419 lines
10 KiB
TypeScript
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
|
|
}
|
|
})
|