import { defineStore } from "pinia"; import "moment/dist/locale/th"; import moment from "moment"; import CustomComponent from "@/components/CustomDialog.vue"; import { Loading, QSpinnerCube } from "quasar"; moment.locale("th"); export const useCounterMixin = defineStore("mixin", () => { /** * ฟังก์ชันกลาง */ const calAge = ( srcDate: Date, birthCal: Date = new Date(), eng: boolean = false ) => { const year = eng ? "years" : "ปี"; const month = eng ? "months" : "เดือน"; const day = eng ? "days" : "วัน"; if (srcDate == null) { return `0 ${year} 0 ${month} 0 ${day}`; } const toDay = birthCal; const birth = new Date(srcDate); const yearNow = toDay.getFullYear(); const monthNow = toDay.getMonth(); const dateNow = toDay.getDate(); const yearDob = birth.getFullYear(); const monthDob = birth.getMonth(); const dateDob = birth.getDate(); const lastYear = 12; const subtractDate: Object = moment().subtract(1, "months").endOf("month"); const lastMonths = new Date(subtractDate.toString()).getDate(); let yearAge = yearNow - yearDob; let monthAge = 0; let dateAge = 0; if (monthNow >= monthDob) { monthAge = monthNow - monthDob; } else { yearAge--; monthAge = lastYear + monthNow - monthDob; } if (dateNow >= dateDob) { dateAge = dateNow - dateDob; } else { monthAge--; dateAge = lastMonths + dateNow - dateDob; if (monthAge < 0) { monthAge = 11; yearAge--; } } const age = { years: yearAge, months: monthAge, days: dateAge, }; return `${yearAge} ${year} ${monthAge} ${month} ${dateAge} ${day}`; }; function date2Thai( srcDate: Date | null, isFullMonth: boolean = false, isTime: boolean = false ) { if (srcDate == null || !moment(srcDate).isValid()) return ""; const dateMoment = moment(srcDate); const day = dateMoment.format("DD"); const month = dateMoment.format(isFullMonth ? "MMMM" : "MMM"); const year = +dateMoment.format("YYYY") + 543; return `${day} ${month} ${year}${ isTime ? dateMoment.format(" HH:mm น.") : "" }`; } function dateMonth2Thai(srcDate: Date, isFullMonth = false, isTime = false) { if (!srcDate) return srcDate; const date = new Date(srcDate); const isValidDate = Boolean(+date); if (!isValidDate) return srcDate; if (isValidDate && date.getFullYear() < 1000) return srcDate; const fullMonthThai = [ "มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม", ]; const abbrMonthThai = [ "ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.", ]; let dstYear = 0; if (date.getFullYear() > 2500) { dstYear = date.getFullYear(); } else { dstYear = date.getFullYear() + 543; } let dstMonth = ""; if (isFullMonth) { dstMonth = fullMonthThai[date.getMonth()]; } else { dstMonth = abbrMonthThai[date.getMonth()]; } let dstTime = ""; if (isTime) { const H = date.getHours().toString().padStart(2, "0"); const M = date.getMinutes().toString().padStart(2, "0"); // const S = date.getSeconds().toString().length === 1 ? "0" + date.getSeconds() : date.getSeconds() // dstTime = " " + H + ":" + M + ":" + S + " น." dstTime = " " + H + ":" + M + " น."; } return date.getDate().toString().padStart(2, "0") + " " + dstMonth; } const calAgeYear = (srcDate: Date, birthCal: Date = new Date()) => { const toDay = birthCal; const birth = new Date(srcDate); const yearNow = toDay.getFullYear(); const monthNow = toDay.getMonth(); const dateNow = toDay.getDate(); const yearDob = birth.getFullYear(); const monthDob = birth.getMonth(); const dateDob = birth.getDate(); const lastYear = 12; const subtractDate: Object = moment().subtract(1, "months").endOf("month"); const lastMonths = new Date(subtractDate.toString()).getDate(); let yearAge = yearNow - yearDob; let monthAge = 0; let dateAge = 0; if (monthNow >= monthDob) { monthAge = monthNow - monthDob; } else { yearAge--; monthAge = lastYear + monthNow - monthDob; } if (dateNow >= dateDob) { dateAge = dateNow - dateDob; } else { monthAge--; dateAge = lastMonths + dateNow - dateDob; if (monthAge < 0) { monthAge = 11; yearAge--; } } return yearAge; }; function monthYear2Thai(month: number, year: number, isFullMonth = false) { const date = new Date(`${year}-${month + 1}-1`); const fullMonthThai = [ "มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม", ]; const abbrMonthThai = [ "ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค.", ]; let dstYear = 0; if (date.getFullYear() > 2500) { dstYear = date.getFullYear(); } else { dstYear = date.getFullYear() + 543; } let dstMonth = ""; if (isFullMonth) { dstMonth = fullMonthThai[date.getMonth()]; } else { dstMonth = abbrMonthThai[date.getMonth()]; } return dstMonth + " " + dstYear; } function dateToISO(date: Date) { if (date != null) { const srcDate = new Date(date); return ( srcDate.getFullYear() + "-" + appendLeadingZeroes(srcDate.getMonth() + 1) + "-" + appendLeadingZeroes(srcDate.getDate()) ); } else { return ""; } } const convertDate = (date: string) => { if (date != null && date.length == 10) { const srcDate = date.toString().split("/"); const dateVal = Number(srcDate[2]) - 543 + "-" + srcDate[1] + "-" + srcDate[0]; const check = moment(dateVal).isValid(); if (check) { return { isValid: check, value: dateVal, }; } else { return { isValid: check, value: "", }; } } else { return { isValid: false, value: "", }; } }; const convertDateDisplay = (dateVal: Date) => { const date = new Date(dateVal); let dstYear = date.getFullYear() + 543; let dstMonth = date.getMonth() + 1; return ( date.getDate().toString().padStart(2, "0") + "/" + dstMonth.toString().padStart(2, "0") + "/" + dstYear ); }; function appendLeadingZeroes(n: number) { if (n <= 9) return "0" + n; return n; } function textToPhone(n: string) { const p = n.substr(0, 3) + "-" + n.substr(3, 3) + "-" + n.substr(6, 4); return p; } function textToFax(n: string) { const p = n.substr(0, 2) + "-" + n.substr(2, 3) + "-" + n.substr(5, 4); return p; } const success = (q: any, val: string) => { // useQuasar ไม่สามารถใช้นอกไฟล์ .vue if (val !== "") { return q.notify({ message: val, color: "primary", icon: "mdi-information", position: "bottom-right", multiLine: true, timeout: 1000, badgeColor: "positive", classes: "my-notif-class", }); } }; function notify(q: any, val: string) { if (val !== "") { q.notify({ color: "teal-10", message: val, icon: "mdi-information", position: "bottom-right", multiLine: true, timeout: 7000, actions: [{ label: "ปิด", color: "white", handler: () => {} }], }); } } function notifyError(q: any, val: string) { if (val !== "") { q.notify({ color: "negative", message: val, icon: "mdi-alert-circle", position: "top", multiLine: true, timeout: 12000, actions: [{ label: "ปิด", color: "white", handler: () => {} }], }); } } const messageError = (q: any, e: any = "", msg: string = "") => { // q.dialog.hide(); if (e.response !== undefined) { if (e.response.data.status !== undefined) { if (e.response.data.status == 401) { //invalid_token q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `ล็อกอินหมดอายุ กรุณาล็อกอินใหม่อีกครั้ง`, icon: "warning", color: "red", onlycancel: true, }, }); } else if (e.response.data.status == 400 && e.response.data.title) { //validation errors q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `${e.response.data.title}`, icon: "warning", color: "red", onlycancel: true, }, }); } else { const message = e.response.data.result ?? e.response.data.message; q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `${message}`, icon: "warning", color: "red", onlycancel: true, }, }); } } else { if (e.response.status == 401) { //invalid_token q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `ล็อกอินหมดอายุ กรุณาล็อกอินใหม่อีกครั้ง`, icon: "warning", color: "red", onlycancel: true, }, }); } else if (e.response.data.successful === false) { q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: e.response.data.message, icon: "warning", color: "red", onlycancel: true, }, }); } else { q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`, icon: "warning", color: "red", onlycancel: true, }, }); } } } else { console.error("err===>", e); // *** if (e.message) { q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: e.message, icon: "warning", color: "red", onlycancel: true, }, }); } else { q.dialog({ component: CustomComponent, componentProps: { title: `พบข้อผิดพลาด`, message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`, icon: "warning", color: "red", onlycancel: true, }, }); } } }; const fails = (q: any, val: string) => { // useQuasar ไม่สามารถใช้นอกไฟล์ .vue if (val !== "") { return q.notify({ message: val, color: "red", icon: "mdi-information", position: "bottom-right", multiLine: true, timeout: 1000, badgeColor: "positive", classes: "my-notif-class", }); } }; const dialogMessage = ( // ไม่เอาใส่ undefined q: any, title: string | undefined, message: string | undefined, icon: string | undefined, textOk: string | undefined, color: string | undefined, ok?: Function | undefined, cancel?: Function | undefined, onlycancel: Boolean = false ) => { q.dialog({ component: CustomComponent, componentProps: { title: title, message: message, icon: icon, color: color, textOk: textOk, onlycancel: onlycancel, }, }) .onOk(() => { if (ok != undefined) ok(); }) .onCancel(() => { if (cancel != undefined) cancel(); }); }; //*** Dialog ***// const dialogConfirm = ( q: any, ok?: Function, title?: string, // ถ้ามี cancel action ใส่เป็น null desc?: string, // ถ้ามี cancel action ใส่เป็น null cancel?: Function ) => { q.dialog({ component: CustomComponent, componentProps: { title: title && title != null ? title : "ยืนยันการบันทึก", message: desc && desc != null ? desc : "ต้องการยืนยันการบันทึกข้อมูลนี้ใช่หรือไม่?", icon: "info", color: "public", textOk: "ตกลง", onlycancel: false, }, }) .onOk(() => { if (ok) ok(); }) .onCancel(() => { if (cancel) cancel(); }); }; const dialogRemove = ( q: any, ok?: Function, title?: string, // ถ้ามี cancel action ใส่เป็น null desc?: string, // ถ้ามี cancel action ใส่เป็น null cancel?: Function ) => { q.dialog({ component: CustomComponent, componentProps: { title: title && title != null ? title : "ยืนยันการลบข้อมูล", message: desc && desc != null ? desc : "ต้องการยืนยันการลบข้อมูลนี้ใช่หรือไม่?", icon: "delete", color: "red", textOk: "ตกลง", onlycancel: false, }, }) .onOk(() => { if (ok) ok(); }) .onCancel(() => { if (cancel) cancel(); }); }; const dialogMessageNotify = ( q: any, desc?: string, // ถ้ามี cancel action ใส่เป็น null cancel?: Function ) => { q.dialog({ component: CustomComponent, componentProps: { title: "ข้อความแจ้งเตือน", message: desc && desc != null ? desc : "กรุณากรอกข้อมูลให้ครบ", icon: "warning", color: "orange", textOk: "ตกลง", onlycancel: true, }, }).onCancel(() => { if (cancel) cancel(); }); }; //*** END Dialog ***// const showLoader = () => { Loading.show({ spinner: QSpinnerCube, spinnerSize: 140, spinnerColor: "primary", backgroundColor: "white", }); }; const hideLoader = () => { Loading.hide(); }; function modalDelete( q: any, title: string, message: string, ok: Function, cancel?: Function ) { q.dialog({ title: `${title}`, message: `${message}`, cancel: { flat: true, color: "grey-14", }, ok: { color: "red-6", }, focus: "none", persistent: true, html: true, }) .onOk(() => { ok(); }) .onCancel(() => { if (cancel != undefined) cancel(); }) .onDismiss(() => {}); } function modalConfirm( q: any, title: string, message: string, ok: Function, cancel?: Function ) { q.dialog({ title: `${title}`, message: `${message}`, cancel: { flat: true, color: "grey", }, ok: { color: "primary", }, focus: "none", persistent: true, html: true, }) .onOk(() => { ok(); }) .onCancel(() => { if (cancel != undefined) cancel(); }) .onDismiss(() => {}); } function modalWarning(q: any, title: string, message: string, ok?: Function) { // q.dialog({ // title: `${title}`, // message: `${message}`, // ok: { // push: true, // color: "primary", // }, // focus: "none", // persistent: true, // html: true, // }) // .onOk(() => { // if (ok != undefined) ok(); // }) // .onCancel(() => {}) // .onDismiss(() => {}); q.dialog({ component: CustomComponent, componentProps: { title: title, message: message, icon: "warning", color: "warning", onlycancel: true, }, }); } function modalError(q: any, title: string, message: string, ok?: Function) { // q.dialog({ // title: `${title}`, // message: `${message}`, // ok: { // push: true, // color: "primary", // }, // focus: "none", // persistent: true, // html: true, // }) // .onOk(() => { // if (ok != undefined) ok(); // }) // .onCancel(() => {}) // .onDismiss(() => {}); q.dialog({ component: CustomComponent, componentProps: { title: title, message: message, icon: "warning", color: "red", onlycancel: true, }, }); } const dateText = (val: Date) => { if (val != null) { return date2Thai(val); } else { return "-"; } }; /** * แปลงช่วงวันที่ถ้า2ค่าเป็นวันเดียวกันจะโชววันเดียวแต่ถ้าไม่เท่ากันจะแสดงเป็นช่วง * @param val ช่วงวันที่ */ const dateThaiRange = (val: [Date, Date]) => { if (val === null) { return ""; } else if (date2Thai(val[0]) === date2Thai(val[1])) { return `${date2Thai(val[0])}`; } else { return `${date2Thai(val[0])} - ${date2Thai(val[1])}`; } }; const weekThai = (val: Number) => { switch (val) { case 0: return "วันอาทิตย์"; case 1: return "วันจันทร์"; case 2: return "วันอังคาร"; case 3: return "วันพุธ"; case 4: return "วันพฤหัสบดี"; case 5: return "วันศุกร์"; case 6: return "วันเสาร์"; default: return "-"; } }; const genColor15 = (val: number) => { val = val % 15; switch (val) { case 1: return "pink"; case 2: return "purple"; case 3: return "deep-purple"; case 4: return "indigo"; case 5: return "blue"; case 6: return "light-blue"; case 7: return "cyan"; case 8: return "teal"; case 9: return "green"; case 10: return "light-green"; case 11: return "amber"; case 12: return "orange"; case 13: return "deep-orange"; case 14: return "brown"; case 0: return "blue-grey"; default: return ""; } }; const typeCategoryExam = (val: string) => { switch (val) { case "hygiene": return "สำนักอนามัย"; case "physician": return "สำนักการแพทย์"; case "city": return "สำนักผังเมือง"; case "culture": return "สำนักวัฒนธรรม กีฬา และการท่องเที่ยว"; default: return "-"; } }; const typeRetire = (val: string) => { switch (val) { case "retire": return "เกษียณอายุราชการ"; case "resign": return "ลาออก"; case "transfer": return "ให้โอน"; case "death": return "ถึงแก่กรรม"; case "layoff": return "ให้ออก"; case "discharge": return "ปลดออก"; case "dismiss": return "ไล่ออก"; case "other": return "อื่นๆ"; default: return "-"; } }; const typeChangeName = (val: string) => { switch (val) { case "prefix": return "เปลี่ยนคำนำหน้าชื่อ"; case "firstName": return "เปลี่ยนชื่อ"; case "lastName": return "เปลี่ยนนามสกุล"; case "all": return "เปลี่ยนคำนำหน้าชื่อ, ชื่อ-นามสกุล"; case "firstNameLastName": return "เปลี่ยนชื่อ-นามสกุล"; case "prefixAndlastName": return "เปลี่ยนคำนำหน้าชื่อ และนามสกุล"; default: return "-"; } }; const statusLeave = (val: string) => { switch (val) { case "waitting": return "รออนุมัติ"; case "reject": return "ไม่ผ่านการอนุมัติ"; case "approve": return "ผ่านการอนุมัติ"; case "cancel": return "ยกเลิก"; default: return "-"; } }; /** * ฟังก์ชั่นคำนวนจำนวน ปี เดือน วัน * @param startDate วันเริ่มต้น format MM-DD-YYYY" * @param endDate วันสิ้นสุด format MM-DD-YYYY" * @returns ผลการคำนวน ปี เดือน วัน ในรูปแบบ 1 ปี 10 เดือน 5 วัน */ function calculateDurationYmd(startDate: any, endDate: any) { if (startDate && endDate) { const start = new Date(startDate); const end = new Date(endDate); //Get the Timestamp const date1_time_stamp = start.getTime(); const date2_time_stamp = end.getTime(); let calc; //Check which timestamp is greater if (date1_time_stamp > date2_time_stamp) { calc = new Date(date1_time_stamp - date2_time_stamp); } else { calc = new Date(date2_time_stamp - date1_time_stamp); } //retrieve the date, month and year const calcFormatTmp = calc.getDate() + "-" + (calc.getMonth() + 1) + "-" + calc.getFullYear(); //Convert to an array and store const calcFormat = calcFormatTmp.split("-"); //Subtract each member of our array from the default date const days_passed = Number(Math.abs(Number(calcFormat[0]))); const months_passed = Number(Math.abs(Number(calcFormat[1])) - 1); const years_passed = Number(Math.abs(Number(calcFormat[2])) - 1970); //Set up custom text const yrsTxt = "ปี"; const mnthsTxt = "เดือน"; const daysTxt = "วัน"; //display result with custom text const result = (years_passed > 0 && (months_passed > 0 || days_passed > 0) ? years_passed + " " + yrsTxt + ", " : "") + (years_passed > 0 && months_passed == 0 && days_passed == 0 ? years_passed + " " + yrsTxt + " " : "") + (months_passed > 0 && days_passed > 0 ? months_passed + " " + mnthsTxt + ", " : "") + (months_passed > 0 && days_passed == 0 ? months_passed + " " + mnthsTxt + " " : "") + (days_passed > 0 ? days_passed + " " + daysTxt : ""); return result.trim(); } return ""; } function diffDay(startDate: any, endDate: any) { var d1 = moment(startDate); var d2 = moment(endDate); const daydiff = Math.ceil(moment.duration(d2.diff(d1)).asDays()); return daydiff; } function findOrgName(obj: any) { if (obj) { let name = obj.child4 != null && obj.child3 != null ? obj.child4 + "/" : obj.child4 != null ? obj.child4 : ""; name += obj.child3 != null && obj.child2 != null ? obj.child3 + "/" : obj.child3 !== null ? obj.child3 : ""; name += obj.child2 != null && obj.child1 != null ? obj.child2 + "/" : obj.child2 != null ? obj.child2 : ""; name += obj.child1 != null && obj.root != null ? obj.child1 + "/" : obj.child1 != null ? obj.child1 : ""; name += obj.root != null ? obj.root : ""; return name == "" ? "-" : name; } else { return ""; } } function findOrgNameOld(obj: any) { if (obj) { let name = obj.child4Old != null && obj.child3Old != null ? obj.child4Old + "/" : obj.child4Old != null ? obj.child4Old : ""; name += obj.child3Old != null && obj.child2Old != null ? obj.child3Old + "/" : obj.child3Old !== null ? obj.child3Old : ""; name += obj.child2Old != null && obj.child1Old != null ? obj.child2Old + "/" : obj.child2Old != null ? obj.child2Old : ""; name += obj.child1Old != null && obj.rootOld != null ? obj.child1Old + "/" : obj.child1Old != null ? obj.child1Old : ""; name += obj.rootOld != null ? obj.rootOld : ""; return name == "" ? "-" : name; } else { return ""; } } function findPosMasterNo(obj: any) { if (obj) { let shortName = (obj.child4ShortName != null ? obj.child4ShortName : obj.child3ShortName != null ? obj.child3ShortName : obj.child2ShortName != null ? obj.child2ShortName : obj.child1ShortName != null ? obj.child1ShortName : obj.rootShortName != null ? obj.rootShortName : "") + (obj.posMasterNo != null ? obj.posMasterNo : ""); return shortName == "" ? "-" : shortName; } else { return ""; } } function findPosMasterNoOld(obj: any) { if (obj) { let shortName = (obj.child4ShortNameOld != null ? obj.child4ShortNameOld : obj.child3ShortNameOld != null ? obj.child3ShortNameOld : obj.child2ShortNameOld != null ? obj.child2ShortNameOld : obj.child1ShortNameOld != null ? obj.child1ShortNameOld : obj.rootShortNameOld != null ? obj.rootShortNameOld : "") + (obj.posMasterNoOld != null ? obj.posMasterNoOld : ""); return shortName == "" ? "-" : shortName; } else { return ""; } } return { calAge, date2Thai, dateToISO, notify, notifyError, calAgeYear, dateText, monthYear2Thai, dateMonth2Thai, success, weekThai, genColor15, typeCategoryExam, textToPhone, textToFax, dateThaiRange, modalDelete, modalConfirm, modalError, dialogMessage, messageError, showLoader, hideLoader, typeRetire, typeChangeName, statusLeave, modalWarning, calculateDurationYmd, // common dialog dialogConfirm, dialogRemove, dialogMessageNotify, fails, convertDate, convertDateDisplay, diffDay, findOrgName, findOrgNameOld, findPosMasterNo, findPosMasterNoOld, }; });