Merge branch 'develop' into devTee

This commit is contained in:
STW_TTTY\stwtt 2024-06-14 16:45:32 +07:00
commit cdceac58f2
57 changed files with 858 additions and 366 deletions

View file

@ -69,4 +69,7 @@ export default {
kpiLink,
profilePosition: () => `${env.API_URI}/org/profile/keycloak/position`,
/** Report*/
kpiReport: () => `${KPI}/report/announcement`,
};

View file

@ -46,7 +46,6 @@ const menuList = readonly<any[]>([
{
key: 1,
icon: "mdi-home-variant-outline",
activeIcon: "mdi-home-variant",
label: "หน้าแรก",
path: "dashboard",
role: "dashboard",
@ -54,7 +53,6 @@ const menuList = readonly<any[]>([
// {
// key: 2,
// icon: "o_person",
// activeIcon: "person",
// label: "ข้อมูลหลัก",
// path: "metadataNew",
// role: "metadata",
@ -89,7 +87,6 @@ const menuList = readonly<any[]>([
{
key: 2,
icon: "o_person",
activeIcon: "person",
label: "ข้อมูลการประเมิน",
path: "metadataNew",
role: "evaluateKPI",
@ -133,7 +130,6 @@ const menuList = readonly<any[]>([
{
key: 3,
icon: "o_groups",
activeIcon: "groups",
label: "โครงสร้างอัตรากำลัง",
path: "organizationalNew",
role: "organization",
@ -159,18 +155,9 @@ const menuList = readonly<any[]>([
path: "registry-employee",
role: "registryEmployee",
},
{
key: 4,
icon: "verified",
activeIcon: "verified",
label: "รายการรอตรวจสอบ",
path: "verified",
role: "registryverify",
},
{
key: 6,
icon: "mdi-file-certificate-outline",
activeIcon: "order",
label: "ออกคำสั่ง",
path: "order",
role: "order",
@ -178,7 +165,6 @@ const menuList = readonly<any[]>([
{
key: 7,
icon: "o_search",
activeIcon: "search",
label: "สรรหา",
path: "recruiting",
role: "recruit",
@ -246,7 +232,6 @@ const menuList = readonly<any[]>([
key: 8,
path: "placement",
icon: "how_to_reg",
activeIcon: "how_to_reg",
label: "บรรจุ แต่งตั้ง ย้าย โอน",
role: "placement",
children: [
@ -305,7 +290,6 @@ const menuList = readonly<any[]>([
{
key: 81,
icon: "badge",
activeIcon: "badge",
label: "ทดลองปฏิบัติหน้าที่ราชการ",
path: "probation",
role: "probation",
@ -313,7 +297,6 @@ const menuList = readonly<any[]>([
{
key: 9,
icon: "mdi-account-cancel-outline",
activeIcon: "mdi-account-cancel",
label: "พ้นจากราชการ",
path: "retirement",
role: "retirement",
@ -348,7 +331,6 @@ const menuList = readonly<any[]>([
{
key: 10,
icon: "mdi-medal-outline",
activeIcon: "mdi-medal",
label: "เครื่องราชฯ",
path: "insignia",
role: "insignia",
@ -388,39 +370,38 @@ const menuList = readonly<any[]>([
{
key: 11,
icon: "mdi-calendar",
activeIcon: "mdi-calendar",
label: "การลา",
path: "leave",
role: "leave",
children: [
{
label: "รอบการปฏิบัติงาน",
path: "/round-time",
path: "roundTime",
role: "leave",
},
{
label: "แก้ไขรอบการปฎิบัติงานผู้ใช้งาน",
path: "/change-round",
path: "changeRound",
role: "leave",
},
{
label: "รายการลงเวลาปฏิบัติงาน",
path: "/work-list",
path: "workList",
role: "leave",
},
{
label: "ลงเวลากรณีพิเศษ",
path: "/timestamp-special",
path: "timestampSpecial",
role: "leave",
},
{
label: "รายการลา",
path: "/leave",
path: "leave",
role: "leave",
},
{
label: "รายงานสถิติการลา",
path: "/leave-report",
path: "leaveReport",
role: "leave",
},
],
@ -428,7 +409,6 @@ const menuList = readonly<any[]>([
{
key: 12,
icon: "mdi-scale-balance",
activeIcon: "mdi-scale-balance",
label: "วินัย",
role: "discipline",
children: [
@ -497,7 +477,6 @@ const menuList = readonly<any[]>([
{
key: 13,
icon: "mdi-account-check",
activeIcon: "mdi-account-check",
label: "ประเมินบุคคล",
role: "evaluate",
children: [
@ -530,12 +509,11 @@ const menuList = readonly<any[]>([
{
key: 14,
icon: "mdi-cash",
activeIcon: "mdi-cash",
label: "เงินเดือน/ค่าจ้าง",
role: "salary",
children: [
{
label: "ผังบัญชีเงินเดือนข้าราชการ ฯ",
label: "ผังบัญชีเงินเดือนข้าราชการฯ",
path: "salaryChart",
role: "salary",
},
@ -550,7 +528,7 @@ const menuList = readonly<any[]>([
role: "salary",
},
{
label: "เลื่อนเงินเดือนข้าราชการ ฯ",
label: "เลื่อนเงินเดือนข้าราชการฯ",
path: "salaryLists",
role: "salary",
},
@ -569,7 +547,6 @@ const menuList = readonly<any[]>([
{
key: 15,
icon: "mdi-account-star",
activeIcon: "mdi-account-star",
label: "ประเมินผลการปฏิบัติราชการระดับบุคคล",
role: "evaluateKPI",
children: [
@ -623,7 +600,7 @@ const menuList = readonly<any[]>([
icon: "o_note",
label: "ระบบเดิม",
path: "registry",
role: "registry",
role: "organization",
children: [
{
key: 13.0,
@ -685,6 +662,20 @@ const menuList = readonly<any[]>([
},
],
},
{
key: 4,
icon: "o_contact_page",
label: "ทะเบียนประวัติ",
path: "registry",
role: "registry",
},
{
key: 4,
icon: "verified",
label: "รายการรอตรวจสอบ",
path: "verified",
role: "registryverify",
},
]);
const tabList = readonly<tabType[]>([

View file

@ -158,8 +158,8 @@ const clickAccount1 = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -185,8 +185,8 @@ const clickAccount2 = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -211,8 +211,8 @@ const clickAccount3 = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -85,15 +85,12 @@ async function fetchOrganizationActive() {
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
/** function เรียกข้อมูลประวัติโครงสร้าง*/
async function fetchHistory() {
showLoader();
await http
.get(config.API.organizationHistoryNew)
.then((res) => {
@ -109,9 +106,6 @@ async function fetchHistory() {
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}

View file

@ -502,8 +502,8 @@ const downloadFile = async () => {
const data = res.data;
downloadFilePDF(data, `Candidate__${dateToISO(new Date())}.xlsx`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -520,8 +520,8 @@ const downloadFileDetail = async () => {
const data = res.data;
downloadFilePDF(data, `Candidate_Detail_${dateToISO(new Date())}.xlsx`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -638,8 +638,8 @@ const downloadFileDashboard = async () => {
`Candidate_Dashboard_${dateToISO(new Date())}.xlsx`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -386,8 +386,8 @@ const downloadExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -407,8 +407,8 @@ const downloadPassExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -428,8 +428,8 @@ const downloadPassResultExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -202,7 +202,7 @@
<div class="col-xs-2 col-sm-2 q-pr-xs text-grey-7">คะแนน</div>
<div class="col-xs-4 col-sm-5 text-weight-bold q-pt-sm">
ผลการสอบx
ผลการสอบ
</div>
<div
class="col-xs-8 col-sm-6 q-pr-xs text-weight-bold text-subtitle1"
@ -336,8 +336,8 @@ const downloadScore = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -358,8 +358,8 @@ const downloadCertificate = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -344,8 +344,8 @@ const downloadExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -365,8 +365,8 @@ const downloadPassExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -386,8 +386,8 @@ const downloadPassResultExam = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -339,8 +339,8 @@ const downloadScore = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -363,8 +363,8 @@ const downloadCertificate = async () => {
// start download
a.click();
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -20,7 +20,7 @@
<q-card-section class="q-pa-md">
<div class="col-xs-12 col-sm-8"></div>
<div class="col-12 row items-center q-col-gutter-x-sm">
<div class="col-xs-12 col-sm-8">
<div class="col-xs-12 col-sm-6">
<q-input
outlined
v-model="name"
@ -61,7 +61,6 @@
<template #trigger>
<q-input
dense
outlined
:model-value="yearly + 543"
:rules="[(val) => !!val || `${'กรุณาเลือกปีงบประมาณ'}`]"
@ -79,7 +78,7 @@
</template>
</datepicker>
</div>
<div class="col-xs-12 col-sm-4 col-md-2" v-if="announcementExam">
<div class="col-xs-12 col-sm-4 col-md-1" v-if="announcementExam">
<q-input
outlined
v-model="fee"
@ -113,7 +112,6 @@
<q-input
outlined
dense
class="full-width datepicker q-mb-md"
:model-value="dateExam != null ? date2Thai(dateExam) : null"
:label="`${'วันที่สอบ'}`"
:rules="[(val) => !!val || `${'กรุณาเลือกวันที่สอบ'}`]"
@ -206,7 +204,10 @@
</template>
</datepicker>
</div>
<div class="col-xs-12 col-sm-3 col-md-3" v-if="announcementExam">
<div
class="col-xs-12 col-sm-3 col-md-3"
v-if="announcementExam && fee != 0"
>
<datepicker
menu-class-name="modalfix"
v-model="datePayment"
@ -228,7 +229,9 @@
outlined
dense
class="full-width datepicker q-mb-md"
:model-value="dateThaiRange(datePayment)"
:model-value="
datePayment != null ? dateThaiRange(datePayment) : null
"
:label="`${'วันที่ชำระเงิน'}`"
:rules="[(val) => !!val || `${'กรุณาเลือกวันที่ชำระเงิน'}`]"
>

View file

@ -378,12 +378,12 @@
lazy-rules
v-model="props.row.code"
:rules="[
(val) =>
val.length >= 3 ||
`${'กรุณากรอกรหัสประจำตำแหน่งที่สอบ'}`,
(val:string) => !!val || `${'กรุณากรอกรหัสประจำตำแหน่งที่สอบ'}`,
(val:any) =>
val.length >= 3 ||
`${'กรุณากรอกรหัสประจำตำแหน่งที่สอบ'}`,
]"
:label="`${'รหัสประจำตำแหน่งที่สอบ'}`"
@update:modelValue="clickEditRow"
hide-bottom-space
mask="###"
/>

View file

@ -176,6 +176,10 @@ export const useSalaryDataStore = defineStore("salary", () => {
id: 18,
name: "ปรับอัตราเงินเดือนตามพระราชกฤษฎีกาการปรับอัตราเงินเดือนของข้าราชการ พ.ศ. (.............)",
},
{
id: 19,
name: "เลื่อนเงินเดือนและให้ได้รับเงินเดือนสูงกว่าขั้นสูงของตำแหน่งที่ได้รับแต่งตั้ง คำสั่ง{หน่วยงาน} ลงวันที่ {เลขที่}/{ปี พ.ศ.}",
},
]);
const optiontype = ref<any>([

View file

@ -329,7 +329,7 @@ watch(
bg-color="white"
outlined
v-model="formData.position"
label="ตำแหน่ง"
label="ตำแหน่งในสายงาน"
dense
lazy-rules
borderless
@ -339,7 +339,7 @@ watch(
<q-select
bg-color="white"
v-model="formData.posTypeId"
label="ประเภทตำแหน่ง"
label="ตำแหน่งประเภท"
outlined
:options="store.posTypeOps"
dense
@ -349,13 +349,13 @@ watch(
option-label="name"
option-value="id"
hide-bottom-space
:rules="[(val) => !!val || 'กรุณาเลือกประเภทตำแหน่ง']"
:rules="[(val) => !!val || 'กรุณาเลือกตำแหน่งประเภท']"
@update:model-value="fetchLevel"
/>
<q-select
bg-color="white"
v-model="formData.posLevelId"
label="ระดับตำแหน่ง"
label="ระดับ"
:options="levelOps"
outlined
dense
@ -365,7 +365,7 @@ watch(
option-value="id"
options-cover
hide-bottom-space
:rules="[(val) => !!val || 'กรุณาเลือกระดับตำแหน่ง']"
:rules="[(val) => !!val || 'กรุณาเลือกระดับ']"
/>
</q-card-section>

View file

@ -64,7 +64,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "position",
align: "left",
label: "ตำแหน่ง",
label: "ตำแหน่งในสายงาน",
sortable: true,
field: "position",
headerStyle: "font-size: 14px",
@ -75,7 +75,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "posPath",
align: "left",
label: "ประเภทตำแหน่ง",
label: "ตำแหน่งประเภท",
sortable: true,
field: "posType",
headerStyle: "font-size: 14px",
@ -86,7 +86,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "posLevel",
align: "left",
label: "ระดับตำแหน่ง",
label: "ระดับ",
sortable: true,
field: "posLevel",
headerStyle: "font-size: 14px",
@ -295,6 +295,11 @@ watch(
<span class="text-weight-medium" v-else-if="col.name === 'posPath'">{{
empType === "officer" ? col.label : "กลุ่มงาน"
}}</span>
<span
class="text-weight-medium"
v-else-if="col.name === 'position'"
>{{ empType === "officer" ? col.label : "ตำแหน่ง" }}</span
>
<span class="text-weight-medium" v-else>{{ col.label }}</span>
</q-th>
@ -375,7 +380,9 @@ watch(
<q-item dense>
<q-item-section>
<q-item-label caption>ตำแหน</q-item-label>
<q-item-label caption>{{
empType === "officer" ? `ตำแหน่งในสายงาน` : `ตำแหน่ง`
}}</q-item-label>
</q-item-section>
<q-item-section>
<q-item-label caption class="text-black">
@ -390,7 +397,7 @@ watch(
<q-item-section>
<q-item-label caption>
{{
empType === "officer" ? "ประเภทตำแหน่ง" : "กลุ่มงาน"
empType === "officer" ? "ตำแหน่งประเภท" : "กลุ่มงาน"
}}</q-item-label
>
</q-item-section>
@ -407,7 +414,7 @@ watch(
<q-item-section>
<q-item-label caption>
{{
empType === "officer" ? "ระดับตำแหน่ง" : "ระดับชั้นงาน"
empType === "officer" ? "ระดับ" : "ระดับชั้นงาน"
}}</q-item-label
>
</q-item-section>

View file

@ -466,7 +466,7 @@ onMounted(() => {
</div>
<div class="row items-center">
<div class="col-12 col-sm-12 col-md-5 text-grey-6 text-weight-medium">
<div>ตำแหน</div>
<div>{{ empType === "" ? `ตำแหน่งในสายงาน` : `ตำแหน่ง` }}</div>
</div>
<div class="col-12 col-sm-12 col-md-7">{{ formMain.positionId }}</div>
</div>
@ -504,7 +504,7 @@ onMounted(() => {
</div>
<div class="row items-center">
<div class="col-12 col-sm-12 col-md-5 text-grey-6 text-weight-medium">
<div>{{ empType === "" ? "ประเภทตำแหน่ง" : "กลุ่มงาน" }}</div>
<div>{{ empType === "" ? "ตำแหน่งประเภท" : "กลุ่มงาน" }}</div>
</div>
<div class="col-12 col-sm-12 col-md-7">
{{ formMain.positionType }}
@ -512,7 +512,7 @@ onMounted(() => {
</div>
<div class="row items-center">
<div class="col-12 col-sm-12 col-md-5 text-grey-6 text-weight-medium">
<div>{{ empType === "" ? "ระดับตำแหน่ง" : "ระดับชั้นงาน" }}</div>
<div>{{ empType === "" ? "ระดับ" : "ระดับชั้นงาน" }}</div>
</div>
<div class="col-12 col-sm-12 col-md-7">
{{ formMain.positionLevel }}

View file

@ -443,9 +443,9 @@ onMounted(async () => {
</div>
<div class="q-py-xs">
{{
`${informaData.rank ? informaData.rank : informaData.prefix} ${
informaData.firstName
} ${informaData.lastName}`
`${
informaData.rank ? informaData.rank : informaData.prefix ?? ""
} ${informaData.firstName} ${informaData.lastName}`
}}
</div>
<div class="q-py-xs">

View file

@ -65,13 +65,13 @@ const adsName = reactive({
const dataLabel = {
registrationAddress: "ที่อยู่ตามทะเบียนบ้าน",
registrationProvince: "จังหวัด",
registrationDistrict: "เขต / อำเภอ",
registrationDistrict: "เขต/อำเภอ",
registrationSubDistrict: "แขวง / ตำบล",
registrationZipCode: "รหัสไปรษณีย์",
currentAddress: "ที่อยู่ปัจจุบัน",
currentProvince: "จังหวัด",
currentDistrict: "เขต / อำเภอ",
currentDistrict: "เขต/อำเภอ",
currentSubDistrict: "แขวง / ตำบล",
currentZipCode: "รหัสไปรษณีย์",
@ -81,7 +81,6 @@ const dataLabel = {
const visibleColumnsHistory = ref<String[]>([
"currentAddress",
"currentDistrict",
"currentProvince",
"currentSubDistrict",
"currentZipCode",
"registrationAddress",
@ -481,6 +480,7 @@ onMounted(async () => {
await fetchAll();
});
</script>
<template>
<div class="row q-gutter-sm items-center">
<div class="toptitle col text-right q-gutter-x-sm">
@ -507,75 +507,109 @@ onMounted(async () => {
</div>
</div>
<q-card bordered class="my-card bg-grey-1 q-pa-md">
<div :class="$q.screen.gt.xs ? 'row' : 'column'">
<!-- column 1 -->
<div class="col-md-6 col-12 row">
<div class="col-6 text-grey-6 text-weight-medium">
<div
v-for="label in Object.keys(dataLabel).slice(0, 5)"
class="q-py-xs"
>
{{ dataLabel[label as keyof typeof dataLabel] }}
</div>
</div>
<!-- data -->
<div class="col-6">
<div class="q-py-xs">
{{ addressData.registrationAddress || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.regisP || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.regisD || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.regisSD || "-" }}
</div>
<div class="q-py-xs">
{{ addressData.registrationZipCode || "-" }}
</div>
</div>
</div>
<div class="row">
<div class="col-md-6 col-12">
<q-card bordered class="bg-grey-1 q-ma-sm">
<q-card-section>
<div class="text-bold">อยตามทะเบยนบาน</div>
</q-card-section>
<q-separator />
<q-card-section>
<div :class="$q.screen.gt.xs ? '' : 'column'">
<!-- column 1 -->
<div class="col-md-6 col-12 row">
<div class="col-5 text-grey-6 text-weight-medium">อย</div>
<div class="col-7">
<div class="q-py-xs">
{{ addressData.registrationAddress || "-" }}
</div>
</div>
<!-- column 2 -->
<!-- <div
class="text-grey-6 text-weight-medium"
v-if="addressData.same === '1'"
>
อยจจนตรงกบทอยตามทะเบยนบาน
</div> -->
<div class="col-md-6 col-12 row">
<div class="col-6 text-grey-6 text-weight-medium">
<div
v-for="label in Object.keys(dataLabel).slice(5, 10)"
class="q-py-xs"
>
{{ dataLabel[label as keyof typeof dataLabel] }}
<div class="col-5 text-grey-6 text-weight-medium">แขวง/ตำบล</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.regisSD || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">เขต/อำเภอ</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.regisD || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">งหว</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.regisP || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">
รหสไปรษณ
</div>
<div class="col-7">
<div class="q-py-xs">
{{ addressData.registrationZipCode || "-" }}
</div>
</div>
</div>
</div>
</div>
<!-- data -->
<div class="col-6">
<div class="q-py-xs">
{{ addressData.currentAddress || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.currentP || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.currentD || "-" }}
</div>
<div class="q-py-xs">
{{ adsName.currentSD || "-" }}
</div>
<div class="q-py-xs">
{{ addressData.currentZipCode || "-" }}
</div>
</div>
</div>
</q-card-section>
</q-card>
</div>
</q-card>
<div class="col-md-6 col-12">
<q-card bordered class="bg-grey-1 q-ma-sm">
<q-card-section>
<div class="text-bold">อยจจ</div>
</q-card-section>
<q-separator />
<q-card-section>
<div :class="$q.screen.gt.xs ? '' : 'column'">
<div class="col-md-6 col-12 row">
<div class="col-5 text-grey-6 text-weight-medium">อย</div>
<div class="col-7">
<div class="q-py-xs">
{{ addressData.currentAddress || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">แขวง/ตำบล</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.currentSD || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">เขต/อำเภอ</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.currentD || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">งหว</div>
<div class="col-7">
<div class="q-py-xs">
{{ adsName.currentP || "-" }}
</div>
</div>
<div class="col-5 text-grey-6 text-weight-medium">
รหสไปรษณ
</div>
<div class="col-7">
<div class="q-py-xs">
{{ addressData.currentZipCode || "-" }}
</div>
</div>
</div>
</div>
</q-card-section>
</q-card>
</div>
</div>
<!-- Edit Dialog -->
<q-dialog v-model="modal" persistent>

View file

@ -216,7 +216,8 @@ async function addData() {
const method = rows.value === null ? "post" : "patch";
await http[method](url, {
profileId: rows.value === null && empType.value === "" ? id.value : undefined,
profileId:
rows.value === null && empType.value === "" ? id.value : undefined,
profileEmployeeId: empType.value !== "" ? id.value : undefined,
motherLive: motherIsHaveInfo.value ? motherIsLive.value : null,
motherCitizenId: motherIsHaveInfo.value ? motherDataEdit.citizenId : null,
@ -353,7 +354,7 @@ onMounted(async () => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ fatherData.citizenId ? fatherData.citizenId : "-" }}
@ -397,7 +398,7 @@ onMounted(async () => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ motherData.citizenId ? motherData.citizenId : "-" }}
@ -441,7 +442,7 @@ onMounted(async () => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ spouseData.citizenId ? spouseData.citizenId : "-" }}
@ -493,7 +494,7 @@ onMounted(async () => {
<div class="col-12 q-pa-md q-col-gutter-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col-10">
{{ children.childrenCitizenId }}
@ -1156,7 +1157,7 @@ onMounted(async () => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ historyRows[index - 1].fatherCitizenId }}
@ -1200,7 +1201,7 @@ onMounted(async () => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ historyRows[index - 1].motherCitizenId }}
@ -1251,7 +1252,7 @@ onMounted(async () => {
>
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ historyRows[index - 1].coupleCitizenId }}
@ -1309,7 +1310,7 @@ onMounted(async () => {
<div class="col-12 q-pa-md q-col-gutter-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col-10">
{{ children.childrenCitizenId }}

View file

@ -46,7 +46,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "citizenId",
align: "left",
label: "เลขประจำตัวประชาชนตัวประชาชน",
label: "เลขประจำตัวประชาชน",
sortable: true,
field: "citizenId",
headerStyle: "font-size: 14px",
@ -465,7 +465,7 @@ onMounted(() => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ fatherData.citizenId ? fatherData.citizenId : "-" }}
@ -540,7 +540,7 @@ onMounted(() => {
<q-card bordered class="bg-grey-1 q-gutter-md q-ma-none q-pb-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col">
{{ motherData.citizenId ? motherData.citizenId : "-" }}
@ -635,7 +635,7 @@ onMounted(() => {
</div>
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col-10">
{{ coupleData.citizenId ?? "-" }}
@ -738,7 +738,7 @@ onMounted(() => {
<div class="col-12 q-pa-md q-col-gutter-md">
<div class="row items-center">
<div class="col-2 text-grey-6 text-weight-medium">
<div>เลขประจำตวประชาชนวประชาชน</div>
<div>เลขประจำตวประชาชน</div>
</div>
<div class="col-10">
{{ item.childrenCitizenId }}

View file

@ -29,7 +29,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "educationLevel",
align: "left",
label: "ระดับศึกษา",
label: "ระดับการศึกษา",
sortable: true,
field: "educationLevel",
headerStyle: "font-size: 14px",
@ -202,7 +202,7 @@ const historyColumns = ref<QTableProps["columns"]>([
{
name: "educationLevel",
align: "left",
label: "ระดับศึกษา",
label: "ระดับการศึกษา",
sortable: true,
field: "educationLevel",
headerStyle: "font-size: 14px",

View file

@ -118,7 +118,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "positionType",
align: "left",
label: "ประเภทตำแหน่ง",
label: "ตำแหน่งประเภท",
sortable: true,
field: "positionType",
headerStyle: "font-size: 14px",

View file

@ -12,7 +12,7 @@ export const useRegistryNewDataStore = defineStore("registryNew", () => {
{ id: "fullName", name: "ชื่อ-นามสกุล" },
{ id: "citizenId", name: "เลขประจำตัวประชาชน" },
// { id: "posNo", name: "ตำแหน่งเลขที่" },
{ id: "position", name: "ตำแหน่งสายงาน" },
{ id: "position", name: "ตำแหน่งในสายงาน" },
]);
const employeeClassOps = ref<DataOption[]>([
{ id: "officer", name: "ข้าราชการ กทม.สามัญ" },

View file

@ -132,17 +132,17 @@ export const useAddressDataStore = defineStore("addess", () => {
let option: zipCodeOption[] = [];
data.subDistricts.map((r: any) => {
option.push({
id: r.id.toString(),
name: r.name.toString(),
zipCode: r.zipCode.toString(),
id: r.id,
name: r.name,
zipCode: r.zipCode,
});
});
if (position == "1") {
Ops.value.subdistrictOps = option;
OpsFilter.value.subdistrictOps = option;
Ops.value.subdistrictOps = option;
} else {
Ops.value.subdistrictCOps = option;
OpsFilter.value.subdistrictCOps = option;
Ops.value.subdistrictCOps = option;
}
})
.catch((e) => {

View file

@ -647,7 +647,7 @@ onMounted(async () => {
icon="mdi-file-eye-outline"
size="md"
>
<q-tooltip>ดาวนไฟล</q-tooltip>
<q-tooltip>ดาวนโหลดไฟล</q-tooltip>
<q-menu>
<q-list style="min-width: 130px">
<q-item clickable v-close-popup @click="onClickDownloadKp7('FULL')">
@ -712,7 +712,7 @@ onMounted(async () => {
<div class="col-2">
<div class="col-sm-3 col-md-3">
<div class="col text-grey-6 text-caption">
{{ empType === "" ? "ประเภทตำแหน่ง" : "กลุ่มงาน" }}
{{ empType === "" ? "ตำแหน่งประเภท" : "กลุ่มงาน" }}
</div>
<div class="col">
{{ formDetail?.posType?.posTypeName || "-" }}
@ -722,7 +722,7 @@ onMounted(async () => {
<div class="col-2">
<div class="col-sm-3 col-md-3">
<div class="col text-grey-6 text-caption">
{{ empType === "" ? "ระดับตำแหน่ง" : "ระดับชั้นงาน" }}
{{ empType === "" ? "ระดับ" : "ระดับชั้นงาน" }}
</div>
<div class="col">
{{ formDetail?.posLevel?.posLevelName || "-" }}

View file

@ -61,7 +61,7 @@ const conditionTotal = computed(() => {
return num;
});
/** function เรียกข้อมูลประเภทตำแหน่ง*/
/** function เรียกข้อมูลตำแหน่งประเภท*/
function fetchType() {
http
.get(config.API.orgPosType)
@ -73,7 +73,7 @@ function fetchType() {
});
}
/** function เรียกข้อมูลระดับตำแหน่ง*/
/** function เรียกข้อมูลระดับ*/
function fetchLevel() {
http
.get(config.API.orgPosLevel)
@ -396,7 +396,7 @@ onMounted(async () => {
labelOption.posType !== "ทั้งหมด"
? labelOption.posType
: empType === "officer"
? `ประเภทตำแหน่ง${labelOption.posType}`
? `ตำแหน่งประเภท${labelOption.posType}`
: `กลุ่มงาน${labelOption.posType}`
}}
<q-btn
@ -439,7 +439,7 @@ onMounted(async () => {
labelOption.posLevel !== "ทั้งหมด"
? labelOption.posLevel
: empType === "officer"
? `ระดับตำแหน่ง${labelOption.posLevel}`
? `ระดับ${labelOption.posLevel}`
: `ระดับชั้นงาน${labelOption.posLevel}`
}}
<q-btn

View file

@ -72,9 +72,9 @@ const fecthappointmentByid = async () => {
const data = res.data.result;
appointment.value = data;
profileId.value = data.profileId;
title.value.fullname = `${data.prefix}${data.firstName ?? "-"} ${
data.lastName ?? "-"
}`;
title.value.fullname = `${data.prefix === null ? "" : data.prefix}${
data.firstName ?? "-"
} ${data.lastName ?? "-"}`;
title.value.organizationPositionOld = data.organizationPositionOld ?? "-";
title.value.positionLevelOld = data.positionLevelOld ?? "-";
title.value.positionTypeOld = data.positionTypeOld ?? "-";

View file

@ -71,7 +71,9 @@ const columns = ref<QTableProps["columns"]>([
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format(val, row) {
return `${row.prefix}${row.firstName} ${row.lastName}`;
return `${row.prefix === null ? "" : row.prefix}${row.firstName} ${
row.lastName
}`;
},
},
{

View file

@ -84,8 +84,8 @@ const fileDownload = async (no: number, type: string, fileName: string) => {
.then(async (res) => {
downloadFile(res, `${fileName}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -950,8 +950,8 @@ async function clickdownloadFile(type: string) {
`แบบมอบหมายงานการทดลองปฏิบัติหน้าที่ราชการ-${fullname.value}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -160,8 +160,8 @@ async function clickdownloadFile(type: string) {
.then((res) => {
downloadFile(res, `แบบรายงานการประเมินฯ_${fullname.value}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -37,13 +37,15 @@ const dataRole = ref<string>("mentor");
/** get
* @param id person id
*/
async function fecthAssign(id: string){
async function fecthAssign(id: string) {
showLoader();
await http
.get(config.API.formevaluate(id))
.then(async (res: any) => {
await fecthdataAssign(res.data.data);
fullname.value = res.data.data.experimentee ? res.data.data.experimentee.name : "";
fullname.value = res.data.data.experimentee
? res.data.data.experimentee.name
: "";
dataArrayNumber.value = 1;
})
.catch((e: any) => {
@ -52,19 +54,19 @@ async function fecthAssign(id: string){
.finally(() => {
hideLoader();
});
};
}
/**
* เปลยน tab
* @param tabVal type
*/
function changeTab(tabVal: string){
function changeTab(tabVal: string) {
tab.value = tabVal;
dataArrayNumber.value = Number(tabVal.charAt(4));
};
}
/** convert file */
function downloadFile(response: any, filename: string){
function downloadFile(response: any, filename: string) {
const link = document.createElement("a");
var fileName = filename;
link.href = window.URL.createObjectURL(new Blob([response.data]));
@ -72,10 +74,10 @@ function downloadFile(response: any, filename: string){
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
}
/** download file */
async function FileDownload(type: string){
async function FileDownload(type: string) {
let numTab = probationStore.evaluate.find(
(e: any) => e.no === dataArrayNumber.value
);
@ -92,8 +94,8 @@ async function FileDownload(type: string){
`แบบบันทึกผล(ผู้ดูเเล)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -111,21 +113,21 @@ async function FileDownload(type: string){
`แบบบันทึกผล(ผู้บังคับบัญชา)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
});
}
};
}
/** ไปหน้า page add */
function addData(){
function addData() {
router.push(
`/probation/detail/addresult/${personalId.value}/${assignId.value}`
);
};
}
onMounted(async () => {
await fecthAssign(assignId.value);

View file

@ -40,9 +40,9 @@ onMounted(async () => {
/**
* get data
* @param id person id
* @param id person id
*/
async function fecthAssign(id: string){
async function fecthAssign(id: string) {
showLoader();
await http
.get(config.API.formevaluateCommander(id))
@ -59,19 +59,19 @@ async function fecthAssign(id: string){
.finally(() => {
hideLoader();
});
};
}
/**
* เปลยน tab
* @param tabVal type
* @param tabVal type
*/
function changeTab(tabVal: string){
function changeTab(tabVal: string) {
tab.value = tabVal;
dataArrayNumber.value = Number(tabVal.charAt(4));
};
}
/** เปลี่ยน type file */
function downloadFile(response: any, filename: string){
function downloadFile(response: any, filename: string) {
const link = document.createElement("a");
var fileName = filename;
link.href = window.URL.createObjectURL(new Blob([response.data]));
@ -79,13 +79,13 @@ function downloadFile(response: any, filename: string){
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
}
/**
* download file
* @param type type
*/
async function FileDownload(type: string){
async function FileDownload(type: string) {
let numTab = probationStore.evaluate.find(
(e: any) => e.no === dataArrayNumber.value
);
@ -102,8 +102,8 @@ async function FileDownload(type: string){
`แบบบันทึกผล(ผู้บังคับบัญชา)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -121,21 +121,21 @@ async function FileDownload(type: string){
`แบบบันทึกผล(ผู้บังคับบัญชา)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
});
}
};
}
/** เปลี่ยนหน้า เพิ่ม */
function addData(){
function addData() {
router.push(
`/probation/detail/addevaluacommander/${personalId.value}/${assignId.value}`
);
};
}
</script>
<template>

View file

@ -37,12 +37,12 @@ const evaluate = ref<any>([]);
/**
* เปลยน tab
* @param tabVal type
* @param tabVal type
*/
function changeTab(tabVal: string){
function changeTab(tabVal: string) {
tab.value = tabVal;
dataArrayNumber.value = Number(tabVal.charAt(4));
};
}
onMounted(() => {
fecthAssign(assignId.value);
@ -50,9 +50,9 @@ onMounted(() => {
/**
* get data
* @param id person id
* @param id person id
*/
async function fecthAssign(id: string){
async function fecthAssign(id: string) {
showLoader();
await http
.get(config.API.createformCommader(id))
@ -60,7 +60,9 @@ onMounted(() => {
await fecthdataAssign(res.data.data);
evaluate.value = probationStore.evaluate;
tabs.value = evaluate.value;
fullname.value = res.data.data.experimentee ? res.data.data.experimentee.name : "";
fullname.value = res.data.data.experimentee
? res.data.data.experimentee.name
: "";
dataArrayNumber.value = 1;
})
.catch((e: any) => {
@ -69,10 +71,10 @@ onMounted(() => {
.finally(() => {
hideLoader();
});
};
}
/** เปลี่ยน type file */
function downloadFile(response: any, filename: string){
function downloadFile(response: any, filename: string) {
const link = document.createElement("a");
var fileName = filename;
link.href = window.URL.createObjectURL(new Blob([response.data]));
@ -80,13 +82,13 @@ function downloadFile(response: any, filename: string){
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
}
/**
* download file
* @param type type
*/
async function FileDownload(type: string){
async function FileDownload(type: string) {
let numTab = evaluate.value.find((e: any) => e.no === dataArrayNumber.value);
showLoader();
await http
@ -99,20 +101,20 @@ function downloadFile(response: any, filename: string){
`แบบประเมินผล(ผู้บังคับบัญชา)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
});
};
}
/** เปลี่ยนหน้า เพิ่ม */
function addData(){
function addData() {
router.push(
`/probation/detail/addevalua/${personalId.value}/${assignId.value}`
);
};
}
</script>
<template>

View file

@ -47,7 +47,9 @@ const fecthAssign = async (id: string) => {
.then(async (res: any) => {
await fecthdataAssign(res.data.data);
evaluate.value = probationStore.evaluate;
fullname.value = res.data.data.experimentee ? res.data.data.experimentee.name : "";
fullname.value = res.data.data.experimentee
? res.data.data.experimentee.name
: "";
tabs.value = evaluate.value;
dataArrayNumber.value = 1;
})
@ -81,8 +83,8 @@ const FileDownload = async (type: string) => {
`แบบประเมินผล(คณะกรรมการ)_${fullname.value}_ครั้งที่${numTab.no}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -357,8 +357,8 @@ const downloadAttachment = async (type: string, id: string) => {
.then(async (res) => {
downloadFile(res, `${"รายชื่อผู้เกษียณอายุราชการ"}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -41,7 +41,7 @@ const columns = ref<QTableProps["columns"]>([
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format(val, row) {
return `${row.prefix}${row.firstName} ${row.lastName}`;
return `${row.prefix ?? ""}${row.firstName} ${row.lastName}`;
},
},
{

View file

@ -90,8 +90,8 @@ const fileDownload = async (type: string) => {
`รายละเอียดบันทึกเวียนแจ้งการถึงแก่กรรม-${fullName}.${type}`
);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -403,8 +403,8 @@ const fileDownload = async (type: string, fileName: string) => {
.then(async (res) => {
downloadFile(res, `${fileName}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -54,8 +54,8 @@ async function downloadDocument(type: string) {
);
}
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -1,4 +1,5 @@
divdiv<script setup lang="ts">
divdiv
<script setup lang="ts">
import { ref, watch, computed } from "vue";
import { QForm, useQuasar } from "quasar";
import http from "@/plugins/http";
@ -307,7 +308,7 @@ const filterSelector = (val: any, update: Function, name: any) => {
<template>
<q-dialog v-model="props.modal" persistent>
<q-card style="min-width: 900px" >
<q-card style="min-width: 900px">
<q-form
ref="myForm"
greedy
@ -490,14 +491,14 @@ const filterSelector = (val: any, update: Function, name: any) => {
<div class="col-xs-12 col-sm-6">
<q-input
:disable="disbleStatus || status == 'DONE'"
:rules="[(val) => !!val || 'กรุณากรอกทะเบียนฐานันดร']"
:rules="[(val) => !!val || 'กรุณากรอกทะเบียนฐานันดร']"
class="inputgreen"
hide-bottom-space
dense
borderless
outlined
v-model="issue"
label="ทะเบียนฐานันดร"
label="ทะเบียนฐานันดร"
lazy-rules
/>
</div>

View file

@ -126,8 +126,8 @@ const downloadReport = async (
showDocument(url);
}
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -128,8 +128,8 @@ const downloadReport = async (
showDocument(url);
}
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -186,7 +186,7 @@ const filterSelector = (val: any, update: Function, name: any) => {
@filter="(inputValue:any,doneFn:Function) =>
filterSelector(inputValue, doneFn,'selectList') "
>
<template v-slot:no-option>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
ไมอม

View file

@ -139,8 +139,8 @@ async function genReportXLSX(data: any) {
const blob = new Blob([res.data]);
downloadReport(blob, "xlsx");
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
});
}

View file

@ -118,8 +118,8 @@ async function genReport(data: any) {
hideLoader();
}, 1500);
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -144,8 +144,8 @@ async function genReportXLSX(data: any) {
const blob = new Blob([res.data]);
downloadReport(blob, "xlsx");
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -14,7 +14,7 @@ const leaveReport = () =>
export default [
{
path: "/round-time",
name: "/round-time",
name: "roundTime",
component: RoundMain,
meta: {
Auth: true,
@ -24,7 +24,7 @@ export default [
},
{
path: "/change-round",
name: "/change-round",
name: "changeRound",
component: ChangeRoundMain,
meta: {
Auth: true,
@ -34,17 +34,7 @@ export default [
},
{
path: "/work-list",
name: "/work-list",
component: workMain,
meta: {
Auth: true,
Key: [9],
Role: "leave",
},
},
{
path: "/work-list",
name: "/work-list",
name: "workList",
component: workMain,
meta: {
Auth: true,
@ -54,7 +44,7 @@ export default [
},
{
path: "/timestamp-special",
name: "/timestamp-special",
name: "timestampSpecial",
component: SpecialTimeMain,
meta: {
Auth: true,
@ -64,7 +54,7 @@ export default [
},
{
path: "/leave",
name: "/leave",
name: "leave",
component: leaveMain,
meta: {
Auth: true,
@ -74,7 +64,7 @@ export default [
},
{
path: "/leave/detail/:id",
name: "/leave/detail",
name: "leaveDetail",
component: leaveDetail,
meta: {
Auth: true,
@ -84,7 +74,7 @@ export default [
},
{
path: "/leave-reject/detail/:id",
name: "/leave-reject/detail",
name: "leaveRejectDetail",
component: leaveDetailReject,
meta: {
Auth: true,
@ -94,7 +84,7 @@ export default [
},
{
path: "/leave-report",
name: "/leave-report",
name: "leaveReport",
component: leaveReport,
meta: {
Auth: true,

View file

@ -129,8 +129,8 @@ const downloadCover = async (type: string) => {
.then(async (res) => {
downloadFile(res, `คำสั่ง ${orderName.value}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -161,8 +161,8 @@ const downloadAttachment = async (type: string) => {
.then(async (res) => {
downloadFile(res, `เอกสารแนบท้าย ${orderName.value}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -207,14 +207,16 @@ const fetchReportCover = async (type: string, orderId: string) => {
viewPDF(orderCoverPdf.value);
}
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {});
}
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
!genReportStatus.value
? messageError($q, JSON.parse(await e.response.data.text()))
: messageError($q, e);
});
};
//
@ -228,8 +230,8 @@ const fetchReportAttachment = async (type: string, orderId: string) => {
const objectUrl = URL.createObjectURL(blob);
orderAttachmentPdf.value = objectUrl;
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
});
};

View file

@ -84,8 +84,8 @@ function getPDF(url: string, type: string) {
hideLoader();
}, 1500);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
store.log = 0;
@ -138,7 +138,9 @@ onMounted(async () => {
active-class="text-primary"
@click="handleItemClick(2)"
>
<q-item-section class="q-py-sm">แบบแสดงรายละเอยดการเสนอผลงาน</q-item-section>
<q-item-section class="q-py-sm"
>แบบแสดงรายละเอยดการเสนอผลงาน</q-item-section
>
</q-item>
<q-item
clickable
@ -147,7 +149,8 @@ onMounted(async () => {
active-class="text-primary"
@click="handleItemClick(3)"
>
<q-item-section class="q-py-sm">แบบตรวจสอบความถกตองครบถวนของขอมลเพอประกอบการคดเลอกบคคล
<q-item-section class="q-py-sm"
>แบบตรวจสอบความถกตองครบถวนของขอมลเพอประกอบการคดเลอกบคคล
(เอกสารแบบ )</q-item-section
>
</q-item>
@ -158,7 +161,9 @@ onMounted(async () => {
active-class="text-primary"
@click="handleItemClick(4)"
>
<q-item-section class="q-py-sm"> แบบประเมนคณลกษณะบคคล </q-item-section>
<q-item-section class="q-py-sm">
แบบประเมนคณลกษณะบคคล
</q-item-section>
</q-item>
<q-item
clickable
@ -178,7 +183,9 @@ onMounted(async () => {
active-class="text-primary"
@click="handleItemClick(6)"
>
<q-item-section class="q-py-sm"> ผลงานทจะสงประเม (เอกสารหมายเลข 11) </q-item-section>
<q-item-section class="q-py-sm">
ผลงานทจะสงประเม (เอกสารหมายเลข 11)
</q-item-section>
</q-item>
</q-list>
</template>

View file

@ -159,7 +159,9 @@ async function getPDF(url: string, type: string, fileName: string) {
a.download = fileName;
a.click();
})
.catch((e) => {})
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {});
}

View file

@ -86,8 +86,8 @@ function getPDF(url: string, type: string) {
hideLoader();
}, 1500);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
store.log = 0;

View file

@ -145,8 +145,8 @@ const downloadCover = async (type: string) => {
.then(async (res) => {
downloadFile(res, `คำสั่ง ${orderName.value}.${type}`);
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();
@ -206,14 +206,16 @@ const fetchReportCover = async (type: string, orderId: string) => {
viewPDF(orderCoverPdf.value);
}
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {});
}
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
!genReportStatus.value
? messageError($q, JSON.parse(await e.response.data.text()))
: messageError($q, e);
});
};
//
@ -227,8 +229,8 @@ const fetchReportAttachment = async (type: string, orderId: string) => {
const objectUrl = URL.createObjectURL(blob);
orderAttachmentPdf.value = objectUrl;
})
.catch((e) => {
messageError($q, e);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
});
};

View file

@ -212,8 +212,8 @@ function downloadFile(url: string, type: string, fileName: string) {
a.download = fileName;
a.click();
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -174,8 +174,8 @@ async function downloadFile(url: string, type: string, fileName: string) {
a.download = fileName;
a.click();
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -10,7 +10,7 @@ import PopupPersonal from "@/components/Dialogs/PopupPersonalNew.vue";
import type {
DataOption,
typeOp,
ResponsePreson,
NewPagination,
tableType,
FormData,
} from "@/modules/14_KPI/interface/index/Main";
@ -22,10 +22,10 @@ const personId = ref<string>("");
const modalPersonal = ref<boolean>(false);
const searchRef = ref<any>(null);
const rows = ref<tableType[]>([]);
const type = ref<string>("idcard");
const type = ref<string>("citizenId");
const search = ref<string>("");
const typeOps = ref<typeOp[]>([
{ id: "idcard", name: "เลขประจำตัวประชาชน" },
{ id: "citizenId", name: "เลขประจำตัวประชาชน" },
{ id: "firstname", name: "ชื่อ" },
{ id: "lastname", name: "นามสกุล" },
]);
@ -96,9 +96,8 @@ function onCloseDialog() {
formRound.commanderHighId = "";
selected.value = [];
search.value = "";
type.value = "idcard";
type.value = "citizenId";
}
/** หัวข้อที่เเสดงในตารางผู้ถูกร้องเรียน */
const visibleColumnsRespondent = ref<string[]>([
"no",
@ -112,13 +111,18 @@ const visibleColumnsRespondent = ref<string[]>([
"organization",
]);
const query = reactive({
page: 1,
pageSize: 10,
});
const columnsRespondent = ref<QTableProps["columns"]>([
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: false,
field: "no",
field: (row) =>
(query.page - 1) * query.pageSize + rows.value.indexOf(row) + 1,
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
@ -223,6 +227,9 @@ function checkClosed() {
isRoundClose.value = formRound.kpiPeriodId.isClosed;
}
const total = ref<number>(0);
const maxPage = ref<number>(1);
async function searchInput(check: boolean) {
if (check) {
searchRules.value = check;
@ -234,13 +241,21 @@ async function searchInput(check: boolean) {
keyword: search.value,
};
await http
.post(config.API.orgSearchPersonal(), body)
.post(
config.API.orgSearchPersonal() +
`?page=${query.page}&pageSize=${query.pageSize}`,
body
)
.then((res) => {
const data = res.data.result;
maxPage.value = Math.ceil(data.total / query.pageSize);
total.value = data.total;
rows.value = data;
rows.value = data.data;
})
.catch((err) => {
messageError($q, err);
})
.catch((err) => {})
.finally(() => {
hideLoader();
});
@ -263,15 +278,21 @@ function getOrgOp() {
const data = res.data.result;
evaluatorIdMainOp.value = data.caregiver.map((i: any) => ({
id: i.id,
name: `${i.prefix ? i.prefix :''}${i.firstName ? i.firstName : ''} ${i.lastName ? i.lastName:''}`,
name: `${i.prefix ? i.prefix : ""}${i.firstName ? i.firstName : ""} ${
i.lastName ? i.lastName : ""
}`,
}));
commanderIdMainOp.value = data.commander.map((i: any) => ({
id: i.id,
name: `${i.prefix ? i.prefix :''}${i.firstName ? i.firstName : ''} ${i.lastName ? i.lastName:''}`,
name: `${i.prefix ? i.prefix : ""}${i.firstName ? i.firstName : ""} ${
i.lastName ? i.lastName : ""
}`,
}));
commanderHighMainOp.value = data.chairman.map((i: any) => ({
id: i.id,
name: `${i.prefix ? i.prefix :''}${i.firstName ? i.firstName : ''} ${i.lastName ? i.lastName:''}`,
name: `${i.prefix ? i.prefix : ""}${i.firstName ? i.firstName : ""} ${
i.lastName ? i.lastName : ""
}`,
}));
})
.catch((e) => {
@ -329,6 +350,22 @@ watch(
}
}
);
/**
* function ปเดท paging
* @param initialPagination อม pagination
*/
async function updatePagination(initialPagination: NewPagination) {
query.page = 1;
query.pageSize = initialPagination.rowsPerPage;
}
watch(
() => query.pageSize,
() => {
searchInput(true);
}
);
</script>
<template>
<q-dialog v-model="modalDialog" persistent>
@ -374,7 +411,7 @@ watch(
icon="search"
label="ค้นหา"
class="full-width q-py-sm q-px-md"
@click="searchInput(true)"
@click="(query.page = 1), searchInput(true)"
>
</q-btn>
</template>
@ -389,11 +426,12 @@ watch(
flat
bordered
selection="single"
:rows-per-page-options="[10, 25, 50, 100]"
v-model:selected="selected"
:paging="true"
dense
class="custom-header-table"
:visible-columns="visibleColumnsRespondent"
@update:pagination="updatePagination"
>
<template v-slot:header="props">
<q-tr :props="props">
@ -425,10 +463,7 @@ watch(
:key="col.name"
:props="props"
>
<div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }}
</div>
<div v-else-if="col.name == 'positionType'">
<div v-if="col.name == 'positionType'">
{{
props.row.positionTypeName
? props.row.positionTypeName
@ -451,6 +486,20 @@ watch(
</q-td>
</q-tr>
</template>
<template v-slot:pagination="scope">
งหมด {{ total }} รายการ
<q-pagination
v-model="query.page"
active-color="primary"
color="dark"
:max="Number(maxPage)"
size="sm"
boundary-links
direction-links
:max-pages="5"
@update:model-value="searchInput(true)"
></q-pagination>
</template>
</d-table>
</div>
</div>

View file

@ -1,3 +1,388 @@
<script setup lang="ts">
import { ref, onMounted } from "vue";
import { useQuasar } from "quasar";
import { VuePDF, usePDF } from "@tato30/vue-pdf";
import config from "@/app.config";
import http from "@/plugins/http";
import axios from "axios";
import genReport from "@/plugins/genreport";
import { useCounterMixin } from "@/stores/mixin";
import type { DataOption } from "@/modules/14_KPI/interface/index/Main";
const $q = useQuasar();
const { showLoader, hideLoader, messageError, date2Thai, dialogConfirm } =
useCounterMixin();
const year = ref<number | null>(new Date().getFullYear());
const round = ref<string>("");
const organization = ref<string>("");
const roundOp = ref<DataOption[]>([]);
const organizationOpsMain = ref<DataOption[]>([]);
const organizationOps = ref<DataOption[]>([]);
function fetchRoundOption() {
http
.get(
config.API.kpiPeriod +
`?page=${1}&pageSize=${10}&keyword=${""}&year=${year.value}`
)
.then(async (res) => {
const data = await res.data.result.data;
if (res.data.result.data.length > 0) {
const list = await data.map((e: any) => ({
id: e.id,
name:
e.durationKPI === "OCT"
? "รอบตุลาคม"
: e.durationKPI === "APR"
? "รอบเมษายน"
: "",
}));
roundOp.value = list;
} else {
roundOp.value = [];
round.value = "";
organization.value = "";
dataDownload.value = null;
pdfSrc.value = null;
}
})
.catch((err) => {
messageError($q, err);
});
}
function fetchActiveId() {
showLoader();
http
.get(config.API.activeOrganization)
.then((res) => {
const data = res.data.result;
fetchListOrg(data.activeId);
})
.catch((err) => {
messageError($q, err);
hideLoader();
});
}
function fetchListOrg(id: string) {
showLoader();
http
.get(config.API.orgByid(id))
.then(async (res) => {
const data = await res.data.result.map((item: any) => ({
id: item.orgTreeId,
name: item.orgName,
}));
organizationOpsMain.value = data;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
function fetchReport() {
if (round.value !== "" && organization.value !== "") {
showLoader();
const body = {
periodId: round.value,
root: organization.value,
};
http
.post(config.API.kpiReport(), body)
.then((res) => {
dataDownload.value = res.data.result;
page.value = 1;
genPDf(res.data.result);
})
.catch((err) => {
messageError($q, err);
hideLoader();
});
}
}
/**
* function เรยกไฟล PDF
* @param data อมลบญชนลา
*/
async function genPDf(data: any) {
showLoader();
await axios
.post(config.API.reportTemplate + `/docx`, data, {
headers: {
accept: "application/pdf",
"content-Type": "application/json",
},
responseType: "blob",
})
.then(async (res) => {
const blob = new Blob([res.data]);
const objectUrl = URL.createObjectURL(blob);
const pdfData = await usePDF(`${objectUrl}`);
showLoader();
setTimeout(() => {
pdfSrc.value = pdfData.pdf.value;
numOfPages.value = pdfData.pages.value;
hideLoader();
}, 1500);
})
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
hideLoader();
});
}
function changOption() {
fetchReport();
}
function filterSelector(val: string, update: Function) {
update(() => {
organizationOps.value = organizationOpsMain.value.filter(
(v: DataOption) => v.name.toLowerCase().indexOf(val) > -1
);
});
}
const splitterModel = ref(14);
const numOfPages = ref<number>(0);
const page = ref<number>(1);
const pdfSrc = ref<any>();
const dataDownload = ref<any>();
async function downloadReport(data: any, type: string) {
var fileName = "ประกาศผู้มีผลการปฏิบัติราชการระดับดีเด่นและดีมาก";
genReport(data, fileName, type);
}
/** ไปหน้าต่อไปของรายงาน */
function nextPage() {
if (page.value < numOfPages.value) {
page.value++;
}
}
/** กลับหน้าก่อนหน้าของรายงาน */
function backPage() {
if (page.value !== 1) {
page.value--;
}
}
onMounted(() => {
fetchRoundOption();
fetchActiveId();
});
</script>
<template>
<div>ดทำประกาศผผลการปฏราชการระดบดเดนและดมาก</div>
<div class="toptitle text-dark col-12 row items-center">
ดทำประกาศผผลการปฏราชการระดบดเดนและดมาก
</div>
<q-card flat bordered>
<q-card-section>
<q-toolbar style="padding: 0">
<div class="row q-gutter-sm">
<datepicker
menu-class-name="modalfix"
v-model="year"
style="width: 150px"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
@update:model-value="fetchRoundOption()"
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
outlined
hide-bottom-space
:model-value="!!year ? year + 543 : null"
:label="`${'ปีงบประมาณ'}`"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
<q-select
v-model="round"
outlined
label="รอบการประเมิน"
dense
option-label="name"
option-value="id"
:options="roundOp"
style="min-width: 150px"
emit-value
map-options
:disable="roundOp.length === 0"
@update:model-value="changOption"
/>
<q-select
:disable="roundOp.length === 0"
style="min-width: 100px"
dense
hide-bottom-space
outlined
option-label="name"
option-value="id"
emit-value
map-options
v-model="organization"
:options="organizationOps"
label="หน่วยงาน"
use-input
@update:model-value="changOption"
@filter="(inputValue: string,
doneFn: Function) => filterSelector(inputValue, doneFn )"
/>
</div>
<q-space />
<q-btn
flat
round
color="primary"
icon="download"
:disable="!dataDownload"
>
<q-menu>
<q-list style="min-width: 150px">
<q-item
clickable
v-close-popup
@click="downloadReport(dataDownload, 'pdf')"
>
<q-item-section avatar
><q-icon color="red" name="mdi-file-pdf"
/></q-item-section>
<q-item-section>ไฟล .PDF</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="downloadReport(dataDownload, 'docx')"
>
<q-item-section avatar
><q-icon color="blue" name="mdi-file-word"
/></q-item-section>
<q-item-section>ไฟล .docx</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-toolbar>
<q-splitter
v-model="splitterModel"
horizontal
style="
height: 75vh;
border: 1px solid rgb(210, 210, 210);
border-radius: 5px;
"
before-class="overflow-hidden disable"
separator-class="bg-white disabled"
>
<template v-slot:before v-if="pdfSrc">
<div class="q-px-sm">
<div class="row items-start items-center">
<div class="col">
<q-btn
padding="xs"
icon="mdi-chevron-left"
color="grey-2"
text-color="grey-5"
size="md"
class="my-auto"
@click="backPage"
:disable="page == 1"
/>
</div>
<div class="col-12 col-md-auto">
<div class="q-pa-md flex">
หนาท {{ page }} จาก {{ numOfPages }}
</div>
</div>
<div class="col text-right">
<q-btn
padding="xs"
icon="mdi-chevron-right"
color="grey-2"
text-color="grey-5"
size="md"
@click="nextPage"
:disable="page === numOfPages"
/>
</div>
</div>
</div>
</template>
<template v-slot:after v-if="pdfSrc">
<div class="q-pa-md">
<VuePDF ref="vuePDFRef" :pdf="pdfSrc" :page="page" fit-parent />
</div>
</template>
<template v-slot:default v-if="pdfSrc">
<div class="q-pa-md">
<div class="row items-start items-center">
<div class="col">
<q-btn
padding="xs"
icon="mdi-chevron-left"
color="grey-2"
text-color="grey-5"
size="md"
class="my-auto"
@click="backPage"
:disable="page == 1"
/>
</div>
<div class="col-12 col-md-auto">
<div class="q-pa-md flex">
หนาท {{ page }} จาก {{ numOfPages }}
</div>
</div>
<div class="col text-right">
<q-btn
padding="xs"
icon="mdi-chevron-right"
color="grey-2"
text-color="grey-5"
size="md"
@click="nextPage"
:disable="page === numOfPages"
/>
</div>
</div>
</div>
</template>
</q-splitter>
</q-card-section>
</q-card>
</template>
<style scoped></style>

View file

@ -29,8 +29,6 @@ async function fetchOrganizationActive() {
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}

View file

@ -51,8 +51,8 @@ async function genReportXLSX(
URL.revokeObjectURL(url);
}
})
.catch((err) => {
messageError($q, err);
.catch(async (e) => {
messageError($q, JSON.parse(await e.response.data.text()));
})
.finally(() => {
hideLoader();

View file

@ -345,7 +345,7 @@ export const useCounterMixin = defineStore("mixin", () => {
}
}
const messageError = (q: any, e: any = "") => {
const messageError = (q: any, e: any = "", msg: string = "") => {
// q.dialog.hide();
if (e.response !== undefined) {
if (e.response.data.status !== undefined) {
@ -411,8 +411,6 @@ export const useCounterMixin = defineStore("mixin", () => {
},
});
} else {
console.log("errror===>", e);
q.dialog({
component: CustomComponent,
componentProps: {
@ -426,18 +424,31 @@ export const useCounterMixin = defineStore("mixin", () => {
}
}
} else {
console.log("errror===>", e);
console.error("err===>", e); // ***
q.dialog({
component: CustomComponent,
componentProps: {
title: `พบข้อผิดพลาด`,
message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`,
icon: "warning",
color: "red",
onlycancel: true,
},
});
if (e.message) {
q.dialog({
component: CustomComponent,
componentProps: {
title: `พบข้อผิดพลาด`,
message: e.message,
icon: "warning",
color: "red",
onlycancel: true,
},
});
} else {
q.dialog({
component: CustomComponent,
componentProps: {
title: `พบข้อผิดพลาด`,
message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`,
icon: "warning",
color: "red",
onlycancel: true,
},
});
}
}
};