hrms-recruit/src/stores/mixin.ts
2023-03-22 12:01:49 +07:00

419 lines
10 KiB
TypeScript

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import moment from 'moment'
import type { DataDateMonthObject } from '@/modules/01_exam/interface/index/Main'
export const useCounterMixin = defineStore('mixin', () => {
/**
* ฟังก์ชันกลาง
*/
const calAge = (srcDate: Date, birthCal: Date = new Date(), eng: boolean = false) => {
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
}
const year = eng ? 'years' : 'ปี'
const month = eng ? 'months' : 'เดือน'
const day = eng ? 'days' : 'วัน'
return `${yearAge} ${year} ${monthAge} ${month} ${dateAge} ${day}`
}
function date2Thai(srcDate: Date, isFullMonth: boolean = false, isTime: boolean = false) {
const date = new Date(srcDate)
const isValidDate = Boolean(+date)
if (!isValidDate) return srcDate.toString()
if (isValidDate && date.getFullYear() < 1000) return srcDate.toString()
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().padStart(2, "0")
// dstTime = " " + H + ":" + M + ":" + S + " น."
dstTime = ' ' + H + ':' + M + ' น.'
}
return date.getDate().toString().padStart(2, '0') + ' ' + dstMonth + ' ' + dstYear + dstTime
}
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) {
return (
date.getFullYear() +
'-' +
appendLeadingZeroes(date.getMonth() + 1) +
'-' +
appendLeadingZeroes(date.getDate())
)
}
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: () => {} }]
})
}
}
function modalDelete(q: any, title: string, message: string, ok: Function, cancel?: Function) {
q.dialog({
title: `<span class="text-red">${title}</span>`,
message: `<span class="text-black">${message}</span>`,
cancel: {
flat: true,
color: 'grey-14'
},
ok: {
color: 'red-5'
},
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: `<span class="text-primary">${title}</span>`,
message: `<span class="text-black">${message}</span>`,
cancel: {
flat: true,
color: 'grey'
},
ok: {
color: 'primary'
},
focus: 'none',
persistent: true,
html: true
})
.onOk(() => {
ok()
})
.onCancel(() => {
if (cancel != undefined) cancel()
})
.onDismiss(() => {})
}
function modalError(q: any, title: string, message: string, ok?: Function) {
q.dialog({
title: `<span class="text-primary">${title}</span>`,
message: `<span class="text-black">${message}</span>`,
ok: {
push: true,
color: 'primary'
},
focus: 'none',
persistent: true,
html: true
})
.onOk(() => {
if (ok != undefined) ok()
})
.onCancel(() => {})
.onDismiss(() => {})
}
const dateText = (val: Date) => {
if (val != null) {
return date2Thai(val)
} else {
return '-'
}
}
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 ''
}
}
/**
* แปลงช่วงวันที่ถ้า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])}`
}
}
/**
* แปลงช่วงเดือนถ้า2ค่าเป็นวันเดียวกันจะโชววันเดียวแต่ถ้าไม่เท่ากันจะแสดงเป็นช่วง
* @param val ช่วงเดือน
*/
const monthThaiRange = (val: DataDateMonthObject[]) => {
if (val === null || val[0] === null || val[1] === null) {
return ''
} else if (
monthYear2Thai(val[0].month, val[0].year) === monthYear2Thai(val[1].month, val[1].year)
) {
return `${monthYear2Thai(val[0].month, val[0].year)}`
} else {
return `${monthYear2Thai(val[0].month, val[0].year)} - ${monthYear2Thai(
val[1].month,
val[1].year
)}`
}
}
return {
calAge,
date2Thai,
dateToISO,
notify,
notifyError,
dateText,
monthYear2Thai,
success,
weekThai,
genColor15,
textToPhone,
textToFax,
dateThaiRange,
monthThaiRange,
modalDelete,
modalConfirm,
modalError
}
})