hrms-edm/Services/client/src/modules/01_user/components/FileDownload.vue

225 lines
6.6 KiB
Vue
Raw Normal View History

<script setup lang="ts">
2023-11-28 09:24:20 +07:00
import axios from 'axios'
import { storeToRefs } from 'pinia'
2023-11-29 17:55:23 +07:00
import axiosClient from '@/services/HttpService'
2023-11-28 09:24:20 +07:00
import type { EhrFile } from '@/stores/tree-data'
import { useFileInfoStore } from '@/stores/file-info-data'
import FileIcon from '@/components/FileIcon.vue'
const { isFilePreview, fileInfo } = storeToRefs(useFileInfoStore())
2023-12-06 09:18:05 +07:00
const { getType, getFormatDate, getSize } = useFileInfoStore()
2023-12-07 10:39:45 +07:00
const filePath =
(fileInfo.value?.pathname || '').split('/').slice(0, -1).join(' / ') + ' / '
2023-11-28 09:24:20 +07:00
2023-12-06 10:16:23 +07:00
async function downloadSubmit(path: string | undefined) {
if (path) {
let formatPath: string
if (path.split('/').length - 1 === 3) {
const [cabinet, drawer, folder, file] = path.split('/')
formatPath = `cabinet/${cabinet}/drawer/${drawer}/folder/${folder}/file/${file}`
} else {
const [cabinet, drawer, folder, subfolder, file] = path.split('/')
formatPath = `cabinet/${cabinet}/drawer/${drawer}/folder/${folder}/subfolder/${subfolder}/file/${file}`
}
const res = await axiosClient.get<EhrFile & { download: string }>(
`${import.meta.env.VITE_API_ENDPOINT}${formatPath}`,
)
await axios
.get(res.data.download, {
method: 'GET',
responseType: 'blob',
headers: {
'Content-Type': 'application/json',
Accept: res.data.fileType,
},
})
.then((r) => {
const a = document.createElement('a')
a.href = window.URL.createObjectURL(r.data)
a.download = res.data.fileName
a.click()
})
}
2023-11-28 09:24:20 +07:00
}
</script>
<template>
2023-11-30 15:30:31 +07:00
<div class="bg-white rounded-borders shadow-5 relative q-pb-md">
<div class="bg-white q-pa-md">
2023-11-30 15:30:31 +07:00
<div class="row items-center">
<span class="text-h6">
<q-btn
flat
dense
class="q-mr-sm q-px-sm"
@click="() => (isFilePreview = false)"
2023-12-04 09:28:40 +07:00
id="goBackInfo"
>
<q-icon
class="pointer"
name="arrow_back"
size="1em"
color="primary"
/>
</q-btn>
{{ fileInfo?.title }}</span
>
2023-12-07 10:39:45 +07:00
<span class="q-ml-lg text-grey">
{{ filePath }}
</span>
</div>
2023-11-30 15:30:31 +07:00
<div class="row q-mt-lg justify-center">
<div class="column q-pa-sm">
<div class="grid">
<div
:style="{
position: 'relative',
display: 'flex',
gap: '0.5rem',
flexDirection: 'column',
alignItems: 'center',
padding: '1rem',
maxWidth: '100%',
}"
class="box"
>
<div class="q-px-md flex items-center justify-center">
<file-icon
size="preview"
:fileName="fileInfo?.fileName ? fileInfo.fileName : undefined"
2023-11-30 15:30:31 +07:00
:fileMimeType="
fileInfo?.fileType ? fileInfo.fileType : undefined
2023-11-30 15:30:31 +07:00
"
/>
</div>
<div
class="text-overflow-handle block q-px-md text-center"
style="max-width: 100%"
>
{{ fileInfo?.title }}
2023-11-30 15:30:31 +07:00
</div>
</div>
<div class="column q-py-sm">
<q-btn
color="primary"
label="ดาวน์โหลด"
icon="mdi-download"
class="q-py-sm"
@click="() => downloadSubmit(fileInfo?.pathname)"
2023-12-04 09:28:40 +07:00
id="downloadSubmit"
2023-11-30 15:30:31 +07:00
/>
</div>
</div>
</div>
2023-11-30 15:30:31 +07:00
<div class="col-grow q-px-lg q-gutter-md q-pt-md">
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>อไฟล</span>
</div>
<div class="col-grow">
<span class="text-grey">{{ fileInfo?.fileName }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>อเรอง</span>
</div>
<div class="col-grow">
<span class="text-grey">{{ fileInfo?.title }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>รายละเอยด</span>
</div>
<div class="col-grow">
<span class="text-grey">{{ fileInfo?.description }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>กล/หมวดหม</span>
</div>
2023-11-28 09:22:44 +07:00
<div class="col-grow">
<span class="text-grey">{{ fileInfo?.category.join(', ') }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>คำสำค</span>
</div>
2023-11-28 09:22:44 +07:00
<div class="col-grow">
<span class="text-grey">{{ fileInfo?.keyword.join(', ') }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>ขนาดไฟล</span>
</div>
<div class="col-grow">
<span class="text-grey">{{ getSize(fileInfo?.fileSize) }}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>ประเภทไฟล</span>
</div>
<div class="col-grow">
<span class="text-grey">{{
getType(fileInfo?.fileType, fileInfo?.fileName)
}}</span>
</div>
</div>
<q-separator />
<div class="row">
2023-12-07 10:39:45 +07:00
<div class="col-12 col-md-3">
<span>นทปโหลด</span>
</div>
<div class="col-grow">
2023-11-28 09:22:44 +07:00
<span class="text-grey">{{
getFormatDate(fileInfo?.createdAt)
}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.box {
2023-11-30 15:30:31 +07:00
border: 2px solid $separator-color;
border-radius: 8px;
}
2023-11-30 15:30:31 +07:00
.text-overflow-handle {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.grid {
display: grid;
width: 250px;
grid-template-columns: repeat(1, minmax(0, 1fr));
gap: 1rem;
}
.grid .box {
position: relative;
}
</style>