From 0739f2b9d7ffdb2a7c45b2b6526ba5ee9150fc42 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Thu, 7 May 2026 10:40:58 +0700 Subject: [PATCH 01/40] feat(receive): add input rank --- .../components/Receive/ReceiveAddPerson.vue | 72 ++++++++++++++++--- .../components/Receive/receiveDetail.vue | 68 +++++++++++++++++- .../interface/index/ProfileType.ts | 3 + 3 files changed, 132 insertions(+), 11 deletions(-) diff --git a/src/modules/05_placement/components/Receive/ReceiveAddPerson.vue b/src/modules/05_placement/components/Receive/ReceiveAddPerson.vue index e6d2da0ce..fa0551e99 100644 --- a/src/modules/05_placement/components/Receive/ReceiveAddPerson.vue +++ b/src/modules/05_placement/components/Receive/ReceiveAddPerson.vue @@ -48,6 +48,7 @@ const informaData = ref({ employeeType: null, employeeClass: null, profileType: null, + rank: "", }); // รายการข้อมูลทั้งหมด @@ -60,6 +61,7 @@ const Ops = ref({ religionOps: [], employeeClassOps: [], employeeTypeOps: [], + rankOps: [], }); // ข้อมูลเมื่อเลือกแล้ว const OpsFilter = ref({ @@ -71,6 +73,7 @@ const OpsFilter = ref({ religionOps: [], employeeClassOps: [], employeeTypeOps: [], + rankOps: [], }); // รูป profile @@ -135,6 +138,16 @@ async function fetchPerson() { }); Ops.value.religionOps = optionreligions; OpsFilter.value.religionOps = optionreligions; + + let rank: DataOption[] = []; + data.rank.map((r: DataOptioninfo) => { + rank.push({ + id: r.id.toString(), + name: r.name.toString(), + }); + }); + Ops.value.rankOps = rank; + OpsFilter.value.rankOps = rank; }) .catch((e) => { messageError($q, e); @@ -204,7 +217,13 @@ function filterSelector(val: string, update: Function, refData: string) { ); }); break; - + case "rankOps": + update(() => { + Ops.value.rankOps = OpsFilter.value.rankOps.filter( + (v: DataOption) => v.name.toLowerCase().indexOf(newVal) > -1 + ); + }); + break; default: break; } @@ -227,7 +246,7 @@ function onSubmit() { if (fileData.value != null) formData.append("File", fileData.value); //แก้ไขรูป if (informaData.value.citizenId != undefined) formData.append("citizenId", informaData.value.citizenId); - if (informaData.value.prefix != undefined) + if (informaData.value.prefix != undefined && informaData.value.prefix != "") formData.append("prefix", informaData.value.prefix); if (informaData.value.firstName != undefined) formData.append("firstName", informaData.value.firstName); @@ -256,6 +275,8 @@ function onSubmit() { formData.append("employeeType", informaData.value.employeeType); if (informaData.value.employeeClass != undefined) formData.append("employeeClass", informaData.value.employeeClass); + if (informaData.value.rank != undefined && informaData.value.rank != "") + formData.append("rank", informaData.value.rank); dialogConfirm($q, async () => { showLoader(); @@ -289,6 +310,15 @@ function updateBirthDate(v: Date) { age.value = calculateAge(v); } +function prefixRankRule() { + return [ + () => + !!informaData.value.rank || + !!informaData.value.prefix || + "กรุณาเลือกคำนำหน้าชื่อ หรือยศ", + ]; +} + /** * ทำงานเมื่อมีการเรียกใช้ Components */ @@ -383,7 +413,7 @@ onMounted(async () => {
-
+
{ mask="#############" />
-
+
{ option-value="name" map-options hide-bottom-space - :rules="[ - (val:string) => { - return val.length > 0 || 'กรุณาเลือกคำนำหน้าชื่อ'; - }, - ]" + :rules="prefixRankRule()" + reactive-rules emit-value use-input hide-selected @@ -432,6 +460,32 @@ onMounted(async () => { )" />
+
+ +
({ { id: "gov", name: "งบประมาณเงินอุดหนุนรัฐบาล" }, { id: "bkk", name: "งบประมาณกรุงเทพมหานคร" }, ], + rankOps: [], }); const OpsFilter = ref({ prefixOps: [], @@ -129,6 +130,7 @@ const OpsFilter = ref({ { id: "gov", name: "งบประมาณเงินอุดหนุนรัฐบาล" }, { id: "bkk", name: "งบประมาณกรุงเทพมหานคร" }, ], + rankOps: [], }); /** ฟังก์ชันดึงข้อมูลรายการข้อมูลเกี่ยวกับบุคคล (dropdown list)*/ @@ -186,6 +188,16 @@ async function fetchPerson() { }); Ops.value.religionOps = optionreligions; OpsFilter.value.religionOps = optionreligions; + + let rank: DataOption[] = []; + data.rank.map((r: DataOptioninfo) => { + rank.push({ + id: r.id.toString(), + name: r.name.toString(), + }); + }); + Ops.value.rankOps = rank; + OpsFilter.value.rankOps = rank; }) .catch((e) => { messageError($q, e); @@ -230,6 +242,7 @@ async function getData() { (data.prefix == "00000000-0000-0000-0000-000000000000" ? null : data.prefix) ?? "", + rank: data.rank ?? "", firstname: data.firstName ?? "", lastname: data.lastName ?? "", birthDate: @@ -295,6 +308,7 @@ async function fetchData(data: any) { (data.prefix == "00000000-0000-0000-0000-000000000000" ? null : data.prefix) ?? "", + rank: data.rank ?? "", firstname: data.firstName ?? "", lastname: data.lastName ?? "", birthDate: data.dateOfBirth !== null ? new Date(data.dateOfBirth) : null, @@ -436,6 +450,14 @@ function filterSelector(val: string, update: Function, refData: string) { }); break; + case "rankOps": + update(() => { + Ops.value.rankOps = OpsFilter.value.rankOps.filter( + (v: DataOption) => v.name.toLowerCase().indexOf(newVal) > -1 + ); + }); + break; + default: break; } @@ -470,6 +492,7 @@ function saveData() { positionNumberOld: posNo.value, amount: 0, amountOld: salary.value, + rank: informaData.value.rank, }; showLoader(); http @@ -517,6 +540,15 @@ function updateBirthDate(v: Date) { informaData.value.age = calculateAge(v); } +function prefixRankRule() { + return [ + () => + !!informaData.value.rank || + !!informaData.value.prefixId || + "กรุณาเลือกคำนำหน้าชื่อ หรือยศ", + ]; +} + /** ทำงานเมื่อมีการเรียกใช้ Components*/ onMounted(async () => { await fetchPerson(); @@ -598,7 +630,7 @@ onMounted(async () => {
ข้อมูลส่วนตัว
-
+
{ mask="#############" />
-
+
{ option-value="name" :label="`${'คำนำหน้าชื่อ'}`" use-input + clearable input-debounce="0" + :rules="prefixRankRule()" + reactive-rules @filter="(inputValue:string, doneFn:Function) => filterSelector(inputValue, doneFn,'prefixOps' ) " />
+ +
+ +
+
Date: Fri, 8 May 2026 10:19:21 +0700 Subject: [PATCH 02/40] reafactor(issues): add status HELPDESK_IN_PROGRESS and REPLIED --- src/modules/22_issues/store.ts | 8 +++- src/modules/22_issues/views/Main.vue | 66 ++++++++++++++++------------ 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/modules/22_issues/store.ts b/src/modules/22_issues/store.ts index f7d19d0a6..a13c173c6 100644 --- a/src/modules/22_issues/store.ts +++ b/src/modules/22_issues/store.ts @@ -13,8 +13,10 @@ export const useIssueStore = defineStore("issue", () => { const statusOptions = ref([ { label: "ทั้งหมด", value: "" }, { label: "ใหม่", value: "NEW" }, - { label: "กำลังดำเนินการ", value: "IN_PROGRESS" }, + { label: "Dev กำลังดำเนินการ", value: "IN_PROGRESS" }, { label: "แก้ไขแล้ว", value: "RESOLVED" }, + { label: "Helpdesk กำลังดำเนินการ", value: "HELPDESK_IN_PROGRESS" }, + { label: "แจ้งกลับแล้ว", value: "REPLIED " }, { label: "ปิดแล้ว", value: "CLOSED" }, ]); @@ -29,6 +31,10 @@ export const useIssueStore = defineStore("issue", () => { return "แก้ไขแล้ว"; case "CLOSED": return "ปิดแล้ว"; + case "HELPDESK_IN_PROGRESS": + return "Helpdesk กำลังดำเนินการ"; + case "REPLIED": + return "แจ้งกลับแล้ว"; default: return "-"; } diff --git a/src/modules/22_issues/views/Main.vue b/src/modules/22_issues/views/Main.vue index 7e7d27c32..72d6b6c5d 100644 --- a/src/modules/22_issues/views/Main.vue +++ b/src/modules/22_issues/views/Main.vue @@ -22,6 +22,7 @@ const { convertStatus, convertSystem } = store; const { systemOptions, statusOptions } = storeToRefs(store); const visibleColumns = ref([ + "codeIssue", "title", "description", "system", @@ -34,6 +35,43 @@ const visibleColumns = ref([ "status", ]); const columns = ref([ + { + name: "codeIssue", + align: "left", + label: "รหัส", + sortable: false, + field: "codeIssue", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + }, + { + name: "createdAt", + align: "left", + label: "วันที่สร้าง", + sortable: false, + field: "createdAt", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + format: (val: string) => date2Thai(new Date(val), false, true), + }, + { + name: "org", + align: "left", + label: "หน่วยงาน", + sortable: false, + field: "org", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + }, + { + name: "createdFullName", + align: "left", + label: "ชื่อผู้สร้าง", + sortable: false, + field: "createdFullName", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + }, { name: "title", align: "left", @@ -72,15 +110,6 @@ const columns = ref([ style: "font-size: 14px", }, - { - name: "org", - align: "left", - label: "หน่วยงาน", - sortable: false, - field: "org", - headerStyle: "font-size: 14px", - style: "font-size: 14px", - }, { name: "email", align: "left", @@ -100,25 +129,6 @@ const columns = ref([ style: "font-size: 14px", }, - { - name: "createdAt", - align: "left", - label: "วันที่สร้าง", - sortable: false, - field: "createdAt", - headerStyle: "font-size: 14px", - style: "font-size: 14px", - format: (val: string) => date2Thai(new Date(val), false, true), - }, - { - name: "createdFullName", - align: "left", - label: "ชื่อผู้สร้าง", - sortable: false, - field: "createdFullName", - headerStyle: "font-size: 14px", - style: "font-size: 14px", - }, { name: "status", align: "left", From ba392dec4127402752361e0d6d9add76302bbd83 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 8 May 2026 10:41:14 +0700 Subject: [PATCH 03/40] fix(issues): statusOptions value --- src/modules/22_issues/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/22_issues/store.ts b/src/modules/22_issues/store.ts index a13c173c6..0ab403a7e 100644 --- a/src/modules/22_issues/store.ts +++ b/src/modules/22_issues/store.ts @@ -16,7 +16,7 @@ export const useIssueStore = defineStore("issue", () => { { label: "Dev กำลังดำเนินการ", value: "IN_PROGRESS" }, { label: "แก้ไขแล้ว", value: "RESOLVED" }, { label: "Helpdesk กำลังดำเนินการ", value: "HELPDESK_IN_PROGRESS" }, - { label: "แจ้งกลับแล้ว", value: "REPLIED " }, + { label: "แจ้งกลับแล้ว", value: "REPLIED" }, { label: "ปิดแล้ว", value: "CLOSED" }, ]); From e998de2b951690e1053118cc82bb31973ea6f30d Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 8 May 2026 11:01:33 +0700 Subject: [PATCH 04/40] fix: remove max-height style from TableCandidate --- src/modules/03_recruiting/views/02_qualify/manageDetail.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/03_recruiting/views/02_qualify/manageDetail.vue b/src/modules/03_recruiting/views/02_qualify/manageDetail.vue index 46f60a5cd..badb61bf4 100644 --- a/src/modules/03_recruiting/views/02_qualify/manageDetail.vue +++ b/src/modules/03_recruiting/views/02_qualify/manageDetail.vue @@ -260,7 +260,6 @@ async function fetchData(loading: boolean = true) { total.value = data.total; maxPage.value = await Math.ceil(data.total / pageSize.value); maxPage.value = maxPage.value < 1 ? 1 : maxPage.value; - rows.value = []; data.data.map((r: any) => { rows.value.push({ @@ -402,6 +401,7 @@ onMounted(async () => { await fetchDataCom(); }); + + From 852f3226c134271d78e02c9fa07ca0263d4c4079 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Mon, 11 May 2026 15:07:00 +0700 Subject: [PATCH 05/40] refactor(qualify-period): hide type column in Table Position --- .../views/02_qualify/PeriodAdd.vue | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/modules/03_recruiting/views/02_qualify/PeriodAdd.vue b/src/modules/03_recruiting/views/02_qualify/PeriodAdd.vue index e02f71ad4..2631acf53 100644 --- a/src/modules/03_recruiting/views/02_qualify/PeriodAdd.vue +++ b/src/modules/03_recruiting/views/02_qualify/PeriodAdd.vue @@ -212,17 +212,17 @@ const columnsPosition = ref([ a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }), }, - { - name: "type", - align: "left", - label: "ประเภทแบบฟอร์ม", - sortable: true, - field: "type", - headerStyle: "font-size: 14px", - style: "font-size: 14px", - sort: (a: string, b: string) => - a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }), - }, + // { + // name: "type", + // align: "left", + // label: "ประเภทแบบฟอร์ม", + // sortable: true, + // field: "type", + // headerStyle: "font-size: 14px", + // style: "font-size: 14px", + // sort: (a: string, b: string) => + // a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }), + // }, ]); const shouldShowPaymentFields = computed(() => { @@ -1476,7 +1476,7 @@ onMounted(async () => {
- + From 8dc473eec0f99d6bbfe5ae7a104e6362124a07a7 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Mon, 11 May 2026 15:54:10 +0700 Subject: [PATCH 06/40] refactor(leave): validate isAct commander --- .../components/05_Leave/DetailLeavePage.vue | 33 +++++++++++++++---- .../05_Leave/Dialog/DialogAddCommander.vue | 11 +++++-- .../09_leave/interface/response/leave.ts | 2 ++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/modules/09_leave/components/05_Leave/DetailLeavePage.vue b/src/modules/09_leave/components/05_Leave/DetailLeavePage.vue index 4f4b2ee46..b74df44e6 100644 --- a/src/modules/09_leave/components/05_Leave/DetailLeavePage.vue +++ b/src/modules/09_leave/components/05_Leave/DetailLeavePage.vue @@ -150,21 +150,41 @@ const rows = ref(); // เช็คสิทธิ์การอนุมัติ const idCheck = computed(() => { if (typeAdd.value == "COMMANDER") { - return rows.value?.commanders.map((items: SeqTypeRow) => items.profileId); + return rows.value?.commanders.map((items: SeqTypeRow) => items.keyId); } else if (typeAdd.value == "APPROVER") { - return rows.value?.approvers.map((items: SeqTypeRow) => items.profileId); + return rows.value?.approvers.map((items: SeqTypeRow) => items.keyId); } }); // เช็คสิทธิ์การเลือกผู้มีอำนาจ const commanderList = computed(() => { - if (typeAdd.value == "COMMANDER") { - return rows.value?.approvers.map((items: SeqTypeRow) => items.profileId); - } else if (typeAdd.value == "APPROVER") { - return rows.value?.commanders.map((items: SeqTypeRow) => items.profileId); + if (typeAdd.value === "COMMANDER") { + return rows.value?.approvers.map((items: SeqTypeRow) => ({ + profileId: items.profileId, + isAct: items.isAct, + })); + } else if (typeAdd.value === "APPROVER") { + return rows.value?.commanders.map((items: SeqTypeRow) => ({ + profileId: items.profileId, + isAct: items.isAct, + })); } + return []; }); +// +const isAct = computed(() => { + if (typeAdd.value === "COMMANDER") { + return rows.value?.commanders && rows.value.commanders.length > 0 + ? rows.value.commanders[0].isAct + : false; + } else if (typeAdd.value === "APPROVER") { + return rows.value?.approvers && rows.value.approvers.length > 0 + ? rows.value.approvers[0].isAct + : false; + } + return false; +}); // เช็คว่าผู้ใช้มีสิทธิ์อนุมัติหรือไม่ const approveCheck = computed(() => { const commanders = rows.value?.commanders; @@ -1272,5 +1292,6 @@ onMounted(async () => { :id-check="idCheck" :keycloak-user-id="keycloakUserId" :commanders-list="commanderList" + :commanders-is-act="isAct" /> diff --git a/src/modules/09_leave/components/05_Leave/Dialog/DialogAddCommander.vue b/src/modules/09_leave/components/05_Leave/Dialog/DialogAddCommander.vue index c3eac2353..f3c2e682f 100644 --- a/src/modules/09_leave/components/05_Leave/Dialog/DialogAddCommander.vue +++ b/src/modules/09_leave/components/05_Leave/Dialog/DialogAddCommander.vue @@ -30,6 +30,7 @@ const props = defineProps({ fetchDetailLeave: Function, idCheck: Array, commandersList: Array, + commandersIsAct: Boolean, }); const pageId = ref(route.params.id as string); @@ -117,7 +118,7 @@ async function getData() { total.value = data.total; rows.value = data.data; selected.value = data.data.filter((items: any) => { - return props.idCheck?.some((i: any) => i === items.id); + return props.idCheck?.some((i: any) => i === items.key); }); }) .catch((err) => { @@ -153,10 +154,14 @@ function onSubmit() { ] .filter(Boolean) .join(" "), + isAct: isAct.value, + keyId: items.key, })); const hasCommander = selected.value.some((e) => - props.commandersList?.some((i: any) => i === e.id) + props.commandersList?.some( + (i: any) => i.profileId === e.id && i.isAct === isAct.value + ) ); if (hasCommander) { @@ -205,6 +210,7 @@ watch( () => modal.value, () => { if (modal.value) { + isAct.value = props.commandersIsAct ?? false; getSearch(); } } @@ -233,6 +239,7 @@ watch( label="ค้นหา" v-model="keyword" style="width: 300px" + @keydown.enter.prevent="onSearchData()" >