diff --git a/src/modules/05_leave/components/DialogDetail.vue b/src/modules/05_leave/components/DialogDetail.vue index 7874515..3333374 100644 --- a/src/modules/05_leave/components/DialogDetail.vue +++ b/src/modules/05_leave/components/DialogDetail.vue @@ -6,7 +6,7 @@ import http from "@/plugins/http"; import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useLeaveStore } from "@/modules/05_leave/store"; -import genReport from "@/plugins/genreport"; +import { useDataStore } from "@/stores/data"; /** import type*/ import type { @@ -16,6 +16,8 @@ import type { FromCancelDetail, } from "@/modules/05_leave/interface/response/leave"; +import DialogHeader from "@/components/DialogHeader.vue"; +import Workflow from "@/components/Workflow/Main.vue"; import FormLeave from "@/modules/05_leave/components/formDetail/01_SickForm.vue"; import FormChildbirth from "@/modules/05_leave/components/formDetail/04_HelpWifeBirthForm.vue"; import FormHoliday from "@/modules/05_leave/components/formDetail/05_VacationForm.vue"; @@ -31,6 +33,7 @@ import FormCancel from "@/modules/05_leave/components/formDetail/formCancel.vue" const $q = useQuasar(); const dataStore = useLeaveStore(); +const mainStore = useDataStore(); const { convertStatud } = dataStore; const mixin = useCounterMixin(); const { @@ -408,28 +411,6 @@ async function onSubmit() { }); } -/** - * ฟังก์ชันดาวน์โหลดไฟล์ - * @param id รหัสการลา - * @param fileName ชื่อไฟล์ - * @param type ประเภทไฟล์ - */ -async function onClickDownloadFile(id: string, fileName: string, type: string) { - showLoader(); - await http - .get(config.API.leaveReport(id)) - .then(async (res) => { - const data = res.data.result; - await genReport(data, fileName, type); - }) - .catch((err) => { - messageError($q, err); - }) - .finally(() => { - hideLoader(); - }); -} - /**** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาแล้วเปิด modal */ watch( () => props.modal, @@ -453,62 +434,10 @@ watch( v-if="props.leaveStatus != 'DELETE'" style="width: 900px; max-width: 80vw" > - - - {{ ` ${titleMain} ${titleName}` }} - - ดาวน์โหลดไฟล์ - - - - - - - ไฟล์ .DOCX - - - - - - ไฟล์ .pdf - - - - - - - + @@ -651,62 +580,10 @@ watch( - - - {{ ` ${titleMainCancle} ${titleName}` }} - - ดาวน์โหลดไฟล์ - - - - - - - ไฟล์ .DOCX - - - - - - ไฟล์ .pdf - - - - - - - + diff --git a/src/modules/05_leave/interface/index/main.ts b/src/modules/05_leave/interface/index/main.ts index a63d65d..9551977 100644 --- a/src/modules/05_leave/interface/index/main.ts +++ b/src/modules/05_leave/interface/index/main.ts @@ -43,7 +43,6 @@ interface LeaveItem { all: number; use: number; remain: number; - leaveCountApproveCount: number; } interface MainList { diff --git a/src/modules/05_leave/views/Main.vue b/src/modules/05_leave/views/Main.vue index fcaca35..4e36478 100644 --- a/src/modules/05_leave/views/Main.vue +++ b/src/modules/05_leave/views/Main.vue @@ -141,14 +141,12 @@ async function fetchStatsTable() { value: el.leaveLimit > 0 ? Math.round( - (Number(el.leaveCountApprove) / Number(el.leaveLimit)) * - 100, + (Number(el.leaveCountApprove) / Number(el.leaveLimit)) * 100 ) : 0, all: Number(el.leaveLimit), use: el.leaveCountApprove, remain: Number(el.leaveLimit) - Number(el.leaveCountApprove), - leaveCountApproveCount: el.leaveCountApproveCount, })); }); stat.forEach((item) => itemPie.value.push(...item)); @@ -256,7 +254,7 @@ onMounted(async () => {
- {{ item.text }} + ลาพักผ่อน
@@ -264,19 +262,17 @@ onMounted(async () => {
ได้รับ - {{ item.all }} วัน + {{ item.all }}
ใช้ไป - {{ item.use }} วัน + {{ item.use }}
คงเหลือ - {{ item.remain }} วัน + {{ item.remain }}
@@ -298,11 +294,11 @@ onMounted(async () => { flat class="shadow-0 col-12 fit row items-center q-px-lg" > -
{{ item.text }}
+
ลาป่วย
ใช้ไป - {{ item.use }} วัน - ({{ item.leaveCountApproveCount }} ครั้ง) + {{ item.use }} +
@@ -321,11 +317,11 @@ onMounted(async () => { flat class="shadow-0 col-12 fit row items-center q-px-lg" > -
{{ item.text }}
+
ลากิจส่วนตัว
ใช้ไป - {{ item.use }} วัน - ({{ item.leaveCountApproveCount }} ครั้ง) + {{ item.use }} +
diff --git a/src/modules/08_KPI/views/form.vue b/src/modules/08_KPI/views/form.vue index 2d8e58b..39b06d4 100644 --- a/src/modules/08_KPI/views/form.vue +++ b/src/modules/08_KPI/views/form.vue @@ -9,7 +9,6 @@ import http from "@/plugins/http"; import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useKpiDataStore } from "@/modules/08_KPI/store"; -import avatar from "@/assets/avatar_user.jpg"; import type { FormProfile } from "@/modules/08_KPI/interface/request/index"; import type { @@ -108,13 +107,11 @@ async function getAvatar(id: string) { .then(async (res) => { const data = await res.data.result; if (data.avatarName) { - fetchProfile(id, data.avatarName); + await fetchProfile(id, data.avatarName); } }) .catch((e) => { messageError($q, e); - imgProfile.value = avatar; - store.dataEvaluation.avartar = avatar; }) .finally(() => { isLoadAvatar.value = false; @@ -122,16 +119,12 @@ async function getAvatar(id: string) { } /** ดึงข้อมูล เพื่อเก็บรูปโปรไฟล์ */ -function fetchProfile(id: string, avatarName: string) { - http +async function fetchProfile(id: string, avatarName: string) { + await http .get(config.API.fileByFile("ทะเบียนประวัติ", "โปรไฟล์", id, avatarName)) - .then((res) => { + .then(async (res) => { store.dataEvaluation.avartar = res.data.downloadUrl; imgProfile.value = res.data.downloadUrl; - }) - .catch(() => { - imgProfile.value = avatar; - store.dataEvaluation.avartar = avatar; }); } @@ -215,7 +208,7 @@ async function getOrgOp() { name: `${i.prefix}${i.firstName} ${i.lastName}`, })) .find( - (i: EvaOptionType) => i.id == store.dataEvaluation.commanderHighId, + (i: EvaOptionType) => i.id == store.dataEvaluation.commanderHighId ); isLoadCommander.value = false; }) @@ -232,21 +225,21 @@ function filterOption(val: string, update: Function, refData: string) { case "evaluatorIdOp": update(() => { evaluatorIdOp.value = evaluatorIdMainOp.value.filter( - (v: DataOptions) => v.name.indexOf(val) > -1, + (v: DataOptions) => v.name.indexOf(val) > -1 ); }); break; case "commanderIdOp": update(() => { commanderIdOp.value = commanderIdMainOp.value.filter( - (v: DataOptions) => v.name.indexOf(val) > -1, + (v: DataOptions) => v.name.indexOf(val) > -1 ); }); break; case "commanderHighOp": update(() => { commanderHighOp.value = commanderHighMainOp.value.filter( - (v: DataOptions) => v.name.indexOf(val) > -1, + (v: DataOptions) => v.name.indexOf(val) > -1 ); }); break; @@ -285,7 +278,7 @@ function sendToEvaluatore() { } }, "ยืนยันการส่งข้อตกลงให้ผู้ประเมินอนุมัติ", - "ต้องการยืนยันส่งข้อตกลงนี้ให้ผู้ประเมินอนุมัติใช่หรือไม่?", + "ต้องการยืนยันส่งข้อตกลงนี้ให้ผู้ประเมินอนุมัติใช่หรือไม่?" ); } @@ -315,7 +308,7 @@ function sendToEvaluateEvaluatore() { } }, "ยืนยันการส่งให้ผู้ประเมินรายงานผลสำเร็จของงาน", - "ต้องการยืนยันส่งให้ผู้ประเมินรายงานผลสำเร็จของงานใช่หรือไม่?", + "ต้องการยืนยันส่งให้ผู้ประเมินรายงานผลสำเร็จของงานใช่หรือไม่?" ); } @@ -345,7 +338,7 @@ function requireEdit() { } }, "ยืนยันการขอแก้ไขข้อตกลง", - "ต้องการยืนยันการขอแก้ไขข้อตกลงนี้ใช่หรือไม่?", + "ต้องการยืนยันการขอแก้ไขข้อตกลงนี้ใช่หรือไม่?" ); } @@ -418,7 +411,7 @@ async function goToSummary() { store.excusiveIndicator2ScoreVal + store.competencyScoreVal ).toFixed(2), - }, + } ) .then((res) => {}); @@ -434,7 +427,7 @@ async function goToSummary() { }); }, "ยืนยันการส่งไปสรุปผลการประเมิน", - "ต้องการยืนยันส่งไปสรุปผลการประเมินใช่หรือไม่?", + "ต้องการยืนยันส่งไปสรุปผลการประเมินใช่หรือไม่?" ); } @@ -524,7 +517,7 @@ async function downloadReport() { store.dataEvaluation.prefix + store.dataEvaluation.firstName + " " + - store.dataEvaluation.lastName, + store.dataEvaluation.lastName ); }) .catch((e) => { @@ -563,7 +556,7 @@ async function clickUpload(file: any) { const foundKey: string | undefined = Object.keys(res.data).find( (key) => res.data[key]?.fileName !== undefined && - res.data[key]?.fileName !== "", + res.data[key]?.fileName !== "" ); foundKey && uploadFileDoc(res.data[foundKey]?.uploadUrl, fileUpload.value); @@ -573,7 +566,7 @@ async function clickUpload(file: any) { }); }, "ยืนยันการอัปโหลดไฟล์", - "ต้องการยืนยันการอัปโหลดไฟล์นี้หรือไม่ ?", + "ต้องการยืนยันการอัปโหลดไฟล์นี้หรือไม่ ?" ); } @@ -630,7 +623,7 @@ function deleteFile(fileName: string) { showLoader(); http .delete( - config.API.file("แบบกำหนดข้อตกลง", "KPI", id.value) + `/${fileName}`, + config.API.file("แบบกำหนดข้อตกลง", "KPI", id.value) + `/${fileName}` ) .catch((e) => { messageError($q, e); diff --git a/src/modules/10_registry/01_Information/02_ChangeName.vue b/src/modules/10_registry/01_Information/02_ChangeName.vue index 165f95a..0a7a972 100644 --- a/src/modules/10_registry/01_Information/02_ChangeName.vue +++ b/src/modules/10_registry/01_Information/02_ChangeName.vue @@ -3,7 +3,6 @@ import { ref, onMounted } from "vue"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import http from "@/plugins/http"; import config from "@/app.config"; @@ -115,7 +114,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } @@ -133,15 +132,12 @@ async function onDownloadFile(id: string, profileId: string) { "ประวัติการเปลี่ยนชื่อ-นามสกุล", profileId, id, - "เอกสารหลักฐาน", - ), + "เอกสารหลักฐาน" + ) ) .then(async (res) => { - const downloadUrl = res.data.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: `ประวัติการเปลี่ยนชื่อ-นามสกุล`, - }); + const data = res.data.downloadUrl; + window.open(data, "_blank"); }) .catch((err) => { messageError($q, err); diff --git a/src/modules/10_registry/01_Information/06_Ability.vue b/src/modules/10_registry/01_Information/06_Ability.vue index ffcb8e0..bc77c5b 100644 --- a/src/modules/10_registry/01_Information/06_Ability.vue +++ b/src/modules/10_registry/01_Information/06_Ability.vue @@ -6,7 +6,6 @@ import http from "@/plugins/http"; import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; /** import type */ import type { AbilityRows } from "@/modules/10_registry/interface/index/Main"; @@ -241,7 +240,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } @@ -259,15 +258,12 @@ async function onDownloadFile(id: string, profileId: string) { "เอกสารความสามารถพิเศษ", profileId, id, - "เอกสารหลักฐาน", - ), + "เอกสารหลักฐาน" + ) ) .then(async (res) => { - const downloadUrl = res.data.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: `เอกสารความสามารถพิเศษ`, - }); + const data = res.data; + window.open(data.downloadUrl, "_blank"); }) .catch((err) => { messageError($q, err); diff --git a/src/modules/10_registry/02_Government/02_Discipline.vue b/src/modules/10_registry/02_Government/02_Discipline.vue index 2d6b4d0..7ac9611 100644 --- a/src/modules/10_registry/02_Government/02_Discipline.vue +++ b/src/modules/10_registry/02_Government/02_Discipline.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { DisciplineDetail } from "@/modules/10_registry/interface/index/Main"; @@ -195,11 +194,8 @@ async function getHistory() { async function onDownloadFile(id: string, profileId: string) { showLoader(); try { - const res = await getPathUploadFlie(fileGroup.value, profileId, id); - await downloadBlobFile({ - downloadUrl: res.downloadUrl, - fileName: `เอกสารวินัย`, - }); + const data = await getPathUploadFlie(fileGroup.value, profileId, id); + window.open(data.downloadUrl, "_blank"); } catch (e) { messageError($q, e); } finally { @@ -212,7 +208,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/modules/10_registry/02_Government/04_Duty.vue b/src/modules/10_registry/02_Government/04_Duty.vue index a64dc34..4a6ff94 100644 --- a/src/modules/10_registry/02_Government/04_Duty.vue +++ b/src/modules/10_registry/02_Government/04_Duty.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { DutyFormType } from "@/modules/10_registry/interface/index/Main"; @@ -298,11 +297,8 @@ async function getHistory() { async function onDownloadFile(id: string, profileId: string) { showLoader(); try { - const res = await getPathUploadFlie(fileGroup.value, profileId, id); - await downloadBlobFile({ - downloadUrl: res.downloadUrl, - fileName: `เอกสารปฏิบัติราชการพิเศษ`, - }); + const data = await getPathUploadFlie(fileGroup.value, profileId, id); + window.open(data.downloadUrl, "_blank"); } catch (e) { messageError($q, e); } finally { @@ -315,7 +311,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/modules/10_registry/02_Government/06_Assistance.vue b/src/modules/10_registry/02_Government/06_Assistance.vue index 69d5184..ac7adc5 100644 --- a/src/modules/10_registry/02_Government/06_Assistance.vue +++ b/src/modules/10_registry/02_Government/06_Assistance.vue @@ -6,7 +6,6 @@ import http from "@/plugins/http"; import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { DutyFormType } from "@/modules/10_registry/interface/index/Main"; @@ -303,15 +302,12 @@ async function onDownloadFile(id: string, profileId: string) { "ช่วยราชการ", profileId, id, - "เอกสารหลักฐาน", - ), + "เอกสารหลักฐาน" + ) ) .then(async (res) => { - const downloadUrl = res.data.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: `เอกสารช่วยราชการ`, - }); + const data = res.data; + window.open(data.downloadUrl, "_blank"); }) .catch((err) => { messageError($q, err); @@ -326,7 +322,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/modules/10_registry/03_Salary/02_Nopaid.vue b/src/modules/10_registry/03_Salary/02_Nopaid.vue index 271d3d9..a74d946 100644 --- a/src/modules/10_registry/03_Salary/02_Nopaid.vue +++ b/src/modules/10_registry/03_Salary/02_Nopaid.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { NopaidFormType } from "@/modules/10_registry/interface/index/Main"; @@ -256,7 +255,7 @@ async function getHistory() { rowsHistoryData.value = []; await http .get( - config.API.dataUserSalaryNopaidHistoryByType(link.value, idByRow.value), + config.API.dataUserSalaryNopaidHistoryByType(link.value, idByRow.value) ) .then((res) => { const data = res.data.result; @@ -279,12 +278,8 @@ async function getHistory() { async function onDownloadFile(id: string, profileId: string) { showLoader(); try { - const res = await getPathUploadFlie(fileGroup.value, profileId, id); - const downloadUrl = res.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: `บันทึกวันที่ไม่ได้รับ${salaryText.value}ฯ`, - }); + const data = await getPathUploadFlie(fileGroup.value, profileId, id); + window.open(data.downloadUrl, "_blank"); } catch (e) { messageError($q, e); } finally { @@ -297,7 +292,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/modules/10_registry/04_Achievement/01_Certificate.vue b/src/modules/10_registry/04_Achievement/01_Certificate.vue index 5e0b4c7..6266c34 100644 --- a/src/modules/10_registry/04_Achievement/01_Certificate.vue +++ b/src/modules/10_registry/04_Achievement/01_Certificate.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { CertificateDetail } from "@/modules/10_registry/interface/index/Main"; @@ -254,8 +253,8 @@ async function getHistory() { config.API.dataUserCertificateHistoryByType( link.value, "certificate", - idByRow.value, - ), + idByRow.value + ) ) .then((res) => { const data = res.data.result; @@ -279,10 +278,7 @@ async function onDownloadFile(id: string, profileId: string) { showLoader(); try { const data = await getPathUploadFlie(fileGroup.value, profileId, id); - await downloadBlobFile({ - downloadUrl: data.downloadUrl, - fileName: `เอกสารใบอนุญาตประกอบวิชาชีพ`, - }); + window.open(data.downloadUrl, "_blank"); } catch (error) { messageError($q, error); } finally { @@ -295,7 +291,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/modules/10_registry/04_Achievement/03_Insignia.vue b/src/modules/10_registry/04_Achievement/03_Insignia.vue index 2acb679..e2dadc0 100644 --- a/src/modules/10_registry/04_Achievement/03_Insignia.vue +++ b/src/modules/10_registry/04_Achievement/03_Insignia.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { InsigniaFormType } from "@/modules/10_registry/interface/index/Main"; @@ -470,8 +469,8 @@ async function getHistory() { config.API.dataUserCertificateHistoryByType( link.value, "insignia", - idByRow.value, - ), + idByRow.value + ) ) .then((res) => { const data = res.data.result; @@ -495,10 +494,7 @@ async function onDownloadFile(id: string, profileId: string) { showLoader(); try { const data = await getPathUploadFlie(fileGroup.value, profileId, id); - await downloadBlobFile({ - downloadUrl: data.downloadUrl, - fileName: `เอกสารเครื่องราชอิสริยาภรณ์`, - }); + window.open(data.downloadUrl, "_blank"); } catch (error) { messageError($q, error); } finally { @@ -511,7 +507,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } @@ -651,6 +647,7 @@ onMounted(async () => { dense round size="14px" + class="absolute_button" @click="onHistory(props.row.id)" > ประวัติแก้ไขเครื่องราชอิสริยาภรณ์ diff --git a/src/modules/10_registry/04_Achievement/04_Honor.vue b/src/modules/10_registry/04_Achievement/04_Honor.vue index a142ad7..6801fd2 100644 --- a/src/modules/10_registry/04_Achievement/04_Honor.vue +++ b/src/modules/10_registry/04_Achievement/04_Honor.vue @@ -7,7 +7,6 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useDataStore } from "@/stores/data"; import { useRegistryDataStore } from "@/modules/10_registry/store/Main"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { HonorFormData } from "@/modules/10_registry/interface/index/Main"; @@ -279,10 +278,7 @@ async function onDownloadFile(id: string, profileId: string) { showLoader(); try { const data = await getPathUploadFlie(fileGroup.value, profileId, id); - await downloadBlobFile({ - downloadUrl: data.downloadUrl, - fileName: `เอกสารประกาศเกียรติคุณ`, - }); + window.open(data.downloadUrl, "_blank"); } catch (error) { messageError($q, error); } finally { @@ -295,7 +291,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } @@ -433,6 +429,7 @@ onMounted(async () => { dense round size="14px" + class="absolute_button" @click="onHistory(props.row.id)" > ประวัติแก้ไขประกาศเกียรติคุณ diff --git a/src/modules/10_registry/05_Other/02_File.vue b/src/modules/10_registry/05_Other/02_File.vue index bb9f287..1be029f 100644 --- a/src/modules/10_registry/05_Other/02_File.vue +++ b/src/modules/10_registry/05_Other/02_File.vue @@ -6,7 +6,6 @@ import { ref, onMounted, watch } from "vue"; import http from "@/plugins/http"; import config from "@/app.config"; import { useRegistryInFormationStore } from "@/modules/10_registry/store/registry"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { FileFormType } from "@/modules/10_registry/interface/index/Main"; @@ -58,10 +57,18 @@ async function downloadFile(fileName: string) { ) .then(async (res) => { const downloadUrl = res.data.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: fileName, - }); + const response = await fetch(downloadUrl); + const blob = await response.blob(); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + setTimeout(() => { + document.body.removeChild(link); + URL.revokeObjectURL(url); + }, 100); }) .catch((e) => { messageError($q, e); diff --git a/src/modules/10_registry/05_Other/03_FileOther.vue b/src/modules/10_registry/05_Other/03_FileOther.vue index 585e68c..05e740b 100644 --- a/src/modules/10_registry/05_Other/03_FileOther.vue +++ b/src/modules/10_registry/05_Other/03_FileOther.vue @@ -6,7 +6,6 @@ import { useQuasar } from "quasar"; import http from "@/plugins/http"; import config from "@/app.config"; import { useRegistryInFormationStore } from "@/modules/10_registry/store/registry"; -import { downloadBlobFile } from "@/modules/10_registry/utils/downloadFile"; import type { FileFormType } from "@/modules/10_registry/interface/index/Main"; @@ -58,10 +57,18 @@ async function downloadFile(fileName: string) { ) .then(async (res) => { const downloadUrl = res.data.downloadUrl; - await downloadBlobFile({ - downloadUrl: downloadUrl, - fileName: fileName, - }); + const response = await fetch(downloadUrl); + const blob = await response.blob(); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + setTimeout(() => { + document.body.removeChild(link); + URL.revokeObjectURL(url); + }, 100); }) .catch((e) => { messageError($q, e); diff --git a/src/modules/10_registry/utils/downloadFile.ts b/src/modules/10_registry/utils/downloadFile.ts deleted file mode 100644 index 99c06c5..0000000 --- a/src/modules/10_registry/utils/downloadFile.ts +++ /dev/null @@ -1,60 +0,0 @@ -export interface DownloadFileOptions { - downloadUrl: string; - fileName: string; -} - -const isMobile = - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent, - ); - -export async function downloadBlobFile({ - downloadUrl, - fileName, -}: DownloadFileOptions): Promise { - // Use window.open for desktop, blob download for mobile - if (!isMobile) { - window.open(downloadUrl, "_blank"); - return; - } - - const response = await fetch(downloadUrl); - const blob = await response.blob(); - - const contentType: string | null = response.headers.get("Content-Type"); - - const extensionMap: Record = { - "application/pdf": "pdf", - "image/jpeg": "jpg", - "image/png": "png", - "image/gif": "gif", - "application/zip": "zip", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": - "docx", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx", - }; - - let extension = contentType ? extensionMap[contentType] : undefined; - - if (!extension) { - const urlWithoutQuery = downloadUrl.split("?")[0]; - extension = urlWithoutQuery.includes(".") - ? urlWithoutQuery.split(".").pop() - : "pdf"; - } - - const blobForDownload = new Blob([blob], { - type: "application/octet-stream", - }); - const url = URL.createObjectURL(blobForDownload); - const link = document.createElement("a"); - link.href = url; - const downloadFileName = fileName.includes(".") ? fileName : `${fileName}.${extension}`; - link.download = downloadFileName; - document.body.appendChild(link); - link.click(); - setTimeout(() => { - document.body.removeChild(link); - URL.revokeObjectURL(url); - }, 100); -} diff --git a/src/modules/11_probation/views/mainDetail.vue b/src/modules/11_probation/views/mainDetail.vue index a4584c0..cd6b60c 100644 --- a/src/modules/11_probation/views/mainDetail.vue +++ b/src/modules/11_probation/views/mainDetail.vue @@ -151,7 +151,6 @@ async function getAvatar(id: string) { }) .catch((e) => { messageError($q, e); - profileImg.value = avatar; }); } @@ -169,15 +168,14 @@ function getList(id: string) { }); } -function getImg(id: string, pathName: string) { - http +async function getImg(id: string, pathName: string) { + await http .get(config.API.fileByFile("ทะเบียนประวัติ", "โปรไฟล์", id, pathName)) .then((res) => { profileImg.value = res.data.downloadUrl; }) .catch((e) => { - profileImg.value = avatar; - // messageError($q, e); + messageError($q, e); hideLoader(); }); } @@ -190,7 +188,7 @@ function onSearch() { rows.value = onSearchDataTable( filter.value, rowsData.value, - columns.value ? columns.value : [], + columns.value ? columns.value : [] ); } diff --git a/src/plugins/genreport.ts b/src/plugins/genreport.ts index 500dca4..520ec00 100644 --- a/src/plugins/genreport.ts +++ b/src/plugins/genreport.ts @@ -19,7 +19,7 @@ async function genReport(data: any, fileName: string, type: string = "docx") { }, responseType: "arraybuffer", }) - .then(async (res) => { + .then((res) => { const responseData = res.data; if (responseData) { const mimeType = @@ -32,11 +32,13 @@ async function genReport(data: any, fileName: string, type: string = "docx") { const baseName = fileName.trim(); const extension = type === "docx" ? "docx" : "pdf"; + const link = document.createElement("a"); link.href = url; link.download = `${baseName}.${extension}`; document.body.appendChild(link); link.click(); + setTimeout(() => { document.body.removeChild(link); URL.revokeObjectURL(url); diff --git a/src/stores/mixin.ts b/src/stores/mixin.ts index 02981bb..41c7161 100644 --- a/src/stores/mixin.ts +++ b/src/stores/mixin.ts @@ -14,7 +14,7 @@ export const useCounterMixin = defineStore("mixin", () => { const calAge = ( srcDate: Date, birthCal: Date = new Date(), - eng: boolean = false, + eng: boolean = false ) => { const year = eng ? "years" : "ปี"; const month = eng ? "months" : "เดือน"; @@ -82,7 +82,7 @@ export const useCounterMixin = defineStore("mixin", () => { function date2Thai( srcDate: Date | null, isFullMonth: boolean = false, - isTime: boolean = false, + isTime: boolean = false ) { if (srcDate == null || !moment(srcDate).isValid()) return ""; @@ -98,7 +98,7 @@ export const useCounterMixin = defineStore("mixin", () => { function dateThai( srcDate: Date, isFullMonth: boolean = true, - isTime: boolean = false, + isTime: boolean = false ) { if (srcDate == null) { return null; @@ -490,7 +490,7 @@ export const useCounterMixin = defineStore("mixin", () => { color: string | undefined, ok?: Function | undefined, cancel?: Function | undefined, - onlycancel: Boolean = false, + onlycancel: Boolean = false ) => { q.dialog({ component: CustomComponent, @@ -529,7 +529,7 @@ export const useCounterMixin = defineStore("mixin", () => { title: string, message: string, ok: Function, - cancel?: Function, + cancel?: Function ) { q.dialog({ title: `${title}`, @@ -559,7 +559,7 @@ export const useCounterMixin = defineStore("mixin", () => { title: string, message: string, ok: Function, - cancel?: Function, + cancel?: Function ) { q.dialog({ title: `${title}`, @@ -795,7 +795,7 @@ export const useCounterMixin = defineStore("mixin", () => { ok?: Function, title?: string, // ถ้ามี cancel action ใส่เป็น null desc?: string, // ถ้ามี cancel action ใส่เป็น null - cancel?: Function, + cancel?: Function ) => { q.dialog({ component: CustomComponent, @@ -824,7 +824,7 @@ export const useCounterMixin = defineStore("mixin", () => { ok?: Function, title?: string, // ถ้ามี cancel action ใส่เป็น null desc?: string, // ถ้ามี cancel action ใส่เป็น null - cancel?: Function, + cancel?: Function ) => { q.dialog({ component: CustomComponent, @@ -851,7 +851,7 @@ export const useCounterMixin = defineStore("mixin", () => { const dialogMessageNotify = ( q: any, desc?: string, // ถ้ามี cancel action ใส่เป็น null - cancel?: Function, + cancel?: Function ) => { q.dialog({ component: CustomComponent, @@ -973,7 +973,7 @@ export const useCounterMixin = defineStore("mixin", () => { * @returns ผลการคำนวน ปี เดือน วัน ในรูปแบบ 1 ปี 10 เดือน 5 วัน */ function calculateDurationYmd(startDate: any, endDate: any) { - if (!startDate || !endDate) return ""; + if (!startDate || !endDate) return ""; let start = moment(startDate).startOf("day"); let end = moment(endDate).startOf("day").add(1, "day"); @@ -1252,15 +1252,9 @@ export const useCounterMixin = defineStore("mixin", () => { // กรณีมีเฉพาะ date function convertDateToAPI(date: Date | null) { - if (!date) return null; - - const parsedDate = new Date(date); - - if (parsedDate) { - return format(parsedDate, "yyyy-MM-dd"); - } else { - return null; - } + return date + ? format(utcToZonedTime(date, "Asia/Bangkok"), "yyyy-MM-dd") + : null; } // กรณี datetime diff --git a/src/views/MainLayout.vue b/src/views/MainLayout.vue index 331dbe8..165bf6e 100644 --- a/src/views/MainLayout.vue +++ b/src/views/MainLayout.vue @@ -74,7 +74,7 @@ async function checkUser() { await dataStore.getProFileType(); kpiDataStore.dataProfile = data; // Set dataProfile in kpiDataStore if (data.avatarName) { - getImg(data.profileId, data.avatarName); + await getImg(data.profileId, data.avatarName); } else { dataStore.profileImg = avatar; } @@ -106,9 +106,6 @@ function getImg(id: string, pathName: string) { .get(config.API.fileByFile("ทะเบียนประวัติ", "โปรไฟล์", id, pathName)) .then((res) => { dataStore.profileImg = res.data.downloadUrl; - }) - .catch(() => { - dataStore.profileImg = avatar; }); }