main
vue 92 lines 2.93 KB
Raw
1 <template>
2 <div class="flex flex-col gap-2">
3 <div v-if="caseData.alerts?.length" class="flex items-center justify-end gap-2">
4 <LinkAlert :case-id="caseData.id" size="small" secondary label="Link Alert" @linked="handleAlertLinked" />
5 </div>
6 <div v-if="caseData.alerts?.length" class="flex flex-col gap-2">
7 <CardEntity v-for="alert in caseData.alerts" :key="alert.id" size="small" embedded>
8 <template #header-main>#{{ alert.id }}</template>
9 <template #header-extra>
10 <Chip :type="getStatusColor(alert.status)">
11 {{ alert.status.replace("_", " ").toUpperCase() }}
12 </Chip>
13 </template>
14 <template #default>
15 {{ alert.alert_name }}
16 </template>
17 <template #footer-main>
18 Created: {{ formatDate(alert.alert_creation_time, dFormats.datetime) }}
19 </template>
20 <template #footer-extra>
21 <div class="flex flex-wrap items-center justify-end gap-2">
22 <Chip v-if="alert.assigned_to" :value="alert.assigned_to" label="Assigned to" />
23 <UnlinkCase
24 :alert-id="alert.id"
25 :case-id="caseData.id"
26 size="small"
27 label="Unlink Alert"
28 @unlinked="handleAlertUnlinked"
29 />
30 <AlertDetailsButton :alert-id="alert.id" size="small" @status-updated="handleStatusUpdated" />
31 </div>
32 </template>
33 </CardEntity>
34 </div>
35
36 <div v-else-if="caseData.alert_ids?.length" class="flex flex-wrap gap-2">
37 <code v-for="alertId in caseData.alert_ids" :key="alertId">Alert #{{ alertId }}</code>
38 </div>
39
40 <n-empty v-else description="No alerts found" class="min-h-50 justify-center">
41 <template #extra>
42 <div class="flex items-center justify-center gap-2">
43 <LinkAlert
44 :case-id="caseData.id"
45 size="small"
46 secondary
47 label="Link Alert"
48 @linked="handleAlertLinked"
49 />
50 </div>
51 </template>
52 </n-empty>
53 </div>
54 </template>
55
56 <script setup lang="ts">
57 import type { AlertStatusUpdateSuccessPayload } from "@/components/alerts/AlertStatusSelect.vue"
58 import type { Case } from "@/types/cases"
59 import { NEmpty } from "naive-ui"
60 import AlertDetailsButton from "@/components/alerts/AlertDetailsButton.vue"
61 import LinkAlert from "@/components/alerts/LinkAlert.vue"
62 import UnlinkCase from "@/components/cases/UnlinkCase.vue"
63 import CardEntity from "@/components/common/cards/CardEntity.vue"
64 import Chip from "@/components/common/Chip.vue"
65 import { useSettingsStore } from "@/stores/settings"
66 import { getStatusColor } from "@/utils"
67 import { formatDate } from "@/utils/format"
68
69 defineProps<{
70 caseData: Case
71 }>()
72
73 const emit = defineEmits<{
74 (e: "updated", value: number): void
75 (e: "unlinked", value: number): void
76 (e: "linked", value: number): void
77 }>()
78
79 const dFormats = useSettingsStore().dateFormat
80
81 function handleStatusUpdated(payload: AlertStatusUpdateSuccessPayload) {
82 emit("updated", payload.alertId)
83 }
84
85 function handleAlertUnlinked(alertId: number) {
86 emit("unlinked", alertId)
87 }
88
89 function handleAlertLinked(alertId: number) {
90 emit("linked", alertId)
91 }
92 </script>