diff --git a/src/api/02_organizational/api.organization.ts b/src/api/02_organizational/api.organization.ts index 5f4e89eb..ee359018 100644 --- a/src/api/02_organizational/api.organization.ts +++ b/src/api/02_organizational/api.organization.ts @@ -91,4 +91,8 @@ export default { orgDeceasedProfile: `${orgPos}/profile/search`, orgProfileListKeycloak: () => `${orgProfile}/search-personal-no-keycloak`, + + /** กำหนดสิทธิ์จัดการโครงสร้าง */ + permissionOrg: `${organization}/permission-org`, + permissionOrgProfile: `${organization}/permission-org/profile`, // คนที่มีสิทธิ์จัดการโครงสร้าง }; diff --git a/src/interface/request/main/main.ts b/src/interface/request/main/main.ts index 5b275984..8f7b8f8e 100644 --- a/src/interface/request/main/main.ts +++ b/src/interface/request/main/main.ts @@ -108,6 +108,11 @@ const menuList = readonly([ label: "กำหนดสิทธิ์ (Permissions)", path: "managePermission", }, + { + key: 2.0, + label: "กำหนดสิทธิ์จัดการโครงสร้าง", + path: "roleOrganization", + }, ], }, { diff --git a/src/modules/01_metadata/components/personal/01ListPrefix.vue b/src/modules/01_metadata/components/personal/01_Prefix.vue similarity index 100% rename from src/modules/01_metadata/components/personal/01ListPrefix.vue rename to src/modules/01_metadata/components/personal/01_Prefix.vue diff --git a/src/modules/01_metadata/components/personal/02ListRank.vue b/src/modules/01_metadata/components/personal/02_Rank.vue similarity index 100% rename from src/modules/01_metadata/components/personal/02ListRank.vue rename to src/modules/01_metadata/components/personal/02_Rank.vue diff --git a/src/modules/01_metadata/components/personal/03ListGender.vue b/src/modules/01_metadata/components/personal/03_Gender.vue similarity index 100% rename from src/modules/01_metadata/components/personal/03ListGender.vue rename to src/modules/01_metadata/components/personal/03_Gender.vue diff --git a/src/modules/01_metadata/components/personal/04ListRelationship.vue b/src/modules/01_metadata/components/personal/04_Relationship.vue similarity index 100% rename from src/modules/01_metadata/components/personal/04ListRelationship.vue rename to src/modules/01_metadata/components/personal/04_Relationship.vue diff --git a/src/modules/01_metadata/components/personal/05ListBloodGroup.vue b/src/modules/01_metadata/components/personal/05_BloodGroup.vue similarity index 100% rename from src/modules/01_metadata/components/personal/05ListBloodGroup.vue rename to src/modules/01_metadata/components/personal/05_BloodGroup.vue diff --git a/src/modules/01_metadata/components/personal/06ListReligion.vue b/src/modules/01_metadata/components/personal/06_Religion.vue similarity index 100% rename from src/modules/01_metadata/components/personal/06ListReligion.vue rename to src/modules/01_metadata/components/personal/06_Religion.vue diff --git a/src/modules/01_metadata/components/personal/07ListProvince.vue b/src/modules/01_metadata/components/personal/07_Province.vue similarity index 100% rename from src/modules/01_metadata/components/personal/07ListProvince.vue rename to src/modules/01_metadata/components/personal/07_Province.vue diff --git a/src/modules/01_metadata/components/personal/08ListEducationLevel.vue b/src/modules/01_metadata/components/personal/08_EducationLevel.vue similarity index 100% rename from src/modules/01_metadata/components/personal/08ListEducationLevel.vue rename to src/modules/01_metadata/components/personal/08_EducationLevel.vue diff --git a/src/modules/01_metadata/components/position-employee/01ListPosition.vue b/src/modules/01_metadata/components/position-employee/01_PositionMain.vue similarity index 69% rename from src/modules/01_metadata/components/position-employee/01ListPosition.vue rename to src/modules/01_metadata/components/position-employee/01_PositionMain.vue index e1e12e2e..2b69a24b 100644 --- a/src/modules/01_metadata/components/position-employee/01ListPosition.vue +++ b/src/modules/01_metadata/components/position-employee/01_PositionMain.vue @@ -1,31 +1,22 @@ diff --git a/src/modules/01_metadata/components/position-employee/02ListType.vue b/src/modules/01_metadata/components/position-employee/02_GroupMain.vue similarity index 70% rename from src/modules/01_metadata/components/position-employee/02ListType.vue rename to src/modules/01_metadata/components/position-employee/02_GroupMain.vue index 5236af84..4ddd53f2 100644 --- a/src/modules/01_metadata/components/position-employee/02ListType.vue +++ b/src/modules/01_metadata/components/position-employee/02_GroupMain.vue @@ -1,28 +1,22 @@ @@ -268,17 +250,6 @@ onMounted(() => { > แก้ไขข้อมูล - {{ col.value ? col.value : "-" }} @@ -289,7 +260,7 @@ onMounted(() => { -
+ @@ -329,7 +300,7 @@ onMounted(() => { label="อักษรย่อกลุ่มงาน" lazy-rules hide-bottom-space - :rules="[(val) => !!val || `${'กรุณากรอกอักษรย่อกลุ่มงาน'}`]" + :rules="[(val:string) => !!val || `${'กรุณากรอกอักษรย่อกลุ่มงาน'}`]" class="inputgreen" /> @@ -345,7 +316,7 @@ onMounted(() => { borderless min="1" bg-color="white" - :rules="[(val) => val != undefined || 'กรุณากรอกระดับกลุ่มงาน']" + :rules="[(val:string) => val != undefined || 'กรุณากรอกระดับกลุ่มงาน']" hide-bottom-space mask="############" class="inputgreen" @@ -354,19 +325,11 @@ onMounted(() => { - + บันทึกข้อมูล - +
diff --git a/src/modules/01_metadata/components/position-employee/03ListLevel.vue b/src/modules/01_metadata/components/position-employee/GroupDetail.vue similarity index 64% rename from src/modules/01_metadata/components/position-employee/03ListLevel.vue rename to src/modules/01_metadata/components/position-employee/GroupDetail.vue index ad100056..1718182f 100644 --- a/src/modules/01_metadata/components/position-employee/03ListLevel.vue +++ b/src/modules/01_metadata/components/position-employee/GroupDetail.vue @@ -11,7 +11,7 @@ import type { ResGroup, ResLevel, } from "@/modules/01_metadata/interface/response/positionEmployee/Main"; -import type { ObjectLevelRef } from "@/modules/01_metadata/interface/index/positionEmployee"; +import type { DataGroup } from "@/modules/01_metadata/interface/index/positionEmployee"; import type { FormDataLevel } from "@/modules/01_metadata/interface/request/positionEmployee"; /** importComponts*/ @@ -23,21 +23,15 @@ import { useCounterMixin } from "@/stores/mixin"; /**use*/ const $q = useQuasar(); +const storeOption = useMainOptionDataStore(); const route = useRoute(); const router = useRouter(); -const posName = ref(""); -const posTypeId = ref(route.params.id.toString()); - -const { - dialogRemove, - dialogConfirm, - showLoader, - hideLoader, - messageError, - success, -} = useCounterMixin(); -const storeOption = useMainOptionDataStore(); +const { dialogConfirm, showLoader, hideLoader, messageError, success } = + useCounterMixin(); +// Table +const rows = ref([]); // รายการกลุ่มงาน +const filter = ref(""); // คำค้นหา const columns = ref([ { name: "no", @@ -60,7 +54,7 @@ const columns = ref([ { name: "posTypeName", align: "left", - label: "กลุ่มงาน", + label: "ระดับชั้นงาน", sortable: true, field: "posTypeName", headerStyle: "font-size: 14px", @@ -77,42 +71,38 @@ const columns = ref([ style: "font-size: 14px", }, ]); -const rows = ref([]); - const visibleColumns = ref([ "no", "posLevelName", "posTypeName", "posLevelAuthority", ]); -const filter = ref(""); -const levelId = ref(""); -const titleName = ref(""); +const posTypeId = ref(route.params.id.toString()); // id กลุ่มงาน +const titleName = ref(""); // ชื่อกลุ่มงาน +const levelId = ref(""); // id ระดับชั้นงานที่จะแก้ไข +const isStatusEdit = ref(false); // สถานะแก่ไขข้อมูล +const modalDialog = ref(false); // popup +// ฟอร์มระดับชั้นงาน const formDataLevel = reactive({ posLevelName: null, posTypeName: "", posLevelAuthority: "", }); -/** formRef*/ -const posLevelNameRef = ref(null); -const commanderRef = ref(null); -const objectLevelRef: ObjectLevelRef = { - posLevelName: posLevelNameRef, - posLevelAuthority: commanderRef, -}; - -const id = ref(route.params.id.toString()); - -function fetchData() { +/** + * ฟังก์ชันดึงข้อมูลรายการระดับชั้นงาน API + * + * เก็บข้อมูลรรายการระดับชั้นงานไว้ใน rows.value + */ +async function fetchData() { showLoader(); - http - .get(config.API.orgEmployeeTypeById(id.value)) - .then((res) => { + await http + .get(config.API.orgEmployeeTypeById(posTypeId.value)) + .then(async (res) => { titleName.value = res.data.result.posTypeName ?? null; formDataLevel.posTypeName = res.data.result.posTypeName; - rows.value = res.data.result.posLevels.map((x: any) => ({ + rows.value = await res.data.result.posLevels.map((x: ResLevel) => ({ ...x, posTypeName: res.data.result.posTypeName, })); @@ -125,9 +115,17 @@ function fetchData() { }); } -const isStatusEdit = ref(false); -const modalDialog = ref(false); -function onClickOpenDialog(statusEdit: boolean = false, data: any = []) { +/** + * ฟังก์ชันเปิด popup แก้ไขข้อมูลระดับชั้นงาน + * @param data ข้อมูลระดับชั้นงานที่จะแก้ไข + * + * กำหนด isStatusEdit เป็น true และกำหนดให้ ฟอร์มข้อมูลระดับชั้นงาน เป็น ข้อมูลที่จะแก่ไข + * + */ +function onClickOpenDialog( + statusEdit: boolean = false, + data: DataGroup = {} as DataGroup +) { isStatusEdit.value = statusEdit; modalDialog.value = true; @@ -141,6 +139,11 @@ function onClickOpenDialog(statusEdit: boolean = false, data: any = []) { } } +/** + * ฟังก์ชันปืด popup แก้ไขหรื่อเพิ่มข้อมูลระดับชั้นงาน + * + * และกำหนดให้ ฟอร์มข้อมูลระดับชั้นงาน เป็นค่าว่าง + */ function onClickCloseDialog() { modalDialog.value = false; formDataLevel.posLevelName = null; @@ -148,66 +151,57 @@ function onClickCloseDialog() { formDataLevel.posLevelAuthority = ""; } -function onClickSubmit() { - const hasError = []; - for (const key in objectLevelRef) { - if (Object.prototype.hasOwnProperty.call(objectLevelRef, key)) { - const property = objectLevelRef[key]; - if (property.value && typeof property.value.validate === "function") { - const isValid = property.value.validate(); - hasError.push(isValid); - } - } - } - if (hasError.every((result) => result === true)) { - dialogConfirm($q, () => { - submit(); - }); - } -} - -async function submit() { - const body = { - posLevelName: Number(formDataLevel.posLevelName), - posTypeId: posTypeId.value, - posLevelRank: Number(formDataLevel.posLevelName), - posLevelAuthority: formDataLevel.posLevelAuthority, - }; - showLoader(); - try { +/** + * ยืนยันการบันทึกข้อมูลรายการระดับชั้นงาน + * + * ุ ถ้า dialogStatus เป็น 'false' จะทำการเพิ่มข้อมูลรายการระดับชั้นงาน ถ้าไม่จะทำการแก้ไขข้อมูล + * เมื่อบันทึกข้อมูลเสร็จจะเรียก function fetchData() เพื่อดึงข้อมูลรายการระดับชั้นงานใหม่ + * + */ +function onSubmit() { + dialogConfirm($q, async () => { + showLoader(); + const body = { + posLevelName: Number(formDataLevel.posLevelName), + posTypeId: posTypeId.value, + posLevelRank: Number(formDataLevel.posLevelName), + posLevelAuthority: formDataLevel.posLevelAuthority, + }; + // กำหนด Phat APi const url = !isStatusEdit.value ? config.API.orgEmployeelevel : config.API.orgEmployeelevelById(levelId.value); - await http[!isStatusEdit.value ? "post" : "put"](url, body); - success($q, "บันทีกข้อมูลสำเร็จ"); - fetchData(); - onClickCloseDialog(); - } catch (err) { - messageError($q, err); - } finally { - hideLoader(); - } -} -function onClickDelete(id: string) { - dialogRemove($q, () => { - http - .delete(config.API.orgEmployeelevelById(id)) - .then(() => { - success($q, "ลบข้อมูลสำเร็จ"); - fetchData(); + await http[!isStatusEdit.value ? "post" : "put"](url, body) + .then(async () => { + await fetchData(); + success($q, "บันทีกข้อมูลสำเร็จ"); + onClickCloseDialog(); }) .catch((err) => { messageError($q, err); + }) + .finally(() => { + hideLoader(); }); }); } +/** + * ฟังก์ชันแปลงตำแหน่งผู้มีอำนาจ + * @param val ค่าของผู้มีอำนาจ + * @returns ตำแหน่งผู้มีอำนาจ + */ function convertPosLevelAuthority(val: string) { const result = storeOption.posLevelAuthorityOption.find((e) => e.id === val); return result?.label; } +/** + * hook ทำงานเมื่อ Components ถูกเรียกใช้งาน + * + * ถ่ามี posTypeId จะดึงข้อมูลรายการระดับชั้นงาน + */ onMounted(() => { posTypeId.value && fetchData(); }); @@ -295,16 +289,6 @@ onMounted(() => { > แก้ไขข้อมูล -
@@ -325,7 +309,7 @@ onMounted(() => { -
+ { /> - +
{ borderless bg-color="white" hide-bottom-space - mask="#######################################" - :rules="[(val) => !!val || 'กรุณากรอกระดับชั้นงาน']" + mask="#" + reverse-fill-mask + :rules="[(val:string) => !!val || 'กรุณากรอกระดับชั้นงาน']" + class="inputgreen" />
@@ -366,7 +352,8 @@ onMounted(() => { borderless bg-color="white" hide-bottom-space - :rules="[(val) => !!val || 'กรุณาเลือกผู้มีอำนาจสั่งบรรจุ']" + :rules="[(val:string) => !!val || 'กรุณาเลือกผู้มีอำนาจสั่งบรรจุ']" + class="inputgreen" />
@@ -374,7 +361,7 @@ onMounted(() => { { /> - + - + บันทึกข้อมูล - + diff --git a/src/modules/01_metadata/components/position/01ListPosition.vue b/src/modules/01_metadata/components/position/01_Position.vue similarity index 64% rename from src/modules/01_metadata/components/position/01ListPosition.vue rename to src/modules/01_metadata/components/position/01_Position.vue index 94df8d65..8d058bd3 100644 --- a/src/modules/01_metadata/components/position/01ListPosition.vue +++ b/src/modules/01_metadata/components/position/01_Position.vue @@ -1,8 +1,10 @@ +