ต่อ api เพิ่ม form การลา

This commit is contained in:
AnandaTon 2023-12-07 18:43:52 +07:00
parent 8b7d83e1d7
commit 26667a4d22
20 changed files with 1555 additions and 750 deletions

View file

@ -21,4 +21,5 @@ export default {
leaveUser: () => `${leave}/user`, leaveUser: () => `${leave}/user`,
leaveUserId: (id: string) => `${leave}/user/${id}`, leaveUserId: (id: string) => `${leave}/user/${id}`,
leaveProfile: () => `${leave}/user/profile`, leaveProfile: () => `${leave}/user/profile`,
leaveCheck: () => `${leave}/user/check`,
} }

View file

@ -1,12 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, watch, computed } from "vue" import { ref, reactive, watch, computed } from "vue"
import { useQuasar } from "quasar"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/SickForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/SickForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useQuasar } from "quasar"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, calculateDurationYmd, dialogConfirm } = mixin const router = useRouter()
const { date2Thai, dateToISO, dialogConfirm, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -22,7 +28,8 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataSick = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
@ -63,17 +70,18 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataSick.leaveWrote = props.data.leaveWrote
formData.leaveStartDate = props.data.leaveStartDate formDataSick.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataSick.leaveEndDate = props.data.leaveEndDate
formData.contractTel = props.data.contractTel formDataSick.contractTel = props.data.contractTel
formData.leaveTotal = props.data.leaveTotal formDataSick.leaveTotal = props.data.leaveTotal
formData.leaveNumber = props.data.leaveNumber formDataSick.leaveNumber = props.data.leaveNumber
formData.leaveDetail = props.data.leaveDetail formDataSick.leaveDetail = props.data.leaveDetail
formData.leaveDocument = props.data.leaveDocument formDataSick.leaveDocument = props.data.leaveDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
async function fileUploadDoc(files: any) { async function fileUploadDoc(files: any) {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -85,9 +93,9 @@ async function fileUploadDoc(files: any) {
* function เซทค leaveStartDate เเละ leaveEndDate * function เซทค leaveStartDate เเละ leaveEndDate
*/ */
function resetDate() { function resetDate() {
if (formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon") { if (formDataSick.halfDay === "half_day_morning" || formDataSick.halfDay === "half_day_afternoon") {
formData.leaveStartDate = null formDataSick.leaveStartDate = null
formData.leaveEndDate = null formDataSick.leaveEndDate = null
} }
console.log("testnull") console.log("testnull")
} }
@ -105,17 +113,58 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataSick.leaveDocument.slice(0, formDataSick.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataSick.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataSick.type)
formData.append("leaveStartDate", dateToISO(formDataSick.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataSick.leaveEndDate))
formData.append("leaveWrote", formDataSick.leaveWrote)
formData.append("leaveAddress", formDataSick.leaveAddress)
formData.append("leaveNumber", formDataSick.leaveNumber)
formData.append("leaveDetail", formDataSick.leaveDetail)
formData.append("leaveTotal", formDataSick.leaveTotal)
formData.append("leaveLast", formDataSick.leaveLast)
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
const isReadOnly = computed(() => { const isReadOnly = computed(() => {
const conditionHalfDay = formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon" const conditionHalfDay = formDataSick.halfDay === "half_day_morning" || formDataSick.halfDay === "half_day_afternoon"
if (conditionHalfDay) { if (conditionHalfDay) {
formData.leaveEndDate = formData.leaveStartDate // Set formData.leaveEndDate to null formDataSick.leaveEndDate = formDataSick.leaveStartDate // Set formDataSick.leaveEndDate to null
formData.leaveTotal = "0.5 วัน " formDataSick.leaveTotal = "0.5 วัน "
} else { } else {
formData.leaveTotal = null formDataSick.leaveTotal = null
} }
return conditionHalfDay return conditionHalfDay
}) })
@ -138,23 +187,23 @@ const isReadOnly = computed(() => {
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.leaveWrote" v-model="formDataSick.leaveWrote"
label="เขียนที่" label="เขียนที่"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<div class="col-12 col-md-4 col-sm-12"> <div class="col-12 col-md-4 col-sm-12">
<q-radio v-model="formData.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" /> <q-radio v-model="formDataSick.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" />
<q-radio v-model="formData.halfDay" val="half_day_morning" label="ลาครึ่งวันเช้า" checked-icon="task_alt" @update:model-value="resetDate" /> <q-radio v-model="formDataSick.halfDay" val="half_day_morning" label="ลาครึ่งวันเช้า" checked-icon="task_alt" @update:model-value="resetDate" />
<q-radio v-model="formData.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" @update:model-value="resetDate" /> <q-radio v-model="formDataSick.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" @update:model-value="resetDate" />
</div> </div>
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<datepicker <datepicker
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataSick.leaveStartDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -178,7 +227,7 @@ const isReadOnly = computed(() => {
:readonly="!edit" :readonly="!edit"
bg-color="white" bg-color="white"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataSick.leaveStartDate != null ? date2Thai(formDataSick.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -192,14 +241,14 @@ const isReadOnly = computed(() => {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataSick.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="isReadOnly" :readonly="isReadOnly"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataSick.leaveStartDate ? new Date(formDataSick.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -217,7 +266,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
:readonly="isReadOnly" :readonly="isReadOnly"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataSick.leaveEndDate != null ? date2Thai(formDataSick.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -234,7 +283,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataSick.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -245,7 +294,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveLastRef" ref="leaveLastRef"
for="leaveLastRef" for="leaveLastRef"
v-model="formData.leaveLast" v-model="formDataSick.leaveLast"
label="ลาครั้งสุดท้ายเมื่อวันที่" label="ลาครั้งสุดท้ายเมื่อวันที่"
readonly readonly
hide-bottom-space hide-bottom-space
@ -261,7 +310,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveNumberRef" ref="leaveNumberRef"
for="leaveNumberRef" for="leaveNumberRef"
v-model="formData.leaveNumber" v-model="formDataSick.leaveNumber"
mask="(###)-###-####" mask="(###)-###-####"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
@ -277,7 +326,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveAddressRef" ref="leaveAddressRef"
for="leaveAddressRef" for="leaveAddressRef"
v-model="formData.leaveAddress" v-model="formDataSick.leaveAddress"
label="ที่อยู่ที่ติดต่อได้ระหว่างลา" label="ที่อยู่ที่ติดต่อได้ระหว่างลา"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]"
@ -293,7 +342,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataSick.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
bg-color="white" bg-color="white"
@ -303,7 +352,7 @@ const isReadOnly = computed(() => {
<q-file <q-file
ref="leaveDocumentRef" ref="leaveDocumentRef"
for="leaveDocumentRef" for="leaveDocumentRef"
v-model="formData.leaveDocument" v-model="formDataSick.leaveDocument"
@added="fileUploadDoc" @added="fileUploadDoc"
dense dense
label="เอกสารประกอบ" label="เอกสารประกอบ"
@ -326,7 +375,7 @@ const isReadOnly = computed(() => {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataSick.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}

View file

@ -1,10 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, watch } from "vue" import { ref, reactive, watch } from "vue"
import { useQuasar } from "quasar"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/BirthForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/BirthForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, calculateDurationYmd } = mixin const router = useRouter()
const $q = useQuasar()
const { date2Thai, dateToISO, dialogConfirm, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -20,7 +28,8 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataBirth = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
@ -57,16 +66,17 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataBirth.leaveWrote = props.data.leaveWrote
formData.leaveStartDate = props.data.leaveStartDate formDataBirth.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataBirth.leaveEndDate = props.data.leaveEndDate
formData.leaveTotal = props.data.leaveTotal formDataBirth.leaveTotal = props.data.leaveTotal
formData.leaveNumber = props.data.leaveNumber formDataBirth.leaveNumber = props.data.leaveNumber
formData.leaveDetail = props.data.leaveDetail formDataBirth.leaveDetail = props.data.leaveDetail
formData.leaveDocument = props.data.leaveDocument formDataBirth.leaveDocument = props.data.leaveDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
async function fileUploadDoc(files: any) { async function fileUploadDoc(files: any) {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -87,9 +97,51 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataBirth.leaveDocument.slice(0, formDataBirth.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataBirth.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataBirth.type)
formData.append("leaveStartDate", dateToISO(formDataBirth.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataBirth.leaveEndDate))
formData.append("leaveWrote", formDataBirth.leaveWrote)
formData.append("leaveAddress", formDataBirth.leaveAddress)
formData.append("leaveNumber", formDataBirth.leaveNumber)
formData.append("leaveDetail", formDataBirth.leaveDetail)
formData.append("leaveLast", formDataBirth.leaveLast)
formData.append("leaveTotal", formDataBirth.leaveTotal)
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
</script> </script>
<!-- ฟอรมลาคลอดบตร--> <!-- ฟอรมลาคลอดบตร-->
@ -107,7 +159,7 @@ function onValidate() {
for="leaveWroteRef" for="leaveWroteRef"
dense dense
outlined outlined
v-model="formData.leaveWrote" v-model="formDataBirth.leaveWrote"
label="เขียนที่" label="เขียนที่"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
@ -118,7 +170,7 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-12" class="col-12 col-md-3 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataBirth.leaveStartDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
@ -143,7 +195,7 @@ function onValidate() {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataBirth.leaveStartDate != null ? date2Thai(formDataBirth.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -157,15 +209,15 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-12" class="col-12 col-md-3 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataBirth.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
hide-bottom-space hide-bottom-space
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="!formData.leaveStartDate" :readonly="!formDataBirth.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataBirth.leaveStartDate ? new Date(formDataBirth.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -181,9 +233,9 @@ function onValidate() {
for="leaveEndDateRef" for="leaveEndDateRef"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
:readonly="!formData.leaveStartDate" :readonly="!formDataBirth.leaveStartDate"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataBirth.leaveEndDate != null ? date2Thai(formDataBirth.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -199,7 +251,7 @@ function onValidate() {
outlined outlined
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataBirth.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
bg-color="white" bg-color="white"
readonly readonly
@ -211,7 +263,7 @@ function onValidate() {
outlined outlined
ref="leaveLastRef" ref="leaveLastRef"
for="leaveLastRef" for="leaveLastRef"
v-model="formData.leaveLast" v-model="formDataBirth.leaveLast"
label="ลาครั้งสุดท้ายเมื่อวันที่" label="ลาครั้งสุดท้ายเมื่อวันที่"
readonly readonly
hide-bottom-space hide-bottom-space
@ -227,7 +279,7 @@ function onValidate() {
bg-color="white" bg-color="white"
ref="leaveNumberRef" ref="leaveNumberRef"
for="leaveNumberRef" for="leaveNumberRef"
v-model="formData.leaveNumber" v-model="formDataBirth.leaveNumber"
mask="(###)-###-####" mask="(###)-###-####"
unmasked-value unmasked-value
label="หมายเลขโทรศัพท์ที่ติดต่อได้" label="หมายเลขโทรศัพท์ที่ติดต่อได้"
@ -243,7 +295,7 @@ function onValidate() {
bg-color="white" bg-color="white"
ref="leaveAddressRef" ref="leaveAddressRef"
for="leaveAddressRef" for="leaveAddressRef"
v-model="formData.leaveAddress" v-model="formDataBirth.leaveAddress"
label="ที่อยู่ที่ติดต่อได้ระหว่างลา" label="ที่อยู่ที่ติดต่อได้ระหว่างลา"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]"
@ -258,7 +310,7 @@ function onValidate() {
bg-color="white" bg-color="white"
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataBirth.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
@ -267,7 +319,7 @@ function onValidate() {
ref="leaveDocumentRef" ref="leaveDocumentRef"
for="leaveDocumentRef" for="leaveDocumentRef"
hide-bottom-space hide-bottom-space
v-model="formData.leaveDocument" v-model="formDataBirth.leaveDocument"
@added="fileUploadDoc" @added="fileUploadDoc"
dense dense
bg-color="white" bg-color="white"
@ -289,7 +341,7 @@ function onValidate() {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataBirth.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}

View file

@ -2,9 +2,17 @@
import { ref, reactive, watch } from "vue" import { ref, reactive, watch } from "vue"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/HelpWifeForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/HelpWifeForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useQuasar } from "quasar"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, calculateDurationYmd } = mixin const router = useRouter()
const $q = useQuasar()
const { date2Thai, calculateDurationYmd, dateToISO, dialogConfirm, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -20,13 +28,13 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataHelpWife = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
wifeDayName: "", wifeDayName: "",
wifeDayDateBorn: null, wifeDayDateBorn: null,
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
contractTel: "",
leaveTotal: "", leaveTotal: "",
leaveNumber: "", leaveNumber: "",
leaveAddress: "", leaveAddress: "",
@ -40,7 +48,6 @@ const wifeDayNameRef = ref<object | null>(null)
const wifeDayDateBornRef = ref<object | null>(null) const wifeDayDateBornRef = ref<object | null>(null)
const leaveStartDateRef = ref<object | null>(null) const leaveStartDateRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const contractTelRef = ref<object | null>(null)
const leaveTotalRef = ref<object | null>(null) const leaveTotalRef = ref<object | null>(null)
const leaveNumberRef = ref<object | null>(null) const leaveNumberRef = ref<object | null>(null)
const leaveAddressRef = ref<object | null>(null) const leaveAddressRef = ref<object | null>(null)
@ -64,18 +71,19 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataHelpWife.leaveWrote = props.data.leaveWrote
formData.wifeDayName = props.data.wifeDayName formDataHelpWife.wifeDayName = props.data.wifeDayName
formData.wifeDayDateBorn = props.data.wifeDayDateBorn formDataHelpWife.wifeDayDateBorn = props.data.wifeDayDateBorn
formData.leaveStartDate = props.data.leaveStartDate formDataHelpWife.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataHelpWife.leaveEndDate = props.data.leaveEndDate
formData.leaveTotal = props.data.leaveTotal formDataHelpWife.leaveTotal = props.data.leaveTotal
formData.leaveNumber = props.data.leaveNumber formDataHelpWife.leaveNumber = props.data.leaveNumber
formData.leaveDetail = props.data.leaveDetail formDataHelpWife.leaveDetail = props.data.leaveDetail
formData.leaveDocument = props.data.leaveDocument formDataHelpWife.leaveDocument = props.data.leaveDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => { const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -96,7 +104,7 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
@ -104,10 +112,53 @@ function onValidate() {
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataHelpWife.leaveStartDate, formDataHelpWife.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataHelpWife.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataHelpWife.leaveDocument.slice(0, formDataHelpWife.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataHelpWife.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataHelpWife.type)
formData.append("leaveStartDate", dateToISO(formDataHelpWife.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataHelpWife.leaveEndDate))
formData.append("leaveWrote", formDataHelpWife.leaveWrote)
formData.append("leaveAddress", formDataHelpWife.leaveAddress)
formData.append("leaveNumber", formDataHelpWife.leaveNumber)
formData.append("leaveDetail", formDataHelpWife.leaveDetail)
formData.append("leaveTotal", formDataHelpWife.leaveTotal)
formData.append("wifeDayName", formDataHelpWife.wifeDayName)
formData.append("wifeDayDateBorn", dateToISO(formDataHelpWife.wifeDayDateBorn))
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
</script> </script>
<template> <template>
@ -142,7 +193,7 @@ function updateLeaveTotal() {
outlined outlined
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
v-model="formData.leaveWrote" v-model="formDataHelpWife.leaveWrote"
label="เขียนที่" label="เขียนที่"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
@ -150,7 +201,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-12" class="col-12 col-md-4 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataHelpWife.leaveStartDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
@ -175,7 +226,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataHelpWife.leaveStartDate != null ? date2Thai(formDataHelpWife.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -189,7 +240,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-12" class="col-12 col-md-4 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataHelpWife.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -197,8 +248,8 @@ function updateLeaveTotal() {
:enableTimePicker="false" :enableTimePicker="false"
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
week-start="0" week-start="0"
:readonly="!formData.leaveStartDate" :readonly="!formDataHelpWife.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataHelpWife.leaveStartDate ? new Date(formDataHelpWife.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -214,9 +265,9 @@ function updateLeaveTotal() {
for="leaveEndDateRef" for="leaveEndDateRef"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
:readonly="!formData.leaveStartDate" :readonly="!formDataHelpWife.leaveStartDate"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataHelpWife.leaveEndDate != null ? date2Thai(formDataHelpWife.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -232,7 +283,7 @@ function updateLeaveTotal() {
outlined outlined
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataHelpWife.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -247,7 +298,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
outlined outlined
hide-bottom-space hide-bottom-space
v-model="formData.wifeDayName" v-model="formDataHelpWife.wifeDayName"
label="ชื่อภรรยา" label="ชื่อภรรยา"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'ชื่อภรรยา'}`]" :rules="[val => !!val || `${'ชื่อภรรยา'}`]"
@ -257,7 +308,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-12" class="col-12 col-md-4 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.wifeDayDateBorn" v-model="formDataHelpWife.wifeDayDateBorn"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -282,7 +333,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.wifeDayDateBorn != null ? date2Thai(formData.wifeDayDateBorn) : null" :model-value="formDataHelpWife.wifeDayDateBorn != null ? date2Thai(formDataHelpWife.wifeDayDateBorn) : null"
:label="`${'วันที่คลอด'}`" :label="`${'วันที่คลอด'}`"
:rules="[val => !!val || `${'กรุณาเลือกวันที่คลอด'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันที่คลอด'}`]"
> >
@ -300,7 +351,7 @@ function updateLeaveTotal() {
outlined outlined
ref="leaveNumberRef" ref="leaveNumberRef"
for="leaveNumberRef" for="leaveNumberRef"
v-model="formData.leaveNumber" v-model="formDataHelpWife.leaveNumber"
mask="(###)-###-####" mask="(###)-###-####"
unmasked-value unmasked-value
hide-bottom-space hide-bottom-space
@ -318,7 +369,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
ref="leaveAddressRef" ref="leaveAddressRef"
for="leaveAddressRef" for="leaveAddressRef"
v-model="formData.leaveAddress" v-model="formDataHelpWife.leaveAddress"
label="ที่อยู่ที่ติดต่อได้ระหว่างลา" label="ที่อยู่ที่ติดต่อได้ระหว่างลา"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]"
@ -334,12 +385,23 @@ function updateLeaveTotal() {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataHelpWife.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
<q-file bg-color="white" ref="leaveDocumentRef" v-model="formData.leaveDocument" @added="fileUploadDoc" dense label="เอกสารประกอบ" outlined use-chips multiple class="q-pl-sm col-12"> <q-file
bg-color="white"
ref="leaveDocumentRef"
v-model="formDataHelpWife.leaveDocument"
@added="fileUploadDoc"
dense
label="เอกสารประกอบ"
outlined
use-chips
multiple
class="q-pl-sm col-12"
>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -351,7 +413,7 @@ function updateLeaveTotal() {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataHelpWife.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}

View file

@ -2,9 +2,17 @@
import { ref, reactive, watch, computed } from "vue" import { ref, reactive, watch, computed } from "vue"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/VacationForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/VacationForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useQuasar } from "quasar"
import { useRouter } from "vue-router"
const $q = useQuasar()
const dataStore = useLeaveStore()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, calculateDurationYmd } = mixin const router = useRouter()
const { date2Thai, dateToISO, dialogConfirm, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -20,14 +28,14 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataVacation = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
halfDay: "day", halfDay: "day",
restDayOldTotal: "", restDayOldTotal: "",
restDayCurrentTotal: "", restDayCurrentTotal: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
contractTel: "",
leaveTotal: "", leaveTotal: "",
leaveNumber: "", leaveNumber: "",
leaveAddress: "", leaveAddress: "",
@ -42,7 +50,6 @@ const restDayCurrentTotalRef = ref<object | null>(null)
const halfDayRef = ref<object | null>(null) const halfDayRef = ref<object | null>(null)
const leaveStartDateRef = ref<object | null>(null) const leaveStartDateRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const contractTelRef = ref<object | null>(null)
const leaveTotalRef = ref<object | null>(null) const leaveTotalRef = ref<object | null>(null)
const leaveNumberRef = ref<object | null>(null) const leaveNumberRef = ref<object | null>(null)
const leaveAddressRef = ref<object | null>(null) const leaveAddressRef = ref<object | null>(null)
@ -57,7 +64,6 @@ const FormRef: FormRef = {
restDayCurrentTotal: restDayCurrentTotalRef, restDayCurrentTotal: restDayCurrentTotalRef,
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
leaveEndDate: leaveEndDateRef, leaveEndDate: leaveEndDateRef,
contractTel: contractTelRef,
leaveTotal: leaveTotalRef, leaveTotal: leaveTotalRef,
leaveNumber: leaveNumberRef, leaveNumber: leaveNumberRef,
leaveAddress: leaveAddressRef, leaveAddress: leaveAddressRef,
@ -68,19 +74,19 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataVacation.leaveWrote = props.data.leaveWrote
formData.restDayOldTotal = props.data.restDayOldTotal formDataVacation.restDayOldTotal = props.data.restDayOldTotal
formData.restDayCurrentTotal = props.data.restDayCurrentTotal formDataVacation.restDayCurrentTotal = props.data.restDayCurrentTotal
formData.leaveStartDate = props.data.leaveStartDate formDataVacation.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataVacation.leaveEndDate = props.data.leaveEndDate
formData.contractTel = props.data.contractTel formDataVacation.leaveTotal = props.data.leaveTotal
formData.leaveTotal = props.data.leaveTotal formDataVacation.leaveNumber = props.data.leaveNumber
formData.leaveNumber = props.data.leaveNumber formDataVacation.leaveDetail = props.data.leaveDetail
formData.leaveDetail = props.data.leaveDetail formDataVacation.leaveDocument = props.data.leaveDocument
formData.leaveDocument = props.data.leaveDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => { const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -101,28 +107,71 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataVacation.leaveDocument.slice(0, formDataVacation.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataVacation.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataVacation.type)
formData.append("leaveStartDate", dateToISO(formDataVacation.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataVacation.leaveEndDate))
formData.append("leaveWrote", formDataVacation.leaveWrote)
formData.append("leaveAddress", formDataVacation.leaveAddress)
formData.append("leaveNumber", formDataVacation.leaveNumber)
formData.append("leaveDetail", formDataVacation.leaveDetail)
formData.append("restDayOldTotal", formDataVacation.restDayOldTotal)
formData.append("restDayCurrentTotal", formDataVacation.restDayCurrentTotal)
formData.append("leaveTotal", formDataVacation.leaveTotal)
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function เซทค leaveStartDate เเละ leaveEndDate * function เซทค leaveStartDate เเละ leaveEndDate
*/ */
function resetDate() { function resetDate() {
if (formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon") { if (formDataVacation.halfDay === "half_day_morning" || formDataVacation.halfDay === "half_day_afternoon") {
formData.leaveStartDate = null formDataVacation.leaveStartDate = null
formData.leaveEndDate = null formDataVacation.leaveEndDate = null
} }
console.log("testnull") console.log("testnull")
} }
const isReadOnly = computed(() => { const isReadOnly = computed(() => {
const conditionHalfDay = formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon" const conditionHalfDay = formDataVacation.halfDay === "half_day_morning" || formDataVacation.halfDay === "half_day_afternoon"
if (conditionHalfDay) { if (conditionHalfDay) {
formData.leaveEndDate = formData.leaveStartDate // Set formData.leaveEndDate to null formDataVacation.leaveEndDate = formDataVacation.leaveStartDate // Set formDataVacation.leaveEndDate to null
formData.leaveTotal = "0.5 วัน " formDataVacation.leaveTotal = "0.5 วัน "
} else { } else {
formData.leaveTotal = null formDataVacation.leaveTotal = null
} }
return conditionHalfDay return conditionHalfDay
}) })
@ -144,15 +193,15 @@ const isReadOnly = computed(() => {
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.leaveWrote" v-model="formDataVacation.leaveWrote"
label="เขียนที่" label="เขียนที่"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<div class="col-12 col-md-4 col-sm-6"> <div class="col-12 col-md-4 col-sm-6">
<q-radio v-model="formData.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" /> <q-radio v-model="formDataVacation.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" />
<q-radio v-model="formData.halfDay" val="half_day_morning" label="ลาครึ่งวันเช้า" checked-icon="task_alt" @update:model-value="resetDate" /> <q-radio v-model="formDataVacation.halfDay" val="half_day_morning" label="ลาครึ่งวันเช้า" checked-icon="task_alt" @update:model-value="resetDate" />
<q-radio v-model="formData.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" @update:model-value="resetDate" /> <q-radio v-model="formDataVacation.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" @update:model-value="resetDate" />
</div> </div>
<q-input <q-input
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
@ -163,7 +212,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
readonly readonly
outlined outlined
v-model="formData.restDayOldTotal" v-model="formDataVacation.restDayOldTotal"
label="จำนวนวันลาพักผ่อนสะสม จากปีที่ผ่านมา" label="จำนวนวันลาพักผ่อนสะสม จากปีที่ผ่านมา"
/> />
@ -176,14 +225,14 @@ const isReadOnly = computed(() => {
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.restDayCurrentTotal" v-model="formDataVacation.restDayCurrentTotal"
label="จำนวนวันลาพักผ่อนประจำปีปัจจุบัน" label="จำนวนวันลาพักผ่อนประจำปีปัจจุบัน"
/> />
<datepicker <datepicker
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataVacation.leaveStartDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
@ -208,7 +257,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataVacation.leaveStartDate != null ? date2Thai(formDataVacation.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -222,7 +271,7 @@ const isReadOnly = computed(() => {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataVacation.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
@ -230,7 +279,7 @@ const isReadOnly = computed(() => {
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="isReadOnly" :readonly="isReadOnly"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataVacation.leaveStartDate ? new Date(formDataVacation.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -248,7 +297,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
class="full-width datepicker" class="full-width datepicker"
:readonly="isReadOnly" :readonly="isReadOnly"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataVacation.leaveEndDate != null ? date2Thai(formDataVacation.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -265,7 +314,7 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataVacation.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -280,7 +329,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
ref="leaveNumberRef" ref="leaveNumberRef"
for="leaveNumberRef" for="leaveNumberRef"
v-model="formData.leaveNumber" v-model="formDataVacation.leaveNumber"
mask="(###)-###-####" mask="(###)-###-####"
unmasked-value unmasked-value
label="หมายเลขโทรศัพท์ที่ติดต่อได้" label="หมายเลขโทรศัพท์ที่ติดต่อได้"
@ -296,7 +345,7 @@ const isReadOnly = computed(() => {
bg-color="white" bg-color="white"
ref="leaveAddressRef" ref="leaveAddressRef"
for="leaveAddressRef" for="leaveAddressRef"
v-model="formData.leaveAddress" v-model="formDataVacation.leaveAddress"
label="ที่อยู่ที่ติดต่อได้ระหว่างลา" label="ที่อยู่ที่ติดต่อได้ระหว่างลา"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่ที่ติดต่อได้ระหว่างลา'}`]"
@ -312,12 +361,23 @@ const isReadOnly = computed(() => {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataVacation.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
<q-file ref="leaveDocumentRef" bg-color="white" v-model="formData.leaveDocument" @added="fileUploadDoc" dense label="เอกสารประกอบ" outlined use-chips multiple class="q-pl-sm col-12"> <q-file
ref="leaveDocumentRef"
bg-color="white"
v-model="formDataVacation.leaveDocument"
@added="fileUploadDoc"
dense
label="เอกสารประกอบ"
outlined
use-chips
multiple
class="q-pl-sm col-12"
>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -329,7 +389,7 @@ const isReadOnly = computed(() => {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataVacation.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}

View file

@ -3,10 +3,14 @@ import { reactive, ref, watch } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import type { OrdinationForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { OrdinationForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, calculateDurationYmd } = mixin const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const files = ref<any>(null) const files = ref<any>(null)
@ -26,8 +30,8 @@ const props = defineProps({
/** ตัวแปร ref สำหรับแสดง validate */ /** ตัวแปร ref สำหรับแสดง validate */
const ordainDayLocationNumberRef = ref<object | null>(null) const ordainDayLocationNumberRef = ref<object | null>(null)
const leaveWroteRef = ref<object | null>(null) const leaveWroteRef = ref<object | null>(null)
const birthdayRef = ref<object | null>(null) const leavebirthDateRef = ref<object | null>(null)
const governmentRef = ref<object | null>(null) const leavegovernmentDateRef = ref<object | null>(null)
const totalLeaveRef = ref<object | null>(null) const totalLeaveRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const ordainDayOrdinationRef = ref<object | null>(null) const ordainDayOrdinationRef = ref<object | null>(null)
@ -39,10 +43,11 @@ const ordainDayBuddhistLentNameRef = ref<object | null>(null)
const leaveDocumentRef = ref<object | null>(null) const leaveDocumentRef = ref<object | null>(null)
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataOrdination = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
government: new Date(), leavegovernmentDate: new Date(),
birthday: new Date(), leavebirthDate: new Date(),
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
totalLeave: new Date(), totalLeave: new Date(),
@ -52,15 +57,15 @@ const formData = reactive<any>({
ordainDayLocationAddress: "", ordainDayLocationAddress: "",
ordainDayBuddhistLentName: "", ordainDayBuddhistLentName: "",
ordainDayBuddhistLentAddress: "", ordainDayBuddhistLentAddress: "",
monk: "never", ordainDayStatus: "true",
leaveDocument: null, leaveDocument: null,
}) })
/** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */ /** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */
const formRef: OrdinationForm = { const formRef: OrdinationForm = {
leaveWrote: leaveWroteRef, leaveWrote: leaveWroteRef,
government: governmentRef, leavegovernmentDate: leavegovernmentDateRef,
birthday: birthdayRef, leavebirthDate: leavebirthDateRef,
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
leaveEndDate: leaveEndDateRef, leaveEndDate: leaveEndDateRef,
totalLeave: totalLeaveRef, totalLeave: totalLeaveRef,
@ -73,11 +78,20 @@ const formRef: OrdinationForm = {
leaveDocument: leaveDocumentRef, leaveDocument: leaveDocumentRef,
} }
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
// Watch for changes in leaveEndDate and update leaveTotal accordingly // Watch for changes in leaveEndDate and update leaveTotal accordingly
watch(formData.leaveEndDate, async () => { watch(formDataOrdination.leaveEndDate, async () => {
if (formData.leaveStartDate !== undefined && formData.leaveEndDate !== undefined) { if (formDataOrdination.leaveStartDate !== undefined && formDataOrdination.leaveEndDate !== undefined) {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataOrdination.leaveStartDate, formDataOrdination.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataOrdination.leaveTotal = newLeaveTotal
console.log(newLeaveTotal) console.log(newLeaveTotal)
} }
// Update the leaveTotal value // Update the leaveTotal value
@ -88,8 +102,8 @@ watch(formData.leaveEndDate, async () => {
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataOrdination.leaveStartDate, formDataOrdination.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataOrdination.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
@ -106,9 +120,56 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataOrdination.leaveDocument.slice(0, formDataOrdination.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataOrdination.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataOrdination.type)
formData.append("leaveStartDate", dateToISO(formDataOrdination.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataOrdination.leaveEndDate))
formData.append("ordainDayOrdination", dateToISO(formDataOrdination.ordainDayOrdination))
formData.append("ordainDayLocationName", formDataOrdination.ordainDayLocationName)
formData.append("ordainDayLocationNumber", formDataOrdination.ordainDayLocationNumber)
formData.append("ordainDayLocationAddress", formDataOrdination.ordainDayLocationAddress)
formData.append("ordainDayBuddhistLentName", formDataOrdination.ordainDayBuddhistLentName)
formData.append("ordainDayBuddhistLentAddress", formDataOrdination.ordainDayBuddhistLentAddress)
formData.append("ordainDayStatus", formDataOrdination.ordainDayStatus)
formData.append("leaveWrote", formDataOrdination.leaveWrote)
formData.append("leaveDetail", formDataOrdination.leaveDetail)
formData.append("leavebirthDate", dateToISO(formDataOrdination.leavebirthDate))
formData.append("leavegovernmentDate", dateToISO(formDataOrdination.leavegovernmentDate))
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
})
.catch((e: any) => {
messageError($q, e)
})
}
</script> </script>
<!-- ฟอร ลาอปสมบท --> <!-- ฟอร ลาอปสมบท -->
@ -127,12 +188,21 @@ function onValidate() {
outlined outlined
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
v-model="formData.leaveWrote" v-model="formDataOrdination.leaveWrote"
label="เขียนที่" label="เขียนที่"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<datepicker class="col-12 col-md-4 col-sm-6" menu-class-name="modalfix" v-model="formData.leaveStartDate" :locale="'th'" autoApply borderless :enableTimePicker="false" week-start="0"> <datepicker
class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix"
v-model="formDataOrdination.leaveStartDate"
:locale="'th'"
autoApply
borderless
:enableTimePicker="false"
week-start="0"
>
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
</template> </template>
@ -147,7 +217,7 @@ function onValidate() {
ref="leaveStartDateRef" ref="leaveStartDateRef"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataOrdination.leaveStartDate != null ? date2Thai(formDataOrdination.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -161,14 +231,14 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataOrdination.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
:readonly="!formData.leaveStartDate" :readonly="!formDataOrdination.leaveStartDate"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataOrdination.leaveStartDate ? new Date(formDataOrdination.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
week-start="0" week-start="0"
> >
<template #year="{ year }"> <template #year="{ year }">
@ -185,9 +255,9 @@ function onValidate() {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataOrdination.leaveEndDate != null ? date2Thai(formDataOrdination.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:readonly="!formData.leaveStartDate" :readonly="!formDataOrdination.leaveStartDate"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -203,7 +273,7 @@ function onValidate() {
bg-color="white" bg-color="white"
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataOrdination.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -213,7 +283,7 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.government" v-model="formDataOrdination.leavegovernmentDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -230,13 +300,13 @@ function onValidate() {
<template #trigger> <template #trigger>
<q-input <q-input
outlined outlined
ref="governmentRef" ref="leavegovernmentDateRef"
dense dense
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
readonly readonly
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.government != null ? date2Thai(formData.government) : null" :model-value="formDataOrdination.leavegovernmentDate != null ? date2Thai(formDataOrdination.leavegovernmentDate) : null"
:label="`${'วันที่เข้ารับราชการ'}`" :label="`${'วันที่เข้ารับราชการ'}`"
:rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]"
> >
@ -250,7 +320,7 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.birthday" v-model="formDataOrdination.leavebirthDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -267,13 +337,13 @@ function onValidate() {
<template #trigger> <template #trigger>
<q-input <q-input
outlined outlined
ref="birthdayRef" ref="leavebirthDateRef"
dense dense
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
readonly readonly
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.birthday != null ? date2Thai(formData.birthday) : null" :model-value="formDataOrdination.leavebirthDate != null ? date2Thai(formDataOrdination.leavebirthDate) : null"
:label="`${'วันเดือนปีเกิด'}`" :label="`${'วันเดือนปีเกิด'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -288,15 +358,15 @@ function onValidate() {
<div class="q-pl-sm text-weight-bold text-dark col-12">เคยบวชหรอไม</div> <div class="q-pl-sm text-weight-bold text-dark col-12">เคยบวชหรอไม</div>
<div class="col-12"> <div class="col-12">
<q-radio v-model="formData.monk" val="ever" label="เคยบวช" checked-icon="task_alt " hide-bottom-space /> <q-radio v-model="formDataOrdination.ordainDayStatus" val="true" label="เคยบวช" checked-icon="task_alt " hide-bottom-space />
<q-radio v-model="formData.monk" val="never" label="ไม่เคยบวช" checked-icon="task_alt" hide-bottom-space /> <q-radio v-model="formDataOrdination.ordainDayStatus" val="false" label="ไม่เคยบวช" checked-icon="task_alt" hide-bottom-space />
</div> </div>
<div class="text-weight-bold text-dark col-12">สถานทบวช</div> <div class="text-weight-bold text-dark col-12">สถานทบวช</div>
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.ordainDayOrdination" v-model="formDataOrdination.ordainDayOrdination"
:locale="'th'" :locale="'th'"
autoApply autoApply
full-width full-width
@ -319,7 +389,7 @@ function onValidate() {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.ordainDayOrdination != null ? date2Thai(formData.ordainDayOrdination) : null" :model-value="formDataOrdination.ordainDayOrdination != null ? date2Thai(formDataOrdination.ordainDayOrdination) : null"
:label="`${'วันอุปสมบท'}`" :label="`${'วันอุปสมบท'}`"
:rules="[val => !!val || `${'กรุณาเลือกวันอุปสมบท'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันอุปสมบท'}`]"
> >
@ -338,7 +408,7 @@ function onValidate() {
bg-color="white" bg-color="white"
outlined outlined
full-width full-width
v-model="formData.ordainDayLocationName" v-model="formDataOrdination.ordainDayLocationName"
label="ชื่อวัด" label="ชื่อวัด"
:rules="[val => !!val || `${'กรุณากรอกชื่อวัด'}`]" :rules="[val => !!val || `${'กรุณากรอกชื่อวัด'}`]"
/> />
@ -349,7 +419,7 @@ function onValidate() {
dense dense
full-width full-width
outlined outlined
v-model="formData.ordainDayLocationNumber" v-model="formDataOrdination.ordainDayLocationNumber"
bg-color="white" bg-color="white"
mask="(###)-###-####" mask="(###)-###-####"
unmasked-value unmasked-value
@ -364,7 +434,7 @@ function onValidate() {
bg-color="white" bg-color="white"
outlined outlined
hide-bottom-space hide-bottom-space
v-model="formData.ordainDayLocationAddress" v-model="formDataOrdination.ordainDayLocationAddress"
label="ที่อยู่" label="ที่อยู่"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่'}`]"
type="textarea" type="textarea"
@ -378,7 +448,7 @@ function onValidate() {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
outlined outlined
v-model="formData.ordainDayBuddhistLentName" v-model="formDataOrdination.ordainDayBuddhistLentName"
label="ชื่อวัด" label="ชื่อวัด"
:rules="[val => !!val || `${'กรุณากรอกชื่อวัด'}`]" :rules="[val => !!val || `${'กรุณากรอกชื่อวัด'}`]"
/> />
@ -389,7 +459,7 @@ function onValidate() {
ref="ordainDayBuddhistLentAddressRef" ref="ordainDayBuddhistLentAddressRef"
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.ordainDayBuddhistLentAddress" v-model="formDataOrdination.ordainDayBuddhistLentAddress"
label="ที่อยู่" label="ที่อยู่"
:rules="[val => !!val || `${'กรุณากรอกที่อยู่'}`]" :rules="[val => !!val || `${'กรุณากรอกที่อยู่'}`]"
type="textarea" type="textarea"
@ -403,13 +473,13 @@ function onValidate() {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataOrdination.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file ref="leaveDocumentRef" v-model="formData.leaveDocument" dense label="เอกสารประกอบ" outlined bg-color="white" multiple> <q-file ref="leaveDocumentRef" v-model="formDataOrdination.leaveDocument" @added="fileUploadDoc" dense label="เอกสารประกอบ" outlined bg-color="white" multiple use-chips>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>

View file

@ -3,17 +3,23 @@ import { reactive, ref } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import type { HajiForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { HajiForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const router = useRouter()
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, calculateDurationYmd } = mixin const { date2Thai, dialogConfirm, calculateDurationYmd, messageError, success, dateToISO } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const files = ref<any>(null) const files = ref<any>(null)
/** ตัวแปร ref สำหรับแสดง validate */ /** ตัวแปร ref สำหรับแสดง validate */
const leaveWroteRef = ref<object | null>(null) const leaveWroteRef = ref<object | null>(null)
const governmentRef = ref<object | null>(null) const leavegovernmentDateRef = ref<object | null>(null)
const leaveStartDateRef = ref<object | null>(null) const leaveStartDateRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const leaveDocumentRef = ref<object | null>(null) const leaveDocumentRef = ref<object | null>(null)
@ -30,25 +36,35 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataHaji = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
government: new Date(), leavegovernmentDate: new Date(),
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
totalLeave: new Date(), totalLeave: new Date(),
hajjDayStatus: "never", hajjDayStatus: "true",
leaveDocument: null, leaveDocument: null,
}) })
/** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */ /** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */
const formRef: HajiForm = { const formRef: HajiForm = {
leaveWrote: leaveWroteRef, leaveWrote: leaveWroteRef,
government: governmentRef, leavegovernmentDate: leavegovernmentDateRef,
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
leaveEndDate: leaveEndDateRef, leaveEndDate: leaveEndDateRef,
leaveDocument: leaveDocumentRef, leaveDocument: leaveDocumentRef,
} }
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
/** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */ /** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */
function onValidate() { function onValidate() {
const hasError = [] const hasError = []
@ -62,15 +78,57 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataHaji.leaveDocument.slice(0, formDataHaji.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataHaji.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataHaji.type)
formData.append("leaveStartDate", dateToISO(formDataHaji.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataHaji.leaveEndDate))
formData.append("hajjDayStatus", formDataHaji.hajjDayStatus)
formData.append("leaveWrote", formDataHaji.leaveWrote)
formData.append("leaveDetail", formDataHaji.leaveDetail)
formData.append("leavegovernmentDate", dateToISO(formDataHaji.leavegovernmentDate))
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataHaji.leaveStartDate, formDataHaji.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataHaji.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
</script> </script>
@ -84,7 +142,7 @@ function updateLeaveTotal() {
<q-card bordered class="q-pa-md bg-grey-1"> <q-card bordered class="q-pa-md bg-grey-1">
<div class="row q-pa-sm q-col-gutter-sm"> <div class="row q-pa-sm q-col-gutter-sm">
<q-input <q-input
v-model="formData.leaveWrote" v-model="formDataHaji.leaveWrote"
ref="leaveWroteRef" ref="leaveWroteRef"
class="col-12 col-sm-12" class="col-12 col-sm-12"
bg-color="white" bg-color="white"
@ -98,7 +156,7 @@ function updateLeaveTotal() {
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<datepicker <datepicker
v-model="formData.leaveStartDate" v-model="formDataHaji.leaveStartDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -123,7 +181,7 @@ function updateLeaveTotal() {
hide-bottom-space hide-bottom-space
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataHaji.leaveStartDate != null ? date2Thai(formDataHaji.leaveStartDate) : null"
> >
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="event" class="cursor-pointer" style="color: var(--q-primary)"> </q-icon> <q-icon name="event" class="cursor-pointer" style="color: var(--q-primary)"> </q-icon>
@ -133,7 +191,7 @@ function updateLeaveTotal() {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.leaveEndDate" v-model="formDataHaji.leaveEndDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -142,8 +200,8 @@ function updateLeaveTotal() {
:enableTimePicker="false" :enableTimePicker="false"
:locale="'th'" :locale="'th'"
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
:readonly="!formData.leaveStartDate" :readonly="!formDataHaji.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataHaji.leaveStartDate ? new Date(formDataHaji.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -158,10 +216,10 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
outlined outlined
dense dense
:readonly="!formData.leaveStartDate" :readonly="!formDataHaji.leaveStartDate"
hide-bottom-space hide-bottom-space
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataHaji.leaveEndDate != null ? date2Thai(formDataHaji.leaveEndDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -178,13 +236,13 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataHaji.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
/> />
<datepicker <datepicker
v-model="formData.government" v-model="formDataHaji.leavegovernmentDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -202,7 +260,7 @@ function updateLeaveTotal() {
</template> </template>
<template #trigger> <template #trigger>
<q-input <q-input
ref="governmentRef" ref="leavegovernmentDateRef"
bg-color="white" bg-color="white"
class="full-width datepicker" class="full-width datepicker"
outlined outlined
@ -210,7 +268,7 @@ function updateLeaveTotal() {
readonly readonly
hide-bottom-space hide-bottom-space
:label="`${'วันที่เข้ารับราชการ'}`" :label="`${'วันที่เข้ารับราชการ'}`"
:model-value="formData.government != null ? date2Thai(formData.government) : null" :model-value="formDataHaji.leavegovernmentDate != null ? date2Thai(formDataHaji.leavegovernmentDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -224,14 +282,14 @@ function updateLeaveTotal() {
<div class="q-pl-sm text-weight-bold text-dark col-12">เคยไปประกอบพจยฯหรอไม</div> <div class="q-pl-sm text-weight-bold text-dark col-12">เคยไปประกอบพจยฯหรอไม</div>
<div class="col-12"> <div class="col-12">
<q-radio v-model="formData.hajjDayStatus" val="ever" checked-icon="task_alt" label="เคย" /> <q-radio v-model="formDataHaji.hajjDayStatus" val="true" checked-icon="task_alt" label="เคย" />
<q-radio v-model="formData.hajjDayStatus" val="never" checked-icon="task_alt" label="ไม่เคยไปประกอบพิธีฮัจย์ฯ" /> <q-radio v-model="formDataHaji.hajjDayStatus" val="false" checked-icon="task_alt" label="ไม่เคยไปประกอบพิธีฮัจย์ฯ" />
</div> </div>
<q-input v-model="formData.leaveDetail" class="col-12 q-mt-sm" bg-color="white" dense outlined type="textarea" label="รายละเอียด" /> <q-input v-model="formDataHaji.leaveDetail" class="col-12 q-mt-sm" bg-color="white" dense outlined type="textarea" label="รายละเอียด" />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file v-model="formData.leaveDocument" bg-color="white" label="เอกสารประกอบ" dense outlined multiple hide-bottom-space> <q-file v-model="formDataHaji.leaveDocument" bg-color="white" label="เอกสารประกอบ" use-chips @added="fileUploadDoc" dense outlined multiple hide-bottom-space>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>

View file

@ -3,10 +3,16 @@ import { reactive, ref } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import type { MilitaryForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { MilitaryForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const router = useRouter()
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, calculateDurationYmd } = mixin const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const files = ref<any>(null) const files = ref<any>(null)
@ -35,20 +41,30 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataMilitary = reactive<any>({
type: dataStore.typeId,
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
totalLeave: 1, leaveTotal: 0,
leaveDocument: null, leaveDocument: null,
leaveWrote: "", leaveWrote: "",
absentDaySummon: "", absentDaySummon: "",
absentDayLocation: "", absentDayLocation: "",
absentDayRegistorDate: "", absentDayRegistorDate: null,
absentDayGetIn: "", absentDayGetIn: "",
absentDayAt: "", absentDayAt: "",
leaveDetail: "", leaveDetail: "",
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
/** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */ /** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */
const formRef: MilitaryForm = { const formRef: MilitaryForm = {
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
@ -75,16 +91,60 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataMilitary.leaveDocument.slice(0, formDataMilitary.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataMilitary.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile)
formData.append("type", formDataMilitary.type)
formData.append("leaveStartDate", dateToISO(formDataMilitary.leaveStartDate))
formData.append("leaveEndDate", dateToISO(formDataMilitary.leaveEndDate))
formData.append("absentDaySummon", formDataMilitary.absentDaySummon)
formData.append("absentDayLocation", formDataMilitary.absentDayLocation)
formData.append("absentDayRegistorDate", dateToISO(formDataMilitary.absentDayRegistorDate))
formData.append("absentDayGetIn", formDataMilitary.absentDayGetIn)
formData.append("absentDayAt", formDataMilitary.absentDayAt)
formData.append("leaveWrote", formDataMilitary.leaveWrote)
formData.append("leaveDetail", formDataMilitary.leaveDetail)
formData.append("leaveTotal", formDataMilitary.leaveTotal)
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataMilitary.leaveStartDate, formDataMilitary.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataMilitary.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
</script> </script>
@ -104,12 +164,21 @@ function updateLeaveTotal() {
outlined outlined
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
v-model="formData.leaveWrote" v-model="formDataMilitary.leaveWrote"
label="เขียนที่" label="เขียนที่"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<datepicker class="col-12 col-md-4 col-sm-6" menu-class-name="modalfix" v-model="formData.leaveStartDate" :locale="'th'" autoApply borderless :enableTimePicker="false" week-start="0"> <datepicker
class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix"
v-model="formDataMilitary.leaveStartDate"
:locale="'th'"
autoApply
borderless
:enableTimePicker="false"
week-start="0"
>
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
</template> </template>
@ -124,7 +193,7 @@ function updateLeaveTotal() {
ref="leaveStartDateRef" ref="leaveStartDateRef"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataMilitary.leaveStartDate != null ? date2Thai(formDataMilitary.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -138,15 +207,15 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataMilitary.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
:readonly="!formData.leaveStartDate" :readonly="!formDataMilitary.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataMilitary.leaveStartDate ? new Date(formDataMilitary.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -161,9 +230,9 @@ function updateLeaveTotal() {
ref="leaveEndDateRef" ref="leaveEndDateRef"
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
:readonly="!formData.leaveStartDate" :readonly="!formDataMilitary.leaveStartDate"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataMilitary.leaveEndDate != null ? date2Thai(formDataMilitary.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -181,7 +250,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataMilitary.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -194,7 +263,7 @@ function updateLeaveTotal() {
dense dense
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.absentDaySummon" v-model="formDataMilitary.absentDaySummon"
label="ได้รับหมายเรียกของ" label="ได้รับหมายเรียกของ"
hide-bottom-space hide-bottom-space
:rules="[val => !!val || `${'กรุณากรอกได้รับหมายเรียกของ'}`]" :rules="[val => !!val || `${'กรุณากรอกได้รับหมายเรียกของ'}`]"
@ -206,7 +275,7 @@ function updateLeaveTotal() {
dense dense
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.absentDayLocation" v-model="formDataMilitary.absentDayLocation"
label="ที่" label="ที่"
hide-bottom-space hide-bottom-space
:rules="[val => !!val || `${'กรุณากรอกที่'}`]" :rules="[val => !!val || `${'กรุณากรอกที่'}`]"
@ -219,7 +288,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.absentDayRegistorDate" v-model="formDataMilitary.absentDayRegistorDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -240,7 +309,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.absentDayRegistorDate != null ? date2Thai(formData.absentDayRegistorDate) : null" :model-value="formDataMilitary.absentDayRegistorDate != null ? date2Thai(formDataMilitary.absentDayRegistorDate) : null"
:label="`${'ลงวันที่'}`" :label="`${'ลงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลงวันที่'}`]"
> >
@ -257,7 +326,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
ref="absentDayGetInRef" ref="absentDayGetInRef"
outlined outlined
v-model="formData.absentDayGetIn" v-model="formDataMilitary.absentDayGetIn"
label="ให้เข้ารับการ" label="ให้เข้ารับการ"
hide-bottom-space hide-bottom-space
:rules="[val => !!val || `${'กรุณากรอกให้เข้ารับการ'}`]" :rules="[val => !!val || `${'กรุณากรอกให้เข้ารับการ'}`]"
@ -269,7 +338,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
outlined outlined
ref="absentDayAtRef" ref="absentDayAtRef"
v-model="formData.absentDayAt" v-model="formDataMilitary.absentDayAt"
label="ณ ที่" label="ณ ที่"
hide-bottom-space hide-bottom-space
:rules="[val => !!val || `${'กรุณากรอก ณ ที่'}`]" :rules="[val => !!val || `${'กรุณากรอก ณ ที่'}`]"
@ -277,10 +346,10 @@ function updateLeaveTotal() {
</div> </div>
</div> </div>
<q-input class="col-12 col-md-12 col-sm-12" dense bg-color="white" outlined v-model="formData.leaveDetail" type="textarea" label="รายละเอียด" /> <q-input class="col-12 col-md-12 col-sm-12" dense bg-color="white" outlined v-model="formDataMilitary.leaveDetail" type="textarea" label="รายละเอียด" />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file v-model="formData.leaveDocument" dense label="เอกสารประกอบ" outlined bg-color="white" multiple hide-bottom-space> <q-file v-model="formDataMilitary.leaveDocument" dense label="เอกสารประกอบ" outlined bg-color="white" multiple hide-bottom-space use-chips @added="fileUploadDoc">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>

View file

@ -3,10 +3,16 @@ import { reactive, ref, computed } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import type { studyDaySubjectForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { studyDaySubjectForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const router = useRouter()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, arabicNumberToText, calculateDurationYmd } = mixin const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError, arabicNumberToText } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const files = ref<any>(null) const files = ref<any>(null)
@ -14,8 +20,8 @@ const files = ref<any>(null)
/** ตัวแปร ref สำหรับแสดง validate */ /** ตัวแปร ref สำหรับแสดง validate */
const leaveStartDateRef = ref<object | null>(null) const leaveStartDateRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const birthdayRef = ref<object | null>(null) const leavebirthDateRef = ref<object | null>(null)
const dateGovernmentRef = ref<object | null>(null) const leavegovernmentDateRef = ref<object | null>(null)
const leaveSalaryRef = ref<object | null>(null) const leaveSalaryRef = ref<object | null>(null)
const leaveNumberRef = ref<object | null>(null) const leaveNumberRef = ref<object | null>(null)
const leaveAddressRef = ref<object | null>(null) const leaveAddressRef = ref<object | null>(null)
@ -39,31 +45,33 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataStudy = reactive<any>({
leaveWrote: "", type: dataStore.typeId, //
leaveWrote: "", //
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
birthday: new Date(), leavebirthDate: new Date(),
dateGovernment: new Date(), leavegovernmentDate: new Date(),
leaveSalary: 10000, leaveSalary: 10000,
leaveSalaryText: arabicNumberToText(10000), leaveSalaryText: arabicNumberToText(10000),
leaveNumber: "", leaveNumber: "",
leaveAddress: "test", leaveAddress: "test",
studyDayScholarship: "", studyDayScholarship: "",
studyDayCountry: "", studyDayCountry: "",
studyDayUniversityName: "", studyDayUniversityName: "", //
studyDayDegreeLevel: "", studyDayDegreeLevel: "", //
studyDaySubject: "", studyDaySubject: "", //
leaveDocument: "", leaveDocument: "", //
leaveDetail: "", leaveDetail: "",
leaveTotal: "",
}) })
/** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */ /** maping ref เข้าตัวแปรเพื่อเตรียมตรวจสอบ */
const formRef: studyDaySubjectForm = { const formRef: studyDaySubjectForm = {
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
leaveEndDate: leaveEndDateRef, leaveEndDate: leaveEndDateRef,
birthday: birthdayRef, leavebirthDate: leavebirthDateRef,
dateGovernment: dateGovernmentRef, leavegovernmentDate: leavegovernmentDateRef,
leaveSalary: leaveSalaryRef, leaveSalary: leaveSalaryRef,
leaveNumber: leaveNumberRef, leaveNumber: leaveNumberRef,
leaveAddress: leaveAddressRef, leaveAddress: leaveAddressRef,
@ -75,6 +83,15 @@ const formRef: studyDaySubjectForm = {
leaveWrote: leaveWroteRef, leaveWrote: leaveWroteRef,
} }
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
/** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */ /** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */
function onValidate() { function onValidate() {
const hasError = [] const hasError = []
@ -88,16 +105,66 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataStudy.leaveDocument.slice(0, formDataStudy.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataStudy.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile) //
formData.append("type", formDataStudy.type) //
formData.append("leaveStartDate", dateToISO(formDataStudy.leaveStartDate)) //
formData.append("leaveEndDate", dateToISO(formDataStudy.leaveEndDate)) //
formData.append("studyDaySubject", formDataStudy.studyDaySubject)
formData.append("studyDayDegreeLevel", formDataStudy.studyDayDegreeLevel)
formData.append("leavegovernmentDate", dateToISO(formDataStudy.leavegovernmentDate))
formData.append("leavebirthDate", dateToISO(formDataStudy.leavebirthDate))
formData.append("studyDayUniversityName", formDataStudy.studyDayUniversityName)
formData.append("studyDayCountry", formDataStudy.studyDayCountry)
formData.append("leaveWrote", formDataStudy.leaveWrote) //
formData.append("leaveDetail", formDataStudy.leaveDetail) //
formData.append("studyDayScholarship", formDataStudy.studyDayScholarship)
formData.append("leaveAddress", formDataStudy.leaveAddress) //
formData.append("leaveNumber", formDataStudy.leaveNumber) //
formData.append("leaveSalaryText", formDataStudy.leaveSalaryText) //
formData.append("leaveSalary", formDataStudy.leaveSalary) //
formData.append("leaveTotal", formDataStudy.leaveTotal) //
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataStudy.leaveStartDate, formDataStudy.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataStudy.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
@ -105,7 +172,7 @@ function updateLeaveTotal() {
* แปลงตวเลขเงนเดอน * แปลงตวเลขเงนเดอน
*/ */
const formattedleaveSalary = computed(() => { const formattedleaveSalary = computed(() => {
return formData.leaveSalary !== null ? formData.leaveSalary.toLocaleString("th-TH") : "" return formDataStudy.leaveSalary !== null ? formDataStudy.leaveSalary.toLocaleString("th-TH") : ""
}) })
</script> </script>
@ -118,7 +185,7 @@ const formattedleaveSalary = computed(() => {
<q-card bordered class="q-pa-md bg-grey-1"> <q-card bordered class="q-pa-md bg-grey-1">
<div class="row q-pa-sm q-col-gutter-sm"> <div class="row q-pa-sm q-col-gutter-sm">
<q-input <q-input
v-model="formData.leaveWrote" v-model="formDataStudy.leaveWrote"
ref="leaveWroteRef" ref="leaveWroteRef"
class="col-12 col-sm-12" class="col-12 col-sm-12"
bg-color="white" bg-color="white"
@ -129,7 +196,16 @@ const formattedleaveSalary = computed(() => {
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<datepicker v-model="formData.leaveStartDate" class="col-12 col-md-4 col-sm-6" menu-class-name="modalfix" autoApply borderless week-start="0" :enableTimePicker="false" :locale="'th'"> <datepicker
v-model="formDataStudy.leaveStartDate"
class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix"
autoApply
borderless
week-start="0"
:enableTimePicker="false"
:locale="'th'"
>
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
</template> </template>
@ -146,7 +222,7 @@ const formattedleaveSalary = computed(() => {
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataStudy.leaveStartDate != null ? date2Thai(formDataStudy.leaveStartDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -157,7 +233,7 @@ const formattedleaveSalary = computed(() => {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.leaveEndDate" v-model="formDataStudy.leaveEndDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -165,9 +241,9 @@ const formattedleaveSalary = computed(() => {
week-start="0" week-start="0"
:locale="'th'" :locale="'th'"
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
:readonly="!formData.leaveStartDate" :readonly="!formDataStudy.leaveStartDate"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataStudy.leaveStartDate ? new Date(formDataStudy.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -185,8 +261,8 @@ const formattedleaveSalary = computed(() => {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:readonly="!formData.leaveStartDate" :readonly="!formDataStudy.leaveStartDate"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataStudy.leaveEndDate != null ? date2Thai(formDataStudy.leaveEndDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -203,7 +279,7 @@ const formattedleaveSalary = computed(() => {
bg-color="white" bg-color="white"
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataStudy.leaveTotal"
label="มีกำหนด" label="มีกำหนด"
readonly readonly
hide-bottom-space hide-bottom-space
@ -212,7 +288,7 @@ const formattedleaveSalary = computed(() => {
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<datepicker <datepicker
v-model="formData.dateGovernment" v-model="formDataStudy.leavegovernmentDate"
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -230,7 +306,7 @@ const formattedleaveSalary = computed(() => {
</template> </template>
<template #trigger> <template #trigger>
<q-input <q-input
ref="dateGovernmentRef" ref="leavegovernmentDateRef"
class="full-width datepicker" class="full-width datepicker"
bg-color="white" bg-color="white"
outlined outlined
@ -238,7 +314,7 @@ const formattedleaveSalary = computed(() => {
dense dense
hide-bottom-space hide-bottom-space
:label="`${'วันที่เข้ารับราชการ'}`" :label="`${'วันที่เข้ารับราชการ'}`"
:model-value="formData.dateGovernment != null ? date2Thai(formData.dateGovernment) : null" :model-value="formDataStudy.leavegovernmentDate != null ? date2Thai(formDataStudy.leavegovernmentDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -249,7 +325,7 @@ const formattedleaveSalary = computed(() => {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.birthday" v-model="formDataStudy.leavebirthDate"
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -267,7 +343,7 @@ const formattedleaveSalary = computed(() => {
</template> </template>
<template #trigger> <template #trigger>
<q-input <q-input
ref="birthdayRef" ref="leavebirthDateRef"
class="full-width datepicker" class="full-width datepicker"
bg-color="white" bg-color="white"
outlined outlined
@ -275,7 +351,7 @@ const formattedleaveSalary = computed(() => {
readonly readonly
hide-bottom-space hide-bottom-space
:label="`${'วันเดือนปีเกิด'}`" :label="`${'วันเดือนปีเกิด'}`"
:model-value="formData.birthday != null ? date2Thai(formData.birthday) : null" :model-value="formDataStudy.leavebirthDate != null ? date2Thai(formDataStudy.leavebirthDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -288,7 +364,7 @@ const formattedleaveSalary = computed(() => {
<q-input v-model="formattedleaveSalary" ref="leaveSalaryRef" class="col-12 col-sm-6 col-md-3" bg-color="white" dense outlined readonly label="เงินเดือนปัจจุบัน" /> <q-input v-model="formattedleaveSalary" ref="leaveSalaryRef" class="col-12 col-sm-6 col-md-3" bg-color="white" dense outlined readonly label="เงินเดือนปัจจุบัน" />
<q-input <q-input
v-model="formData.leaveSalaryText" v-model="formDataStudy.leaveSalaryText"
ref="leaveSalaryRef" ref="leaveSalaryRef"
class="col-12 col-sm-6 col-md-3" class="col-12 col-sm-6 col-md-3"
bg-color="white" bg-color="white"
@ -305,7 +381,7 @@ const formattedleaveSalary = computed(() => {
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<q-input <q-input
v-model="formData.studyDayUniversityName" v-model="formDataStudy.studyDayUniversityName"
ref="studyDayUniversityNameRef" ref="studyDayUniversityNameRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -317,7 +393,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayDegreeLevel" v-model="formDataStudy.studyDayDegreeLevel"
ref="studyDayDegreeLevelRef" ref="studyDayDegreeLevelRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -329,7 +405,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDaySubject" v-model="formDataStudy.studyDaySubject"
ref="studyDaySubjectRef" ref="studyDaySubjectRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -341,7 +417,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayCountry" v-model="formDataStudy.studyDayCountry"
ref="studyDayCountryRef" ref="studyDayCountryRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -353,7 +429,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayScholarship" v-model="formDataStudy.studyDayScholarship"
ref="studyDayScholarshipRef" ref="studyDayScholarshipRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -365,7 +441,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.leaveNumber" v-model="formDataStudy.leaveNumber"
ref="leaveNumberRef" ref="leaveNumberRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -379,7 +455,7 @@ const formattedleaveSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.leaveAddress" v-model="formDataStudy.leaveAddress"
ref="leaveAddressRef" ref="leaveAddressRef"
class="col-12" class="col-12"
bg-color="white" bg-color="white"
@ -392,10 +468,10 @@ const formattedleaveSalary = computed(() => {
</div> </div>
</div> </div>
<q-input v-model="formData.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" /> <q-input v-model="formDataStudy.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file v-model="formData.leaveDocument" bg-color="white" dense outlined multiple label="เอกสารประกอบ"> <q-file v-model="formDataStudy.leaveDocument" bg-color="white" dense outlined multiple use-chips @added="fileUploadDoc" label="เอกสารประกอบ">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>

View file

@ -3,10 +3,16 @@ import { reactive, ref, computed } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import type { TrainForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { TrainForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const router = useRouter()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, arabicNumberToText, calculateDurationYmd } = mixin const { date2Thai, dialogConfirm, arabicNumberToText, calculateDurationYmd, dateToISO, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const files = ref<any>(null) const files = ref<any>(null)
@ -23,16 +29,17 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataTrain = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
birthday: new Date(), leavebirthDate: new Date(),
dateGovernment: new Date(), leavegovernmentDate: new Date(),
leaveSalary: 10000, leaveSalary: 10000,
salaryText: arabicNumberToText(10000), leaveSalaryText: arabicNumberToText(10000),
leaveNumber: "", leaveNumber: "",
leaveAddress: "test", leaveAddress: "",
studyDayScholarship: "", studyDayScholarship: "",
studyDayCountry: "", studyDayCountry: "",
studyDayTrainingSubject: "", studyDayTrainingSubject: "",
@ -44,8 +51,8 @@ const formData = reactive<any>({
/** ตัวแปร ref สำหรับแสดง validate */ /** ตัวแปร ref สำหรับแสดง validate */
const leaveStartDateRef = ref<object | null>(null) const leaveStartDateRef = ref<object | null>(null)
const leaveEndDateRef = ref<object | null>(null) const leaveEndDateRef = ref<object | null>(null)
const birthdayRef = ref<object | null>(null) const leavebirthDateRef = ref<object | null>(null)
const dateGovernmentRef = ref<object | null>(null) const leavegovernmentDateRef = ref<object | null>(null)
const leaveNumberRef = ref<object | null>(null) const leaveNumberRef = ref<object | null>(null)
const leaveAddressRef = ref<object | null>(null) const leaveAddressRef = ref<object | null>(null)
const studyDayScholarshipRef = ref<object | null>(null) const studyDayScholarshipRef = ref<object | null>(null)
@ -58,8 +65,8 @@ const leaveWroteRef = ref<object | null>(null)
const formRef: TrainForm = { const formRef: TrainForm = {
leaveStartDate: leaveStartDateRef, leaveStartDate: leaveStartDateRef,
leaveEndDate: leaveEndDateRef, leaveEndDate: leaveEndDateRef,
birthday: birthdayRef, leavebirthDate: leavebirthDateRef,
dateGovernment: dateGovernmentRef, leavegovernmentDate: leavegovernmentDateRef,
leaveNumber: leaveNumberRef, leaveNumber: leaveNumberRef,
leaveAddress: leaveAddressRef, leaveAddress: leaveAddressRef,
studyDayScholarship: studyDayScholarshipRef, studyDayScholarship: studyDayScholarshipRef,
@ -69,6 +76,15 @@ const formRef: TrainForm = {
leaveWrote: leaveWroteRef, leaveWrote: leaveWroteRef,
} }
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
/** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */ /** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */
function onValidate() { function onValidate() {
const hasError = [] const hasError = []
@ -83,16 +99,65 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataTrain.leaveDocument.slice(0, formDataTrain.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataTrain.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile) //
formData.append("type", formDataTrain.type) //
formData.append("leaveStartDate", dateToISO(formDataTrain.leaveStartDate)) //
formData.append("leaveEndDate", dateToISO(formDataTrain.leaveEndDate)) //
formData.append("studyDayCountry", formDataTrain.studyDayCountry)
formData.append("leavegovernmentDate", dateToISO(formDataTrain.leavegovernmentDate))
formData.append("leavebirthDate", dateToISO(formDataTrain.leavebirthDate))
formData.append("studyDayTrainingName", formDataTrain.studyDayTrainingName)
formData.append("studyDayTrainingSubject", formDataTrain.studyDayTrainingSubject)
formData.append("leaveWrote", formDataTrain.leaveWrote) //
formData.append("leaveDetail", formDataTrain.leaveDetail) //
formData.append("studyDayScholarship", formDataTrain.studyDayScholarship)
formData.append("leaveAddress", formDataTrain.leaveAddress) //
formData.append("leaveNumber", formDataTrain.leaveNumber) //
formData.append("leaveSalaryText", formDataTrain.leaveSalaryText) //
formData.append("leaveSalary", formDataTrain.leaveSalary) //
formData.append("leaveTotal", formDataTrain.leaveTotal) //
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataTrain.leaveStartDate, formDataTrain.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataTrain.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
@ -100,7 +165,7 @@ function updateLeaveTotal() {
* แปลงตวเลขเงนเดอน * แปลงตวเลขเงนเดอน
*/ */
const formattedSalary = computed(() => { const formattedSalary = computed(() => {
return formData.leaveSalary !== null ? formData.leaveSalary.toLocaleString("th-TH") : "" return formDataTrain.leaveSalary !== null ? formDataTrain.leaveSalary.toLocaleString("th-TH") : ""
}) })
</script> </script>
@ -113,7 +178,7 @@ const formattedSalary = computed(() => {
<q-card bordered class="q-pa-md bg-grey-1"> <q-card bordered class="q-pa-md bg-grey-1">
<div class="row q-pa-sm q-col-gutter-sm"> <div class="row q-pa-sm q-col-gutter-sm">
<q-input <q-input
v-model="formData.leaveWrote" v-model="formDataTrain.leaveWrote"
ref="leaveWroteRef" ref="leaveWroteRef"
class="col-12 col-sm-12" class="col-12 col-sm-12"
bg-color="white" bg-color="white"
@ -124,7 +189,16 @@ const formattedSalary = computed(() => {
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<datepicker v-model="formData.leaveStartDate" class="col-12 col-md-4 col-sm-6" menu-class-name="modalfix" autoApply borderless week-start="0" :enableTimePicker="false" :locale="'th'"> <datepicker
v-model="formDataTrain.leaveStartDate"
class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix"
autoApply
borderless
week-start="0"
:enableTimePicker="false"
:locale="'th'"
>
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
</template> </template>
@ -141,7 +215,7 @@ const formattedSalary = computed(() => {
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataTrain.leaveStartDate != null ? date2Thai(formDataTrain.leaveStartDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -152,17 +226,17 @@ const formattedSalary = computed(() => {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.leaveEndDate" v-model="formDataTrain.leaveEndDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
borderless borderless
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
week-start="0" week-start="0"
:readonly="!formData.leaveStartDate" :readonly="!formDataTrain.leaveStartDate"
:locale="'th'" :locale="'th'"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataTrain.leaveStartDate ? new Date(formDataTrain.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -180,8 +254,8 @@ const formattedSalary = computed(() => {
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:readonly="!formData.leaveStartDate" :readonly="!formDataTrain.leaveStartDate"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataTrain.leaveEndDate != null ? date2Thai(formDataTrain.leaveEndDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -198,7 +272,7 @@ const formattedSalary = computed(() => {
bg-color="white" bg-color="white"
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataTrain.leaveTotal"
label="มีกำหนด" label="มีกำหนด"
readonly readonly
hide-bottom-space hide-bottom-space
@ -207,7 +281,7 @@ const formattedSalary = computed(() => {
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<datepicker <datepicker
v-model="formData.dateGovernment" v-model="formDataTrain.leavegovernmentDate"
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -225,7 +299,7 @@ const formattedSalary = computed(() => {
</template> </template>
<template #trigger> <template #trigger>
<q-input <q-input
ref="dateGovernmentRef" ref="leavegovernmentDateRef"
class="full-width datepicker" class="full-width datepicker"
outlined outlined
readonly readonly
@ -233,7 +307,7 @@ const formattedSalary = computed(() => {
dense dense
hide-bottom-space hide-bottom-space
:label="`${'วันที่เข้ารับราชการ'}`" :label="`${'วันที่เข้ารับราชการ'}`"
:model-value="formData.dateGovernment != null ? date2Thai(formData.dateGovernment) : null" :model-value="formDataTrain.leavegovernmentDate != null ? date2Thai(formDataTrain.leavegovernmentDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]" :rules="[val => !!val || `${'กรุณาเลือกวันที่เข้ารับราชการ'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -244,7 +318,7 @@ const formattedSalary = computed(() => {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.birthday" v-model="formDataTrain.leavebirthDate"
class="col-12 col-md-3 col-sm-6" class="col-12 col-md-3 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
@ -262,7 +336,7 @@ const formattedSalary = computed(() => {
</template> </template>
<template #trigger> <template #trigger>
<q-input <q-input
ref="birthdayRef" ref="leavebirthDateRef"
class="full-width datepicker" class="full-width datepicker"
bg-color="white" bg-color="white"
outlined outlined
@ -270,7 +344,7 @@ const formattedSalary = computed(() => {
readonly readonly
hide-bottom-space hide-bottom-space
:label="`${'วันเดือนปีเกิด'}`" :label="`${'วันเดือนปีเกิด'}`"
:model-value="formData.birthday != null ? date2Thai(formData.birthday) : null" :model-value="formDataTrain.leavebirthDate != null ? date2Thai(formDataTrain.leavebirthDate) : null"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
<template v-slot:prepend> <template v-slot:prepend>
@ -282,14 +356,14 @@ const formattedSalary = computed(() => {
<q-input v-model="formattedSalary" class="col-12 col-sm-6 col-md-3" bg-color="white" dense outlined readonly label="เงินเดือนปัจจุบัน" /> <q-input v-model="formattedSalary" class="col-12 col-sm-6 col-md-3" bg-color="white" dense outlined readonly label="เงินเดือนปัจจุบัน" />
<q-input v-model="formData.salaryText" class="col-12 col-sm-6 col-md-3" dense readonly outlined bg-color="white" label="เงินเดือนปัจจุบัน (ตัวอักษร)" /> <q-input v-model="formDataTrain.leaveSalaryText" class="col-12 col-sm-6 col-md-3" dense readonly outlined bg-color="white" label="เงินเดือนปัจจุบัน (ตัวอักษร)" />
</div> </div>
</div> </div>
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<q-input <q-input
v-model="formData.studyDayTrainingSubject" v-model="formDataTrain.studyDayTrainingSubject"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
ref="studyDayTrainingSubjectRef" ref="studyDayTrainingSubjectRef"
bg-color="white" bg-color="white"
@ -301,7 +375,7 @@ const formattedSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayTrainingName" v-model="formDataTrain.studyDayTrainingName"
ref="studyDayTrainingNameRef" ref="studyDayTrainingNameRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -313,7 +387,7 @@ const formattedSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayCountry" v-model="formDataTrain.studyDayCountry"
ref="studyDayCountryRef" ref="studyDayCountryRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
dense dense
@ -325,7 +399,7 @@ const formattedSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.studyDayScholarship" v-model="formDataTrain.studyDayScholarship"
ref="studyDayScholarshipRef" ref="studyDayScholarshipRef"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
bg-color="white" bg-color="white"
@ -337,7 +411,7 @@ const formattedSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.leaveNumber" v-model="formDataTrain.leaveNumber"
class="col-12 col-sm-6 col-md-4" class="col-12 col-sm-6 col-md-4"
ref="leaveNumberRef" ref="leaveNumberRef"
dense dense
@ -351,7 +425,7 @@ const formattedSalary = computed(() => {
/> />
<q-input <q-input
v-model="formData.leaveAddress" v-model="formDataTrain.leaveAddress"
ref="leaveAddressRef" ref="leaveAddressRef"
class="col-12" class="col-12"
bg-color="white" bg-color="white"
@ -364,10 +438,10 @@ const formattedSalary = computed(() => {
</div> </div>
</div> </div>
<q-input v-model="formData.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" /> <q-input v-model="formDataTrain.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file v-model="formData.leaveDocument" bg-color="white" dense outlined multiple label="เอกสารประกอบ"> <q-file v-model="formDataTrain.leaveDocument" bg-color="white" dense outlined multiple label="เอกสารประกอบ">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>

View file

@ -3,11 +3,17 @@ import { ref, reactive, watch } from "vue"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/WorkInternationalForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/WorkInternationalForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, notifyError } = mixin const { date2Thai, dialogConfirm, notifyError, dateToISO, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const router = useRouter()
const isSave = ref<boolean>(false) const isSave = ref<boolean>(false)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -23,7 +29,8 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<FormData>({ const formDataWorkInternational = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
@ -51,15 +58,17 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataWorkInternational.leaveWrote = props.data.leaveWrote
formData.leaveStartDate = props.data.leaveStartDate formDataWorkInternational.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataWorkInternational.leaveEndDate = props.data.leaveEndDate
formData.leaveDetail = props.data.leaveDetail formDataWorkInternational.leaveDetail = props.data.leaveDetail
formData.leaveDocument = props.data.leaveDocument formDataWorkInternational.leaveDocument = props.data.leaveDocument
formData.leaveDraftDocument = props.data.leaveDraftDocument formDataWorkInternational.leaveDraftDocument = props.data.leaveDraftDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const nameFileDraft = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => { const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -80,9 +89,53 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataWorkInternational.leaveDocument.slice(0, formDataWorkInternational.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataWorkInternational.leaveDocument[0].type,
})
const blobDrafe = formDataWorkInternational.leaveDraftDocument.slice(0, formDataWorkInternational.leaveDraftDocument[0].size)
const newFileDraft = new File(blobDrafe, nameFileDraft.value, {
type: formDataWorkInternational.leaveDraftDocument[0].type,
})
formData.append("leaveDocument", newFile) //
formData.append("leaveDraftDocument", newFileDraft) //
formData.append("type", formDataWorkInternational.type) //
formData.append("leaveStartDate", dateToISO(formDataWorkInternational.leaveStartDate)) //
formData.append("leaveEndDate", dateToISO(formDataWorkInternational.leaveEndDate)) //
formData.append("leaveWrote", formDataWorkInternational.leaveWrote) //
formData.append("leaveDetail", formDataWorkInternational.leaveDetail) //
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
</script> </script>
<template> <template>
@ -101,7 +154,7 @@ function onValidate() {
for="leaveWroteRef" for="leaveWroteRef"
dense dense
outlined outlined
v-model="formData.leaveWrote" v-model="formDataWorkInternational.leaveWrote"
label="เขียนที่" label="เขียนที่"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
@ -110,7 +163,7 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-6 col-sm-6" class="col-12 col-md-6 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataWorkInternational.leaveStartDate"
:locale="'th'" :locale="'th'"
hide-bottom-space hide-bottom-space
autoApply autoApply
@ -135,7 +188,7 @@ function onValidate() {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataWorkInternational.leaveStartDate != null ? date2Thai(formDataWorkInternational.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -149,15 +202,15 @@ function onValidate() {
<datepicker <datepicker
class="col-12 col-md-6 col-sm-6" class="col-12 col-md-6 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataWorkInternational.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="!formData.leaveStartDate" :readonly="!formDataWorkInternational.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataWorkInternational.leaveStartDate ? new Date(formDataWorkInternational.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -173,9 +226,9 @@ function onValidate() {
for="leaveEndDateRef" for="leaveEndDateRef"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
:readonly="!formData.leaveStartDate" :readonly="!formDataWorkInternational.leaveStartDate"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataWorkInternational.leaveEndDate != null ? date2Thai(formDataWorkInternational.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -192,7 +245,7 @@ function onValidate() {
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
type="number" type="number"
v-model="formData.leaveTotal" v-model="formDataWorkInternational.leaveTotal"
label="จำนวนวันที่ลา" label="จำนวนวันที่ลา"
readonly readonly
:rules="[val => !!val || `${'กรุณากรอกจำนวนวัน'}`]" :rules="[val => !!val || `${'กรุณากรอกจำนวนวัน'}`]"
@ -207,12 +260,23 @@ function onValidate() {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataWorkInternational.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
<q-file ref="fileRef" bg-color="white" v-model="formData.leaveDocument" @added="fileUploadDoc" dense label="เอกสารประกอบ" outlined use-chips multiple class="q-pl-sm col-12"> <q-file
ref="fileRef"
bg-color="white"
v-model="formDataWorkInternational.leaveDocument"
@added="fileUploadDoc"
dense
label="เอกสารประกอบ"
outlined
use-chips
multiple
class="q-pl-sm col-12"
>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -224,7 +288,7 @@ function onValidate() {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataWorkInternational.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}
@ -238,7 +302,7 @@ function onValidate() {
</div> </div>
</q-card> </q-card>
<div v-if="formData.leaveWrote && formData.leaveEndDate && formData.leaveStartDate" class="q-mt-md"> <div v-if="formDataWorkInternational.leaveWrote && formDataWorkInternational.leaveEndDate && formDataWorkInternational.leaveStartDate" class="q-mt-md">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-4-circle" size="20px" color="primary" /> <q-icon name="mdi-numeric-4-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">ดาวนโหลด/ปโหลดแบบฟอร</div> <div class="q-pl-sm text-weight-bold text-dark">ดาวนโหลด/ปโหลดแบบฟอร</div>
@ -254,7 +318,7 @@ function onValidate() {
<div class="col-10 col-sm-5 col-md-4 q-my-sm"> <div class="col-10 col-sm-5 col-md-4 q-my-sm">
<div class="column q-mx-xs"> <div class="column q-mx-xs">
<div class="q-pl-sm text-weight-bold text-dark text-center">ปโหลด</div> <div class="q-pl-sm text-weight-bold text-dark text-center">ปโหลด</div>
<q-file v-model="formData.leaveDraftDocument" dense label="แบบฟอร์ม" outlined bg-color="white" multiple accept=".pdf"> <q-file v-model="formDataWorkInternational.leaveDraftDocument" dense label="แบบฟอร์ม" outlined bg-color="white" multiple accept=".pdf">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -262,7 +326,7 @@ function onValidate() {
</div> </div>
</div> </div>
<div class="col-md-1 self-end q-mb-sm"> <div class="col-md-1 self-end q-mb-sm">
<q-btn v-if="formData.leaveDraftDocument" flat round color="primary" icon="mdi-arrow-up-bold" @click="fileUploadDoc"><q-tooltip>ปโหลด</q-tooltip></q-btn> <q-btn v-if="formDataWorkInternational.leaveDraftDocument" flat round color="primary" icon="mdi-arrow-up-bold" @click="fileUploadDoc"><q-tooltip>ปโหลด</q-tooltip></q-btn>
</div> </div>
</div> </div>
</q-card> </q-card>

View file

@ -2,9 +2,17 @@
import { ref, reactive, watch, computed, onMounted } from "vue" import { ref, reactive, watch, computed, onMounted } from "vue"
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/FollowSpouseForm" import type { FormData, FormRef } from "@/modules/05_leave/interface/request/FollowSpouseForm"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import { useQuasar } from "quasar"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, arabicNumberToText, calculateDurationYmd } = mixin const router = useRouter()
const { dialogConfirm, date2Thai, arabicNumberToText, calculateDurationYmd, dateToISO, success, messageError } = mixin
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
/** รับ props มาจากหน้าหลัก */ /** รับ props มาจากหน้าหลัก */
@ -20,29 +28,30 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataFollowSpouse = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
leaveTotal: "", // leaveTotal: "", //
salaryText: 25000, leaveSalaryText: 25000,
leaveSalary: 25000, // leaveSalary: 25000, //
coupleDayName: "", // coupleDayName: "", //
coupleDayPosition: "", // coupleDayPosition: "", //
coupleDayLevel: "", // coupleDayLevel: "", //
coupleDayLevelCountry: "", // coupleDayLevelCountry: "", //
followHistoryCountry: "", // followHistoryCountry: "ลาว", //
followHistoryTime: "", followHistoryTime: "0 วัน",
followHistoryStart: null, followHistoryStart: new Date(),
followHistoryEnd: null, followHistoryEnd: new Date(),
leaveDetail: "ในกรณีลาติดต่อกับครั้งก่อน รวมทั้งนี้ด้วย เป็นเวลา ...ปี, ...เดือน, ...วัน", // leaveDetail: "ในกรณีลาติดต่อกับครั้งก่อน รวมทั้งนี้ด้วย เป็นเวลา ...ปี, ...เดือน, ...วัน", //
leaveDocument: [], // leaveDocument: [], //
}) })
/** แปลงตัวแปร Salary */ /** แปลงตัวแปร Salary */
const formattSalaryText = arabicNumberToText(formData.salaryText) const formattleaveSalaryText = arabicNumberToText(formDataFollowSpouse.leaveSalaryText)
const formattSalary = computed(() => { const formattSalary = computed(() => {
return formData.leaveSalary !== null ? formData.leaveSalary.toLocaleString("th-TH") : "" return formDataFollowSpouse.leaveSalary !== null ? formDataFollowSpouse.leaveSalary.toLocaleString("th-TH") : ""
}) })
/** ตัวแปร ref สำหรับแสดง validate */ /** ตัวแปร ref สำหรับแสดง validate */
@ -86,15 +95,16 @@ const FormRef: FormRef = {
/** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */ /** ตรวจสอบว่ามีการส่งข้อมูลเข้ามาที่ฟอร์มไหม เมื่อมีการส่งจะ map ข้อมูลเข้า v-model ของฟอร์ม */
watch(props.data, async () => { watch(props.data, async () => {
// console.log("data==>", props.data) // console.log("data==>", props.data)
formData.leaveWrote = props.data.leaveWrote formDataFollowSpouse.leaveWrote = props.data.leaveWrote
formData.leaveStartDate = props.data.leaveStartDate formDataFollowSpouse.leaveStartDate = props.data.leaveStartDate
formData.leaveEndDate = props.data.leaveEndDate formDataFollowSpouse.leaveEndDate = props.data.leaveEndDate
formData.leaveTotal = props.data.leaveTotal formDataFollowSpouse.leaveTotal = props.data.leaveTotal
formData.leaveDetail = props.data.leaveDetail formDataFollowSpouse.leaveDetail = props.data.leaveDetail
formData.leaveDocument = props.data.leaveDocument formDataFollowSpouse.leaveDocument = props.data.leaveDocument
}) })
/** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */ /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
const nameFile = ref<string>("")
const fileDocDataUpload = ref<File[]>([]) const fileDocDataUpload = ref<File[]>([])
const fileUploadDoc = async (files: any) => { const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => { files.forEach((file: any) => {
@ -115,16 +125,66 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataFollowSpouse.leaveDocument.slice(0, formDataFollowSpouse.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataFollowSpouse.leaveDocument[0].type,
})
formData.append("leaveDocument", newFile) //
formData.append("type", formDataFollowSpouse.type) //
formData.append("leaveStartDate", dateToISO(formDataFollowSpouse.leaveStartDate)) //
formData.append("leaveEndDate", dateToISO(formDataFollowSpouse.leaveEndDate)) //
formData.append("followHistoryStart", dateToISO(formDataFollowSpouse.followHistoryStart)) //
formData.append("followHistoryEnd", dateToISO(formDataFollowSpouse.followHistoryEnd)) //
formData.append("leaveWrote", formDataFollowSpouse.leaveWrote) //
formData.append("leaveDetail", formDataFollowSpouse.leaveDetail) //
formData.append("leaveSalaryText", formDataFollowSpouse.leaveSalaryText) //
formData.append("leaveSalary", formDataFollowSpouse.leaveSalary) //
formData.append("followHistoryTime", formDataFollowSpouse.followHistoryTime) //
formData.append("followHistoryCountry", formDataFollowSpouse.followHistoryCountry) //
formData.append("coupleDayLevelCountry", formDataFollowSpouse.coupleDayLevelCountry) //
formData.append("coupleDayLevel", formDataFollowSpouse.coupleDayLevel) //
formData.append("coupleDayPosition", formDataFollowSpouse.coupleDayPosition) //
formData.append("coupleDayName", formDataFollowSpouse.coupleDayName) //
formData.append("leaveTotal", formDataFollowSpouse.leaveTotal) //
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
}
/** /**
* function พเดทค LeaveTotal * function พเดทค LeaveTotal
*/ */
function updateLeaveTotal() { function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.leaveStartDate, formData.leaveEndDate) const newLeaveTotal = calculateDurationYmd(formDataFollowSpouse.leaveStartDate, formDataFollowSpouse.leaveEndDate)
formData.leaveTotal = newLeaveTotal formDataFollowSpouse.leaveTotal = newLeaveTotal
console.log("test") console.log("test")
} }
</script> </script>
@ -145,7 +205,7 @@ function updateLeaveTotal() {
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.leaveWrote" v-model="formDataFollowSpouse.leaveWrote"
label="เขียนที่" label="เขียนที่"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
@ -153,7 +213,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-12" class="col-12 col-md-4 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveStartDate" v-model="formDataFollowSpouse.leaveStartDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
@ -178,7 +238,7 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
:readonly="!edit" :readonly="!edit"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataFollowSpouse.leaveStartDate != null ? date2Thai(formDataFollowSpouse.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -192,7 +252,7 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-4 col-sm-12" class="col-12 col-md-4 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.leaveEndDate" v-model="formDataFollowSpouse.leaveEndDate"
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@ -200,8 +260,8 @@ function updateLeaveTotal() {
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
@update:model-value="updateLeaveTotal" @update:model-value="updateLeaveTotal"
:readonly="!formData.leaveStartDate" :readonly="!formDataFollowSpouse.leaveStartDate"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataFollowSpouse.leaveStartDate ? new Date(formDataFollowSpouse.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -217,9 +277,9 @@ function updateLeaveTotal() {
for="leaveEndDateRef" for="leaveEndDateRef"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
:readonly="!formData.leaveStartDate" :readonly="!formDataFollowSpouse.leaveStartDate"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataFollowSpouse.leaveEndDate != null ? date2Thai(formDataFollowSpouse.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -236,7 +296,7 @@ function updateLeaveTotal() {
outlined outlined
ref="leaveTotalRef" ref="leaveTotalRef"
for="leaveTotalRef" for="leaveTotalRef"
v-model="formData.leaveTotal" v-model="formDataFollowSpouse.leaveTotal"
label="เป็นเวลา" label="เป็นเวลา"
readonly readonly
hide-bottom-space hide-bottom-space
@ -264,7 +324,7 @@ function updateLeaveTotal() {
for="leaveSalaryRef" for="leaveSalaryRef"
dense dense
outlined outlined
v-model="formattSalaryText" v-model="formattleaveSalaryText"
label="เงินเดือนปัจจุบัน" label="เงินเดือนปัจจุบัน"
readonly readonly
/> />
@ -279,7 +339,7 @@ function updateLeaveTotal() {
dense dense
bg-color="white" bg-color="white"
outlined outlined
v-model="formData.coupleDayName" v-model="formDataFollowSpouse.coupleDayName"
label="ชื่อคู่สมรส" label="ชื่อคู่สมรส"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'ชื่อคู่สมรส'}`]" :rules="[val => !!val || `${'ชื่อคู่สมรส'}`]"
@ -294,7 +354,7 @@ function updateLeaveTotal() {
dense dense
outlined outlined
bg-color="white" bg-color="white"
v-model="formData.coupleDayPosition" v-model="formDataFollowSpouse.coupleDayPosition"
label="ตำแหน่งคู่สมรส" label="ตำแหน่งคู่สมรส"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'ตำแหน่งคู่สมรส'}`]" :rules="[val => !!val || `${'ตำแหน่งคู่สมรส'}`]"
@ -309,7 +369,7 @@ function updateLeaveTotal() {
hide-bottom-space hide-bottom-space
outlined outlined
bg-color="white" bg-color="white"
v-model="formData.coupleDayLevel" v-model="formDataFollowSpouse.coupleDayLevel"
label="ระดับคู่สมรส" label="ระดับคู่สมรส"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'ระดับคู่สมรส'}`]" :rules="[val => !!val || `${'ระดับคู่สมรส'}`]"
@ -324,7 +384,7 @@ function updateLeaveTotal() {
dense dense
outlined outlined
bg-color="white" bg-color="white"
v-model="formData.coupleDayLevelCountry" v-model="formDataFollowSpouse.coupleDayLevelCountry"
label="ไปปฏิบัติราชการ ณ ประเทศ" label="ไปปฏิบัติราชการ ณ ประเทศ"
:readonly="!edit" :readonly="!edit"
:rules="[val => !!val || `${'ปฏิบัติราชการ ณ ประเทศ'}`]" :rules="[val => !!val || `${'ปฏิบัติราชการ ณ ประเทศ'}`]"
@ -334,14 +394,14 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-12" class="col-12 col-md-3 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.followHistoryStart" v-model="formDataFollowSpouse.followHistoryStart"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="formData.followHistoryStart !== null" :readonly="formDataFollowSpouse.followHistoryStart !== null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -356,10 +416,10 @@ function updateLeaveTotal() {
ref="followHistoryStartRef" ref="followHistoryStartRef"
for="followHistoryStartRef" for="followHistoryStartRef"
hide-bottom-space hide-bottom-space
:readonly="formData.followHistoryStart !== null" :readonly="formDataFollowSpouse.followHistoryStart !== null"
bg-color="white" bg-color="white"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.followHistoryStart != null ? date2Thai(formData.followHistoryStart) : null" :model-value="formDataFollowSpouse.followHistoryStart != null ? date2Thai(formDataFollowSpouse.followHistoryStart) : null"
:label="`${'ตั้งแต่วันที่'}`" :label="`${'ตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกตั้งแต่วันที่'}`]"
> >
@ -372,14 +432,14 @@ function updateLeaveTotal() {
<datepicker <datepicker
class="col-12 col-md-3 col-sm-12" class="col-12 col-md-3 col-sm-12"
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.followHistoryEnd" v-model="formDataFollowSpouse.followHistoryEnd"
:locale="'th'" :locale="'th'"
autoApply autoApply
hide-bottom-space hide-bottom-space
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="formData.followHistoryEnd !== null" :readonly="formDataFollowSpouse.followHistoryEnd !== null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -395,9 +455,9 @@ function updateLeaveTotal() {
for="followHistoryEndRef" for="followHistoryEndRef"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
:readonly="formData.followHistoryEnd !== null" :readonly="formDataFollowSpouse.followHistoryEnd !== null"
class="full-width datepicker" class="full-width datepicker"
:model-value="formData.followHistoryEnd != null ? date2Thai(formData.followHistoryEnd) : null" :model-value="formDataFollowSpouse.followHistoryEnd != null ? date2Thai(formDataFollowSpouse.followHistoryEnd) : null"
:label="`${'ถึงวันที่'}`" :label="`${'ถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกถึงวันที่'}`]"
> >
@ -415,21 +475,21 @@ function updateLeaveTotal() {
bg-color="white" bg-color="white"
ref="followHistoryCountryRef" ref="followHistoryCountryRef"
for="followHistoryCountryRef" for="followHistoryCountryRef"
v-model="formData.followHistoryCountry" v-model="formDataFollowSpouse.followHistoryCountry"
label="ประเทศ" label="ประเทศ"
:rules="[val => !!val || `${'กรุณาเลือกประเทศ'}`]" :rules="[val => !!val || `${'กรุณาเลือกประเทศ'}`]"
:readonly="formData.followHistoryCountry !== ''" :readonly="formDataFollowSpouse.followHistoryCountry !== ''"
/> />
<q-input <q-input
class="col-12 col-md-3 col-sm-12" class="col-12 col-md-3 col-sm-12"
dense dense
outlined outlined
:readonly="formData.followHistoryTime !== ''" :readonly="formDataFollowSpouse.followHistoryTime !== ''"
hide-bottom-space hide-bottom-space
bg-color="white" bg-color="white"
ref="followHistoryTimeRef" ref="followHistoryTimeRef"
for="followHistoryTimeRef" for="followHistoryTimeRef"
v-model="formData.followHistoryTime" v-model="formDataFollowSpouse.followHistoryTime"
label="เป็นเวลา" label="เป็นเวลา"
/> />
@ -442,12 +502,23 @@ function updateLeaveTotal() {
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"
v-model="formData.leaveDetail" v-model="formDataFollowSpouse.leaveDetail"
label="รายละเอียด" label="รายละเอียด"
:readonly="!edit" :readonly="!edit"
/> />
<q-file ref="fileRef" bg-color="white" v-model="formData.leaveDocument" @added="fileUploadDoc" dense label="เอกสารประกอบ" outlined use-chips multiple class="q-pl-sm col-12"> <q-file
ref="fileRef"
bg-color="white"
v-model="formDataFollowSpouse.leaveDocument"
@added="fileUploadDoc"
dense
label="เอกสารประกอบ"
outlined
use-chips
multiple
class="q-pl-sm col-12"
>
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -459,7 +530,7 @@ function updateLeaveTotal() {
</div> </div>
<q-card bordered flat class="full-width"> <q-card bordered flat class="full-width">
<q-list separator> <q-list separator>
<q-item v-for="(file, index) in formData.leaveDocument" :key="index" class="q-my-xs"> <q-item v-for="(file, index) in formDataFollowSpouse.leaveDocument" :key="index" class="q-my-xs">
<q-item-section> <q-item-section>
<q-item-label class="full-width ellipsis"> <q-item-label class="full-width ellipsis">
{{ file.name }} {{ file.name }}

View file

@ -3,11 +3,16 @@ import { reactive, ref, computed } from "vue"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar" import { useQuasar } from "quasar"
import type { RehabilitationForm } from "@/modules/05_leave/interface/request/AddAbsence" import type { RehabilitationForm } from "@/modules/05_leave/interface/request/AddAbsence"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import { useRouter } from "vue-router"
const dataStore = useLeaveStore()
const $q = useQuasar() const $q = useQuasar()
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, notifyError } = mixin const { date2Thai, dialogConfirm, notifyError, dateToISO, success, messageError } = mixin
const router = useRouter()
const edit = ref<boolean>(true) const edit = ref<boolean>(true)
const isSave = ref<boolean>(false) const isSave = ref<boolean>(false)
const files = ref<any>(null) const files = ref<any>(null)
@ -31,7 +36,8 @@ const props = defineProps({
}) })
/** ข้อมูล v-model ของฟอร์ม */ /** ข้อมูล v-model ของฟอร์ม */
const formData = reactive<any>({ const formDataRehabilitation = reactive<any>({
type: dataStore.typeId,
leaveWrote: "", leaveWrote: "",
leaveStartDate: null, leaveStartDate: null,
leaveEndDate: null, leaveEndDate: null,
@ -60,15 +66,63 @@ function onValidate() {
} }
} }
if (hasError.every(result => result === true)) { if (hasError.every(result => result === true)) {
props.onSubmit(formData) onSubmit()
} }
} }
/** /** ส่วนของการประกาศและเลือกไฟล์เอกสารประกอบ */
* consolelog ไวอน const nameFile = ref<string>("")
*/ const nameFileDraft = ref<string>("")
function upLoadFile() { const fileDocDataUpload = ref<File[]>([])
console.log("upload", filesUpload.value) const fileUploadDoc = async (files: any) => {
files.forEach((file: any) => {
fileDocDataUpload.value.push(file)
})
}
/** ฟังก์ชั่น บันทึก */
const onSubmit = async () => {
dialogConfirm(
$q,
async () => {
await saveFormData()
},
"ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
)
console.log("save")
}
async function saveFormData() {
const formData = new FormData()
const blob = formDataRehabilitation.leaveDocument.slice(0, formDataRehabilitation.leaveDocument[0].size)
const newFile = new File(blob, nameFile.value, {
type: formDataRehabilitation.leaveDocument[0].type,
})
const blobDrafe = formDataRehabilitation.leaveDraftDocument.slice(0, formDataRehabilitation.leaveDraftDocument[0].size)
const newFileDraft = new File(blobDrafe, nameFileDraft.value, {
type: formDataRehabilitation.leaveDraftDocument[0].type,
})
formData.append("leaveDocument", newFile) //
formData.append("leaveDraftDocument", newFileDraft) //
formData.append("type", formDataRehabilitation.type) //
formData.append("leaveStartDate", dateToISO(formDataRehabilitation.leaveStartDate)) //
formData.append("leaveEndDate", dateToISO(formDataRehabilitation.leaveEndDate)) //
formData.append("leaveWrote", formDataRehabilitation.leaveWrote) //
formData.append("leaveDetail", formDataRehabilitation.leaveDetail) //
await http
.post(config.API.leaveUser(), formData)
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
router.push(`/leave`)
})
.catch((e: any) => {
messageError($q, e)
})
} }
</script> </script>
@ -81,7 +135,7 @@ function upLoadFile() {
<q-card bordered class="q-pa-md bg-grey-1"> <q-card bordered class="q-pa-md bg-grey-1">
<div class="row q-pa-sm q-col-gutter-sm"> <div class="row q-pa-sm q-col-gutter-sm">
<q-input <q-input
v-model="formData.leaveWrote" v-model="formDataRehabilitation.leaveWrote"
class="col-12 col-sm-12" class="col-12 col-sm-12"
ref="leaveWroteRef" ref="leaveWroteRef"
dense dense
@ -92,7 +146,16 @@ function upLoadFile() {
:rules="[val => !!val || `${'เขียนที่'}`]" :rules="[val => !!val || `${'เขียนที่'}`]"
/> />
<datepicker v-model="formData.leaveStartDate" class="col-12 col-md-4 col-sm-6" menu-class-name="modalfix" autoApply borderless week-start="0" :enableTimePicker="false" :locale="'th'"> <datepicker
v-model="formDataRehabilitation.leaveStartDate"
class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix"
autoApply
borderless
week-start="0"
:enableTimePicker="false"
:locale="'th'"
>
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
</template> </template>
@ -108,7 +171,7 @@ function upLoadFile() {
dense dense
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
:model-value="formData.leaveStartDate != null ? date2Thai(formData.leaveStartDate) : null" :model-value="formDataRehabilitation.leaveStartDate != null ? date2Thai(formDataRehabilitation.leaveStartDate) : null"
:label="`${'ลาตั้งแต่วันที่'}`" :label="`${'ลาตั้งแต่วันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาตั้งแต่วันที่'}`]"
> >
@ -120,16 +183,16 @@ function upLoadFile() {
</datepicker> </datepicker>
<datepicker <datepicker
v-model="formData.leaveEndDate" v-model="formDataRehabilitation.leaveEndDate"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
borderless borderless
week-start="0" week-start="0"
:locale="'th'" :locale="'th'"
:readonly="!formData.leaveStartDate" :readonly="!formDataRehabilitation.leaveStartDate"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.leaveStartDate ? new Date(formData.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formDataRehabilitation.leaveStartDate ? new Date(formDataRehabilitation.leaveStartDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
{{ year + 543 }} {{ year + 543 }}
@ -146,8 +209,8 @@ function upLoadFile() {
lazy-rules lazy-rules
bg-color="white" bg-color="white"
hide-bottom-space hide-bottom-space
:readonly="!formData.leaveStartDate" :readonly="!formDataRehabilitation.leaveStartDate"
:model-value="formData.leaveEndDate != null ? date2Thai(formData.leaveEndDate) : null" :model-value="formDataRehabilitation.leaveEndDate != null ? date2Thai(formDataRehabilitation.leaveEndDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
> >
@ -158,10 +221,10 @@ function upLoadFile() {
</template> </template>
</datepicker> </datepicker>
<q-input v-model="formData.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" /> <q-input v-model="formDataRehabilitation.leaveDetail" class="col-12 col-md-12 col-sm-12" bg-color="white" dense outlined type="textarea" label="รายละเอียด" />
<div class="col-12 col-sm-6"> <div class="col-12 col-sm-6">
<q-file v-model="formData.leaveDocument" bg-color="white" dense outlined multiple label="เอกสารประกอบ"> <q-file v-model="formDataRehabilitation.leaveDocument" @added="fileUploadDoc" use-chips bg-color="white" dense outlined multiple label="เอกสารประกอบ">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -189,7 +252,7 @@ function upLoadFile() {
</div> </div>
</q-card> </q-card>
<div v-if="formData.leaveWrote && formData.leaveStartDate && formData.leaveEndDate" class="q-mt-md"> <div v-if="formDataRehabilitation.leaveWrote && formDataRehabilitation.leaveStartDate && formDataRehabilitation.leaveEndDate" class="q-mt-md">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-4-circle" size="20px" color="primary" /> <q-icon name="mdi-numeric-4-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">ดาวนโหลด/ปโหลดแบบฟอร</div> <div class="q-pl-sm text-weight-bold text-dark">ดาวนโหลด/ปโหลดแบบฟอร</div>
@ -205,7 +268,7 @@ function upLoadFile() {
<div class="col-10 col-sm-5 col-md-4 q-my-sm"> <div class="col-10 col-sm-5 col-md-4 q-my-sm">
<div class="column q-mx-xs"> <div class="column q-mx-xs">
<div class="q-pl-sm text-weight-bold text-dark text-center">ปโหลด</div> <div class="q-pl-sm text-weight-bold text-dark text-center">ปโหลด</div>
<q-file v-model="formData.leaveDraftDocument" dense label="แบบฟอร์ม" outlined bg-color="white" multiple accept="application/pdf"> <q-file v-model="formDataRehabilitation.leaveDraftDocument" dense label="แบบฟอร์ม" outlined bg-color="white" multiple accept="application/pdf">
<template v-slot:prepend> <template v-slot:prepend>
<q-icon name="attach_file" color="primary" /> <q-icon name="attach_file" color="primary" />
</template> </template>
@ -213,7 +276,7 @@ function upLoadFile() {
</div> </div>
</div> </div>
<div class="col-md-1 self-end q-mb-sm"> <div class="col-md-1 self-end q-mb-sm">
<q-btn v-if="formData.leaveDraftDocument" flat round color="primary" icon="mdi-arrow-up-bold" @click="upLoadFile"><q-tooltip>ปโหลด</q-tooltip></q-btn> <q-btn v-if="formDataRehabilitation.leaveDraftDocument" flat round color="primary" icon="mdi-arrow-up-bold" @click="fileUploadDoc"><q-tooltip>ปโหลด</q-tooltip></q-btn>
</div> </div>
</div> </div>
</q-card> </q-card>

View file

@ -39,19 +39,8 @@ const formData = reactive<FormData>({
}) })
onMounted(async () => { onMounted(async () => {
await FetchProfile() // await FetchProfile()
}) })
async function FetchProfile() {
await http
.post(config.API.leaveProfile(), { type: "08db80fe-919b-4439-856f-3fdb86ff99f9" })
.then((res: any) => {
success($q, "บันทึกสำเร็จ")
})
.catch((e: any) => {
messageError($q, e)
})
}
</script> </script>
<template> <template>
<q-card bordered class="q-pa-md bg-grey-1"> <q-card bordered class="q-pa-md bg-grey-1">

View file

@ -1,40 +1,41 @@
import type { S } from "@fullcalendar/core/internal-common"; import type { S } from "@fullcalendar/core/internal-common"
interface OptionData { interface OptionData {
id: string | undefined; id: string | undefined
name: string | undefined; name: string | undefined
code: string | undefined
} }
interface FormLeavetMainData { interface FormLeavetMainData {
type: string; type: string
numDate: string; numDate: string
extend: string; extend: string
use: string; use: string
numAll: string; numAll: string
numDone: string; numDone: string
numNot: string; numNot: string
numCancel: string; numCancel: string
} }
interface formListLeaveData { interface formListLeaveData {
no: string; no: string
date: string | null; date: string | null
type: string; type: string
status: string; status: string
year: string; year: string
} }
interface TypeLeave { interface TypeLeave {
code: string; code: string
createdAt: Date; createdAt: Date
createdFullName: string; createdFullName: string
createdUserId: string; createdUserId: string
id: string; id: string
lastUpdateFullName: string; lastUpdateFullName: string
lastUpdateUserId: string; lastUpdateUserId: string
lastUpdatedAt: Date | null; lastUpdatedAt: Date | null
limit: number; limit: number
name: string; name: string
} }
export type { OptionData, FormLeavetMainData, formListLeaveData, TypeLeave }; export type { OptionData, FormLeavetMainData, formListLeaveData, TypeLeave }

View file

@ -12,8 +12,8 @@ interface FormData {
} }
interface OrdinationForm { interface OrdinationForm {
leaveWrote: object | null leaveWrote: object | null
government: object | null leavegovernmentDate: object | null
birthday: object | null leavebirthDate: object | null
leaveStartDate: object | null leaveStartDate: object | null
leaveEndDate: object | null leaveEndDate: object | null
totalLeave: object | null totalLeave: object | null
@ -27,7 +27,7 @@ interface OrdinationForm {
} }
interface HajiForm { interface HajiForm {
leaveWrote: object | null leaveWrote: object | null
government: object | null leavegovernmentDate: object | null
leaveStartDate: object | null leaveStartDate: object | null
leaveEndDate: object | null leaveEndDate: object | null
[key: string]: any [key: string]: any
@ -47,8 +47,8 @@ interface MilitaryForm {
interface studyDaySubjectForm { interface studyDaySubjectForm {
leaveStartDate: object | null leaveStartDate: object | null
leaveEndDate: object | null leaveEndDate: object | null
birthday: object | null leavebirthDate: object | null
dateGovernment: object | null leavegovernmentDate: object | null
leaveSalary: object | null leaveSalary: object | null
leaveNumber: object | null leaveNumber: object | null
leaveAddress: object | null leaveAddress: object | null
@ -63,8 +63,8 @@ interface studyDaySubjectForm {
interface TrainForm { interface TrainForm {
leaveStartDate: object | null leaveStartDate: object | null
leaveEndDate: object | null leaveEndDate: object | null
birthday: object | null leavebirthDate: object | null
dateGovernment: object | null leavegovernmentDate: object | null
leaveNumber: object | null leaveNumber: object | null
leaveAddress: object | null leaveAddress: object | null
studyDayScholarship: object | null studyDayScholarship: object | null

View file

@ -6,7 +6,6 @@ interface FormData {
leaveStartDate: Date | null //*วัน เดือน ปีเริ่มต้นลา leaveStartDate: Date | null //*วัน เดือน ปีเริ่มต้นลา
leaveEndDate: Date | null //*วัน เดือน ปีสิ้นสุดลา leaveEndDate: Date | null //*วัน เดือน ปีสิ้นสุดลา
leaveTotal: string //จำนวนวันลา leaveTotal: string //จำนวนวันลา
contractTel: string //หมายเลขโทรศัพท์ที่ติดต่อได้
leaveNumber: string //หมายเลขที่ติดต่อขณะลา leaveNumber: string //หมายเลขที่ติดต่อขณะลา
leaveDetail: string //รายละเอียดการลา leaveDetail: string //รายละเอียดการลา
leaveAddress: string //สถานที่ติดต่อขณะลา leaveAddress: string //สถานที่ติดต่อขณะลา
@ -22,7 +21,6 @@ interface FormRef {
restDayCurrentTotal: object | null //วันที่คลอด restDayCurrentTotal: object | null //วันที่คลอด
leaveEndDate: object | null //*วัน เดือน ปีสิ้นสุดลา leaveEndDate: object | null //*วัน เดือน ปีสิ้นสุดลา
leaveTotal: object | null //จำนวนวันลา leaveTotal: object | null //จำนวนวันลา
contractTel: object | null //หมายเลขโทรศัพท์ที่ติดต่อได้
leaveNumber: object | null //หมายเลขที่ติดต่อขณะลา leaveNumber: object | null //หมายเลขที่ติดต่อขณะลา
leaveDetail: object | null //รายละเอียดการลา leaveDetail: object | null //รายละเอียดการลา
leaveAddress: object | null //สถานที่ติดต่อขณะลา leaveAddress: object | null //สถานที่ติดต่อขณะลา

View file

@ -1,4 +1,5 @@
interface FormData { interface FormData {
type: string
leaveWrote: string //เขียนที่*** leaveWrote: string //เขียนที่***
leaveStartDate: Date | null //*วัน เดือน ปีเริ่มต้นลา leaveStartDate: Date | null //*วัน เดือน ปีเริ่มต้นลา
leaveEndDate: Date | null //*วัน เดือน ปีสิ้นสุดลา leaveEndDate: Date | null //*วัน เดือน ปีสิ้นสุดลา

View file

@ -1,257 +1,263 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia"
import { ref } from "vue"; import { ref } from "vue"
import { useQuasar } from "quasar"
import type { QTableProps } from "quasar"; import type { QTableProps } from "quasar"
import type { import type { OptionData, TypeLeave } from "@/modules/05_leave/interface/index/main"
OptionData, import type { ListLeave, ListLeaveTable } from "@/modules/05_leave/interface/response/leave"
TypeLeave, import http from "@/plugins/http"
} from "@/modules/05_leave/interface/index/main"; import config from "@/app.config"
import type {
ListLeave,
ListLeaveTable,
} from "@/modules/05_leave/interface/response/leave";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin"
const mixin = useCounterMixin(); const mixin = useCounterMixin()
const { date2Thai } = mixin; const { date2Thai, messageError } = mixin
const $q = useQuasar()
export const useLeaveStore = defineStore("Leave", () => { export const useLeaveStore = defineStore("Leave", () => {
const tabValue = ref<string>("calendar"); const tabValue = ref<string>("calendar")
const typeLeave = ref<string | undefined>(""); const typeLeave = ref<string | undefined>("")
const LeaveType = ref<string | null>("0"); const LeaveType = ref<string | null>("0")
const LeaveStatus = ref<string | null>("0"); const LeaveStatus = ref<string | null>("0")
const fiscalYearyear = ref<Number | null>(new Date().getFullYear()); const fiscalYearyear = ref<Number | null>(new Date().getFullYear())
const rows = ref<ListLeaveTable[]>([]); const rows = ref<ListLeaveTable[]>([])
/** /**
* function Table * function Table
* @param data Table * @param data Table
*/ */
async function fetchListLeave(data: ListLeave[]) { async function fetchListLeave(data: ListLeave[]) {
let datalist: ListLeaveTable[] = data.map((e: ListLeave) => ({ let datalist: ListLeaveTable[] = data.map((e: ListLeave) => ({
id: e.id, id: e.id,
leaveTypeName: e.leaveTypeName, leaveTypeName: e.leaveTypeName,
leaveTypeId: e.leaveTypeId, leaveTypeId: e.leaveTypeId,
fullName: e.fullName, fullName: e.fullName,
dateSendLeave: e.dateSendLeave && date2Thai(e.dateSendLeave), dateSendLeave: e.dateSendLeave && date2Thai(e.dateSendLeave),
status: e.status, status: e.status,
statusConvert: convertStatud(e.status), statusConvert: convertStatud(e.status),
isDelete: e.isDelete, isDelete: e.isDelete,
})); }))
rows.value = datalist; rows.value = datalist
} }
function convertStatud(val: string) { function convertStatud(val: string) {
switch (val) { switch (val) {
case "NEW": case "NEW":
return "ใหม่"; return "ใหม่"
case "PENDING": case "PENDING":
return "กำลังดำเนินการ"; return "กำลังดำเนินการ"
case "APPROVE": case "APPROVE":
return "อนุมัติ"; return "อนุมัติ"
case "REJECT": case "REJECT":
return "ไม่อนุมัติ"; return "ไม่อนุมัติ"
case "DELETE": case "DELETE":
return "ยกเลิก"; return "ยกเลิก"
} }
} }
/** ประเภทการลา */ /** ประเภทการลา */
const typeOptions = ref<OptionData[]>([]); const typeOptions = ref<OptionData[]>([])
const typeOptionsMain = ref<OptionData[]>([]); const typeId = ref<string | undefined>("")
/** const typeOptionsMain = ref<OptionData[]>([])
* function const typeOptionsAdd = ref<OptionData[]>([])
* @param data /** รายการข้อมูลประเภทใบลา */
*/ const options = ref<OptionData[]>([])
async function fetchLeaveType(data: TypeLeave[]) { /**
typeOptionsMain.value = [ * function
{ id: "00000000-0000-0000-0000-000000000000", name: "ทั้งหมด" }, * @param data
]; */
const optionType = data.map((e: TypeLeave) => ({ async function fetchLeaveType(data: TypeLeave[]) {
id: e.id, typeOptionsMain.value = [{ id: "00000000-0000-0000-0000-000000000000", name: "ทั้งหมด", code: "LV-000" }]
name: e.name, const optionType = data.map((e: TypeLeave) => ({
})); id: e.id,
typeOptionsMain.value.push(...optionType); name: e.name,
typeOptions.value = typeOptionsMain.value; code: e.code,
} }))
typeOptionsMain.value.push(...optionType)
typeOptions.value = typeOptionsMain.value
console.log(typeOptions.value)
/** สถานะของการลา */ typeOptionsAdd.value.push(...optionType)
const statusOptionsMain = ref<OptionData[]>([ options.value = typeOptionsAdd.value
{ id: "ALL", name: "ทั้งหมด" }, console.log(options.value)
{ id: "NEW", name: "ใหม่" }, }
{ id: "PENDING", name: "กำลังดำเนินการ" },
{ id: "APPROVE", name: "อนุมัติ " },
{ id: "REJECT", name: "ไม่อนุมัติ" },
{ id: "DELETE", name: "ยกเลิก" },
]);
const statusOptions = ref<OptionData[]>(statusOptionsMain.value);
/** /** สถานะของการลา */
* function Option const statusOptionsMain = ref<any[]>([
* @param val { id: "ALL", name: "ทั้งหมด" },
* @param update { id: "NEW ", name: "ใหม่" },
* @param refData { id: "PENDING ", name: "กำลังดำเนินการ" },
*/ { id: "APPROVE ", name: "อนุมัติ " },
function filterOption(val: any, update: Function, refData: string) { { id: "REJECT ", name: "ไม่อนุมัติ" },
switch (refData) { { id: "DELETE ", name: "ยกเลิก" },
case "LeaveTypeOption": ])
update(() => { const statusOptions = ref<any[]>(statusOptionsMain.value)
typeOptions.value = typeOptionsMain.value.filter(
(v: any) => v.name.indexOf(val) > -1
);
});
break;
case "LeaveStatusOption":
update(() => {
statusOptions.value = statusOptionsMain.value.filter(
(v: any) => v.name.indexOf(val) > -1
);
});
break;
default:
break;
}
}
/** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/ /**
const optionsSpecific = ref([ * function Option
{ id: "s0", name: "ลาไปศึกษาต่อ" }, * @param val
{ id: "s1", name: "ลาฝึกอบรม" }, * @param update
{ id: "s2", name: "ลาปฎิบัติการวิจัย" }, * @param refData
{ id: "s3", name: "ลาดูงาน" }, */
]); function filterOption(val: any, update: Function, refData: string) {
switch (refData) {
case "LeaveTypeOption":
update(() => {
typeOptions.value = typeOptionsMain.value.filter((v: any) => v.name.indexOf(val) > -1)
})
break
case "LeaveStatusOption":
update(() => {
statusOptions.value = statusOptionsMain.value.filter((v: any) => v.name.indexOf(val) > -1)
})
break
default:
break
}
}
/** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/
const optionsSpecific = ref([
{ id: "s0", name: "ลาไปศึกษาต่อ", code: "s0" },
{ id: "s1", name: "ลาฝึกอบรม", code: "s1" },
{ id: "s2", name: "ลาปฎิบัติการวิจัย", code: "s2" },
{ id: "s3", name: "ลาดูงาน", code: "s3" },
])
/** รายการประเภทการลาของ ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ*/ /** รายการประเภทการลาของ ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ*/
const optionsOrdination = ref([ const optionsOrdination = ref([
{ id: "0", name: "ลาอุปสมบท" }, { id: "0", name: "ลาอุปสมบท", code: "0" },
{ id: "1", name: "ลาประกอบพิธีฮัจย์ฯ" }, { id: "1", name: "ลาประกอบพิธีฮัจย์ฯ", code: "1" },
]); ])
/** รายการข้อมูลประเภทใบลา */ /** data table filter & column ของรายการลา */
const options = ref<OptionData[]>([ const visibleColumns = ref<String[]>(["no", "leaveTypeName", "dateSendLeave", "status"])
{ id: "1", name: "ลาป่วย" }, const columns = ref<QTableProps["columns"]>([
{ id: "2", name: "ลากิจส่วนตัว" }, {
{ id: "3", name: "ลาคลอดบุตร" }, name: "no",
{ id: "4", name: "ลาไปช่วยเหลือภริยาที่คลอดบุตร" }, align: "left",
{ id: "5", name: "ลาพักผ่อน" }, label: "ลำดับ",
{ id: "6", name: "ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ" }, sortable: true,
{ id: "7", name: "ลาเข้ารับการตรวจเลือกหรือเข้ารับการเตรียมพล" }, field: "no",
{ id: "8", name: "ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน" }, headerStyle: "font-size: 14px",
{ id: "9", name: "ลาไปปฎิบัติงานในองค์การระหว่างประเทศ" }, style: "font-size: 14px; width:5%;",
{ id: "10", name: "ลาติดตามคู่สมรส" }, },
{ id: "11", name: "ลาไปฟื้นฟูสมรรถภาพด้านอาชีพ" }, {
]); name: "leaveTypeName",
align: "left",
label: "ประเภทการลา",
sortable: true,
field: "leaveTypeName",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "dateSendLeave",
align: "left",
label: "วันที่ยื่นใบลา",
sortable: true,
field: "dateSendLeave",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "status",
align: "left",
label: "สถานะ",
sortable: true,
field: "status",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:10%;",
},
])
/**
*
* @param item
* @param subitem
*/
function typeConvert(item: string, subitem: any) {
// console.log('first',item)
if (item !== "LV-006" && item !== "LV-008") {
typeLeave.value = convertSubtitle(item)
} else if (item === "LV-006") {
typeLeave.value = convertSubtitleInfo(subitem)
} else if (item === "LV-008") {
typeLeave.value = convertSubtitleInfo2(subitem)
}
typeId.value = convertId(item)
console.log(typeId.value)
}
/** data table filter & column ของรายการลา */ /**
const visibleColumns = ref<String[]>([ * /
"no", * @param val string
"leaveTypeName", * @returns
"dateSendLeave", */
"status", function convertSubtitle(val: string) {
]); return options.value.find(x => x.id == val)?.name
const columns = ref<QTableProps["columns"]>([ }
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: true,
field: "no",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:5%;",
},
{
name: "leaveTypeName",
align: "left",
label: "ประเภทการลา",
sortable: true,
field: "leaveTypeName",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "dateSendLeave",
align: "left",
label: "วันที่ยื่นใบลา",
sortable: true,
field: "dateSendLeave",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "status",
align: "left",
label: "สถานะ",
sortable: true,
field: "status",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:10%;",
},
]);
/** /**
* * /
* @param item * @param val string
* @param subitem * @returns
*/ */
function typeConvert(item: string, subitem: any) { function convertSubtitleInfo(val: string) {
// console.log('first',item) return optionsOrdination.value.find(x => x.id == val)?.name
if (item !== "6" && item !== "8") { }
typeLeave.value = convertSubtitle(item);
} else if (item === "6") {
typeLeave.value = convertSubtitleInfo(subitem);
} else if (item === "8") {
typeLeave.value = convertSubtitleInfo2(subitem);
}
}
/** /**
* / *
* @param val string * @param val string
* @returns * @returns
*/ */
function convertSubtitle(val: string) { function convertSubtitleInfo2(val: string) {
return options.value.find((x) => x.id == val)?.name; return optionsSpecific.value.find(x => x.id == val)?.name
} }
/** /**
* / * id
* @param val string * @param val string
* @returns * @returns
*/ */
function convertSubtitleInfo(val: string) { function convertId(val: string) {
return optionsOrdination.value.find((x) => x.id == val)?.name; return options.value.find(x => x.code == val)?.id
} }
/** async function fetchProfile() {
* console.log("profile")
* @param val string await http
* @returns .post(config.API.leaveProfile(), { type: typeId.value })
*/ .then((res: any) => {
function convertSubtitleInfo2(val: string) { const data = res.data.result
return optionsSpecific.value.find((x) => x.id == val)?.name; console.log(data.va)
} })
.catch((e: any) => {
messageError($q, e)
})
}
return { return {
tabValue, tabValue,
typeOptions, typeOptions,
optionsSpecific, optionsSpecific,
statusOptions, statusOptions,
visibleColumns, visibleColumns,
columns, columns,
rows, rows,
LeaveType, LeaveType,
LeaveStatus, LeaveStatus,
fiscalYearyear, fiscalYearyear,
options, options,
optionsOrdination, optionsOrdination,
typeConvert, typeConvert,
typeLeave, typeLeave,
typeId,
fetchListLeave, fetchListLeave,
fetchLeaveType, fetchLeaveType,
filterOption, filterOption,
}; fetchProfile,
}); }
})

View file

@ -23,6 +23,7 @@ import type { QForm } from "quasar"
import { useCounterMixin } from "@/stores/mixin" import { useCounterMixin } from "@/stores/mixin"
const dataStore = useLeaveStore() const dataStore = useLeaveStore()
const { fetchLeaveType } = dataStore
const mixin = useCounterMixin() const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, success, messageError } = mixin const { date2Thai, dialogConfirm, success, messageError } = mixin
const router = useRouter() const router = useRouter()
@ -33,7 +34,9 @@ const $q = useQuasar()
const model = ref<string>("") const model = ref<string>("")
const modelSpecific = ref<string>("") const modelSpecific = ref<string>("")
// onMounted(() => {}); onMounted(async () => {
await fectOptionType()
})
const saveAbsence = () => { const saveAbsence = () => {
$q.dialog({ $q.dialog({
@ -47,9 +50,9 @@ const saveAbsence = () => {
}) })
.onOk(() => { .onOk(() => {
// createFormresign() // createFormresign()
if (model.value !== "7") { if (model.value !== "LV-007") {
console.log(1) console.log(1)
} else if (model.value === "7") { } else if (model.value === "LV-007") {
console.log(2) console.log(2)
} }
router.push(`/leave`) router.push(`/leave`)
@ -58,69 +61,107 @@ const saveAbsence = () => {
.onDismiss(() => {}) .onDismiss(() => {})
} }
/** ฟังก์ชั่น บันทึก */ /** ฟังก์ชั่น บันทึก */
const onSubmit = async (formData: any) => { const onSubmit = async () => {
dialogConfirm( dialogConfirm(
$q, $q,
async () => { async () => {
console.log(formData) await saveformdata()
saveformdata(formData)
}, },
"ยืนยันการยื่นใบลา", "ยืนยันการยื่นใบลา",
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?" "ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
) )
console.log(formData)
console.log(formData.leaveWrote)
console.log("save") console.log("save")
} }
async function saveformdata(formData: any) { async function fectOptionType() {
await http
.get(config.API.leaveType())
.then(async res => {
const data = res.data.result
await fetchLeaveType(data)
})
.catch(err => {
messageError($q, err)
})
}
async function FetchCheck(formData: any) {
await http
.post(config.API.leaveCheck(), { type: dataStore.typeId ?? null, leaveStartDate: formData.leaveStartDate ?? null, leaveEndDate: formData.leaveEndDate ?? null })
.then((res: any) => {
const data = res.data.result
formData.dateStart = data.isLeave
formData.subject = data.sumDateWork
formData.leaveabsentDaySummon = data.totalDate
})
.catch((e: any) => {
messageError($q, e)
})
}
async function saveformdata() {
const formData = new FormData()
// if (formDataLeave.value.leaveDocument > 0) {
// const blob = formDataLeave.value.leaveDocument.slice(0, formDataLeave.value.leaveDocument[0].size)
// const newFile = new File(blob, nameFile.value, {
// type: formDataLeave.value.leaveDocument[0].type,
// })
// formData.append("leaveDocument", newFile)
// }
// if (formDataLeave.value.leaveDraftDocument > 0) {
// const blob = formDataLeave.value.leaveDraftDocument.slice(0, formDataLeave.value.leaveDraftDocument[0].size)
// const newFileDraft = new File(blob, nameFile.value, {
// type: formDataLeave.value.leaveDraftDocument[0].type,
// })
// formData.append("leaveDraftDocument", newFileDraft)
// }
formData.append("type", "6d8430db-da6d-4234-8499-6c98ea1de1cd")
// formData.append("leaveStartDate", formDataLeave.value.leaveStartDate)
// formData.append("leaveEndDate", formDataLeave.value.leaveEndDate)
// formData.append("leaveWrote", formDataLeave.value.leaveWrote)
// formData.append("leaveAddress", formDataLeave.value.leaveAddress)
// formData.append("leaveNumber", formDataLeave.value.leaveNumber)
// formData.append("leaveDetail", formDataLeave.value.leaveDetail)
// formData.append("leaveSalaryText", formDataLeave.value.leaveSalaryText)
// formData.append("wifeDayName", formDataLeave.value.wifeDayName)
// formData.append("wifeDayDateBorn", formDataLeave.value.wifeDayDateBorn)
// formData.append("restDayOldTotal", formDataLeave.value.restDayOldTotal)
// formData.append("restDayCurrentTotal", formDataLeave.value.restDayCurrentTotal)
// formData.append("ordainDayStatus", formDataLeave.value.ordainDayStatus)
// formData.append("ordainDayLocationName", formDataLeave.value.ordainDayLocationName)
// formData.append("ordainDayLocationAddress", formDataLeave.value.ordainDayLocationAddress)
// formData.append("ordainDayLocationNumber", formDataLeave.value.ordainDayLocationNumber)
// formData.append("ordainDayOrdination", formDataLeave.value.ordainDayOrdination)
// formData.append("ordainDayBuddhistLentName", formDataLeave.value.ordainDayBuddhistLentName)
// formData.append("ordainDayBuddhistLentAddress", formDataLeave.value.ordainDayBuddhistLentAddress)
// formData.append("hajjDayStatus", formDataLeave.value.hajjDayStatus)
// formData.append("absentDaySummon", formDataLeave.value.absentDaySummon)
// formData.append("absentDayLocation", formDataLeave.value.absentDayLocation)
// formData.append("absentDayRegistorDate", formDataLeave.value.absentDayRegistorDate)
// formData.append("absentDayGetIn", formDataLeave.value.absentDayGetIn)
// formData.append("absentDayAt", formDataLeave.value.absentDayAt)
// formData.append("studyDaySubject", formDataLeave.value.studyDaySubject)
// formData.append("studyDayDegreeLevel", formDataLeave.value.studyDayDegreeLevel)
// formData.append("studyDayUniversityName", formDataLeave.value.studyDayUniversityName)
// formData.append("studyDayTrainingSubject", formDataLeave.value.studyDayTrainingSubject)
// formData.append("studyDayTrainingName", formDataLeave.value.studyDayTrainingName)
// formData.append("studyDayCountry", formDataLeave.value.studyDayCountry)
// formData.append("studyDayScholarship", formDataLeave.value.studyDayScholarship)
// formData.append("coupleDayName", formDataLeave.value.coupleDayName)
// formData.append("coupleDayPosition", formDataLeave.value.coupleDayPosition)
// formData.append("coupleDayLevel", formDataLeave.value.coupleDayLevel)
// formData.append("coupleDayLevelCountry", formDataLeave.value.coupleDayLevelCountry)
// formData.append("coupleDayCountryHistory", formDataLeave.value.coupleDayCountryHistory)
// formData.append("coupleDayTotalHistory", formDataLeave.value.coupleDayTotalHistory)
// formData.append("coupleDayStartDateHistory", formDataLeave.value.coupleDayStartDateHistory)
// formData.append("coupleDayEndDateHistory", formDataLeave.value.coupleDayEndDateHistory)
// formData.append("coupleDaySumTotalHistory", formDataLeave.value.coupleDaySumTotalHistory)
// formData.append("leaveSalary", formDataLeave.value.leaveSalary)
await http await http
.post(config.API.leaveUser(), { .post(config.API.leaveUser(), {
type: formData.id ?? null, formData,
leaveStartDate: formData.leaveStartDate ?? null,
leaveEndDate: formData.leaveEndDate ?? null,
leaveWrote: formData.leaveWrote ?? null ?? null, //
leaveAddress: formData.leaveAddress ?? null, //
leaveNumber: formData.leaveNumber ?? null, //
leaveDetail: formData.leaveDetail ?? null, //
leaveDocument: formData.leaveDocument ?? null, //
leaveDraftDocument: formData.leaveDraftDocument ?? null, //
leaveSalaryText: formData.leaveSalaryText ?? null, // ()
wifeDayName: formData.wifeDayName ?? null, //()
wifeDayDateBorn: formData.wifeDayDateBorn ?? null, //()
restDayOldTotal: formData.restDayOldTotal ?? null, // ()(Auto)
restDayCurrentTotal: formData.restDayCurrentTotal ?? null, //()(Auto)
ordainDayStatus: formData.ordainDayStatus ?? null, /// () ()
ordainDayLocationName: formData.ordainDayLocationName ?? null, // ()
ordainDayLocationAddress: formData.ordainDayLocationAddress ?? null, // ()
ordainDayLocationNumber: formData.ordainDayLocationNumber ?? null, // ()
ordainDayOrdination: formData.ordainDayOrdination ?? null, // ()
ordainDayBuddhistLentName: formData.ordainDayBuddhistLentName ?? null, // ()
ordainDayBuddhistLentAddress: formData.ordainDayBuddhistLentAddress ?? null, // ()
hajjDayStatus: formData.hajjDayStatus ?? null, /// () ()
absentDaySummon: formData.absentDaySummon ?? null, // ()
absentDayLocation: formData.absentDayLocation ?? null, // ()
absentDayRegistorDate: formData.absentDayRegistorDate ?? null, // ()
absentDayGetIn: formData.absentDayGetIn ?? null, // ()
absentDayAt: formData.absentDayAt ?? null, // ()
studyDaySubject: formData.studyDaySubject ?? null, // ( )
studyDayDegreeLevel: formData.studyDayDegreeLevel ?? null, // ( )
studyDayUniversityName: formData.studyDayUniversityName ?? null, // ( )
studyDayTrainingSubject: formData.studyDayTrainingSubject ?? null, // / ( )
studyDayTrainingName: formData.studyDayTrainingName ?? null, // ( )
studyDayCountry: formData.studyDayCountry ?? null, // ( )
studyDayScholarship: formData.studyDayScholarship ?? null, // ( )
coupleDayName: formData.coupleDayName ?? null, // ()
coupleDayPosition: formData.coupleDayPosition ?? null, // ()
coupleDayLevel: formData.coupleDayLevel ?? null, // ()
coupleDayLevelCountry: formData.coupleDayLevelCountry ?? null, // ()
coupleDayCountryHistory: formData.coupleDayCountryHistory ?? null, // ()
coupleDayTotalHistory: formData.coupleDayTotalHistory ?? null, // ()
coupleDayStartDateHistory: formData.coupleDayStartDateHistory ?? null, // ()
coupleDayEndDateHistory: formData.coupleDayEndDateHistory ?? null, // ()
coupleDaySumTotalHistory: formData.coupleDaySumTotalHistory ?? null, // ()
leaveSalary: formData.leaveSalary,
}) })
.then((res: any) => { .then((res: any) => {
success($q, "บันทึกสำเร็จ") success($q, "บันทึกสำเร็จ")
@ -156,22 +197,22 @@ async function saveformdata(formData: any) {
outlined outlined
v-model="model" v-model="model"
:options="dataStore.options" :options="dataStore.options"
option-value="id" option-value="code"
option-label="name" option-label="name"
emit-value emit-value
map-options map-options
prefix="ประเภทใบลา :" prefix="ประเภทใบลา :"
@update:model-value="dataStore.typeConvert(model, null), (modelSpecific = '')" @update:model-value="dataStore.typeConvert(model, null), (modelSpecific = ''), dataStore.fetchProfile()"
/> />
</div> </div>
<div class="row q-mt-sm"> <div class="row q-mt-sm">
<div class="col-12 col-sm-6 col-md-3" v-if="model === '6' || model === '8'"> <div class="col-12 col-sm-6 col-md-3" v-if="model === 'LV-006' || model === 'LV-008'">
<q-select <q-select
dense dense
outlined outlined
v-model="modelSpecific" v-model="modelSpecific"
:options="model === '6' ? dataStore.optionsOrdination : dataStore.optionsSpecific" :options="model === 'LV-006' ? dataStore.optionsOrdination : dataStore.optionsSpecific"
option-value="id" option-value="code"
option-label="name" option-label="name"
emit-value emit-value
map-options map-options
@ -193,18 +234,18 @@ async function saveformdata(formData: any) {
</div> </div>
</div> </div>
<div v-if="model" class="col-12"> <div v-if="model" class="col-12">
<SickForm :on-submit="onSubmit" v-if="model === '1' || model === '2'" /> <SickForm :on-submit="onSubmit" v-if="model === 'LV-001' || model === 'LV-002'" />
<FormBirth :on-submit="onSubmit" v-if="model === '3'" /> <FormBirth :on-submit="onSubmit" v-if="model === 'LV-003'" />
<HelpWifeBirthForm :on-submit="onSubmit" v-if="model === '4'" /> <HelpWifeBirthForm :on-submit="onSubmit" v-if="model === 'LV-004'" />
<VacationForm :on-submit="onSubmit" v-if="model === '5'" /> <VacationForm :on-submit="onSubmit" v-if="model === 'LV-005'" />
<OrdinationForm :on-submit="onSubmit" v-if="model === '6' && modelSpecific === '0'" /> <OrdinationForm :on-submit="onSubmit" v-if="model === 'LV-006' && modelSpecific === '0'" />
<HajjForm :on-submit="onSubmit" v-if="model === '6' && modelSpecific === '1'" /> <HajjForm :on-submit="onSubmit" v-if="model === 'LV-006' && modelSpecific === '1'" />
<MilitaryForm :on-submit="onSubmit" v-if="model === '7'" style="width: 100%" /> <MilitaryForm :on-submit="onSubmit" v-if="model === 'LV-007'" style="width: 100%" />
<StudyForm :on-submit="onSubmit" v-if="model === '8' && modelSpecific === 's0'" style="width: 100%" /> <StudyForm :on-submit="onSubmit" v-if="model === 'LV-008' && modelSpecific === 's0'" style="width: 100%" />
<TrainForm :on-submit="onSubmit" v-if="model === '8' && modelSpecific != 's0' && modelSpecific != ''" /> <TrainForm :on-submit="onSubmit" v-if="model === 'LV-008' && modelSpecific != 's0' && modelSpecific != ''" />
<WorkInternationalForm :on-submit="onSubmit" v-if="model === '9'" /> <WorkInternationalForm :on-submit="onSubmit" v-if="model === 'LV-009'" />
<FollowSpouseForm :on-submit="onSubmit" v-if="model === '10'" /> <FollowSpouseForm :on-submit="onSubmit" v-if="model === 'LV-010'" />
<RehabilitationForm :on-submit="onSubmit" v-if="model === '11'" /> <RehabilitationForm :on-submit="onSubmit" v-if="model === 'LV-011'" />
</div> </div>
</div> </div>
</q-card> </q-card>