hrms-mgt/src/modules/02_organizationalNew/components/DialogAddPosition.vue

532 lines
18 KiB
Vue
Raw Normal View History

2024-02-08 17:52:25 +07:00
<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 {
DataOption,
FormPositionSelect,
FormPositionSelectRef,
} from "@/modules/02_organizationalNew/interface/index/Main";
import type {
OptionType,
OptionLevel,
OptionExecutive,
DataPosition,
} from "@/modules/02_organizationalNew/interface/response/organizational";
const posExecutive = ref<string>("");
2024-02-29 15:11:56 +07:00
const isSpecial = ref<boolean>(false);
const shape = ref<string>("false");
2024-02-08 17:52:25 +07:00
const props = defineProps({
emitSearch: Function,
2024-02-21 11:28:54 +07:00
getData: Function,
2024-02-09 11:54:09 +07:00
data: Object,
levelOp: Object,
2024-02-08 17:52:25 +07:00
});
const modal = defineModel<boolean>("modalAdd", { required: true });
2024-02-21 11:28:54 +07:00
const isEditCheck = defineModel<boolean>("isEdit", { required: true });
2024-02-08 17:52:25 +07:00
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 shapeOp = ref<DataOption[]>([
{
id: "false",
name: "เลือกจากรายการ",
},
{
id: "true",
name: "เพิ่มใหม่",
},
]);
2024-02-08 17:52:25 +07:00
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();
2024-02-08 17:52:25 +07:00
}
// }
2024-02-08 17:52:25 +07:00
}
2024-02-29 15:11:56 +07:00
function saveSelectEdit() {
console.log(formPositionSelect.positionExecutive);
2024-02-21 11:28:54 +07:00
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}`;
2024-02-21 11:28:54 +07:00
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,
};
2024-02-21 11:28:54 +07:00
await http
.put(url, body)
2024-02-21 11:28:54 +07:00
.then(() => {
success($q, "เพิ่มข้อมูลสำเร็จ");
2024-02-29 15:11:56 +07:00
props.getData?.();
2024-02-21 11:28:54 +07:00
close();
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
},
"ยืนยันการแก้ไขตำแหน่ง",
"ต้องการยืนยันแก้ไขตำแหน่งนี้ใช่หรือไม่?"
);
}
2024-02-08 17:52:25 +07:00
/** ฟังชั่น บันทึก */
function onSubmitSelectEdit() {
2024-02-29 15:11:56 +07:00
console.log(formPositionSelect.positionExecutive);
2024-02-08 17:52:25 +07:00
dialogConfirm(
$q,
async () => {
const dataExecutive =
shape.value == "false"
? formPositionSelect.positionExecutive
: posExecutive.value;
const url =
shape.value == "false"
? config.API.orgPosPosition
: config.API.orgPosPositionExecutive();
2024-02-08 17:52:25 +07:00
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,
};
2024-02-08 17:52:25 +07:00
await http
.post(url, body)
2024-02-08 17:52:25 +07:00
.then(() => {
success($q, "เพิ่มข้อมูลสำเร็จ");
props.emitSearch?.(formPositionSelect.positionName, "positionName");
close();
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
},
"ยืนยันการเพิ่มตำแหน่ง",
"ต้องการยืนยันการเพิ่มตำแหน่งนี้ใช่หรือไม่?"
);
}
async function clearFormPositionSelect() {
2024-02-29 15:11:56 +07:00
isEditCheck.value = false;
2024-02-08 17:52:25 +07:00
isDisValidate.value = await true;
formPositionSelect.positionId = "";
formPositionSelect.positionName = "";
formPositionSelect.positionField = "";
formPositionSelect.positionType = "";
formPositionSelect.positionLevel = "";
formPositionSelect.positionExecutive = "";
formPositionSelect.positionExecutiveField = "";
formPositionSelect.positionArea = "";
2024-02-29 15:11:56 +07:00
isSpecial.value = false;
2024-02-08 17:52:25 +07:00
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,
2024-02-29 15:11:56 +07:00
async () => {
2024-02-08 17:52:25 +07:00
if (modal.value === true) {
2024-02-09 11:54:09 +07:00
await fetchType();
await fetchExecutive();
console.log(props.data);
2024-02-09 11:54:09 +07:00
if (props.data) {
const dataList = props.data;
2024-02-29 15:11:56 +07:00
console.log(dataList);
2024-02-09 11:54:09 +07:00
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;
2024-02-29 15:11:56 +07:00
isSpecial.value = dataList.isSpecial;
2024-02-09 11:54:09 +07:00
}
2024-02-08 17:52:25 +07:00
}
}
);
</script>
<template>
<q-dialog v-model="modal" persistent>
<q-card style="min-width: 50vw">
2024-02-29 15:11:56 +07:00
<DialogHeader
:tittle="`${isEditCheck ? `แก้ไขข้อมูลตำแหน่ง` : `เพิ่มข้อมูลตำแหน่ง`}`"
:close="close"
/>
2024-02-08 17:52:25 +07:00
<q-separator />
<q-card-section class="q-pa-none">
<q-form
greedy
@submit.prevent
@validation-success="validateFormPositionEdit"
>
<!-- @submit.prevent="validateFormPositionEdit" -->
2024-02-08 17:52:25 +07:00
<div class="row q-col-gutter-sm col-12 q-pa-sm">
<div class="col-12">
2024-02-08 17:52:25 +07:00
<q-input
ref="positionNameRef"
v-model="formPositionSelect.positionName"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionName"
label="ตำแหน่งในสายงาน"
lazy-rules
2024-02-08 17:52:25 +07:00
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณากรอกตำแหน่งในสายงาน'}`]
: []
"
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6">
<q-input
ref="positionAreaRef"
v-model="formPositionSelect.positionArea"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionArea"
label="ด้าน/สาขา"
lazy-rules
hide-bottom-space
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6">
2024-02-08 17:52:25 +07:00
<q-input
ref="positionFieldRef"
v-model="formPositionSelect.positionField"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionField"
label="สายงาน"
lazy-rules
2024-02-08 17:52:25 +07:00
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณากรอกสายงาน'}`]
: []
"
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6">
2024-02-08 17:52:25 +07:00
<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
2024-02-08 17:52:25 +07:00
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณาเลือกประเภทตำแหน่ง'}`]
: []
"
/>
</div>
<div class="col-12 col-sm-6 col-md-6">
2024-02-08 17:52:25 +07:00
<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
2024-02-08 17:52:25 +07:00
hide-bottom-space
:rules="
!isDisValidate
? [(val) => !!val || `${'กรุณาเลือกระดับตำแหน่ง'}`]
: []
"
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6 col-lg-3">
<q-select
ref="positionExecutiveRef"
:class="inputEdit(isReadonly)"
label="ตำแหน่งทางการบริหาร"
v-model="shape"
:options="shapeOp"
emit-value
dense
map-options
outlined
option-label="name"
option-value="id"
lazy-rules
hide-bottom-space
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6 col-lg-3">
2024-02-08 17:52:25 +07:00
<q-select
v-if="shape == 'false'"
2024-02-08 17:52:25 +07:00
ref="positionExecutiveRef"
:class="inputEdit(isReadonly)"
label="รายการตำแหน่งทางการบริหาร"
2024-02-08 17:52:25 +07:00
v-model="formPositionSelect.positionExecutive"
:options="executiveOps"
emit-value
dense
map-options
outlined
option-label="name"
option-value="id"
lazy-rules
2024-02-08 17:52:25 +07:00
hide-bottom-space
2024-02-29 15:01:41 +07:00
clearable
2024-02-08 17:52:25 +07:00
/>
<q-input
v-else
ref="positionExecutiveFieldRef"
v-model="posExecutive"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionExecutiveField"
label="ชื่อตำแหน่งทางการบริหาร"
lazy-rules
hide-bottom-space
/>
</div>
2024-03-18 16:18:44 +07:00
<div class="col-12 col-sm-6 col-md-6">
<q-input
ref="positionExecutiveFieldRef"
v-model="formPositionSelect.positionExecutiveField"
:class="inputEdit(isReadonly)"
dense
outlined
for="#positionExecutiveField"
label="ด้านทางการบริหาร"
lazy-rules
hide-bottom-space
/>
2024-02-08 17:52:25 +07:00
</div>
2024-02-20 17:27:08 +07:00
<div class="col-6 self-center">
<q-checkbox
size="md"
v-model="isSpecial"
label="เฉพาะสายงานที่กำหนด"
/>
2024-02-20 17:27:08 +07:00
</div>
2024-02-08 17:52:25 +07:00
</div>
<q-separator />
<q-card-actions align="right" class="bg-white text-teal q-pa-sm">
2024-02-29 15:11:56 +07:00
<q-btn
type="submit"
:label="`${isEditCheck ? 'แก้ไขตำแหน่ง' : 'เพิ่มตำแหน่ง'}`"
color="public"
/>
2024-02-08 17:52:25 +07:00
</q-card-actions>
</q-form>
2024-02-08 17:52:25 +07:00
</q-card-section>
</q-card>
</q-dialog>
</template>