hrms-mgt/src/modules/18_command/components/Step/4_Attached.vue

380 lines
9.9 KiB
Vue
Raw Normal View History

<script setup lang="ts">
2024-09-24 10:50:42 +07:00
import { onMounted, ref, watch } from "vue";
import { VuePDF, usePDF } from "@tato30/vue-pdf";
import { useQuasar } from "quasar";
import type { PDFDocumentLoadingTask } from "pdfjs-dist/types/src/display/api";
import axios from "axios";
2024-09-24 10:50:42 +07:00
import { useRoute } from "vue-router";
2024-09-24 10:50:42 +07:00
import http from "@/plugins/http";
import config from "@/app.config";
import genReport from "@/plugins/genreport";
import genReportXLSX from "@/plugins/genreportxlsx";
2024-09-24 10:50:42 +07:00
import type { DataFileOrder } from "@/modules/18_command/interface/response/Main";
2024-09-24 10:50:42 +07:00
import { useCounterMixin } from "@/stores/mixin";
const $q = useQuasar();
const route = useRoute();
2024-09-24 10:50:42 +07:00
const mixin = useCounterMixin();
const { messageError, showLoader, hideLoader } = mixin;
const commandId = ref<string>(route.params.id.toString());
2024-10-10 15:03:24 +07:00
const props = defineProps({
formCommandList: { type: Object, required: true },
});
const isAttachment = defineModel<boolean>("isAttachment", { required: true });
2024-09-24 10:50:42 +07:00
const tab = ref<string>("main"); //tab
const page = ref<number>(1);
const numOfPages = ref<number>(0); //จำนวนหน้า pdf
const pdfSrc = ref<PDFDocumentLoadingTask | undefined>(); // ตัวแปรเก็บ เเสดง pdf
const dialog = ref<boolean>(false); // เปิด dialog
const isLoadView = ref<boolean>(false);
const dataCover = ref<DataFileOrder>(); //ข้อมูลไฟล์คำสั่ง
const dataAttachment = ref<DataFileOrder>(); //ข้อมูลไฟล์แบนท้าย
2024-09-24 10:50:42 +07:00
/**
* งกนดงขอมลโหลดไฟลคำส
* @param type ประเภท cover เปนคำส attachment เป แบนทาย
2024-09-24 10:50:42 +07:00
*/
async function fetchDataCommand(type: string) {
await http
.get(config.API.commandAction(commandId.value, `tab4/${type}`))
.then(async (res) => {
const dataMain = await res.data.result;
if (type === "cover") {
dataCover.value = dataMain;
await fetchPDF(dataCover.value);
} else {
dataAttachment.value = dataMain;
}
})
.catch((err) => {
messageError($q, err);
});
2024-09-24 10:50:42 +07:00
}
2024-10-09 14:33:20 +07:00
/** ฟังชั่นกำหนดค่าของ PDF*/
async function fetchPDF(data: any, type: string = "docx?folder=command") {
isLoadView.value = false;
2025-02-21 09:30:54 +07:00
pdfSrc.value = undefined;
page.value = 1;
2024-09-24 10:50:42 +07:00
await axios
.post(config.API.reportTemplate + `/${type}`, data, {
headers: {
accept: "application/pdf",
"content-Type": "application/json",
},
responseType: "blob",
})
.then(async (res) => {
const blob = new Blob([res.data]);
const objectUrl = URL.createObjectURL(blob);
const pdfData = usePDF(`${objectUrl}`);
setTimeout(() => {
pdfSrc.value = pdfData.pdf.value;
numOfPages.value = pdfData.pages.value;
isLoadView.value = true;
2024-09-24 10:50:42 +07:00
}, 1500);
})
.catch(async (e) => {
messageError($q, e);
isLoadView.value = true;
2024-09-24 10:50:42 +07:00
});
}
/**
* งชนดาวหโหลดไฟล
* @param type pdf/docx
*/
async function downloadCover(type: string) {
if (tab.value === "main") {
genReport(
dataCover.value,
2024-10-10 15:03:24 +07:00
`คำสั่ง ${props.formCommandList.issue}`,
2024-10-09 14:33:20 +07:00
type,
"?folder=command"
);
} else {
genReportXLSX(
dataAttachment.value,
2024-10-10 15:03:24 +07:00
`เอกสารแนบท้าย ${props.formCommandList.issue}`,
2024-10-09 14:33:20 +07:00
type,
"?folder=command"
);
}
2024-09-24 10:50:42 +07:00
}
/**
* เปลยน tab
* @param val tab
*/
function setTab(val: string) {
tab.value = val;
page.value = 1;
}
2024-09-24 10:50:42 +07:00
/**
* class ตามท set ไว
*/
function getClass(val: boolean) {
return {
"card-header-active q-px-lg q-py-md cursor-pointer": val,
"card-header q-px-lg q-py-md cursor-pointer": !val,
};
}
2024-09-24 10:50:42 +07:00
/**
* check tab เมอมการเปลยน tab
*/
2024-09-24 10:50:42 +07:00
watch(tab, () => {
if (tab.value === "main") {
fetchPDF(dataCover.value);
2024-09-24 10:50:42 +07:00
}
if (tab.value === "second") {
fetchPDF(dataAttachment.value, "xlsx?folder=command");
2024-09-24 10:50:42 +07:00
}
});
/** hook */
onMounted(async () => {
showLoader();
const promises = [fetchDataCommand("cover")];
if (isAttachment.value) {
promises.push(fetchDataCommand("attachment"));
}
await Promise.all(promises).finally(() => {
hideLoader();
});
2024-09-24 10:50:42 +07:00
});
</script>
2024-09-09 17:26:30 +07:00
<template>
2024-09-24 10:50:42 +07:00
<div class="space">
<div @click="setTab('main')" :class="getClass(tab == 'main')">
<div class="q-pr-sm">คำส</div>
</div>
<div
v-if="isAttachment"
@click="setTab('second')"
:class="getClass(tab == 'second')"
>
2024-09-24 10:50:42 +07:00
<div class="q-pr-sm">เอกสารแนบทาย</div>
</div>
<q-space />
<q-btn
class="text-dark"
flat
dense
icon="mdi-fullscreen"
2024-12-04 16:13:12 +07:00
color="primary"
2024-09-24 10:50:42 +07:00
@click="dialog = true"
/>
</div>
<q-separator style="margin-top: -1px; z-index: 1" />
<div class="q-pa-sm">
<div class="q-pa-sm row q-gutter-sm">
<q-btn
2024-09-24 13:06:35 +07:00
outline
2024-09-24 10:50:42 +07:00
color="red"
2024-09-24 13:06:35 +07:00
icon="mdi-file-pdf"
label="ดาวน์โหลดไฟล์ PDF"
2024-09-24 10:50:42 +07:00
@click="downloadCover('pdf')"
2024-09-24 13:06:35 +07:00
class="q-px-sm"
2024-09-24 10:50:42 +07:00
>
</q-btn>
2024-09-24 10:50:42 +07:00
<q-btn
v-if="tab === 'main'"
2024-09-24 13:06:35 +07:00
outline
class="q-px-sm"
2024-09-24 10:50:42 +07:00
color="blue"
2024-09-24 13:06:35 +07:00
icon="mdi-file-word"
label="ดาวน์โหลดไฟล์ docx"
2024-09-24 10:50:42 +07:00
@click="downloadCover('docx')"
/>
<q-btn
v-else
outline
class="q-px-sm"
color="green"
icon="mdi-file-excel"
label="ดาวน์โหลดไฟล์ xlsx"
@click="downloadCover('xlsx')"
/>
2024-09-24 10:50:42 +07:00
</div>
<q-card bordered class="card-pdf q-mx-sm q-pa-md">
<div class="justify-between items-center align-center q-pb-sm row">
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page > 1 ? page - 1 : page"
>
<q-icon name="mdi-chevron-left" />
</q-btn>
<span class="body-2 grey--text">
หนาท {{ page }} จาก {{ numOfPages }}
</span>
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page < numOfPages ? page + 1 : page"
>
<q-icon name="mdi-chevron-right" />
</q-btn>
</div>
<div class="pdfWidth" v-if="isLoadView">
2024-09-24 10:50:42 +07:00
<VuePDF ref="vuePDFRef" :pdf="pdfSrc" :page="page" fit-parent />
</div>
<div class="full-width row flex-center text-accent q-gutter-sm" v-else>
<span
><div
style="
height: 60vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
"
class="text-grey-5"
>
<q-spinner color="primary" size="3em" :thickness="10" />
</div>
</span>
</div>
2024-09-24 10:50:42 +07:00
</q-card>
</div>
<q-dialog
v-model="dialog"
persistent
:maximized="true"
transition-show="slide-up"
transition-hide="slide-down"
>
<q-card class="bg-white text-white">
<div class="flex justify-end items-center align-center q-mr-md q-mt-sm">
<q-btn
icon="close"
unelevated
round
dense
style="color: #ff8080; background-color: #ffdede"
size="12px"
v-close-popup
/>
</div>
<q-card-section bordered class="card-pdf q-ma-md q-pa-md">
<div class="justify-between items-center align-center q-pb-sm row">
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page > 1 ? page - 1 : page"
>
<q-icon name="mdi-chevron-left" />
</q-btn>
<span class="body-2 grey--text text-black">
หนาท {{ page }} จาก {{ numOfPages }}
</span>
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page < numOfPages ? page + 1 : page"
>
<q-icon name="mdi-chevron-right" />
</q-btn>
</div>
<div class="pdfWidth">
<VuePDF
ref="vuePDFRef"
:pdf="pdfSrc"
:page="page"
fit-parent
:scale="0.1"
/>
<!-- <VuePdf :key="page" :src="pdfSrc" :page="page" /> -->
</div>
<div class="justify-between items-center align-center q-pt-sm row">
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page > 1 ? page - 1 : page"
>
<q-icon name="mdi-chevron-left" />
</q-btn>
<span class="body-2 grey--text text-black">
หนาท {{ page }} จาก {{ numOfPages }}
</span>
<q-btn
class="text-dark bg-grey-4"
flat
dense
@click="page = page < numOfPages ? page + 1 : page"
>
<q-icon name="mdi-chevron-right" />
</q-btn>
</div>
</q-card-section>
</q-card>
</q-dialog>
2024-09-09 17:26:30 +07:00
</template>
2024-09-24 10:50:42 +07:00
<style scoped lang="scss">
.space {
background-color: #e9eaec61;
display: flex;
z-index: 3;
min-height: 40px;
}
.card-header-active {
margin-top: 5px;
margin-left: -1px;
background-color: white;
padding: 2px !important;
border-radius: 10px 10px 0px 0px;
border: 1px solid #e9eaec;
width: 200px;
display: flex;
justify-content: center;
border-bottom-style: none;
font-weight: 600;
align-items: center;
}
.card-header {
margin-top: 5px;
background-color: transparent;
padding: 2px !important;
border-radius: 10px 10px 0px 0px;
width: 200px;
display: flex;
justify-content: center;
font-weight: normal;
align-items: center;
}
.card-pdf {
border-radius: 10px;
border: 1px solid #e9eaec;
background-color: #e9eaec61;
}
</style>