hrms-mgt/src/modules/02_organizationalNew/components/DialogAddPosition.vue
2024-03-18 14:50:52 +07:00

506 lines
18 KiB
Vue

<script setup lang="ts">
import { ref, reactive, watch, defineProps } from "vue";
import type { QTableProps } from "quasar";
import { useQuasar } from "quasar";
import { useCounterMixin } from "@/stores/mixin";
import DialogHeader from "@/components/DialogHeader.vue";
import http from "@/plugins/http";
import config from "@/app.config";
import type {
FormDataPosition,
FormPositionRef,
DataOption,
FormPositionSelect,
RowDetailPositions,
FormPositionSelectRef,
ListMenu,
} from "@/modules/02_organizationalNew/interface/index/Main";
import type {
OptionType,
OptionLevel,
OptionExecutive,
DataPosition,
} from "@/modules/02_organizationalNew/interface/response/organizational";
const posExecutive = ref<string>("");
const isSpecial = ref<boolean>(false);
const shape = ref<string>("false");
const props = defineProps({
emitSearch: Function,
getData: Function,
data: Object,
levelOp: Object,
});
const modal = defineModel<boolean>("modalAdd", { required: true });
const isEditCheck = defineModel<boolean>("isEdit", { required: true });
const dataLevel = ref<any>();
const $q = useQuasar();
const mixin = useCounterMixin();
const {
dialogConfirm,
showLoader,
hideLoader,
messageError,
success,
dialogRemove,
} = mixin;
const isReadonly = ref<boolean>(false); // อ่านได้อย่างเดียว
const isDisValidate = ref<boolean>(false);
const positionNameRef = ref<Object | null>(null);
const positionFieldRef = ref<Object | null>(null);
const positionTypeRef = ref<Object | null>(null);
const positionLevelRef = ref<Object | null>(null);
const positionExecutiveRef = ref<Object | null>(null);
const positionExecutiveFieldRef = ref<Object | null>(null);
const positionAreaRef = ref<Object | null>(null);
const typeOpsMain = ref<DataOption[]>([]);
const levelOpsMain = ref<DataOption[]>([]);
const executiveOpsMain = ref<DataOption[]>([]);
const executiveOps = ref<DataOption[]>([]);
const typeOps = ref<DataOption[]>([]);
const levelOps = ref<DataOption[]>([]);
const formPositionSelect = reactive<FormPositionSelect>({
positionId: "",
positionName: "",
positionField: "",
positionType: "",
positionLevel: "",
positionExecutive: "",
positionExecutiveField: "",
positionArea: "",
});
const objectPositionSelectRef: FormPositionSelectRef = {
positionName: positionNameRef,
positionField: positionFieldRef,
positionType: positionTypeRef,
positionLevel: positionLevelRef,
positionExecutive: positionExecutiveRef,
positionExecutiveField: positionExecutiveFieldRef,
positionArea: positionAreaRef,
};
/** ฟังก์ชั่นตรวจสอบความถูกต้องของข้อมูลในฟอร์ม */
function validateFormPositionEdit() {
isDisValidate.value = false;
const hasError = [];
for (const key in objectPositionSelectRef) {
if (Object.prototype.hasOwnProperty.call(objectPositionSelectRef, key)) {
const property = objectPositionSelectRef[key];
if (property.value && typeof property.value.validate === "function") {
const isValid = property.value.validate();
hasError.push(isValid);
}
}
}
if (hasError.every((result) => result === true)) {
if (isEditCheck.value == true) {
saveSelectEdit();
} else {
onSubmitSelectEdit();
}
}
}
function saveSelectEdit() {
console.log(formPositionSelect.positionExecutive);
dialogConfirm(
$q,
async () => {
const dataExecutive = shape.value == "false" ? formPositionSelect.positionExecutive:posExecutive.value
const url =
shape.value == "false"
? config.API.orgPosPositionById(formPositionSelect.positionId)
: config.API.orgPosPositionExecutive()+`/${formPositionSelect.positionId}`;
showLoader();
const body = shape.value == "false" ?{
posDictName: formPositionSelect.positionName,
posDictField: formPositionSelect.positionField, //สายงาน
posTypeId: formPositionSelect.positionType, //*ประเภทตำแหน่ง
posLevelId: formPositionSelect.positionLevel, //*ระดับตำแหน่ง
posExecutiveId: dataExecutive, //ตำแหน่งทางการบริหาร
posDictExecutiveField: formPositionSelect.positionExecutiveField, //ด้านทางการบริหาร
posDictArea: formPositionSelect.positionArea, //ด้าน/สาขา
isSpecial: isSpecial.value,
}:{
posDictName: formPositionSelect.positionName,
posDictField: formPositionSelect.positionField, //สายงาน
posTypeId: formPositionSelect.positionType, //*ประเภทตำแหน่ง
posLevelId: formPositionSelect.positionLevel, //*ระดับตำแหน่ง
posExecutive: dataExecutive, //ตำแหน่งทางการบริหาร
posDictExecutiveField: formPositionSelect.positionExecutiveField, //ด้านทางการบริหาร
posDictArea: formPositionSelect.positionArea, //ด้าน/สาขา
isSpecial: isSpecial.value,
}
await http
.put(url, body)
.then(() => {
success($q, "เพิ่มข้อมูลสำเร็จ");
props.getData?.();
close();
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
},
"ยืนยันการแก้ไขตำแหน่ง",
"ต้องการยืนยันแก้ไขตำแหน่งนี้ใช่หรือไม่?"
);
}
/** ฟังชั่น บันทึก */
function onSubmitSelectEdit() {
console.log(formPositionSelect.positionExecutive);
dialogConfirm(
$q,
async () => {
const dataExecutive = shape.value == "false" ? formPositionSelect.positionExecutive:posExecutive.value
const url =
shape.value == "false"
? config.API.orgPosPosition
: config.API.orgPosPositionExecutive();
showLoader();
const body = shape.value == "false" ?{
posDictName: formPositionSelect.positionName,
posDictField: formPositionSelect.positionField, //สายงาน
posTypeId: formPositionSelect.positionType, //*ประเภทตำแหน่ง
posLevelId: formPositionSelect.positionLevel, //*ระดับตำแหน่ง
posExecutiveId: dataExecutive, //ตำแหน่งทางการบริหาร
posDictExecutiveField: formPositionSelect.positionExecutiveField, //ด้านทางการบริหาร
posDictArea: formPositionSelect.positionArea, //ด้าน/สาขา
isSpecial: isSpecial.value,
}:{
posDictName: formPositionSelect.positionName,
posDictField: formPositionSelect.positionField, //สายงาน
posTypeId: formPositionSelect.positionType, //*ประเภทตำแหน่ง
posLevelId: formPositionSelect.positionLevel, //*ระดับตำแหน่ง
posExecutive: dataExecutive, //ตำแหน่งทางการบริหาร
posDictExecutiveField: formPositionSelect.positionExecutiveField, //ด้านทางการบริหาร
posDictArea: formPositionSelect.positionArea, //ด้าน/สาขา
isSpecial: isSpecial.value,
}
await http
.post(url, body)
.then(() => {
success($q, "เพิ่มข้อมูลสำเร็จ");
props.emitSearch?.(formPositionSelect.positionName, "positionName");
close();
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
},
"ยืนยันการเพิ่มตำแหน่ง",
"ต้องการยืนยันการเพิ่มตำแหน่งนี้ใช่หรือไม่?"
);
}
async function clearFormPositionSelect() {
isEditCheck.value = false;
isDisValidate.value = await true;
formPositionSelect.positionId = "";
formPositionSelect.positionName = "";
formPositionSelect.positionField = "";
formPositionSelect.positionType = "";
formPositionSelect.positionLevel = "";
formPositionSelect.positionExecutive = "";
formPositionSelect.positionExecutiveField = "";
formPositionSelect.positionArea = "";
isSpecial.value = false;
setTimeout(async () => {
isDisValidate.value = await false;
}, 1000);
}
/**
* ส่งค่า css ออกไปตามเงื่อนไข
* @param val true/false
*/
function inputEdit(val: boolean) {
return {
"full-width cursor-pointer inputgreen ": val,
"full-width cursor-pointer inputgreen": !val,
};
}
function updateSelectType(val: string) {
const listLevel = dataLevel.value.find((e: any) => e.id === val);
levelOpsMain.value = listLevel.posLevels.map((e: OptionLevel) => ({
id: e.id,
name: e.posLevelName,
}));
levelOps.value = levelOpsMain.value;
formPositionSelect.positionLevel = "";
}
function close() {
modal.value = false;
clearFormPositionSelect();
}
async function fetchType() {
showLoader();
await http
.get(config.API.orgPosType)
.then((res) => {
dataLevel.value = res.data.result;
typeOpsMain.value = res.data.result.map((e: OptionType) => ({
id: e.id,
name: e.posTypeName,
}));
typeOps.value = typeOpsMain.value;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
/** function เรียกรายการตำแหน่งทางการบริหาร */
async function fetchExecutive() {
showLoader();
await http
.get(config.API.orgPosExecutive)
.then((res) => {
executiveOpsMain.value = res.data.result.map((e: OptionExecutive) => ({
id: e.id,
name: e.posExecutiveName,
}));
executiveOps.value = executiveOpsMain.value;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
watch(
() => modal.value,
async () => {
if (modal.value === true) {
await fetchType();
await fetchExecutive();
if (props.data) {
const dataList = props.data;
console.log(dataList);
updateSelectType(dataList.posTypeId);
formPositionSelect.positionId = dataList.id;
formPositionSelect.positionName = dataList.positionName;
formPositionSelect.positionField = dataList.positionField;
formPositionSelect.positionType = dataList.posTypeId;
formPositionSelect.positionLevel = dataList.posLevelId;
formPositionSelect.positionExecutive = dataList.posExecutiveId;
formPositionSelect.positionExecutiveField =
dataList.positionExecutiveField;
formPositionSelect.positionArea = dataList.positionArea;
isSpecial.value = dataList.isSpecial;
}
}
}
);
</script>
<template>
<q-dialog v-model="modal" persistent>
<q-card style="min-width: 50vw">
<DialogHeader
:tittle="`${isEditCheck ? `แก้ไขข้อมูลตำแหน่ง` : `เพิ่มข้อมูลตำแหน่ง`}`"
:close="close"
/>
<q-separator />
<q-card-section class="q-pa-none">
<form @submit.prevent="validateFormPositionEdit">
<div class="row q-col-gutter-sm col-12 q-pa-sm">
<div class="col-12">
<q-input
ref="positionNameRef"
v-model="formPositionSelect.positionName"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionName"
label="ตำแหน่งในสายงาน"
lazy-rules
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณากรอกตำแหน่งในสายงาน'}`]
: []
"
/>
</div>
<div class="col-6">
<q-input
ref="positionAreaRef"
v-model="formPositionSelect.positionArea"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionArea"
label="ด้าน/สาขา"
lazy-rules
hide-bottom-space
/>
</div>
<div class="col-6">
<q-input
ref="positionFieldRef"
v-model="formPositionSelect.positionField"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionField"
label="สายงาน"
lazy-rules
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณากรอกสายงาน'}`]
: []
"
/>
</div>
<div class="col-6">
<q-select
ref="positionTypeRef"
:class="inputEdit(isReadonly)"
label="ประเภทตำแหน่ง"
v-model="formPositionSelect.positionType"
:options="typeOps"
emit-value
dense
@update:model-value="updateSelectType"
map-options
outlined
option-label="name"
option-value="id"
lazy-rules
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณาเลือกประเภทตำแหน่ง'}`]
: []
"
/>
</div>
<div class="col-6">
<q-select
ref="positionLevelRef"
:class="inputEdit(isReadonly)"
label="ระดับตำแหน่ง"
v-model="formPositionSelect.positionLevel"
:disable="formPositionSelect.positionType === ''"
:options="levelOps"
emit-value
dense
map-options
outlined
option-label="name"
option-value="id"
lazy-rules
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณาเลือกระดับตำแหน่ง'}`]
: []
"
/>
</div>
<div class="col-12 self-center">
<q-radio
v-model="shape"
checked-icon="task_alt"
unchecked-icon="panorama_fish_eye"
val="false"
label="เลือกจากรายการ"
/>
<q-radio
v-model="shape"
checked-icon="task_alt"
w
unchecked-icon="panorama_fish_eye"
val="true"
label="เพิ่มใหม่"
/>
</div>
<div class="col-6">
<q-select
v-if="shape == 'false'"
ref="positionExecutiveRef"
:class="inputEdit(isReadonly)"
label="ตำแหน่งทางการบริหาร"
v-model="formPositionSelect.positionExecutive"
:options="executiveOps"
emit-value
dense
map-options
outlined
option-label="name"
option-value="id"
lazy-rules
hide-bottom-space
clearable
/>
<q-input
v-else
ref="positionExecutiveFieldRef"
v-model="posExecutive"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionExecutiveField"
label="เพิ่มตำแหน่งทางการบริหาร"
lazy-rules
hide-bottom-space
/>
</div>
<div class="col-6">
<q-input
ref="positionExecutiveFieldRef"
v-model="formPositionSelect.positionExecutiveField"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionExecutiveField"
label="ด้านทางการบริหาร"
lazy-rules
hide-bottom-space
/>
</div>
<div class="col-6 self-center">
<q-checkbox
size="md"
v-model="isSpecial"
label="เฉพาะสายงานที่กำหนด"
/>
</div>
</div>
<q-separator />
<q-card-actions align="right" class="bg-white text-teal q-pa-sm">
<q-btn
type="submit"
:label="`${isEditCheck ? 'แก้ไขตำแหน่ง' : 'เพิ่มตำแหน่ง'}`"
color="public"
/>
</q-card-actions>
</form>
</q-card-section>
</q-card>
</q-dialog>
</template>