แก้ไข ui ฟอร์มการลา

-จัดโค้ด
-เพิ่ม function
This commit is contained in:
AnandaTon 2023-11-22 15:45:52 +07:00
parent 1ea53b0fe5
commit f30a552b69
11 changed files with 496 additions and 409 deletions

View file

@ -29,6 +29,7 @@ const formData = reactive<any>({
halfDay: "day", halfDay: "day",
contractTel: "", contractTel: "",
leaveTotal: "", leaveTotal: "",
leaveLast: "",
leaveContactTel: "", leaveContactTel: "",
leaveContactLocation: "", leaveContactLocation: "",
leaveDetail: "", leaveDetail: "",
@ -42,6 +43,7 @@ const endLeaveDateRef = ref<object | null>(null)
const halfDayRef = ref<object | null>(null) const halfDayRef = ref<object | null>(null)
const contractTelRef = ref<object | null>(null) const contractTelRef = ref<object | null>(null)
const leaveTotalRef = ref<object | null>(null) const leaveTotalRef = ref<object | null>(null)
const leaveLastRef = ref<object | null>(null)
const leaveContactTelRef = ref<object | null>(null) const leaveContactTelRef = ref<object | null>(null)
const leaveContactLocationRef = ref<object | null>(null) const leaveContactLocationRef = ref<object | null>(null)
const leaveDetailRef = ref<object | null>(null) const leaveDetailRef = ref<object | null>(null)
@ -82,6 +84,17 @@ async function fileUploadDoc(files: any) {
}) })
} }
/**
* function เซทค startLeaveDate เเละ endLeaveDate
*/
function resetDate() {
if (formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon") {
formData.startLeaveDate = null
formData.endLeaveDate = null
}
console.log("testnull")
}
/** ฟังก์ชั่นตรวจสอบความถูกต้องของข้อมูลในฟอร์ม */ /** ฟังก์ชั่นตรวจสอบความถูกต้องของข้อมูลในฟอร์ม */
function onValidate() { function onValidate() {
const hasError = [] const hasError = []
@ -103,6 +116,9 @@ const isReadOnly = computed(() => {
const conditionHalfDay = formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon" const conditionHalfDay = formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon"
if (conditionHalfDay) { if (conditionHalfDay) {
formData.endLeaveDate = formData.startLeaveDate // Set formData.endLeaveDate to null formData.endLeaveDate = formData.startLeaveDate // Set formData.endLeaveDate to null
formData.leaveTotal = "0.5 วัน "
} else {
formData.leaveTotal = null
} }
return conditionHalfDay return conditionHalfDay
}) })
@ -133,8 +149,8 @@ console.log(isReadOnly.value)
<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="formData.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" />
<q-radio v-model="formData.halfDay" val="half_day_morning" 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="formData.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" /> <q-radio v-model="formData.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">
@ -212,16 +228,28 @@ console.log(isReadOnly.value)
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.startLeaveDate && formData.endLeaveDate" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
เปนเวลา dense
{{ outlined
formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon" ref="leaveTotalRef"
? "0.5 วัน" for="leaveTotalRef"
: calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate) v-model="formData.leaveTotal"
}} label="จำนวนวันที่ลา"
</p> readonly
</div> hide-bottom-space
/>
<q-input
class="col-12 col-md-3 col-sm-6"
dense
outlined
ref="leaveLastRef"
for="leaveLastRef"
v-model="formData.leaveLast"
label="ลาครั้งสุดท้ายเมื่อวันที่"
readonly
hide-bottom-space
/>
</div> </div>
</div> </div>
<div class="full-width"> <div class="full-width">

View file

@ -26,6 +26,7 @@ const formData = reactive<any>({
endLeaveDate: null, endLeaveDate: null,
contractTel: "", contractTel: "",
leaveTotal: "", leaveTotal: "",
leaveLast: "",
leaveContactTel: "", leaveContactTel: "",
leaveContactLocation: "", leaveContactLocation: "",
leaveDetail: "", leaveDetail: "",
@ -193,12 +194,18 @@ function onValidate() {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input class="col-12 col-md-2 col-sm-6" dense outlined ref="leaveTotalRef" for="leaveTotalRef" v-model="formData.leaveTotal" label="จำนวนวันที่ลา" readonly hide-bottom-space />
<p v-if="formData.startLeaveDate && formData.endLeaveDate" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> <q-input
เปนเวลา class="col-12 col-md-3 col-sm-6"
{{ calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate) }} dense
</p> outlined
</div> ref="leaveLastRef"
for="leaveLastRef"
v-model="formData.leaveLast"
label="ลาครั้งสุดท้ายเมื่อวันที่"
readonly
hide-bottom-space
/>
<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

View file

@ -215,12 +215,7 @@ function onValidate() {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input class="col-12 col-md-2 col-sm-6" dense outlined ref="leaveTotalRef" for="leaveTotalRef" v-model="formData.leaveTotal" label="จำนวนวันที่ลา" readonly hide-bottom-space />
<p v-if="formData.startLeaveDate && formData.endLeaveDate" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a">
เปนเวลา
{{ calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate) }}
</p>
</div>
<div class="col-12 col-md-4 col-sm-12"> <div class="col-12 col-md-4 col-sm-12">
<q-input <q-input
class="col-12 col-sm-12" class="col-12 col-sm-12"

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, watch } 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"
@ -104,6 +104,28 @@ function onValidate() {
props.onSubmit() props.onSubmit()
} }
} }
/**
* function เซทค startLeaveDate เเละ endLeaveDate
*/
function resetDate() {
if (formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon") {
formData.startLeaveDate = null
formData.endLeaveDate = null
}
console.log("testnull")
}
const isReadOnly = computed(() => {
const conditionHalfDay = formData.halfDay === "half_day_morning" || formData.halfDay === "half_day_afternoon"
if (conditionHalfDay) {
formData.endLeaveDate = formData.startLeaveDate // Set formData.endLeaveDate to null
formData.leaveTotal = "0.5 วัน "
} else {
formData.leaveTotal = null
}
return conditionHalfDay
})
</script> </script>
<template> <template>
@ -128,8 +150,8 @@ function onValidate() {
/> />
<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="formData.halfDay" val="day" label="ลาทั้งวัน" checked-icon="task_alt" />
<q-radio v-model="formData.halfDay" val="half_day_morning" 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="formData.halfDay" val="half_day_afternoon" label="ลาครึ่งวันบ่าย" checked-icon="task_alt" /> <q-radio v-model="formData.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"
@ -203,7 +225,7 @@ function onValidate() {
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
:readonly="!formData.startLeaveDate" :readonly="isReadOnly"
:min-date="formData.startLeaveDate ? new Date(formData.startLeaveDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.startLeaveDate ? new Date(formData.startLeaveDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
<template #year="{ year }"> <template #year="{ year }">
@ -220,7 +242,7 @@ function onValidate() {
for="endLeaveDateRef" for="endLeaveDateRef"
hide-bottom-space hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:readonly="!formData.startLeaveDate" :readonly="isReadOnly"
:model-value="formData.endLeaveDate != null ? date2Thai(formData.endLeaveDate) : null" :model-value="formData.endLeaveDate != null ? date2Thai(formData.endLeaveDate) : null"
:label="`${'ลาถึงวันที่'}`" :label="`${'ลาถึงวันที่'}`"
:rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]" :rules="[val => !!val || `${'กรุณาเลือกลาถึงวันที่'}`]"
@ -231,12 +253,7 @@ function onValidate() {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input class="col-12 col-md-2 col-sm-6" dense outlined ref="leaveTotalRef" for="leaveTotalRef" v-model="formData.leaveTotal" label="จำนวนวันที่ลา" readonly hide-bottom-space />
<p v-if="formData.startLeaveDate && formData.endLeaveDate" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a">
เปนเวลา
{{ calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate) }}
</p>
</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

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref } from "vue" 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 { FormRef06 } from "@/modules/05_leave/interface/request/AddAbsence" import type { FormRef06 } from "@/modules/05_leave/interface/request/AddAbsence"
@ -71,6 +71,26 @@ const formRef: FormRef06 = {
addressBuddhist: addressBuddhistRef, addressBuddhist: addressBuddhistRef,
} }
// Watch for changes in dateLeaveEnd and update leaveTotal accordingly
watch(formData.dateLeaveEnd, async () => {
if (formData.dateLeaveStart !== undefined && formData.dateLeaveEnd !== undefined) {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log(newLeaveTotal)
}
// Update the leaveTotal value
console.log("test")
})
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */ /** ฟังก์ชั่นตรวจสอบความถูกต้องก่อน บันทึก */
function onValidate() { function onValidate() {
const hasError = [] const hasError = []
@ -157,6 +177,7 @@ function onSubmit() {
:locale="'th'" :locale="'th'"
autoApply autoApply
borderless borderless
@update:model-value="updateLeaveTotal"
:readonly="!formData.dateLeaveStart" :readonly="!formData.dateLeaveStart"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null"
@ -187,13 +208,18 @@ function onSubmit() {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<q-input
<div class="col-12 col-md-4 col-sm-6"> class="col-12 col-md-2 col-sm-6"
<p v-if="formData.dateLeaveStart && formData.dateLeaveEnd" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> dense
เปนเวลา outlined
{{ calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd) }} bg-color="white"
</p> ref="leaveTotalRef"
</div> for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">
<datepicker <datepicker
@ -385,6 +411,7 @@ function onSubmit() {
type="textarea" type="textarea"
class="col-12 col-md-12 col-sm-12" class="col-12 col-md-12 col-sm-12"
dense dense
bg-color="white"
outlined outlined
ref="leaveDetailRef" ref="leaveDetailRef"
for="leaveDetailRef" for="leaveDetailRef"

View file

@ -64,6 +64,14 @@ function onValidate() {
onSubmit() onSubmit()
} }
} }
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** ฟังก์ชั่น บันทึก */ /** ฟังก์ชั่น บันทึก */
function onSubmit() { function onSubmit() {
@ -145,6 +153,7 @@ function onSubmit() {
week-start="0" week-start="0"
:enableTimePicker="false" :enableTimePicker="false"
:locale="'th'" :locale="'th'"
@update:model-value="updateLeaveTotal"
:readonly="!formData.dateLeaveStart" :readonly="!formData.dateLeaveStart"
:min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null"
> >
@ -174,12 +183,18 @@ function onSubmit() {
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.dateLeaveStart && formData.dateLeaveEnd" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
เปนเวลา dense
{{ calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd) }} outlined
</p> bg-color="white"
</div> ref="leaveTotalRef"
for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<datepicker <datepicker
v-model="formData.government" v-model="formData.government"
class="col-12 col-md-4 col-sm-6" class="col-12 col-md-4 col-sm-6"
@ -219,10 +234,10 @@ function onSubmit() {
</div> </div>
</div> </div>
<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" checked-icon="task_alt" label="เคย" /> <q-radio v-model="formData.monk" val="ever" checked-icon="task_alt" label="เคย" />
<q-radio v-model="formData.monk" val="never" checked-icon="task_alt" label="ไม่เคยไปประกอบพิธีฮัจย์" /> <q-radio v-model="formData.monk" val="never" checked-icon="task_alt" label="ไม่เคยไปประกอบพิธีฮัจย์" />
</div> </div>
<q-input v-model="formData.info" class="col-12 q-mt-sm" bg-color="white" dense outlined type="textarea" label="รายละเอียด" /> <q-input v-model="formData.info" class="col-12 q-mt-sm" bg-color="white" dense outlined type="textarea" label="รายละเอียด" />

View file

@ -77,6 +77,15 @@ function onValidate() {
} }
} }
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** ฟังก์ชั่น บันทึก */ /** ฟังก์ชั่น บันทึก */
function onSubmit() { function onSubmit() {
dialogConfirm( dialogConfirm(
@ -146,6 +155,7 @@ function onSubmit() {
borderless borderless
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
@update:model-value="updateLeaveTotal"
:readonly="!formData.dateLeaveStart" :readonly="!formData.dateLeaveStart"
:min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null"
> >
@ -175,12 +185,18 @@ function onSubmit() {
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.dateLeaveStart && formData.dateLeaveEnd" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
เปนเวลา dense
{{ calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd) }} outlined
</p> bg-color="white"
</div> ref="leaveTotalRef"
for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<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

View file

@ -92,6 +92,15 @@ function onValidate() {
} }
} }
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** ฟังก์ชั่น บันทึก */ /** ฟังก์ชั่น บันทึก */
function onSubmit() { function onSubmit() {
dialogConfirm( dialogConfirm(
@ -168,6 +177,7 @@ const formattedSalary = computed(() => {
borderless borderless
week-start="0" week-start="0"
:locale="'th'" :locale="'th'"
@update:model-value="updateLeaveTotal"
:readonly="!formData.dateLeaveStart" :readonly="!formData.dateLeaveStart"
:enableTimePicker="false" :enableTimePicker="false"
:min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.dateLeaveStart ? new Date(formData.dateLeaveStart.getTime() + 24 * 60 * 60 * 1000) : null"
@ -199,12 +209,18 @@ const formattedSalary = computed(() => {
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.dateLeaveStart && formData.dateLeaveEnd" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
เปนเวลา dense
{{ calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd) }} outlined
</p> bg-color="white"
</div> ref="leaveTotalRef"
for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">

View file

@ -87,6 +87,15 @@ function onValidate() {
} }
} }
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** ฟังก์ชั่น บันทึก */ /** ฟังก์ชั่น บันทึก */
function onSubmit() { function onSubmit() {
dialogConfirm( dialogConfirm(
@ -160,6 +169,7 @@ const formattedSalary = computed(() => {
menu-class-name="modalfix" menu-class-name="modalfix"
autoApply autoApply
borderless borderless
@update:model-value="updateLeaveTotal"
week-start="0" week-start="0"
:readonly="!formData.dateLeaveStart" :readonly="!formData.dateLeaveStart"
:locale="'th'" :locale="'th'"
@ -193,12 +203,18 @@ const formattedSalary = computed(() => {
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.dateLeaveStart && formData.dateLeaveEnd" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
ระยะเวลา dense
{{ calculateDurationYmd(formData.dateLeaveStart, formData.dateLeaveEnd) }} outlined
</p> bg-color="white"
</div> ref="leaveTotalRef"
for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<div class="full-width"> <div class="full-width">
<div class="q-col-gutter-sm row"> <div class="q-col-gutter-sm row">

View file

@ -119,6 +119,15 @@ function onValidate() {
} }
} }
/**
* function พเดทค LeaveTotal
*/
function updateLeaveTotal() {
const newLeaveTotal = calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate)
formData.leaveTotal = newLeaveTotal
console.log("test")
}
/** /**
* function check าถามามาเเลวจะเป readonly * function check าถามามาเเลวจะเป readonly
*/ */
@ -230,6 +239,7 @@ watch(formData.followHistoryEnd, newVal => {
hide-bottom-space hide-bottom-space
:enableTimePicker="false" :enableTimePicker="false"
week-start="0" week-start="0"
@update:model-value="updateLeaveTotal"
:readonly="!formData.startLeaveDate" :readonly="!formData.startLeaveDate"
:min-date="formData.startLeaveDate ? new Date(formData.startLeaveDate.getTime() + 24 * 60 * 60 * 1000) : null" :min-date="formData.startLeaveDate ? new Date(formData.startLeaveDate.getTime() + 24 * 60 * 60 * 1000) : null"
> >
@ -258,12 +268,18 @@ watch(formData.followHistoryEnd, newVal => {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-12 col-md-4 col-sm-6"> <q-input
<p v-if="formData.startLeaveDate && formData.endLeaveDate" class="text-weight-bold text-subtitle1 q-mb-none" style="padding-top: 7px; color: #26a69a"> class="col-12 col-md-2 col-sm-6"
กำหนด dense
{{ calculateDurationYmd(formData.startLeaveDate, formData.endLeaveDate) }} outlined
</p> bg-color="white"
</div> ref="leaveTotalRef"
for="leaveTotalRef"
v-model="formData.leaveTotal"
label="จำนวนวันที่ลา"
readonly
hide-bottom-space
/>
<div class="col-12 col-md-6 col-sm-12"> <div class="col-12 col-md-6 col-sm-12">
<q-input hide-bottom-space class="col-12 col-sm-12" ref="salaryRef" for="salaryRef" dense outlined v-model="formattSalary" label="เงินเดือนปัจจุบัน" readonly /> <q-input hide-bottom-space class="col-12 col-sm-12" ref="salaryRef" for="salaryRef" dense outlined v-model="formattSalary" label="เงินเดือนปัจจุบัน" readonly />
</div> </div>

View file

@ -1,356 +1,290 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia"
import { ref, computed } from "vue"; import { ref, computed } from "vue"
import type { QTableProps } from "quasar"; import type { QTableProps } from "quasar"
import type { import type { FormLeavetMainData, OptionData, formListLeaveData } from "@/modules/05_leave/interface/index/main"
FormLeavetMainData, import { useCounterMixin } from "@/stores/mixin"
OptionData,
formListLeaveData,
} from "@/modules/05_leave/interface/index/main";
import { useCounterMixin } from "@/stores/mixin";
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 mixin = useCounterMixin(); const mixin = useCounterMixin()
const { date2Thai } = mixin; const { date2Thai } = mixin
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<string | null>("0"); const fiscalYearyear = ref<string | null>("0")
const rows = ref<formListLeaveData[]>([]); const rows = ref<formListLeaveData[]>([])
const DataMainOrig = ref<formListLeaveData[]>([]); // ข้อมูลหลักดั้งเดิม const DataMainOrig = ref<formListLeaveData[]>([]) // ข้อมูลหลักดั้งเดิม
async function fecthList(data: formListLeaveData[]) { async function fecthList(data: formListLeaveData[]) {
let datalist: formListLeaveData[] = data.map((e: any) => ({ let datalist: formListLeaveData[] = data.map((e: any) => ({
no: e.no, no: e.no,
type: e.type, type: e.type,
status: e.status, status: e.status,
date: e.date, date: e.date,
year: e.year, year: e.year,
})); }))
rows.value = datalist; rows.value = datalist
DataMainOrig.value = datalist; DataMainOrig.value = datalist
} }
const DataMainUpdate = ref<formListLeaveData[]>([]); // ข้อมูลเปลี่ยนแปลง const DataMainUpdate = ref<formListLeaveData[]>([]) // ข้อมูลเปลี่ยนแปลง
const DataMain = (val: formListLeaveData[]) => (DataMainOrig.value = val); const DataMain = (val: formListLeaveData[]) => (DataMainOrig.value = val)
const DataUpdate = ( const DataUpdate = (filterType: string, filterStatus: string, filterYear: string) => {
filterType: string, DataMainUpdate.value = []
filterStatus: string,
filterYear: string
) => {
DataMainUpdate.value = [];
if (filterType === "" && filterStatus === "" && filterYear === "") { if (filterType === "" && filterStatus === "" && filterYear === "") {
DataMainUpdate.value = DataMainOrig.value; DataMainUpdate.value = DataMainOrig.value
} else if (filterType !== "" && filterStatus === "" && filterYear === "") { } else if (filterType !== "" && filterStatus === "" && filterYear === "") {
DataMainUpdate.value = DataMainOrig.value.filter( DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.type === filterType)
(item: formListLeaveData) => item.type === filterType } else if (filterType !== "" && filterStatus !== "" && filterYear === null) {
); DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.type === filterType && item.status === filterStatus)
} else if ( } else if (filterType !== "" && filterStatus === "" && filterYear !== "") {
filterType !== "" && DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.type === filterType && item.year === filterYear)
filterStatus !== "" && } else if (filterType === "" && filterStatus !== "" && filterYear === "") {
filterYear === null DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.status === filterStatus)
) { } else if (filterType === "" && filterStatus === "" && filterYear !== "") {
DataMainUpdate.value = DataMainOrig.value.filter( DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.year === filterYear)
(item: formListLeaveData) => } else if (filterType === "" && filterStatus !== "" && filterYear !== null) {
item.type === filterType && item.status === filterStatus DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.status === filterStatus && item.year === filterYear)
); } else if (filterType !== "" && filterStatus !== "" && filterYear === "") {
} else if (filterType !== "" && filterStatus === "" && filterYear !== "") { DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.status === filterStatus && item.type === filterType)
DataMainUpdate.value = DataMainOrig.value.filter( } else if (filterType !== "" && filterStatus !== "" && filterYear !== null) {
(item: formListLeaveData) => DataMainUpdate.value = DataMainOrig.value.filter((item: formListLeaveData) => item.type === filterType && item.status === filterStatus && item.year === filterYear)
item.type === filterType && item.year === filterYear } else if (filterType == "0" && filterStatus == "0" && filterYear !== null) {
); DataMainUpdate.value = DataMainOrig.value
} else if (filterType === "" && filterStatus !== "" && filterYear === "") { }
DataMainUpdate.value = DataMainOrig.value.filter( }
(item: formListLeaveData) => item.status === filterStatus
);
} else if (filterType === "" && filterStatus === "" && filterYear !== "") {
DataMainUpdate.value = DataMainOrig.value.filter(
(item: formListLeaveData) => item.year === filterYear
);
} else if (
filterType === "" &&
filterStatus !== "" &&
filterYear !== null
) {
DataMainUpdate.value = DataMainOrig.value.filter(
(item: formListLeaveData) =>
item.status === filterStatus && item.year === filterYear
);
} else if (filterType !== "" && filterStatus !== "" && filterYear === "") {
DataMainUpdate.value = DataMainOrig.value.filter(
(item: formListLeaveData) =>
item.status === filterStatus && item.type === filterType
);
} else if (
filterType !== "" &&
filterStatus !== "" &&
filterYear !== null
) {
DataMainUpdate.value = DataMainOrig.value.filter(
(item: formListLeaveData) =>
item.type === filterType &&
item.status === filterStatus &&
item.year === filterYear
);
} else if (
filterType == "0" &&
filterStatus == "0" &&
filterYear !== null
) {
DataMainUpdate.value = DataMainOrig.value;
}
};
//--------------|ฟิลเตอร์|--------------------------------------// //--------------|ฟิลเตอร์|--------------------------------------//
const searchFilterTable = async () => { const searchFilterTable = async () => {
rows.value = []; rows.value = []
if (LeaveType.value !== undefined && LeaveType.value !== null) { if (LeaveType.value !== undefined && LeaveType.value !== null) {
await DataUpdate( await DataUpdate(LeaveType.value === "0" ? "all" : LeaveType.value!, LeaveStatus.value === "0" ? "all" : LeaveStatus.value!, fiscalYearyear.value === "0" ? "all" : fiscalYearyear.value!)
LeaveType.value === "0" ? "all" : LeaveType.value!, let filteredData = DataMainOrig.value
LeaveStatus.value === "0" ? "all" : LeaveStatus.value!, if (LeaveType.value !== "0") {
fiscalYearyear.value === "0" ? "all" : fiscalYearyear.value! filteredData = filteredData.filter((item: formListLeaveData) => item.type === LeaveType.value)
); }
let filteredData = DataMainOrig.value; if (LeaveStatus.value !== "0") {
if (LeaveType.value !== "0") { filteredData = filteredData.filter((item: formListLeaveData) => item.status === LeaveStatus.value)
filteredData = filteredData.filter( }
(item: formListLeaveData) => item.type === LeaveType.value if (fiscalYearyear.value !== "0") {
); filteredData = filteredData.filter((item: formListLeaveData) => item.year === fiscalYearyear.value)
} }
if (LeaveStatus.value !== "0") { const dataArr: formListLeaveData[] = filteredData.map((e: any) => ({
filteredData = filteredData.filter( no: e.no,
(item: formListLeaveData) => item.status === LeaveStatus.value type: convertType(e.type) || "",
); status: convertStatus(e.status) || "",
} date: date2Thai(new Date(e.date)),
if (fiscalYearyear.value !== "0") { year: e.year !== undefined ? e.year : "",
filteredData = filteredData.filter( }))
(item: formListLeaveData) => item.year === fiscalYearyear.value rows.value = dataArr
); }
} }
const dataArr: formListLeaveData[] = filteredData.map((e: any) => ({
no: e.no,
type: convertType(e.type) || "",
status: convertStatus(e.status) || "",
date: date2Thai(new Date(e.date)),
year: e.year !== undefined ? e.year : "",
}));
rows.value = dataArr;
}
};
/** /**
* * selector
* @param val * @param val
* @param update * @param update
* @param refData * @param refData
*/ */
const filterSelector = (val: any, update: Function, refData: string) => { const filterSelector = (val: any, update: Function, refData: string) => {
switch (refData) { switch (refData) {
case "fiscalyearOP": case "fiscalyearOP":
update(() => { update(() => {
fiscalyearOP.value = fiscalyearOP.value.filter( fiscalyearOP.value = fiscalyearOP.value.filter((v: any) => v.name.indexOf(val) > -1)
(v: any) => v.name.indexOf(val) > -1 })
); break
}); case "LeaveTypeOption":
break; update(() => {
case "LeaveTypeOption": typeOptions.value = typeOptions.value.filter((v: any) => v.name.indexOf(val) > -1)
update(() => { })
typeOptions.value = typeOptions.value.filter( break
(v: any) => v.name.indexOf(val) > -1 case "LeaveStatusOption":
); update(() => {
}); statusOptions.value = statusOptions.value.filter((v: any) => v.name.indexOf(val) > -1)
break; })
case "LeaveStatusOption": break
update(() => { default:
statusOptions.value = statusOptions.value.filter( break
(v: any) => v.name.indexOf(val) > -1 }
); }
});
break;
default:
break;
}
};
/** filter ปี */ /** filter ปี */
const fiscalyearOP = ref<OptionData[]>([ const fiscalyearOP = ref<OptionData[]>([
{ id: "0", name: "ทั้งหมด" }, { id: "0", name: "ทั้งหมด" },
{ id: "1", name: "2566" }, { id: "1", name: "2566" },
{ id: "2", name: "2567" }, { id: "2", name: "2567" },
{ id: "2", name: "2568" }, { id: "2", name: "2568" },
]); ])
/** /**
* * option
* @param val * @param val
* @returns * @returns option
*/ */
function convertType(val: string) { function convertType(val: string) {
if (val == "0") return "ทั้งหมด"; if (val == "0") return "ทั้งหมด"
else return options.value.find((x) => x.id == val)?.name; else return options.value.find(x => x.id == val)?.name
} }
/** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/ /** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/
const optionsSpecific = ref([ const optionsSpecific = ref([
{ id: "s0", name: "ลาไปศึกษาต่อ" }, { id: "s0", name: "ลาไปศึกษาต่อ" },
{ id: "s1", name: "ลาฝึกอบรม" }, { id: "s1", name: "ลาฝึกอบรม" },
{ id: "s2", name: "ลาปฎิบัติการวิจัย" }, { id: "s2", name: "ลาปฎิบัติการวิจัย" },
{ id: "s3", name: "ลาดูงาน" }, { id: "s3", name: "ลาดูงาน" },
]); ])
/** รายการประเภทการลาของ ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ*/ /** รายการประเภทการลาของ ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ*/
const optionsOrdination = ref([ const optionsOrdination = ref([
{ id: "0", name: "ลาอุปสมบท" }, { id: "0", name: "ลาอุปสมบท" },
{ id: "1", name: "ลาประกอบพิธีฮัจย์" }, { id: "1", name: "ลาประกอบพิธีฮัจย์" },
]); ])
/** รายการข้อมูลประเภทใบลา */ /** รายการข้อมูลประเภทใบลา */
const options = ref<OptionData[]>([ const options = ref<OptionData[]>([
{ id: "1", name: "ลาป่วย" }, { id: "1", name: "ลาป่วย" },
{ id: "2", name: "ลากิจส่วนตัว" }, { id: "2", name: "ลากิจส่วนตัว" },
{ id: "3", name: "ลาคลอดบุตร" }, { id: "3", name: "ลาคลอดบุตร" },
{ id: "4", name: "ลาไปช่วยเหลือภริยาที่คลอดบุตร" }, { id: "4", name: "ลาไปช่วยเหลือภริยาที่คลอดบุตร" },
{ id: "5", name: "ลาพักผ่อน" }, { id: "5", name: "ลาพักผ่อน" },
{ id: "6", name: "ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ" }, { id: "6", name: "ลาอุปสมบทหรือลาประกอบพิธีฮัจย์ฯ" },
{ id: "7", name: "ลาเข้ารับการตรวจเลือกหรือเข้ารับการเตรียมพล" }, { id: "7", name: "ลาเข้ารับการตรวจเลือกหรือเข้ารับการเตรียมพล" },
{ id: "8", name: "ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน" }, { id: "8", name: "ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน" },
{ id: "9", name: "ลาไปปฎิบัติงานในองค์การระหว่างประเทศ" }, { id: "9", name: "ลาไปปฎิบัติงานในองค์การระหว่างประเทศ" },
{ id: "10", name: "ลาติดตามคู่สมรส" }, { id: "10", name: "ลาติดตามคู่สมรส" },
{ id: "11", name: "ลาไปฟื้นฟูสมรรถภาพด้านอาชีพ" }, { id: "11", name: "ลาไปฟื้นฟูสมรรถภาพด้านอาชีพ" },
]); ])
/** filter ประเภทการลา */ /** filter ประเภทการลา */
const typeOptions = ref<OptionData[]>([ const typeOptions = ref<OptionData[]>([{ id: "0", name: "ทั้งหมด" }, ...options.value])
{ id: "0", name: "ทั้งหมด" },
...options.value,
]);
/** สถานะของการลา */ /** สถานะของการลา */
const statusOptions = ref<OptionData[]>([ const statusOptions = ref<OptionData[]>([
{ id: "0", name: "ทั้งหมด" }, { id: "0", name: "ทั้งหมด" },
{ id: "1", name: "อนุมัติ" }, { id: "1", name: "อนุมัติ" },
{ id: "2", name: "ไม่อนุมัติ" }, { id: "2", name: "ไม่อนุมัติ" },
{ id: "3", name: "อยู่ระหว่างดำเนินการ" }, { id: "3", name: "อยู่ระหว่างดำเนินการ" },
{ id: "4", name: "ใหม่" }, { id: "4", name: "ใหม่" },
]); ])
/** /**
* * option
* @param val * @param val
* @returns * @returns option
*/ */
function convertStatus(val: string) { function convertStatus(val: string) {
if (val == "0") return "ทั้งหมด"; if (val == "0") return "ทั้งหมด"
else return statusOptions.value.find((x) => x.id == val)?.name; else return statusOptions.value.find(x => x.id == val)?.name
} }
/** data table filter & column ของรายการลา */ /** data table filter & column ของรายการลา */
const visibleColumns = ref<String[]>(["no", "type", "date", "status"]); const visibleColumns = ref<String[]>(["no", "type", "date", "status"])
const columns = ref<QTableProps["columns"]>([ const columns = ref<QTableProps["columns"]>([
{ {
name: "no", name: "no",
align: "left", align: "left",
label: "ลำดับ", label: "ลำดับ",
sortable: true, sortable: true,
field: "no", field: "no",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px; width:5%;", style: "font-size: 14px; width:5%;",
}, },
{ {
name: "type", name: "type",
align: "left", align: "left",
label: "ประเภทการลา", label: "ประเภทการลา",
sortable: true, sortable: true,
field: "type", field: "type",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;", style: "font-size: 14px; width:15%;",
}, },
{ {
name: "date", name: "date",
align: "left", align: "left",
label: "วันที่ยื่นใบลา", label: "วันที่ยื่นใบลา",
sortable: true, sortable: true,
field: "date", field: "date",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;", style: "font-size: 14px; width:15%;",
}, },
{ {
name: "status", name: "status",
align: "left", align: "left",
label: "สถานะ", label: "สถานะ",
sortable: true, sortable: true,
field: "status", field: "status",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px; width:10%;", style: "font-size: 14px; width:10%;",
}, },
]); ])
/** /**
* *
* @param item * @param item
* @param subitem * @param subitem
*/ */
function typeConvert(item: string, subitem: any) { function typeConvert(item: string, subitem: any) {
// console.log('first',item) // console.log('first',item)
if (item !== "6" && item !== "8") { if (item !== "6" && item !== "8") {
typeLeave.value = convertSubtitle(item); typeLeave.value = convertSubtitle(item)
} else if (item === "6") { } else if (item === "6") {
typeLeave.value = convertSubtitleInfo(subitem); typeLeave.value = convertSubtitleInfo(subitem)
} else if (item === "8") { } else if (item === "8") {
typeLeave.value = convertSubtitleInfo2(subitem); typeLeave.value = convertSubtitleInfo2(subitem)
} }
} }
/** /**
* * /
* @param val * @param val string
* @returns * @returns
*/ */
function convertSubtitle(val: string) { function convertSubtitle(val: string) {
return options.value.find((x) => x.id == val)?.name; return options.value.find(x => x.id == val)?.name
} }
/** /**
* * /
* @param val * @param val string
* @returns * @returns
*/ */
function convertSubtitleInfo(val: string) { function convertSubtitleInfo(val: string) {
return optionsOrdination.value.find((x) => x.id == val)?.name; return optionsOrdination.value.find(x => x.id == val)?.name
} }
/** /**
* *
* @param val * @param val string
* @returns * @returns
*/ */
function convertSubtitleInfo2(val: string) { function convertSubtitleInfo2(val: string) {
return optionsSpecific.value.find((x) => x.id == val)?.name; return optionsSpecific.value.find(x => x.id == val)?.name
} }
return { return {
tabValue, tabValue,
typeOptions, typeOptions,
optionsSpecific, optionsSpecific,
statusOptions, statusOptions,
DataMain, DataMain,
DataMainUpdate, DataMainUpdate,
DataUpdate, DataUpdate,
DataMainOrig, DataMainOrig,
visibleColumns, visibleColumns,
columns, columns,
rows, rows,
LeaveType, LeaveType,
LeaveStatus, LeaveStatus,
fecthList, fecthList,
filterSelector, filterSelector,
searchFilterTable, searchFilterTable,
fiscalyearOP, fiscalyearOP,
fiscalYearyear, fiscalYearyear,
options, options,
optionsOrdination, optionsOrdination,
typeConvert, typeConvert,
typeLeave, typeLeave,
}; }
}); })