แก้โครงฟอร์มลา

This commit is contained in:
Warunee Tamkoo 2024-01-04 15:17:42 +07:00
parent 346ba79606
commit 2c351bbb15
46 changed files with 8182 additions and 11803 deletions

View file

@ -1,56 +1,53 @@
<script setup lang="ts">
import { ref, onMounted, computed } from "vue"
import { useQuasar } from "quasar"
import { useRouter, useRoute } from "vue-router"
import { ref, onMounted } from "vue";
import { useQuasar } from "quasar";
import { useRouter, useRoute } from "vue-router";
import { useLeaveStore } from "@/modules/05_leave/store";
import http from "@/plugins/http";
import config from "@/app.config";
import type { QForm } from "quasar";
import { useCounterMixin } from "@/stores/mixin";
import FormPart2 from "@/modules/05_leave/components/Forms/Form.vue"
import SickForm from "@/modules/05_leave/components/Forms/01_SickForm.vue"
import FormBirth from "@/modules/05_leave/components/Forms/03_Birth.vue"
import HelpWifeBirthForm from "@/modules/05_leave/components/Forms/04_HelpWifeBirthForm.vue"
import VacationForm from "@/modules/05_leave/components/Forms/05_VacationForm.vue"
import OrdinationForm from "@/modules/05_leave/components/Forms/06_OrdinationForm.vue"
import HajjForm from "@/modules/05_leave/components/Forms/07_HajjForm.vue"
import MilitaryForm from "@/modules/05_leave/components/Forms/08_MilitaryForm.vue"
import StudyForm from "@/modules/05_leave/components/Forms/09_StudyForm.vue"
import TrainForm from "@/modules/05_leave/components/Forms/10_TrainForm.vue"
import WorkInternationalForm from "@/modules/05_leave/components/Forms/11_WorkInternationalForm.vue"
import FollowSpouseForm from "@/modules/05_leave/components/Forms/12_FollowSpouseForm.vue"
import RehabilitationForm from "@/modules/05_leave/components/Forms/13_RehabilitationForm.vue"
import { useLeaveStore } from "@/modules/05_leave/store"
import http from "@/plugins/http"
import config from "@/app.config"
import type { QForm } from "quasar"
import { useCounterMixin } from "@/stores/mixin"
import FormPart2 from "@/modules/05_leave/components/FormLeave/Form.vue";
import SickForm from "@/modules/05_leave/components/FormLeave/01_SickForm.vue";
import FormBirth from "@/modules/05_leave/components/FormLeave/03_Birth.vue";
import HelpWifeBirthForm from "@/modules/05_leave/components/FormLeave/04_HelpWifeBirthForm.vue";
import VacationForm from "@/modules/05_leave/components/FormLeave/05_VacationForm.vue";
import OrdinationForm from "@/modules/05_leave/components/FormLeave/06_OrdinationForm.vue";
import HajjForm from "@/modules/05_leave/components/FormLeave/07_HajjForm.vue";
import MilitaryForm from "@/modules/05_leave/components/FormLeave/08_MilitaryForm.vue";
import StudyForm from "@/modules/05_leave/components/FormLeave/09_StudyForm.vue";
import TrainForm from "@/modules/05_leave/components/FormLeave/10_TrainForm.vue";
import WorkInternationalForm from "@/modules/05_leave/components/FormLeave/11_WorkInternationalForm.vue";
import FollowSpouseForm from "@/modules/05_leave/components/FormLeave/12_FollowSpouseForm.vue";
import RehabilitationForm from "@/modules/05_leave/components/FormLeave/13_RehabilitationForm.vue";
const dataStore = useLeaveStore()
const { fetchLeaveType } = dataStore
const mixin = useCounterMixin()
const { date2Thai, dialogConfirm, success, messageError } = mixin
const router = useRouter()
const route = useRoute()
const myform = ref<QForm | null>(null)
const $q = useQuasar()
const dataStore = useLeaveStore();
const { fetchLeaveType } = dataStore;
const mixin = useCounterMixin();
const { dialogConfirm, success, messageError, showLoader, hideLoader } = mixin;
const model = ref<string>("")
const modelSpecific = ref<string>("")
const router = useRouter();
const route = useRoute();
const myform = ref<QForm | null>(null);
const $q = useQuasar();
onMounted(async () => {
await fectOptionType()
})
const model = ref<string>("");
const modelSpecific = ref<string>("");
/**
* งคาประเภทการลาจาก Api
*/
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)
})
await http
.get(config.API.leaveType())
.then(async (res) => {
const data = res.data.result;
await fetchLeaveType(data);
})
.catch((err) => {
messageError($q, err);
});
}
function inputEdit(val: boolean) {
@ -60,85 +57,177 @@ function inputEdit(val: boolean) {
};
}
function onSubmit(postData: FormData) {
dialogConfirm($q, async () => {
showLoader();
await http
.put(config.API.leaveUser(), postData)
.then(() => {
success($q, "บันทึกสำเร็จ");
})
.catch((e: any) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
});
}
onMounted(async () => {
if (dataStore.options.length == 0) {
await fectOptionType();
}
});
</script>
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn to="/leave" icon="mdi-arrow-left" unelevated round dense flat color="primary" class="q-mr-sm" />
<div>นใบลา</div>
</div>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn
to="/leave"
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
/>
<div>สรางใบลา</div>
</div>
<q-form ref="myform" class="col-12">
<q-card bordered>
<div class="col-12 row q-col-gutter-md q-pa-md">
<div class="col-xs-12 col-sm-12">
<div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-1-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">เลอกประเภทการลา</div>
</div>
<div class="q-py-sm q-px-lg">
<div class="row">
<q-select
dense
class="col-12 col-sm-6 col-md-4 inputgreen"
outlined
v-model="model"
:options="dataStore.options"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทใบลา :"
@update:model-value="dataStore.typeConvert(model, null), (modelSpecific = ''), dataStore.fetchProfile()"
/>
</div>
<div class="row q-mt-sm">
<div class="col-12 col-sm-6 col-md-3" v-if="model === 'LV-006' || model === 'LV-008'">
<q-select
dense
outlined
v-model="modelSpecific"
:options="model === 'LV-006' ? dataStore.optionsOrdination : dataStore.optionsSpecific"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทการลา :"
@update:model-value="dataStore.typeConvert(model, modelSpecific)"
/>
</div>
</div>
<q-form ref="myform" class="col-12">
<q-card bordered>
<div class="col-12 row q-col-gutter-md q-pa-md">
<div class="col-xs-12 col-sm-12">
<div style="display: flex; align-items: center">
<q-icon
name="mdi-numeric-1-circle"
size="20px"
color="primary"
/>
<div class="q-pl-sm text-weight-bold text-dark">
เลอกประเภทการลา
</div>
</div>
<div class="q-py-sm q-px-lg">
<div class="row">
<q-select
dense
class="col-12 col-sm-6 col-md-4 inputgreen"
outlined
v-model="model"
:options="dataStore.options"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทใบลา :"
@update:model-value="
dataStore.typeConvert(model, null),
(modelSpecific = ''),
dataStore.fetchProfile()
"
/>
</div>
<!-- v-if (ลาอปสมบทหรอลาประกอบพจญ||ลาไปศกษา กอบรม ปฎการว หรอดงาน) -->
</div>
<div class="row q-mt-sm">
<div
class="col-12 col-sm-6 col-md-3"
v-if="model === 'LV-006' || model === 'LV-008'"
>
<q-select
dense
outlined
v-model="modelSpecific"
:options="
model === 'LV-006'
? dataStore.optionsOrdination
: dataStore.optionsSpecific
"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทการลา :"
@update:model-value="
dataStore.typeConvert(model, modelSpecific)
"
/>
</div>
</div>
</div>
<div>
<div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-2-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">อมลการลา</div>
</div>
<FormPart2 :model="model" />
</div>
</div>
<div v-if="model" class="col-12">
<SickForm v-if="model === 'LV-001' || model === 'LV-002'" />
<FormBirth v-if="model === 'LV-003'" />
<HelpWifeBirthForm v-if="model === 'LV-004'" />
<VacationForm v-if="model === 'LV-005'" />
<OrdinationForm v-if="model === 'LV-006' && modelSpecific === '0'" />
<HajjForm v-if="model === 'LV-006' && modelSpecific === '1'" />
<MilitaryForm v-if="model === 'LV-007'" style="width: 100%" />
<StudyForm v-if="model === 'LV-008' && modelSpecific === 's0'" style="width: 100%" />
<TrainForm v-if="model === 'LV-008' && modelSpecific != 's0' && modelSpecific != ''" />
<WorkInternationalForm v-if="model === 'LV-009'" />
<FollowSpouseForm v-if="model === 'LV-010'" />
<RehabilitationForm v-if="model === 'LV-011'" />
</div>
</div>
</q-card>
</q-form>
</div>
</div>
<div>
<div style="display: flex; align-items: center">
<q-icon
name="mdi-numeric-2-circle"
size="20px"
color="primary"
/>
<div class="q-pl-sm text-weight-bold text-dark">
อมลการลา
</div>
</div>
<FormPart2 :model="model" />
</div>
</div>
<div class="col-12">
<SickForm
v-if="model === 'LV-001' || model === 'LV-002'"
:on-submit="onSubmit"
/>
<FormBirth v-if="model === 'LV-003'" :on-submit="onSubmit" />
<HelpWifeBirthForm
v-if="model === 'LV-004'"
:on-submit="onSubmit"
/>
<VacationForm v-if="model === 'LV-005'" :on-submit="onSubmit" />
<OrdinationForm
v-if="model === 'LV-006' && modelSpecific == 'b1'"
:on-submit="onSubmit"
/>
<HajjForm
v-if="model === 'LV-006' && modelSpecific == 'b2'"
:on-submit="onSubmit"
/>
<MilitaryForm
v-if="model === 'LV-007'"
style="width: 100%"
:on-submit="onSubmit"
/>
<StudyForm
v-if="model === 'LV-008' && modelSpecific === 's0'"
style="width: 100%"
:on-submit="onSubmit"
/>
<TrainForm
v-if="
model === 'LV-008' &&
modelSpecific != 's0' &&
modelSpecific != ''
"
:on-submit="onSubmit"
/>
<WorkInternationalForm
v-if="model === 'LV-009'"
:on-submit="onSubmit"
/>
<FollowSpouseForm
v-if="model === 'LV-010'"
:on-submit="onSubmit"
/>
<RehabilitationForm
v-if="model === 'LV-011'"
:on-submit="onSubmit"
/>
</div>
</div>
</q-card>
</q-form>
</div>
</div>
</template>

View file

@ -1,430 +1,423 @@
<script setup lang="ts">
import { ref, onMounted, reactive } from "vue"
import { ref, onMounted, reactive, computed } from "vue";
//import form
import FormPart2 from "@/modules/05_leave/components/formEdit/Form.vue"
import WorkInternational from "../components/formEdit/formEdit_WorkInternational.vue"
import Rehabilitation from "../components/formEdit/formEdit_Rehabilitation.vue"
import Sick from "../components/formEdit/formEdit_Sick.vue"
import FollowSpouse from "../components/formEdit/formEdit_FollowSpouse.vue"
import Birth from "../components/formEdit/formEdit_Birth.vue"
import Vacation from "../components/formEdit/formEdit_Vacation.vue"
import HelpWifeBirth from "../components/formEdit/formEdit_HelpWifeBirth.vue"
import Ordination from "../components/formEdit/formEdit_Ordinationvue.vue"
import Haji from "../components/formEdit/formEdit_Hajj.vue"
import Millitary from "../components/formEdit/formEdit_Military.vue"
import Study from "../components/formEdit/formEdit_Study.vue"
import FormPart2 from "@/modules/05_leave/components/FormLeave/Form.vue";
import SickForm from "@/modules/05_leave/components/FormLeave/01_SickForm.vue";
import FormBirth from "@/modules/05_leave/components/FormLeave/03_Birth.vue";
import HelpWifeBirthForm from "@/modules/05_leave/components/FormLeave/04_HelpWifeBirthForm.vue";
import VacationForm from "@/modules/05_leave/components/FormLeave/05_VacationForm.vue";
import OrdinationForm from "@/modules/05_leave/components/FormLeave/06_OrdinationForm.vue";
import HajjForm from "@/modules/05_leave/components/FormLeave/07_HajjForm.vue";
import MilitaryForm from "@/modules/05_leave/components/FormLeave/08_MilitaryForm.vue";
import StudyForm from "@/modules/05_leave/components/FormLeave/09_StudyForm.vue";
import TrainForm from "@/modules/05_leave/components/FormLeave/10_TrainForm.vue";
import WorkInternationalForm from "@/modules/05_leave/components/FormLeave/11_WorkInternationalForm.vue";
import FollowSpouseForm from "@/modules/05_leave/components/FormLeave/12_FollowSpouseForm.vue";
import RehabilitationForm from "@/modules/05_leave/components/FormLeave/13_RehabilitationForm.vue";
import { useCounterMixin } from "@/stores/mixin"
import { useQuasar } from "quasar"
import { useRoute } from "vue-router"
import router from "@/router"
import http from "@/plugins/http"
import config from "@/app.config"
import { useLeaveStore } from "@/modules/05_leave/store"
import { useCounterMixin } from "@/stores/mixin";
import { useQuasar } from "quasar";
import { useRoute } from "vue-router";
import router from "@/router";
import http from "@/plugins/http";
import config from "@/app.config";
import { useLeaveStore } from "@/modules/05_leave/store";
const route = useRoute()
const personalId = ref<string>(route.params.id as string)
console.log(personalId.value)
const leaveId = ref<string>("")
const dataStore = useLeaveStore()
const $q = useQuasar()
const mixin = useCounterMixin()
const { messageError, showLoader, hideLoader, dialogConfirm, success, date2Thai, dateToISO } = mixin
const route = useRoute();
const personalId = ref<string>(route.params.id as string);
const leaveId = ref<string>("");
const dataStore = useLeaveStore();
const $q = useQuasar();
const mixin = useCounterMixin();
const {
messageError,
showLoader,
hideLoader,
dialogConfirm,
success,
date2Thai,
dateToISO,
} = mixin;
const props = defineProps({
modal: {
type: Boolean,
require: true,
},
leaveId: {
type: String,
require: true,
},
onClickClose: {
type: Function,
require: true,
},
leaveType: {
type: Object,
require: true,
},
leaveStatus: {
type: String,
require: true,
},
fetchDataTable: {
type: Function,
require: true,
},
})
const titleName = ref<string>("")
const model = ref<string>("")
const modelSpecific = ref<string>("")
const titleName = ref<string>("");
/** Form รายละเอียดข้อมูล*/
const formData = reactive<any>({
id: "", //Id
leaveTypeName: "", // Name
leaveTypeId: "", //Id
fullname: "", //
dateSendLeave: new Date(), //
status: "", //
leaveDateStart: new Date(), //
leaveDateEnd: new Date(), //
leaveCount: 0, //
leaveWrote: "", //
leaveAddress: "", //
leaveNumber: "", //
leaveDetail: "", //
leaveDocument: "", //
leaveDraftDocument: "", //
leaveLastStart: new Date(), // ( )(Auto)
leaveLastEnd: new Date(), // ( )(Auto)
leaveTotal: 0, //(Auto)
leavebirthDate: new Date(), //(Auto)
leavegovernmentDate: new Date(), //(Auto)
leaveSalary: 0, //(Auto)
leaveSalaryText: "", //()
leaveTypeDay: "", //
wifeDayName: "", //()
wifeDayDateBorn: new Date(), //()
restDayOldTotal: 0, // ()(Auto)
restDayCurrentTotal: 0, //()(Auto)
ordainDayStatus: "", /// () ()
ordainDayLocationName: "", // ()
ordainDayLocationAddress: "", // ()
ordainDayLocationNumber: "", // ()
ordainDayOrdination: new Date(), // ()
ordainDayBuddhistLentName: "", // ()
ordainDayBuddhistLentAddress: "", // ()
hajjDayStatus: "", /// () ()
absentDaySummon: "", // ()
absentDayLocation: "", // ()
absentDayRegistorDate: new Date(), // ()
absentDayGetIn: "", // ()
absentDayAt: "", // ()
studyDaySubject: "", // ( )
studyDayDegreeLevel: "", // ( )
studyDayUniversityName: "", // ( )
studyDayTrainingSubject: "", // / ( )
studyDayTrainingName: "", // ( )
studyDayCountry: "", // ( )
studyDayScholarship: "", // ( )
coupleDayName: "", // ()
coupleDayPosition: "", // ()
coupleDayLevel: "", // ()
coupleDayLevelCountry: "", // ()
coupleDayCountryHistory: "", // ()
coupleDayTotalHistory: "", // ()
coupleDayStartDateHistory: new Date(), // ()
coupleDayEndDateHistory: new Date(), // ()
coupleDaySumTotalHistory: "", // ()
approveStep: "",
dear: "",
})
id: "", //Id
leaveTypeName: "", // Name
leaveTypeId: "", //Id
fullname: "", //
dateSendLeave: new Date(), //
status: "", //
leaveDateStart: new Date(), //
leaveDateEnd: new Date(), //
leaveCount: 0, //
leaveWrote: "", //
leaveAddress: "", //
leaveNumber: "", //
leaveDetail: "", //
leaveDocument: "", //
leaveDraftDocument: "", //
leaveLastStart: new Date(), // ( )(Auto)
leaveLastEnd: new Date(), // ( )(Auto)
leaveTotal: 0, //(Auto)
leavebirthDate: new Date(), //(Auto)
leavegovernmentDate: new Date(), //(Auto)
leaveSalary: 0, //(Auto)
leaveSalaryText: "", //()
leaveTypeDay: "", //
wifeDayName: "", //()
wifeDayDateBorn: new Date(), //()
restDayOldTotal: 0, // ()(Auto)
restDayCurrentTotal: 0, //()(Auto)
ordainDayStatus: "", /// () ()
ordainDayLocationName: "", // ()
ordainDayLocationAddress: "", // ()
ordainDayLocationNumber: "", // ()
ordainDayOrdination: new Date(), // ()
ordainDayBuddhistLentName: "", // ()
ordainDayBuddhistLentAddress: "", // ()
hajjDayStatus: "", /// () ()
absentDaySummon: "", // ()
absentDayLocation: "", // ()
absentDayRegistorDate: new Date(), // ()
absentDayGetIn: "", // ()
absentDayAt: "", // ()
studyDaySubject: "", // ( )
studyDayDegreeLevel: "", // ( )
studyDayUniversityName: "", // ( )
studyDayTrainingSubject: "", // / ( )
studyDayTrainingName: "", // ( )
studyDayCountry: "", // ( )
studyDayScholarship: "", // ( )
coupleDayName: "", // ()
coupleDayPosition: "", // ()
coupleDayLevel: "", // ()
coupleDayLevelCountry: "", // ()
coupleDayCountryHistory: "", // ()
coupleDayTotalHistory: "", // ()
coupleDayStartDateHistory: new Date(), // ()
coupleDayEndDateHistory: new Date(), // ()
coupleDaySumTotalHistory: "", // ()
approveStep: "",
dear: "",
leaveLast: "",
});
/**
* เรยกใชงาน fetchData เพอดงขอม
*/
onMounted(() => {
fetchDataDetail(personalId.value)
dataStore.fetchProfile()
})
/**
* get อมลเกากรณแกไขขอม
*/
const data = reactive<any>({
id: "", //Id
leaveTypeName: "", // Name
leaveTypeId: "", //Id
fullname: "", //
dateSendLeave: new Date(), //
status: "", //
leaveDateStart: new Date(), //
leaveDateEnd: new Date(), //
leaveCount: 0, //
leaveWrote: "", //
leaveAddress: "", //
leaveNumber: "", //
leaveDetail: "", //
leaveDocument: "", //
leaveDraftDocument: "", //
leaveLastStart: new Date(), // ( )(Auto)
leaveLastEnd: new Date(), // ( )(Auto)
leaveTotal: 0, //(Auto)
leavebirthDate: new Date(), //(Auto)
leavegovernmentDate: new Date(), //(Auto)
leaveSalary: 0, //(Auto)
leaveSalaryText: "", //()
leaveTypeDay: "", //
wifeDayName: "", //()
wifeDayDateBorn: new Date(), //()
restDayOldTotal: 0, // ()(Auto)
restDayCurrentTotal: 0, //()(Auto)
ordainDayStatus: "", /// () ()
ordainDayLocationName: "", // ()
ordainDayLocationAddress: "", // ()
ordainDayLocationNumber: "", // ()
ordainDayOrdination: new Date(), // ()
ordainDayBuddhistLentName: "", // ()
ordainDayBuddhistLentAddress: "", // ()
hajjDayStatus: "", /// () ()
absentDaySummon: "", // ()
absentDayLocation: "", // ()
absentDayRegistorDate: new Date(), // ()
absentDayGetIn: "", // ()
absentDayAt: "", // ()
studyDaySubject: "", // ( )
studyDayDegreeLevel: "", // ( )
studyDayUniversityName: "", // ( )
studyDayTrainingSubject: "", // / ( )
studyDayTrainingName: "", // ( )
studyDayCountry: "", // ( )
studyDayScholarship: "", // ( )
coupleDayName: "", // ()
coupleDayPosition: "", // ()
coupleDayLevel: "", // ()
coupleDayLevelCountry: "", // ()
coupleDayCountryHistory: "", // ()
coupleDayTotalHistory: "", // ()
coupleDayStartDateHistory: new Date(), // ()
coupleDayEndDateHistory: new Date(), // ()
coupleDaySumTotalHistory: "", // ()
approveStep: "",
dear: "",
})
/**
* function เรยกขอมลการลา
* @param id การลา
*/
async function fetchDataDetail(id: string) {
showLoader()
await http
.get(config.API.leaveUserId(id), {})
.then(res => {
const data = res.data.result
titleName.value = data.fullName ?? "-"
formData.id = data.id ?? "-"
formData.leaveTypeName = data.leaveTypeName ?? "-"
formData.leaveTypeId = data.leaveTypeId ?? "-"
formData.fullname = data.fullName ?? "-"
formData.dateSendLeave = data.dateSendLeave && date2Thai(data.dateSendLeave)
formData.status = data.status ?? "-"
formData.leaveDateStart = data.leaveStartDate && date2Thai(data.leaveStartDate)
console.log(formData.leaveDateStart)
formData.leaveDateEnd = data.leaveEndDate && date2Thai(data.leaveEndDate)
console.log(formData.leaveDateEnd)
formData.leaveCount = data.leaveTotal ?? "-"
formData.leaveWrote = data.leaveWrote ?? "-"
formData.leaveAddress = data.leaveAddress ?? "-"
formData.leaveNumber = data.leaveNumber ?? "-"
formData.leaveDetail = data.leaveDetail ?? "-"
formData.leaveDocument = data.leaveDocument
formData.leaveDraftDocument = data.leaveDraftDocument
formData.leaveLastStart = data.leaveLastStart && date2Thai(data.leaveLastStart)
formData.leaveLastEnd = data.leaveLastStart && date2Thai(data.leaveLastEnd)
formData.leaveTotal = data.leaveTotal
formData.leavebirthDate = data.leaveBirthDate && date2Thai(data.leaveBirthDate)
formData.leavegovernmentDate = data.leaveGovernmentDate && date2Thai(data.leaveGovernmentDate)
formData.leaveSalary = data.leaveSalary ?? "-"
formData.leaveSalaryText = data.leaveSalaryText ?? "-"
formData.wifeDayName = data.wifeDayName ?? "-"
formData.wifeDayDateBorn = data.wifeDayDateBorn && date2Thai(data.wifeDayDateBorn)
formData.restDayOldTotal = data.restDayOldTotal ?? "-"
formData.restDayCurrentTotal = data.restDayCurrentTotal ?? "-"
formData.ordainDayStatus = data.ordainDayStatus ? "เคย" : "ไม่เคยบวช"
formData.ordainDayLocationName = data.ordainDayLocationName ?? "-"
formData.ordainDayLocationAddress = data.ordainDayLocationAddress ?? "-"
formData.ordainDayLocationNumber = data.ordainDayLocationNumber ?? "-"
formData.ordainDayOrdination = data.ordainDayOrdination && date2Thai(data.ordainDayOrdination)
formData.ordainDayBuddhistLentName = data.ordainDayBuddhistLentName ?? "-"
formData.ordainDayBuddhistLentAddress = data.ordainDayBuddhistLentAddress ?? "-"
formData.hajjDayStatus = data.hajjDayStatus ? "เคย" : "ไม่เคยไปประกอบพิธีฮัจญ์"
formData.absentDaySummon = data.absentDaySummon ?? "-"
formData.absentDayLocation = data.absentDayLocation ?? "-"
formData.absentDayRegistorDate = data.absentDayRegistorDate && date2Thai(data.absentDayRegistorDate)
formData.absentDayGetIn = data.absentDayGetIn ?? "-"
formData.absentDayAt = data.absentDayAt ?? "-"
formData.studyDaySubject = data.studyDaySubject ?? "-"
formData.studyDayDegreeLevel = data.studyDayDegreeLevel ?? "-"
formData.studyDayUniversityName = data.studyDayUniversityName ?? "-"
formData.studyDayTrainingSubject = data.studyDayTrainingSubject ?? "-" ?? "-"
formData.studyDayTrainingName = data.studyDayTrainingName ?? "-"
formData.studyDayCountry = data.studyDayCountry ?? "-"
formData.studyDayScholarship = data.studyDayScholarship ?? "-"
formData.coupleDayName = data.coupleDayName ?? "-"
formData.coupleDayPosition = data.coupleDayPosition ?? "-"
formData.coupleDayLevel = data.coupleDayLevel ?? "-"
formData.coupleDayLevelCountry = data.coupleDayLevelCountry ?? "-"
formData.coupleDayCountryHistory = data.coupleDayCountryHistory ?? "-"
formData.coupleDayTotalHistory = data.coupleDayTotalHistory ?? "-"
formData.coupleDayStartDateHistory = data.coupleDayStartDateHistory && date2Thai(data.coupleDayStartDateHistory)
formData.coupleDayEndDateHistory = data.coupleDayEndDateHistory && date2Thai(data.coupleDayEndDateHistory)
formData.coupleDaySumTotalHistory = data.coupleDaySumTotalHistory ?? "-"
formData.approveStep = data.approveStep ?? "-"
formData.dear = data.dear ?? "-"
checkLeaveType(formData.leaveTypeId, formData.leaveTypeName)
})
.catch(err => {
props.onClickClose?.()
messageError($q, err)
})
.finally(() => {
hideLoader()
})
}
console.log(formData)
showLoader();
await http
.get(config.API.leaveUserId(id), {})
.then(async (res) => {
const data = await res.data.result;
/**
* function check ประเภทการลา
* @param leaveTypeId ประเภทการลา
* @param leaveTypeName ประเภทการลา
titleName.value = data.fullName ?? "-";
formData.id = data.id ?? "-";
formData.leaveTypeName = data.leaveTypeName ?? "-";
formData.leaveTypeId = data.leaveTypeId ?? "-";
formData.fullname = data.fullName ?? "-";
formData.dateSendLeave =
data.dateSendLeave && date2Thai(data.dateSendLeave);
formData.status = data.status ?? "-";
formData.leaveStartDate = data.leaveStartDate;
// console.log(formData.leaveDateStart)
formData.leaveEndDate = data.leaveEndDate;
// console.log(formData.leaveDateEnd)
formData.leaveCount = data.leaveTotal ?? "-";
formData.leaveWrote = data.leaveWrote ?? "-";
formData.leaveAddress = data.leaveAddress ?? "-";
formData.leaveNumber = data.leaveNumber ?? "-";
formData.leaveDetail = data.leaveDetail ?? "-";
formData.leaveDocument = data.leaveDocument;
formData.leaveDraftDocument = data.leaveDraftDocument;
formData.leaveLastStart =
data.leaveLastStart && date2Thai(data.leaveLastStart);
formData.leaveLastEnd =
data.leaveLastStart && date2Thai(data.leaveLastEnd);
formData.leaveTotal = data.leaveTotal;
formData.leavebirthDate =
data.leaveBirthDate && date2Thai(data.leaveBirthDate);
formData.leavegovernmentDate =
data.leaveGovernmentDate && date2Thai(data.leaveGovernmentDate);
formData.leaveSalary = data.leaveSalary ?? "-";
formData.leaveSalaryText = data.leaveSalaryText ?? "-";
formData.wifeDayName = data.wifeDayName ?? "-";
formData.wifeDayDateBorn =
data.wifeDayDateBorn && date2Thai(data.wifeDayDateBorn);
formData.restDayOldTotal = data.restDayOldTotal ?? "-";
formData.restDayCurrentTotal = data.restDayCurrentTotal ?? "-";
formData.ordainDayStatus = data.ordainDayStatus ? "เคย" : "ไม่เคยบวช";
formData.ordainDayLocationName = data.ordainDayLocationName ?? "-";
formData.ordainDayLocationAddress = data.ordainDayLocationAddress ?? "-";
formData.ordainDayLocationNumber = data.ordainDayLocationNumber ?? "-";
formData.ordainDayOrdination =
data.ordainDayOrdination && date2Thai(data.ordainDayOrdination);
formData.ordainDayBuddhistLentName =
data.ordainDayBuddhistLentName ?? "-";
formData.ordainDayBuddhistLentAddress =
data.ordainDayBuddhistLentAddress ?? "-";
formData.hajjDayStatus = data.hajjDayStatus
? "เคย"
: "ไม่เคยไปประกอบพิธีฮัจญ์";
formData.absentDaySummon = data.absentDaySummon ?? "-";
formData.absentDayLocation = data.absentDayLocation ?? "-";
formData.absentDayRegistorDate =
data.absentDayRegistorDate && date2Thai(data.absentDayRegistorDate);
formData.absentDayGetIn = data.absentDayGetIn ?? "-";
formData.absentDayAt = data.absentDayAt ?? "-";
formData.studyDaySubject = data.studyDaySubject ?? "-";
formData.studyDayDegreeLevel = data.studyDayDegreeLevel ?? "-";
formData.studyDayUniversityName = data.studyDayUniversityName ?? "-";
formData.studyDayTrainingSubject =
data.studyDayTrainingSubject ?? "-" ?? "-";
formData.studyDayTrainingName = data.studyDayTrainingName ?? "-";
formData.studyDayCountry = data.studyDayCountry ?? "-";
formData.studyDayScholarship = data.studyDayScholarship ?? "-";
formData.coupleDayName = data.coupleDayName ?? "-";
formData.coupleDayPosition = data.coupleDayPosition ?? "-";
formData.coupleDayLevel = data.coupleDayLevel ?? "-";
formData.coupleDayLevelCountry = data.coupleDayLevelCountry ?? "-";
formData.coupleDayCountryHistory = data.coupleDayCountryHistory ?? "-";
formData.coupleDayTotalHistory = data.coupleDayTotalHistory ?? "-";
formData.coupleDayStartDateHistory =
data.coupleDayStartDateHistory &&
date2Thai(data.coupleDayStartDateHistory);
formData.coupleDayEndDateHistory =
data.coupleDayEndDateHistory && date2Thai(data.coupleDayEndDateHistory);
formData.coupleDaySumTotalHistory = data.coupleDaySumTotalHistory ?? "-";
formData.approveStep = data.approveStep ?? "-";
formData.dear = data.dear ?? "-";
formData.leaveLast = data.leaveLast ?? "-";
// checkLeaveType(formData.leaveTypeId, formData.leaveTypeName)
dataStore.fetchProfileOld(data);
dataStore.typeId = formData.leaveTypeId;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
const model = computed(() => {
return (
dataStore.options.find((x) => x.id == formData.leaveTypeId)?.code ?? ""
);
});
const modelSpecific = computed(() => {
const code = dataStore.options.find(
(x) => x.id == formData.leaveTypeId
)?.code;
if (code == "LV-006" && formData.leaveTypeName == 'ลาอุปสมบท') {
return "b0";
} else if (code == "LV-006" && formData.leaveTypeName == 'ลาประกอบพิธีฮัจญ์') {
return "b1";
} else if (code == "LV-008" && formData.leaveTypeName == 'ลาไปศึกษาต่อ') {
return "s0";
} else if (code == "LV-008" && formData.leaveTypeName == 'ลาฝึกอบรม') {
return "s1";
} else if (code == "LV-008" && formData.leaveTypeName == 'ลาปฎิบัติการวิจัย') {
return "s2";
} else if (code == "LV-008" && formData.leaveTypeName == 'ลาดูงาน') {
return "s3";
} else {
return "";
}
});
function onSubmit(postData: FormData) {
dialogConfirm($q, async () => {
showLoader();
await http
.put(config.API.leaveUser() + "/" + formData.id, postData)
.then(() => {
success($q, "บันทึกสำเร็จ");
})
.catch((e: any) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
});
}
/**
* เรยกใชงาน fetchData เพอดงขอม
*/
/**checkForm Form การลา*/
const checkForm = ref<string>("")
function checkLeaveType(leaveTypeId: string, leaveTypeName: string) {
if (props.leaveType) {
const filtertype = props.leaveType.find((e: any) => e.id === leaveTypeId)
const type = filtertype.code
if (type === "LV-001" || type === "LV-002" || type === "LV-003") {
checkForm.value = "FormLeave"
} else if (type === "LV-004") {
checkForm.value = "FormChildbirth"
} else if (type === "LV-005") {
checkForm.value = "FormHoliday"
} else if (type === "LV-006") {
checkForm.value = "FormUpasom"
} else if (type === "LV-006" && leaveTypeName === "พิธีฮัจญ์ฯ") {
checkForm.value = "FormHajj"
} else if (type === "LV-007") {
checkForm.value = "FormCheckSelect"
} else if (type === "LV-008" && leaveTypeName === "ลาไปศีกษา") {
checkForm.value = "FormStudy"
} else if (type === "LV-008") {
checkForm.value = "FormLeaveToTraining"
} else if (type === "LV-009") {
checkForm.value = "FormLeaveToWorkInternational"
} else if (type === "LV-010") {
checkForm.value = "FormSpouse"
} else if (type === "LV-011") {
checkForm.value = "FormVocationalRehabilitation"
}
}
}
/**
* นทกขอมลทเเกไข
* @param id ระบ คคล
*/
function onSubmit(formData: FormData) {
// dialogConfirm($q, () => putData(formData));
console.log(personalId.value)
}
// function putData(formData: any) {
// showLoader();
// http
// .put(config.API.meetingById(personalId.value), {
// round: formData.rounded ?? "",
// tittle: formData.title,
// dateStart: dateToISO(formData.dateMeetingStart),
// dateEnd: dateToISO(formData.dateMeetingEnd),
// result: formData.consider,
// duration: formData.period,
// })
// .then((res) => {
// success($q, "");
// })
// .catch((e) => {
// messageError($q, e);
// })
// .finally(async () => {
// hideLoader();
// router.push(`/evaluate/meeting`);
// });
// }
onMounted(() => {
fetchDataDetail(personalId.value);
});
</script>
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn to="/leave" icon="mdi-arrow-left" unelevated round dense flat color="primary" class="q-mr-sm" />
<div>แกไขยนใบลา {{ formData.leaveTypeName }} {{ leaveId }}</div>
</div>
<q-form ref="myform" class="col-12">
<q-card bordered>
<div class="col-12 row q-col-gutter-md q-pa-md">
<div class="col-xs-12 col-sm-12">
<div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-1-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">เลอกประเภทการลา</div>
</div>
<div class="q-py-sm q-px-lg">
<div class="row">
<q-select
dense
class="col-12 col-sm-6 col-md-4 inputgreen"
outlined
v-model="formData.leaveTypeName"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทใบลา :"
/>
</div>
<div class="row q-mt-sm">
<div class="col-12 col-sm-6 col-md-3" v-if="model === 'LV-006' || model === 'LV-008'">
<q-select
dense
outlined
v-model="modelSpecific"
:options="model === 'LV-006' ? dataStore.optionsOrdination : dataStore.optionsSpecific"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทการลา :"
@update:model-value="dataStore.typeConvert(model, modelSpecific)"
/>
</div>
</div>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn
to="/leave"
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
/>
<div>แกไขขอมลการ{{ formData.leaveTypeName }} {{ leaveId }}</div>
</div>
<q-form ref="myform" class="col-12">
<q-card bordered>
<div class="col-12 row q-col-gutter-md q-pa-md">
<div class="col-xs-12 col-sm-12">
<div style="display: flex; align-items: center">
<q-icon
name="mdi-numeric-1-circle"
size="20px"
color="primary"
/>
<div class="q-pl-sm text-weight-bold text-dark">
เลอกประเภทการลา
</div>
</div>
<div class="q-py-sm q-px-lg">
<div class="row">
<q-select
dense
class="col-12 col-sm-6 col-md-4 inputgreen"
outlined
v-model="formData.leaveTypeName"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทใบลา :"
/>
</div>
<div class="row q-mt-sm">
<div
class="col-12 col-sm-6 col-md-3"
v-if="model === 'LV-006' || model === 'LV-008'"
>
<q-select
dense
outlined
v-model="modelSpecific"
:options="
model === 'LV-006'
? dataStore.optionsOrdination
: dataStore.optionsSpecific
"
option-value="code"
option-label="name"
emit-value
map-options
prefix="ประเภทการลา :"
@update:model-value="
dataStore.typeConvert(model, modelSpecific)
"
/>
</div>
</div>
</div>
<!-- v-if (ลาอปสมบทหรอลาประกอบพจญ||ลาไปศกษา กอบรม ปฎการว หรอดงาน) -->
</div>
<div>
<div style="display: flex; align-items: center">
<q-icon name="mdi-numeric-2-circle" size="20px" color="primary" />
<div class="q-pl-sm text-weight-bold text-dark">อมลการลา</div>
</div>
<FormPart2 :model="model" :data="formData" :leaveTypeId="formData.leaveTypeId" />
</div>
</div>
<div class="col-12">
<Sick :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาป่วย' || formData.leaveTypeName === 'ลากิจส่วนตัว'" :data="formData" :leaveId="leaveId" />
<Birth :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาคลอดบุตร'" :data="formData" :leaveId="leaveId" />
<HelpWifeBirth :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาไปช่วยเหลือภริยาที่คลอดบุตร'" :data="formData" :leaveId="leaveId" />
<Vacation :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาพักผ่อน'" :data="formData" :leaveId="leaveId" />
<Ordination :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาอุปสมบทหรือการลาประกอบพิธีฮัจญ์ฯ'" :data="formData" :leaveId="leaveId" />
<Haji :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาอุปสมบทหรือการลาประกอบพิธีฮัจญ์ฯ'" :data="formData" :leaveId="leaveId" />
<Millitary :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาเข้ารับการตรวจเลือกหรือเข้ารับการเตรียมพล'" :data="formData" :leaveId="leaveId" />
<WorkInternational ::on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาไปปฏิบัติงานในองค์การระหว่างประเทศ'" :data="formData" :leaveId="leaveId" />
<Study :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาไปศึกษา ฝึกอบรม ปฏิบัติการวิจัย หรือดูงาน'" :data="formData" :leaveId="leaveId" />
<FollowSpouse :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาติดตามคู่สมรส'" :data="formData" :leaveId="leaveId" />
<Rehabilitation :on-submit="onSubmit" v-if="formData.leaveTypeName === 'ลาไปฟื้นฟูสมรรถภาพด้านอาชีพ'" :data="formData" :leaveId="leaveId" />
</div>
<!-- <div class="toptitle col-12 row items-center">
<q-btn icon="mdi-arrow-left" unelevated round dense flat color="" class="q-mr-sm" @click="router.push(`/evaluate/meeting`)" />
<div class="text-white q-pl-sm">นขอลา {{ formData.leaveTypeName }} {{ leaveId }}</div>
</div>
<WorkInternational v-if="checkForm === 'FormLeaveToWorkInternational'" :on-submit="onSubmit" :data="formData" />
v-if="checkForm === 'FormVocationalRehabilitation'" -->
</div>
</q-card>
</q-form>
</div>
</div>
<div>
<div style="display: flex; align-items: center">
<q-icon
name="mdi-numeric-2-circle"
size="20px"
color="primary"
/>
<div class="q-pl-sm text-weight-bold text-dark">
อมลการลา
</div>
</div>
<FormPart2
:model="model"
:data="formData"
:leaveTypeId="formData.leaveTypeId"
/>
</div>
</div>
<div class="col-12">
<SickForm
v-if="model === 'LV-001' || model === 'LV-002'"
:data="formData"
:on-submit="onSubmit"
/>
<FormBirth
v-if="model === 'LV-003'"
:data="formData"
:on-submit="onSubmit"
/>
<HelpWifeBirthForm
v-if="model === 'LV-004'"
:data="formData"
:on-submit="onSubmit"
/>
<VacationForm
v-if="model === 'LV-005'"
:data="formData"
:on-submit="onSubmit"
/>
<OrdinationForm
v-if="model === 'LV-006' && modelSpecific === 'b0'"
:data="formData"
:on-submit="onSubmit"
/>
<HajjForm
v-if="model === 'LV-006' && modelSpecific === 'b1'"
:data="formData"
:on-submit="onSubmit"
/>
<MilitaryForm
v-if="model === 'LV-007'"
style="width: 100%"
:data="formData"
:on-submit="onSubmit"
/>
<StudyForm
v-if="model === 'LV-008' && modelSpecific === 's0'"
style="width: 100%"
:data="formData"
:on-submit="onSubmit"
/>
<TrainForm
v-if="
model === 'LV-008' &&
modelSpecific != 's0' &&
modelSpecific != ''
"
:data="formData"
:on-submit="onSubmit"
/>
<WorkInternationalForm
v-if="model === 'LV-009'"
:data="formData"
:on-submit="onSubmit"
/>
<FollowSpouseForm
v-if="model === 'LV-010'"
:data="formData"
:on-submit="onSubmit"
/>
<RehabilitationForm
v-if="model === 'LV-011'"
:data="formData"
:on-submit="onSubmit"
/>
</div>
</div>
</q-card>
</q-form>
</div>
</div>
</template>

View file

@ -1,395 +1,503 @@
<script setup lang="ts">
import { ref, onMounted, computed } from "vue"
import { useQuasar } from "quasar"
import { useRouter } from "vue-router"
import http from "@/plugins/http"
import config from "@/app.config"
import type { LeaveItem } from "@/modules/05_leave/interface/index/main"
import type { QTableProps } from "quasar"
import { ref, onMounted, computed } from "vue";
import { useQuasar } from "quasar";
import { useRouter } from "vue-router";
import http from "@/plugins/http";
import config from "@/app.config";
import type { LeaveItem } from "@/modules/05_leave/interface/index/main";
import type { QTableProps } from "quasar";
import CalendarView from "@/modules/05_leave/components/Calendar.vue"
import ListView from "@/modules/05_leave/components/ListView.vue"
import CalendarView from "@/modules/05_leave/components/Calendar.vue";
import ListView from "@/modules/05_leave/components/ListView.vue";
import { useCounterMixin } from "@/stores/mixin"
import { useLeaveStore } from "@/modules/05_leave/store"
import { useCounterMixin } from "@/stores/mixin";
import { useLeaveStore } from "@/modules/05_leave/store";
const mixin = useCounterMixin()
const leaveStore = useLeaveStore()
const { showLoader, hideLoader, messageError } = mixin
const mixin = useCounterMixin();
const leaveStore = useLeaveStore();
const { showLoader, hideLoader, messageError } = mixin;
const router = useRouter()
const $q = useQuasar()
const router = useRouter();
const $q = useQuasar();
const filterLeaveType = ref(["ลาป่วย", "ลากิจส่วนตัว", "ลาพักผ่อน"])
const filterLeaveType = ref(["ลาป่วย", "ลากิจส่วนตัว", "ลาพักผ่อน"]);
const itemPie = ref<LeaveItem[]>([])
const knob = ref(80)
const itemPie = ref<LeaveItem[]>([]);
const knob = ref(80);
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: "leaveLimit",
align: "left",
label: "โควตาวันลา",
sortable: true,
field: "leaveLimit",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveExtend",
align: "left",
label: "วันลาสะสม",
sortable: true,
field: "leaveExtend",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
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: "leaveLimit",
align: "left",
label: "โควตาวันลา",
sortable: true,
field: "leaveLimit",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveExtend",
align: "left",
label: "วันลาสะสม",
sortable: true,
field: "leaveExtend",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountSend",
align: "left",
label: "จำนวนยื่นขอลา (วัน)",
sortable: true,
field: "leaveCountSend",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountApprove",
align: "left",
label: "จำนวนที่อนุมัติ (วัน)",
sortable: true,
field: "leaveCountApprove",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountReject",
align: "left",
label: "จำนวนที่ไม่อนุมัติ (วัน)",
sortable: true,
field: "leaveCountReject",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountDelete",
align: "left",
label: "จำนวนที่ยกเลิก (วัน)",
sortable: true,
field: "leaveCountDelete",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
])
const row = ref<any>([])
const pagination = ref({ rowsPerPage: 15 })
{
name: "leaveCountSend",
align: "left",
label: "จำนวนยื่นขอลา (วัน)",
sortable: true,
field: "leaveCountSend",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountApprove",
align: "left",
label: "จำนวนที่อนุมัติ (วัน)",
sortable: true,
field: "leaveCountApprove",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountReject",
align: "left",
label: "จำนวนที่ไม่อนุมัติ (วัน)",
sortable: true,
field: "leaveCountReject",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
{
name: "leaveCountDelete",
align: "left",
label: "จำนวนที่ยกเลิก (วัน)",
sortable: true,
field: "leaveCountDelete",
headerStyle: "font-size: 14px",
style: "font-size: 14px; width:15%;",
},
]);
const row = ref<any>([]);
const pagination = ref({ rowsPerPage: 15 });
/** function เรียกข้อมูลตารางสถิติการลา*/
async function fetchStatsTable() {
// modalStatsTable.value = true;
showLoader()
await http
.get(config.API.leaveStats())
.then(res => {
const data = res.data.result
console.log(data)
const stat = filterLeaveType.value.map(e => {
return data
.filter((el: any) => el.leaveTypeName === e)
.map((el: any) => ({
text: el.leaveTypeName,
color: el.leaveTypeName === "ลาพักผ่อน" ? "text-pink-5" : el.leaveTypeName === "ลากิจส่วนตัว" ? "text-deep-purple" : "text-indigo",
value: el.leavePercent,
all: el.leaveLimit,
use: el.leaveCountApprove,
remain: Number(el.leaveLimit) - Number(el.leaveCountApprove),
}))
})
stat.forEach(item => itemPie.value.push(...item))
// modalStatsTable.value = true;
showLoader();
await http
.get(config.API.leaveStats())
.then((res) => {
const data = res.data.result;
const stat = filterLeaveType.value.map((e) => {
return data
.filter((el: any) => el.leaveTypeName === e)
.map((el: any) => ({
text: el.leaveTypeName,
color:
el.leaveTypeName === "ลาพักผ่อน"
? "text-pink-5"
: el.leaveTypeName === "ลากิจส่วนตัว"
? "text-deep-purple"
: "text-indigo",
value: el.leavePercent,
all: el.leaveLimit,
use: el.leaveCountApprove,
remain: Number(el.leaveLimit) - Number(el.leaveCountApprove),
}));
});
stat.forEach((item) => itemPie.value.push(...item));
row.value = data.map((e: any) => ({
leaveTypeName: e.leaveTypeName,
leaveLimit: e.leaveTypeName === "ลาพักผ่อน" ? e.leaveLimit : e.leaveTypeName === "ลากิจส่วนตัว" ? "-" : "-",
leaveExtend: e.leaveTypeName === "ลาพักผ่อน" ? e.leaveExtend : e.leaveTypeName === "ลากิจส่วนตัว" ? "-" : "-",
leavePercent: e.leavePercent,
leaveCountSend: e.leaveCountSend,
leaveCountApprove: e.leaveCountApprove,
leaveCountReject: e.leaveCountReject,
leaveCountDelete: e.leaveCountDelete,
}))
})
.catch(err => {
messageError($q, err)
})
.finally(() => {
hideLoader()
})
row.value = data.map((e: any) => ({
leaveTypeName: e.leaveTypeName,
leaveLimit:
e.leaveTypeName === "ลาพักผ่อน"
? e.leaveLimit
: e.leaveTypeName === "ลากิจส่วนตัว"
? "-"
: "-",
leaveExtend:
e.leaveTypeName === "ลาพักผ่อน"
? e.leaveExtend
: e.leaveTypeName === "ลากิจส่วนตัว"
? "-"
: "-",
leavePercent: e.leavePercent,
leaveCountSend: e.leaveCountSend,
leaveCountApprove: e.leaveCountApprove,
leaveCountReject: e.leaveCountReject,
leaveCountDelete: e.leaveCountDelete,
}));
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
const modalStatsTable = ref<boolean>(false)
const modalStatsTable = ref<boolean>(false);
function onClickOpenStat() {
modalStatsTable.value = true
modalStatsTable.value = true;
}
/** function redirectTo ยื่นใบลา*/
async function addAbsence() {
router.push(`/leave/add`)
await leaveStore.resetForm2();
router.push(`/leave/add`);
}
/**
* find อมลจาก api
*/
const filteredItems = computed(() => {
return itemPie.value.filter(item => item.text === "ลาพักผ่อน")
})
return itemPie.value.filter((item) => item.text === "ลาพักผ่อน");
});
const filteredSick = computed(() => {
return itemPie.value.filter(item => item.text === "ลาป่วย")
})
return itemPie.value.filter((item) => item.text === "ลาป่วย");
});
const filteredBusi = computed(() => {
return itemPie.value.filter(item => item.text === "ลากิจส่วนตัว")
})
return itemPie.value.filter((item) => item.text === "ลากิจส่วนตัว");
});
onMounted(async () => {
await fetchStatsTable()
})
await fetchStatsTable();
});
</script>
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn icon="mdi-arrow-left" unelevated round dense flat color="primary" class="q-mr-sm" @click="router.go(-1)" />
<div>รายการลา</div>
</div>
</div>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
@click="router.go(-1)"
/>
<div>รายการลา</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-11 row">
<!-- สถการลา -->
<div class="col-12 row q-pb-sm">
<q-card bordered class="col-12 row">
<div class="row col-12 items-center q-px-md q-py-sm">
<div class="text-weight-bold">สถการลา</div>
<q-space />
<q-btn dense flat class="text-blue" icon="mdi-chart-line-variant" @click="onClickOpenStat" label="ตารางสถิติการลา" />
</div>
<div bordered class="col-6 row justify-center q-px-md q-pb-md q-col-gutter-sm" v-for="item in filteredItems" :key="item.text">
<div class="col-xs-12 col-sm-12">
<q-card bordered flat class="col-12 row shadow-0 no-wrap" v-if="item.text === 'ลาพักผ่อน'">
<div class="col-xs-12 col-sm-8 row justify-center q-py-md">
<div class="col-12 row items-center justify-center q-pb-sm">
<q-knob readonly v-model="item.value" show-value size="60px" :thickness="0.15" track-color="grey-3" class="text-indigo">
<span class="text-subtitle2 text-weight-bold">{{ item.value }}</span>
</q-knob>
</div>
<div class="col-12 text-center text-weight-medium">ลาพกผอน</div>
</div>
<div class="row gt-xs"><q-separator vertical /></div>
<div class="col-xs-12 col-sm-4 gt-xs row">
<div class="col-12 row text-dark text-body2 items-center">
<div class="col-12 row q-pa-xs q-px-md row">
<span class="text-grey-7 col-6">ได</span>
<span class="text-weight-bold">{{ item.all }}</span>
</div>
<div class="col-12"><q-separator /></div>
<div class="col-12 row q-pa-xs q-px-md">
<span class="text-grey-7 col-6">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
</div>
<div class="col-12"><q-separator /></div>
<div class="col-12 row q-pa-xs q-px-md">
<span class="text-grey-7 col-6">คงเหล</span>
<span class="text-weight-bold">{{ item.remain }}</span>
</div>
</div>
</div>
</q-card>
</div>
</div>
<div class="col-6 row">
<div bordered class="col-12 row justify-center q-px-md q-pb-md q-col-gutter-sm" v-for="item in filteredSick" :key="item.text">
<div class="col-xs-12 col-sm-12 row q-col-gutter-sm">
<div class="col-12 row" v-if="item.text === 'ลาป่วย'">
<q-card bordered flat class="shadow-0 col-12 fit row items-center q-px-lg">
<div class="text-subtitle2 col-4">ลาปวย</div>
<div class="text-subtitle2 col-8">
<span class="text-grey-7 q-pr-md">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
<!-- <span class="text-grey-7 q-pl-md">ลา</span> -->
</div>
</q-card>
</div>
</div>
</div>
<div bordered class="col-12 row justify-center q-px-md q-pb-md q-col-gutter-sm" v-for="item in filteredBusi" :key="item.text">
<div class="col-xs-12 col-sm-12 row q-col-gutter-sm">
<div class="col-12 row" v-if="item.text === 'ลากิจส่วนตัว'">
<q-card bordered flat class="shadow-0 col-12 fit row items-center q-px-lg">
<div class="text-subtitle2 col-4">ลากจสวนต</div>
<div class="text-subtitle2 col-8">
<span class="text-grey-7 q-pr-md">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
<!-- <span class="text-grey-7 q-pl-md">ลา</span> -->
</div>
</q-card>
</div>
</div>
</div>
</div>
</q-card>
</div>
<div class="col-xs-12 col-sm-12 col-md-11 row">
<!-- สถการลา -->
<div class="col-12 row q-pb-sm">
<q-card bordered class="col-12 row">
<div class="row col-12 items-center q-px-md q-py-sm">
<div class="text-weight-bold">สถการลา</div>
<q-space />
<q-btn
dense
flat
class="text-blue"
icon="mdi-chart-line-variant"
@click="onClickOpenStat"
label="ตารางสถิติการลา"
/>
</div>
<div
bordered
class="col-6 row justify-center q-px-md q-pb-md q-col-gutter-sm"
v-for="item in filteredItems"
:key="item.text"
>
<div class="col-xs-12 col-sm-12">
<q-card
bordered
flat
class="col-12 row shadow-0 no-wrap"
v-if="item.text === 'ลาพักผ่อน'"
>
<div class="col-xs-12 col-sm-8 row justify-center q-py-md">
<div class="col-12 row items-center justify-center q-pb-sm">
<q-knob
readonly
v-model="item.value"
show-value
size="60px"
:thickness="0.15"
track-color="grey-3"
class="text-indigo"
>
<span class="text-subtitle2 text-weight-bold">{{
item.value
}}</span>
</q-knob>
</div>
<div class="col-12 text-center text-weight-medium">
ลาพกผอน
</div>
</div>
<div class="row gt-xs"><q-separator vertical /></div>
<div class="col-xs-12 col-sm-4 gt-xs row">
<div class="col-12 row text-dark text-body2 items-center">
<div class="col-12 row q-pa-xs q-px-md row">
<span class="text-grey-7 col-6">ได</span>
<span class="text-weight-bold">{{ item.all }}</span>
</div>
<div class="col-12"><q-separator /></div>
<div class="col-12 row q-pa-xs q-px-md">
<span class="text-grey-7 col-6">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
</div>
<div class="col-12"><q-separator /></div>
<div class="col-12 row q-pa-xs q-px-md">
<span class="text-grey-7 col-6">คงเหล</span>
<span class="text-weight-bold">{{ item.remain }}</span>
</div>
</div>
</div>
</q-card>
</div>
</div>
<div class="col-6 row">
<div
bordered
class="col-12 row justify-center q-px-md q-pb-md q-col-gutter-sm"
v-for="item in filteredSick"
:key="item.text"
>
<div class="col-xs-12 col-sm-12 row q-col-gutter-sm">
<div class="col-12 row" v-if="item.text === 'ลาป่วย'">
<q-card
bordered
flat
class="shadow-0 col-12 fit row items-center q-px-lg"
>
<div class="text-subtitle2 col-4">ลาปวย</div>
<div class="text-subtitle2 col-8">
<span class="text-grey-7 q-pr-md">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
<!-- <span class="text-grey-7 q-pl-md">ลา</span> -->
</div>
</q-card>
</div>
</div>
</div>
<div
bordered
class="col-12 row justify-center q-px-md q-pb-md q-col-gutter-sm"
v-for="item in filteredBusi"
:key="item.text"
>
<div class="col-xs-12 col-sm-12 row q-col-gutter-sm">
<div class="col-12 row" v-if="item.text === 'ลากิจส่วนตัว'">
<q-card
bordered
flat
class="shadow-0 col-12 fit row items-center q-px-lg"
>
<div class="text-subtitle2 col-4">ลากจสวนต</div>
<div class="text-subtitle2 col-8">
<span class="text-grey-7 q-pr-md">ใชไป</span>
<span class="text-weight-bold">{{ item.use }}</span>
<!-- <span class="text-grey-7 q-pl-md">ลา</span> -->
</div>
</q-card>
</div>
</div>
</div>
</div>
</q-card>
</div>
<div class="row col-12">
<!-- แสดงปฏ -->
<div class="col-12 row">
<q-card bordered class="q-pa-md col-12">
<div class="row col-12">
<div class="row items-center">
<div class="q-ml-sm">
<q-btn round dense flat size="13px" class="q-px-sm" @click="addAbsence">
<q-icon name="mdi-plus" size="22px" color="blue" />
<q-tooltip>นใบลา</q-tooltip>
</q-btn>
</div>
</div>
<q-space />
<div class="justify-center row items-center">
<!-- tab ปแบบแสดงวนหย ปฏนกบรายการ -->
<q-tabs v-model="leaveStore.tabValue" indicator-color="transparent" align="left" active-color="activetab" class="text-nativetab" inline-label dense>
<q-btn
name="calendar"
round
size="12px"
flat
icon="mdi-calendar-month"
@click="leaveStore.tabValue = 'calendar'"
:color="leaveStore.tabValue == 'calendar' ? 'primary' : 'grey-6'"
class="q-mr-sm"
>
<q-tooltip>ปฏ</q-tooltip>
</q-btn>
<q-separator vertical inset />
<q-btn
name="list"
round
size="12px"
flat
icon="mdi-format-list-bulleted"
@click="leaveStore.tabValue = 'list'"
:color="leaveStore.tabValue == 'list' ? 'primary' : 'grey-6'"
class="q-ml-sm"
>
<q-tooltip>รายการ</q-tooltip>
</q-btn>
</q-tabs>
</div>
</div>
<div class="col-12">
<CalendarView v-if="leaveStore.tabValue === 'calendar'" />
</div>
<div class="row col-12">
<!-- แสดงปฏ -->
<div class="col-12 row">
<q-card bordered class="q-pa-md col-12">
<div class="row col-12">
<div class="row items-center">
<div class="q-ml-sm">
<q-btn
round
dense
flat
size="13px"
class="q-px-sm"
@click="addAbsence"
>
<q-icon name="mdi-plus" size="22px" color="blue" />
<q-tooltip>สรางใบลา</q-tooltip>
</q-btn>
</div>
</div>
<q-space />
<div class="justify-center row items-center">
<!-- tab ปแบบแสดงวนหย ปฏนกบรายการ -->
<q-tabs
v-model="leaveStore.tabValue"
indicator-color="transparent"
align="left"
active-color="activetab"
class="text-nativetab"
inline-label
dense
>
<q-btn
name="calendar"
round
size="12px"
flat
icon="mdi-calendar-month"
@click="leaveStore.tabValue = 'calendar'"
:color="
leaveStore.tabValue == 'calendar' ? 'primary' : 'grey-6'
"
class="q-mr-sm"
>
<q-tooltip>ปฏ</q-tooltip>
</q-btn>
<q-separator vertical inset />
<q-btn
name="list"
round
size="12px"
flat
icon="mdi-format-list-bulleted"
@click="leaveStore.tabValue = 'list'"
:color="
leaveStore.tabValue == 'list' ? 'primary' : 'grey-6'
"
class="q-ml-sm"
>
<q-tooltip>รายการ</q-tooltip>
</q-btn>
</q-tabs>
</div>
</div>
<div class="col-12">
<CalendarView v-if="leaveStore.tabValue === 'calendar'" />
</div>
<div class="col-12">
<ListView v-if="leaveStore.tabValue === 'list'" />
</div>
</q-card>
</div>
</div>
</div>
</div>
<div class="col-12">
<ListView v-if="leaveStore.tabValue === 'list'" />
</div>
</q-card>
</div>
</div>
</div>
</div>
<!-- modal ตารางสถการลา -->
<q-dialog v-model="modalStatsTable" persistent>
<q-card style="min-width: 85%">
<q-card-section class="row items-center q-pa-sm">
<div class="text-bold q-pl-sm">ตารางสถการลา</div>
<q-space />
<q-btn icon="close" unelevated round dense v-close-popup style="color: #ff8080; background-color: #ffdede" />
</q-card-section>
<q-separator />
<q-card-section class="q-p-md row">
<q-table flat bordered dense :rows="row" :columns="columns" row-key="leaveTypeName" class="custom-table2 col-12" hide-bottom v-model:pagination="pagination">
<template v-slot:header="props">
<q-tr :props="props">
<q-th v-for="col in props.cols" :key="col.name" :props="props">
<span class="text-weight-medium">{{ col.label }}</span>
</q-th>
</q-tr>
</template>
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td v-for="col in props.cols" :key="col.name" :props="props">
<div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }}
</div>
<div v-else>
{{ col.value }}
</div>
</q-td>
</q-tr></template
></q-table
>
</q-card-section>
</q-card>
</q-dialog>
<!-- modal ตารางสถการลา -->
<q-dialog v-model="modalStatsTable" persistent>
<q-card style="min-width: 85%">
<q-card-section class="row items-center q-pa-sm">
<div class="text-bold q-pl-sm">ตารางสถการลา</div>
<q-space />
<q-btn
icon="close"
unelevated
round
dense
v-close-popup
style="color: #ff8080; background-color: #ffdede"
/>
</q-card-section>
<q-separator />
<q-card-section class="q-p-md row">
<q-table
flat
bordered
dense
:rows="row"
:columns="columns"
row-key="leaveTypeName"
class="custom-table2 col-12"
hide-bottom
v-model:pagination="pagination"
>
<template v-slot:header="props">
<q-tr :props="props">
<q-th v-for="col in props.cols" :key="col.name" :props="props">
<span class="text-weight-medium">{{ col.label }}</span>
</q-th>
</q-tr>
</template>
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td v-for="col in props.cols" :key="col.name" :props="props">
<div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }}
</div>
<div v-else>
{{ col.value }}
</div>
</q-td>
</q-tr></template
></q-table
>
</q-card-section>
</q-card>
</q-dialog>
</template>
<style lang="scss" scoped>
.borderTop {
border-top: 1px solid #ededed;
border-bottom: 1px solid #ededed;
border-top: 1px solid #ededed;
border-bottom: 1px solid #ededed;
}
.custom-table2 {
.q-table tr:nth-child(odd) td {
background: white;
}
.q-table tr:nth-child(odd) td {
background: white;
}
.q-table tr:nth-child(even) td {
background: #f8f8f8;
}
.q-table tr:nth-child(even) td {
background: #f8f8f8;
}
.q-table thead tr {
background: #ecebeb;
}
.q-table thead tr {
background: #ecebeb;
}
.q-table thead tr th {
position: sticky;
}
.q-table thead tr th {
position: sticky;
}
.q-table td:nth-of-type(2) {
z-index: 3 !important;
}
.q-table td:nth-of-type(2) {
z-index: 3 !important;
}
.q-table th:nth-of-type(2),
.q-table td:nth-of-type(2) {
position: sticky;
left: 0;
z-index: 1;
}
.q-table th:nth-of-type(2),
.q-table td:nth-of-type(2) {
position: sticky;
left: 0;
z-index: 1;
}
/* this will be the loading indicator */
.q-table thead tr:last-child th {
/* height of all previous header rows */
top: 48px;
}
/* this will be the loading indicator */
.q-table thead tr:last-child th {
/* height of all previous header rows */
top: 48px;
}
.q-table thead tr:first-child th {
top: 0;
}
.q-table thead tr:first-child th {
top: 0;
}
}
</style>