main
vue 140 lines 3.92 KB
Raw
1 <template>
2 <CardEntity :loading="canceling" :embedded hoverable>
3 <template #headerMain>
4 <div class="flex items-center">
5 <span>
6 #{{ dataStoreFile.id }}
7 <span class="xs:inline hidden">- {{ dataStoreFile.bucket_name }}</span>
8 </span>
9 </div>
10 </template>
11 <template v-if="dataStoreFile.upload_time" #headerExtra>
12 {{ formatDate(dataStoreFile.upload_time, dFormats.datetime) }}
13 </template>
14 <template #default>
15 <div class="flex flex-col gap-1">
16 {{ dataStoreFile.file_name }}
17
18 <p v-if="dataStoreFile.file_hash" class="hidden font-mono text-sm sm:inline">
19 hash:
20 {{ dataStoreFile.file_hash }}
21 </p>
22 </div>
23 </template>
24 <template #footerMain>
25 <div class="hidden flex-wrap items-center gap-3 sm:flex">
26 <Badge v-if="dataStoreFile.content_type" type="splitted">
27 <template #label>type</template>
28 <template #value>
29 {{ dataStoreFile.content_type }}
30 </template>
31 </Badge>
32 <Badge v-if="dataStoreFile.file_size" type="splitted">
33 <template #label>size</template>
34 <template #value>
35 {{ prettyBytes }}
36 </template>
37 </Badge>
38 </div>
39 </template>
40 <template #footerExtra>
41 <div class="flex flex-wrap gap-3">
42 <n-popconfirm
43 v-model:show="showDeleteConfirm"
44 trigger="manual"
45 to="body"
46 @positive-click="deleteDataStoreFile()"
47 @clickoutside="showDeleteConfirm = false"
48 >
49 <template #trigger>
50 <n-button quaternary size="tiny" :loading="canceling" @click.stop="showDeleteConfirm = true">
51 Delete
52 </n-button>
53 </template>
54 Are you sure you want to delete this file?
55 </n-popconfirm>
56
57 <n-button size="tiny" type="primary" :loading="downloading" @click.stop="downloadFile()">
58 <template #icon>
59 <Icon :name="DownloadIcon" />
60 </template>
61
62 Download
63 </n-button>
64 </div>
65 </template>
66 </CardEntity>
67 </template>
68
69 <script setup lang="ts">
70 import type { CaseDataStore } from "@/types/incidentManagement/cases"
71 import bytes from "bytes"
72 import { saveAs } from "file-saver"
73 import { NButton, NPopconfirm, useMessage } from "naive-ui"
74 import { computed, ref } from "vue"
75 import Api from "@/api"
76 import Badge from "@/components/common/Badge.vue"
77 import CardEntity from "@/components/common/cards/CardEntity.vue"
78 import Icon from "@/components/common/Icon.vue"
79 import { useSettingsStore } from "@/stores/settings"
80 import { formatDate } from "@/utils/format"
81
82 const { dataStoreFile, embedded } = defineProps<{
83 dataStoreFile: CaseDataStore
84 embedded?: boolean
85 }>()
86
87 const emit = defineEmits<{
88 (e: "opened"): void
89 (e: "deleted"): void
90 }>()
91
92 const DownloadIcon = "carbon:cloud-download"
93 const message = useMessage()
94 const canceling = ref(false)
95 const downloading = ref(false)
96 const showDeleteConfirm = ref(false)
97 const dFormats = useSettingsStore().dateFormat
98 const prettyBytes = computed(() => bytes(dataStoreFile.file_size))
99
100 function downloadFile() {
101 downloading.value = true
102
103 Api.incidentManagement.cases
104 .downloadCaseDataStoreFile(dataStoreFile.case_id, dataStoreFile.file_name)
105 .then(res => {
106 if (res.data) {
107 saveAs(res.data, dataStoreFile.file_name)
108 } else {
109 message.warning("An error occurred. Please try again later.")
110 }
111 })
112 .catch(err => {
113 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
114 })
115 .finally(() => {
116 downloading.value = false
117 })
118 }
119
120 function deleteDataStoreFile() {
121 canceling.value = true
122
123 Api.incidentManagement.cases
124 .deleteCaseDataStoreFile(dataStoreFile.case_id, dataStoreFile.file_name)
125 .then(res => {
126 if (res.data.success) {
127 message.success(res.data?.message || "Case Data Store File deleted successfully")
128 emit("deleted")
129 } else {
130 message.warning(res.data?.message || "An error occurred. Please try again later.")
131 }
132 })
133 .catch(err => {
134 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
135 })
136 .finally(() => {
137 canceling.value = false
138 })
139 }
140 </script>