182 lines
5.1 KiB
Vue
182 lines
5.1 KiB
Vue
<script setup lang="ts">
|
|
import { ref, watch } from "vue";
|
|
import { useQuasar } from "quasar";
|
|
import config from "@/app.config";
|
|
import http from "@/plugins/http";
|
|
|
|
import type { DataOption } from "@/modules/09_leave/interface/index/Main";
|
|
|
|
import HeaderDialog from "@/components/DialogHeader.vue";
|
|
|
|
import { useCounterMixin } from "@/stores/mixin";
|
|
|
|
const $q = useQuasar();
|
|
const mixin = useCounterMixin();
|
|
const { dialogConfirm, success, showLoader, hideLoader, messageError } = mixin;
|
|
|
|
const props = defineProps({
|
|
modal: {
|
|
type: Boolean,
|
|
require: true,
|
|
},
|
|
detail: {
|
|
type: Object,
|
|
require: true,
|
|
},
|
|
close: {
|
|
type: Function,
|
|
require: true,
|
|
},
|
|
fetchData: {
|
|
type: Function,
|
|
require: true,
|
|
},
|
|
});
|
|
|
|
const morningStatus = ref<string>("");
|
|
const afternoonStatus = ref<string>("");
|
|
const reason = ref<string>("");
|
|
|
|
const morningStatusRef = ref<any>();
|
|
const afternoonStatusRef = ref<any>();
|
|
|
|
const optionsMain = ref<DataOption[]>([
|
|
{ id: "NORMAL", name: "ปกติ" },
|
|
{ id: "LATE", name: "สาย" },
|
|
{ id: "ABSENT", name: "ขาดราชการ" },
|
|
]);
|
|
const options = ref<DataOption[]>(optionsMain.value);
|
|
|
|
async function onClickSave() {
|
|
morningStatusRef.value?.validate();
|
|
afternoonStatusRef.value?.validate();
|
|
if (!morningStatusRef.value.hasError && !afternoonStatusRef.value.hasError) {
|
|
const body = {
|
|
checkInStatus: morningStatus.value,
|
|
checkOutStatus: afternoonStatus.value,
|
|
reason: reason.value,
|
|
};
|
|
|
|
dialogConfirm($q, async () => {
|
|
showLoader();
|
|
await http
|
|
.put(config.API.leaveEditCheckin(props.detail?.id), body)
|
|
.then(() => {
|
|
success($q, "บันทึกข้อมูลสำเร็จ");
|
|
})
|
|
.catch((err) => {
|
|
messageError($q, err);
|
|
})
|
|
.finally(() => {
|
|
hideLoader();
|
|
props.fetchData?.();
|
|
props.close?.();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function filterFnOptions(val: any, update: Function) {
|
|
update(() => {
|
|
options.value = optionsMain.value.filter(
|
|
(v: DataOption) => v.name.indexOf(val) > -1
|
|
);
|
|
});
|
|
}
|
|
|
|
watch(
|
|
() => props.modal,
|
|
() => {
|
|
props.modal &&
|
|
((morningStatus.value = ""),
|
|
(afternoonStatus.value = ""),
|
|
(reason.value = ""));
|
|
}
|
|
);
|
|
</script>
|
|
<template>
|
|
<q-dialog v-model="props.modal">
|
|
<q-card class="column" style="width: 320px">
|
|
<HeaderDialog :tittle="'แก้ไขสถานะการเข้า-ออกงาน'" :close="props.close" />
|
|
|
|
<q-separator />
|
|
<q-card-section class="q-pt-none">
|
|
<q-card flat bordered class="col-12 q-mt-sm">
|
|
<div class="q-pa-sm text-green-8">
|
|
สถานะช่วงเช้า
|
|
<q-select
|
|
ref="morningStatusRef"
|
|
class="q-pa-sm"
|
|
dense
|
|
outlined
|
|
v-model="morningStatus"
|
|
:options="options"
|
|
label="สถานะ"
|
|
emit-value
|
|
map-options
|
|
option-label="name"
|
|
option-value="id"
|
|
:rules="[(val) => !!val || `${'กรุณาเลือกสถานะ'}`]"
|
|
hide-bottom-space
|
|
use-input
|
|
@filter="(inputValue: any,doneFn: Function) => filterFnOptions(inputValue, doneFn)"
|
|
><template v-slot:no-option>
|
|
<q-item>
|
|
<q-item-section class="text-grey">
|
|
ไม่มีข้อมูล
|
|
</q-item-section>
|
|
</q-item>
|
|
</template></q-select
|
|
>
|
|
</div>
|
|
</q-card>
|
|
<q-card flat bordered class="col-12 q-mt-sm">
|
|
<div class="q-pa-sm text-green-8">
|
|
สถานะช่วงบ่าย
|
|
<q-select
|
|
ref="afternoonStatusRef"
|
|
class="q-pa-sm"
|
|
dense
|
|
outlined
|
|
v-model="afternoonStatus"
|
|
:options="options"
|
|
label="สถานะ"
|
|
emit-value
|
|
map-options
|
|
option-label="name"
|
|
option-value="id"
|
|
:rules="[(val) => !!val || `${'กรุณาเลือกสถานะ'}`]"
|
|
hide-bottom-space
|
|
use-input
|
|
@filter="(inputValue: any,doneFn: Function) => filterFnOptions(inputValue, doneFn)"
|
|
><template v-slot:no-option>
|
|
<q-item>
|
|
<q-item-section class="text-grey">
|
|
ไม่มีข้อมูล
|
|
</q-item-section>
|
|
</q-item>
|
|
</template></q-select
|
|
>
|
|
</div>
|
|
</q-card>
|
|
|
|
<q-card flat class="col-12 q-mt-sm">
|
|
<q-input
|
|
outlined
|
|
dense
|
|
v-model="reason"
|
|
type="textarea"
|
|
label="เหตุผล"
|
|
/>
|
|
</q-card>
|
|
</q-card-section>
|
|
|
|
<q-separator />
|
|
<q-card-actions align="right">
|
|
<q-btn dense color="secondary" label="บันทึก" @click="onClickSave" />
|
|
</q-card-actions>
|
|
</q-card>
|
|
</q-dialog>
|
|
</template>
|
|
|
|
<style scoped></style>
|