Merge branch 'develop' into feat/issue

* develop:
  fix: edit email
  fix:tooltip card organization-chart
  fix: delete import defineProps
  fix:disable organization-chart
  ปิดตารางประวัติตำแหน่งไปก่อน
  ปิดไม่แสดงข้อมูลตำแหน่งและเงินเดือน
  feat: add position and salary review

# Conflicts:
#	src/api/org/api.org.ts
This commit is contained in:
Warunee Tamkoo 2026-01-30 14:58:25 +07:00
commit 85738041cf
15 changed files with 1677 additions and 158 deletions

View file

@ -37,7 +37,8 @@
"vue": "^3.4.15", "vue": "^3.4.15",
"vue-router": "^4.1.6", "vue-router": "^4.1.6",
"vue3-datepicker": "^0.3.4", "vue3-datepicker": "^0.3.4",
"vue3-pdfjs": "^0.1.6" "vue3-pdfjs": "^0.1.6",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@quasar/vite-plugin": "^1.3.0", "@quasar/vite-plugin": "^1.3.0",

View file

@ -12,8 +12,8 @@ export const apiUrlConfigReport = import.meta.env.VITE_API_REPORT_URL;
const config = ref<any>({ const config = ref<any>({
development: { development: {
// API_URI: "https://localhost:7260/api", // API_URI: "https://localhost:7260/api",
API_URI: "https://bma-ehr.frappet.synology.me/api/v1", API_URI: "https://hrmsbkk.case-collection.com/api/v1",
API_URL_SUPPORT: "https://bma-ehr.frappet.synology.me/api/v1/support", API_URL_SUPPORT: "https://hrmsbkk.case-collection.com/api/v1/support",
MEET_URI: "meet.frappet.com", MEET_URI: "meet.frappet.com",
LINK_EVALUATE_PUBLISH: "https://bma-ehr-publish.frappet.synology.me", LINK_EVALUATE_PUBLISH: "https://bma-ehr-publish.frappet.synology.me",
API_REPORT_TEMPLATE_URI: API_REPORT_TEMPLATE_URI:

View file

@ -3,7 +3,6 @@ import env from "../index";
const metadata = `${env.API_URI}/org/metadata/`; const metadata = `${env.API_URI}/org/metadata/`;
const org = `${env.API_URI}/org`; const org = `${env.API_URI}/org`;
const profileOrg = `${env.API_URI}/org/profile`; const profileOrg = `${env.API_URI}/org/profile`;
const report = `${env.API_URI}/org`;
const workflow = `${env.API_URI}/org/workflow`; const workflow = `${env.API_URI}/org/workflow`;
export default { export default {
orgCommandCode: `${metadata}commandCode`, orgCommandCode: `${metadata}commandCode`,
@ -70,9 +69,9 @@ export default {
dataUserOtherByType: (type: string) => `${org}/profile${type}/other/user`, dataUserOtherByType: (type: string) => `${org}/profile${type}/other/user`,
profileReportId: (profileId: string, type: string) => profileReportId: (profileId: string, type: string) =>
`${report}/${type}/kk1/${profileId}`, `${org}/${type}/kk1/${profileId}`,
profileKp7ShortId: (profileId: string, type: string) => profileKp7ShortId: (profileId: string, type: string) =>
`${report}/${type}/kp7-short/${profileId}`, `${org}/${type}/kp7-short/${profileId}`,
/** history */ /** history */
dataUserInformatioHistory: (type: string) => dataUserInformatioHistory: (type: string) =>
@ -177,4 +176,7 @@ export default {
orgAssistance: (id: string) => `${profileOrg}/assistance/${id}`, orgAssistance: (id: string) => `${profileOrg}/assistance/${id}`,
orgIssues: `${env.API_URI}/org/issues`, orgIssues: `${env.API_URI}/org/issues`,
// ตรวจสอบข้อมูลตำแหน่งและเงินเดือน
profileSalaryTemp: `${profileOrg}/salaryTemp`,
}; };

View file

@ -54,7 +54,8 @@ const items = ref<MenuMainList[]>([
icon: "mdi-account-group-outline", icon: "mdi-account-group-outline",
title: "แผนผังองค์กร", title: "แผนผังองค์กร",
sub: "ดูแผนผังองค์กร", sub: "ดูแผนผังองค์กร",
color: "blue-3", // color: "blue-3",
color: "grey-3",
path: "/organization-chart", path: "/organization-chart",
active: false, active: false,
}, },
@ -305,8 +306,14 @@ onMounted(async () => {
<q-card <q-card
v-else v-else
bordered bordered
@click="goToPage(item.path)" @click="
class="noactive col-12" item.path === '/organization-chart' ? null : goToPage(item.path)
"
:class="
item.path === '/organization-chart'
? 'disabledcard col-12'
: 'noactive col-12'
"
> >
<div class="col-12"> <div class="col-12">
<q-avatar <q-avatar
@ -330,6 +337,9 @@ onMounted(async () => {
> >
{{ item.sub }} {{ item.sub }}
</div> </div>
<q-tooltip v-if="item.path === '/organization-chart'">
อยระหวางปรบปร</q-tooltip
>
</q-card> </q-card>
</div> </div>
</div> </div>
@ -511,7 +521,7 @@ onMounted(async () => {
border: 1px solid #6dbdb142; border: 1px solid #6dbdb142;
} }
.disabledcard { .disabledcard {
color: rgba(209, 209, 209, 0.733) !important; color: rgba(105, 104, 104, 0.733) !important;
border-color: rgba(207, 207, 207, 0.322) !important; border-color: rgba(207, 207, 207, 0.322) !important;
box-shadow: none !important; box-shadow: none !important;
border-radius: 12px; border-radius: 12px;

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, defineProps, watch } from "vue"; import { ref, reactive, watch } from "vue";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
@ -145,7 +145,7 @@ function onSubmit(data: FormDataType) {
props.onSubmit(data); props.onSubmit(data);
}, },
"ยืนยันการบันทึกข้อมูล", "ยืนยันการบันทึกข้อมูล",
"ต้องการยืนยันการบันทึกข้อมูลนี้หรือไม่ ?" "ต้องการยืนยันการบันทึกข้อมูลนี้หรือไม่ ?",
); );
} }
@ -160,7 +160,7 @@ watch(
formData.position = newValue.position; formData.position = newValue.position;
} }
}, },
{ deep: true } { deep: true },
); );
watch( watch(
@ -185,7 +185,7 @@ watch(
formData.historyStatus = props.data.historyStatus; formData.historyStatus = props.data.historyStatus;
} }
}, },
{ deep: true } { deep: true },
); );
</script> </script>
@ -255,7 +255,7 @@ watch(
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
/> />
<q-skeleton v-else type="QSelect" height="40px" /> <q-skeleton v-else type="QInput" height="40px" />
</div> </div>
<div class="col-xs-12 col-md-3"> <div class="col-xs-12 col-md-3">
<q-input <q-input

View file

@ -351,7 +351,7 @@ async function onSavePhone() {
getData(); getData();
}); });
}, },
"ยืนยันการแก้ไขเบอร์โทร" "ยืนยันการแก้ไขเบอร์โทร",
); );
} }
} }
@ -381,7 +381,7 @@ async function onSaveEmail() {
}) })
.finally(() => {}); .finally(() => {});
}, },
"ยืนยันการแก้ไขอีเมล" "ยืนยันการแก้ไขอีเมล",
); );
} }
} }
@ -588,7 +588,18 @@ onMounted(async () => {
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 text-grey-6 text-weight-medium">เมล</div> <div class="col-4 text-grey-6 text-weight-medium">
เมล
<q-icon
if="emailVerify == 'NOT_VERIFIED'"
name="mdi-alert-box"
color="warning"
size="sm"
>
<q-tooltip>รอยนยนอเมล</q-tooltip>
</q-icon>
</div>
<div class="col-8"> <div class="col-8">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-9"> <div class="col-9">
@ -606,7 +617,8 @@ onMounted(async () => {
@change="isValidEmail = true" @change="isValidEmail = true"
/> />
</div> </div>
<div v-if="emailVerify == null" class="self-center col-3">
<!-- <div v-if="emailVerify == null" class="self-center col-3"> -->
<div v-if="editEmail == false"> <div v-if="editEmail == false">
<q-btn <q-btn
dense dense
@ -648,20 +660,7 @@ onMounted(async () => {
<q-tooltip>ยกเล</q-tooltip> <q-tooltip>ยกเล</q-tooltip>
</q-btn> </q-btn>
</div> </div>
</div> <!-- </div> -->
<div
v-else-if="emailVerify == 'NOT_VERIFIED'"
class="self-center col-3"
>
<q-icon
name="mdi-alert-box"
color="warning"
size="sm"
class="selft-center"
>
<q-tooltip>รอยนยนอเมล</q-tooltip>
</q-icon>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -27,7 +27,7 @@ const {
} = useCounterMixin(); } = useCounterMixin();
const checkType = ref<boolean>( const checkType = ref<boolean>(
dataPerson.officerType == "OFFICER" ? true : false dataPerson.officerType == "OFFICER" ? true : false,
); // ); //
const mode = ref<boolean>($q.screen.gt.xs); // xs const mode = ref<boolean>($q.screen.gt.xs); // xs
const isLoading = reactive({ const isLoading = reactive({
@ -320,25 +320,25 @@ const columns = computed<QTableColumn[]>(() => {
(column) => (column) =>
column.name !== "positionExecutive" && column.name !== "positionExecutive" &&
column.name !== "lastUpdateFullName" && column.name !== "lastUpdateFullName" &&
column.name !== "lastUpdatedAt" column.name !== "lastUpdatedAt",
); );
} }
} }
return baseColumns.value.filter( return baseColumns.value.filter(
(e: QTableColumn) => (e: QTableColumn) =>
e.name !== "lastUpdateFullName" && e.name !== "lastUpdatedAt" e.name !== "lastUpdateFullName" && e.name !== "lastUpdatedAt",
); );
}); });
const visibleColumns = ref<String[]>( const visibleColumns = ref<String[]>(
baseVisibleColumns.value.filter( baseVisibleColumns.value.filter(
(e: string) => e !== "lastUpdateFullName" && e !== "lastUpdatedAt" (e: string) => e !== "lastUpdateFullName" && e !== "lastUpdatedAt",
) ),
); );
const columnsHistory = computed<QTableColumn[]>(() => { const columnsHistory = computed<QTableColumn[]>(() => {
if (!checkType.value) { if (!checkType.value) {
if (baseColumns.value) { if (baseColumns.value) {
return baseColumns.value.filter( return baseColumns.value.filter(
(column) => column.name !== "positionExecutive" (column) => column.name !== "positionExecutive",
); );
} }
} }
@ -445,7 +445,7 @@ function onSearch() {
rows.value = onSearchDataTable( rows.value = onSearchDataTable(
filter.value, filter.value,
rowsData.value, rowsData.value,
columns.value ? columns.value : [] columns.value ? columns.value : [],
); );
} }
@ -491,7 +491,7 @@ onMounted(async () => {
</div> </div>
</div> </div>
<div class="row col-12"> <!-- <div class="row col-12">
<q-space /> <q-space />
<q-input <q-input
v-if="mode" v-if="mode"
@ -522,9 +522,9 @@ onMounted(async () => {
:options="columns" :options="columns"
:display-value="$q.lang.table.columns" :display-value="$q.lang.table.columns"
/> />
</div> </div> -->
<div class="col-12 q-mt-sm"> <!-- <div class="col-12 q-mt-sm">
<d-table <d-table
flat flat
dense dense
@ -649,7 +649,7 @@ onMounted(async () => {
</div> </div>
</template> </template>
</d-table> </d-table>
</div> </div> -->
</div> </div>
<DialogHistory <DialogHistory

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,76 @@
interface DataSalaryPos {
avatar: string;
avatarName: string;
citizenId: string;
firstName: string;
id: string;
lastName: string;
org: string;
orgRevisionId: string;
orgRootShortName: string;
posExecutive: string;
posLevel: string;
posLevelId: string;
posNo: string;
posType: string;
posTypeId: string;
position: string;
prefix: string;
rank: string;
root: string;
rootId: string;
statusCheckEdit: string;
type: string;
}
interface DataPosition {
no?: number;
amount: number;
amountSpecial: number;
commandCode: string;
commandDateAffect: Date;
commandDateSign: Date;
commandId: string;
commandName: string;
commandNo: string;
commandYear: number;
createdAt: string;
createdFullName: string;
createdUserId: string;
dateGovernment: string;
id: string;
isDelete: boolean;
isEdit: boolean;
isEntry: boolean;
isGovernment: string;
lastUpdateFullName: string;
lastUpdateUserId: string;
lastUpdatedAt: string;
mouthSalaryAmount: number;
order: number;
orgChild1: string;
orgChild2: string;
orgChild3: string;
orgChild4: string;
orgRoot: string;
posNo: string;
posNoAbb: string;
positionCee: string;
positionExecutive: string;
positionLevel: string;
positionLine: string;
positionName: string;
positionPathSide: string;
positionSalaryAmount: number;
positionType: string;
profileEmployeeId: string;
profileId: string;
refId: number;
remark: string;
salaryId: string;
status: string;
posNumCodeSitAbb: string;
posNumCodeSit: string;
}
export type { DataSalaryPos, DataPosition };

View file

@ -0,0 +1,155 @@
interface Pagination {
rowsPerPage: number;
}
interface DataOption {
id: string;
name: string;
}
interface DataOption2 {
id: number;
name: string;
}
interface DataOptionSys {
id: string;
name: string;
system: string;
}
interface DataOptionInsignia {
id: string;
name: string;
typeId: string;
typeName: string;
}
interface DataOptionEducation {
label: string;
value: boolean;
}
interface DataOptionEducationLevel {
label: string;
value: string;
}
interface zipCodeOption {
id: string;
name: string;
zipCode: string;
}
interface InformationOps {
prefixOps: DataOption[];
rankOps: DataOption[];
genderOps: DataOption[];
bloodOps: DataOption[];
statusOps: DataOption[];
religionOps: DataOption[];
employeeClassOps: DataOption[];
employeeTypeOps: DataOption[];
}
interface AddressOps {
provinceOps: DataOption[];
districtOps: DataOption[];
districtCOps: DataOption[];
subdistrictOps: zipCodeOption[];
subdistrictCOps: zipCodeOption[];
}
interface InsigniaOps {
insigniaOptions: DataOptionInsignia[];
}
interface ItemTab {
name: string;
icon: string;
label: string;
}
interface Request {
createdAt: string;
createdFullName: string;
detail: string;
fullname: string;
id: string;
idcard: string;
lastUpdateFullName: string;
lastUpdatedAt: string;
profileId: string;
remark: string;
status: string;
topic: string;
}
interface InsigniasType {
id: string;
createdAt: Date;
createdUserId: string;
lastUpdatedAt: Date;
lastUpdateUserId: string;
createdFullName: string;
lastUpdateFullName: string;
name: string;
isActive: boolean;
insignias: InsigniasTypeSub[];
}
interface InsigniasTypeSub {
id: string;
createdAt: Date;
createdUserId: string;
lastUpdatedAt: Date;
lastUpdateUserId: string;
createdFullName: string;
lastUpdateFullName: string;
name: string;
shortName: string;
level: string;
isActive: string;
note: string;
insigniaTypeId: string;
}
interface ResFileData {
downloadUrl: string;
fileName: string;
path: string;
pathname: string;
}
interface DataHistory {
[key: string]: string | number | Date | boolean;
}
interface DataCommandCode {
id: string;
createdAt: Date;
lastUpdatedAt: Date;
createdFullName: string;
lastUpdateFullName: string;
name: string;
code: number;
}
export type {
Pagination,
DataOption,
DataOption2,
DataOptionInsignia,
zipCodeOption,
InformationOps,
AddressOps,
InsigniaOps,
DataOptionSys,
ItemTab,
DataOptionEducation,
DataOptionEducationLevel,
Request,
InsigniasType,
InsigniasTypeSub,
ResFileData,
DataHistory,
DataCommandCode,
};

View file

@ -17,6 +17,8 @@ const requestEditMain = () =>
import("@/modules/10_registry/views/requestEditMain.vue"); import("@/modules/10_registry/views/requestEditMain.vue");
const requestEditDetail = () => const requestEditDetail = () =>
import("@/modules/10_registry/views/requestEditDetail.vue"); import("@/modules/10_registry/views/requestEditDetail.vue");
const positionReviewPage = () =>
import("@/modules/10_registry/views/positionReview.vue");
export default [ export default [
{ {
@ -93,4 +95,15 @@ export default [
Key: [10], Key: [10],
}, },
}, },
// ตรวจสอบข้อมูลตำแหน่งและเงินเดือน
{
path: "/registry/position-review",
name: "position-review",
component: positionReviewPage,
meta: {
Auth: true,
Key: [10],
},
},
]; ];

View file

@ -12,7 +12,7 @@ const {} = mixin;
export const useGovernmentPosDataStore = defineStore("GovernmentPos", () => { export const useGovernmentPosDataStore = defineStore("GovernmentPos", () => {
// commandCode ขอตำแหน่ง // commandCode ขอตำแหน่ง
const positionCode = ref<number[]>([ const positionCode = ref<number[]>([
0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20,
]); ]);
const commandCodeData = ref<DataOption[]>([]); const commandCodeData = ref<DataOption[]>([]);

View file

@ -25,7 +25,7 @@ const router = useRouter();
</div> </div>
<div :class="`row q-my-sm ${$q.screen.gt.xs ? '' : 'mobileClass'}`"> <div :class="`row q-my-sm ${$q.screen.gt.xs ? '' : 'mobileClass'}`">
<Salary /> <!-- <Salary /> -->
<Nopaid /> <Nopaid />
</div> </div>
</template> </template>

View file

@ -52,11 +52,11 @@ async function onClickDownloadKp7(type: string) {
type === "FULL" type === "FULL"
? config.API.profileReportId( ? config.API.profileReportId(
store.profileId, store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee" dataStore.officerType == "OFFICER" ? "profile" : "profile-employee",
) )
: config.API.profileKp7ShortId( : config.API.profileKp7ShortId(
store.profileId, store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee" dataStore.officerType == "OFFICER" ? "profile" : "profile-employee",
); );
const fileName = type === "FULL" ? "ทปอ. สามัญ" : "ประวัติแบบย่อ"; const fileName = type === "FULL" ? "ทปอ. สามัญ" : "ประวัติแบบย่อ";
await http await http
@ -78,11 +78,6 @@ const clickBack = () => {
router.push(`/`); router.push(`/`);
}; };
/** ฟังก์ชัน redirect ไปหน้ารายการคำร้องขอแก้ไขข้อมูล*/
function redirectToPagePetition() {
router.push(`/registry/request-edit`);
}
function onMobile(type: string) { function onMobile(type: string) {
router.push(`/registry/${type}`); router.push(`/registry/${type}`);
} }
@ -103,10 +98,20 @@ function onMobile(type: string) {
@click="clickBack" @click="clickBack"
/> />
อมลทะเบยนประว <q-space /> อมลทะเบยนประว <q-space />
<q-btn
color="blue-6"
icon="mdi-eye"
label="ตรวจสอบข้อมูลตำแหน่งและเงินเดือน"
class="q-mr-sm"
@click="() => router.push('/registry/position-review')"
>
<q-tooltip>ไปยงหนาตรวจสอบขอมลตำแหนงและเงนเดอน</q-tooltip>
</q-btn>
<q-btn <q-btn
color="primary" color="primary"
label="ยื่นคำร้องขอแก้ไขข้อมูล" label="ยื่นคำร้องขอแก้ไขข้อมูล"
@click="redirectToPagePetition" @click="() => router.push('/registry/request-edit')"
> >
<q-tooltip>นคำรองขอแกไขขอม</q-tooltip> <q-tooltip>นคำรองขอแกไขขอม</q-tooltip>
</q-btn> </q-btn>

View file

@ -0,0 +1,197 @@
<script setup lang="ts">
import { ref, onMounted } from "vue";
// import { useQuasar } from "quasar";
// import http from "@/plugins/http";
// import config from "@/app.config";
// import { useCounterMixin } from "@/stores/mixin";
import { useRoute, useRouter } from "vue-router";
// import { useDataStore } from "@/stores/data";
/** importType*/
// import type { DataProfile } from "@/modules/04_registryPerson/interface/index/Edit";
import Table from "@/modules/10_registry/components/PositionReview/Table.vue";
// import DialogEdit from "@/modules/04_registryPerson/views/edit/components/DialogEdit.vue";
// const dataStore = useDataStore();
// const $q = useQuasar();
// const { showLoader, hideLoader, messageError, dialogConfirm, success } =
// useCounterMixin();
// const route = useRoute();
const router = useRouter();
const tabs = ref<string>("CHECKED");
const statusCheckEdit = ref<string>("");
// const empType = ref<string>(dataStore.officerType);
// const profileId = ref<string>(dataStore.profileId);
const isConfirmEdit = ref<boolean>(false); //
// const isConfirmDone = ref<boolean>(false); //
// const modalEdit = ref<boolean>(false);
// const modalHistory = ref<boolean>(false);
/** function ยืนยันเสร็จสิ้นการแก้ไข*/
// function onConfirmEdit() {
// dialogConfirm(
// $q,
// () => {
// showLoader();
// http
// .post(config.API.salaryTemp + `/confirm-edit`, {
// profileId: profileId.value,
// type: empType.value?.toLocaleUpperCase(),
// })
// .then(async () => {
// success($q, "");
// })
// .catch((err) => {
// messageError($q, err);
// })
// .finally(() => {
// hideLoader();
// });
// },
// "",
// "?",
// );
// }
/** function ยืนยันข้อมูลถูกต้อง*/
// function onConfirmDone() {
// dialogConfirm(
// $q,
// () => {
// showLoader();
// http
// .post(config.API.salaryTemp + `/confirm-done`, {
// profileId: profileId.value,
// type: empType.value?.toLocaleUpperCase(),
// })
// .then(async () => {
// success($q, "");
// })
// .catch((err) => {
// messageError($q, err);
// })
// .finally(() => {
// hideLoader();
// });
// },
// "",
// "",
// );
// }
</script>
<template>
<div class="row items-center q-gutter-sm q-mb-xs">
<div class="toptitle text-white row items-center q-py-xs">
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
@click="router.go(-1)"
/>
รายการประวตำแหน/เงนเดอน
</div>
</div>
<q-card flat bordered>
<!-- <q-separator v-if="isConfirmEdit || isConfirmDone" />
<q-card-section v-if="isConfirmEdit || isConfirmDone">
<div class="row q-col-gutter-sm justify-center">
<div class="row items-center" v-if="isConfirmEdit">
<q-btn
:disable="
statusCheckEdit === 'EDITED' || statusCheckEdit === 'CHECKED'
"
:color="
statusCheckEdit === 'EDITED' || statusCheckEdit === 'CHECKED'
? 'grey'
: 'public'
"
outline
label="ยืนยันการแก้ไขสำเร็จ"
@click.stop.prevent="onConfirmEdit"
/>
<q-btn
flat
label="ประวัติการดำเนินการ"
class="q-ml-md"
color="blue"
@click="modalHistory = true"
/>
</div>
<div
class="row items-center"
v-if="isConfirmDone && statusCheckEdit === 'EDITED'"
>
<q-btn
color="public"
outline
label="ยืนยันข้อมูลถูกต้อง"
@click.stop.prevent="onConfirmDone"
/>
<q-btn
flat
label="ตีกลับให้แก้ไข"
class="q-ml-md"
color="blue"
@click="modalEdit = true"
/>
</div>
</div>
</q-card-section> -->
<q-separator />
<q-card-section>
<!-- <q-tabs
v-model="tabs"
dense
align="left"
inline-label
class="bg-white text-grey"
active-color="primary"
indicator-color="primary"
>
<q-tab name="PENDING" label="รายการตำแหน่ง/เงินเดือนที่กำลังแก้ไข" />
<q-tab
name="CHECKED"
label="แสดงรายการตำแหน่ง/เงินเดือนหลังจากแก้ไขแล้ว"
/>
</q-tabs>
<q-separator />
<q-tab-panels v-model="tabs" animated>
<q-tab-panel name="PENDING">
<Table
:tabs="tabs"
:status-check-edit="statusCheckEdit"
:is-confirm-edit="isConfirmEdit"
/>
</q-tab-panel>
<q-tab-panel name="CHECKED"> -->
<Table
:tabs="tabs"
:status-check-edit="statusCheckEdit"
:is-confirm-edit="isConfirmEdit"
/>
<!-- </q-tab-panel>
</q-tab-panels> -->
</q-card-section>
</q-card>
<!-- <DialogEdit
v-model:modal="modalEdit"
:emp-type="empType"
:fetch-data="fetchDataProfile"
/> -->
</template>
<style scoped></style>