Merge branch 'nice_dev' into develop

This commit is contained in:
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 2024-02-07 13:32:40 +07:00
commit 3496d3eda4
7 changed files with 279 additions and 182 deletions

View file

@ -410,7 +410,10 @@ function onSubmitSelectEdit() {
posDictField: formPositionSelect.positionField, //
posTypeId: formPositionSelect.positionType, //*
posLevelId: formPositionSelect.positionLevel, //*
posExecutiveId: formPositionSelect.positionExecutive, //
posExecutiveId:
formPositionSelect.positionExecutive !== ""
? formPositionSelect.positionExecutive
: null, //
posDictExecutiveField: formPositionSelect.positionExecutiveField, //
posDictArea: formPositionSelect.positionArea, ///
};

View file

@ -15,71 +15,74 @@
{{ header }}
</div>
</div>
<div class="q-gutter-sm q-mx-sm" v-if="addData == false">
<q-btn
size="12px"
v-if="!edit"
flat
round
:disabled="disable"
:color="edit ? 'grey-7' : 'primary'"
@click="ClickEdit"
icon="mdi-pencil-outline"
>
<q-tooltip>แกไขขอม</q-tooltip>
</q-btn>
<q-btn
size="12px"
flat
round
v-if="edit"
:color="!edit ? 'grey-7' : 'public'"
@click="save"
icon="mdi-content-save-outline"
>
<q-tooltip>นทกขอม</q-tooltip>
</q-btn>
<q-btn
size="12px"
flat
round
v-if="edit && !addEmployee"
:color="!edit ? 'grey-7' : 'red'"
@click="ClickCancel"
icon="mdi-undo"
>
<q-tooltip>ยกเล</q-tooltip>
</q-btn>
</div>
<div class="q-pl-sm" v-else-if="iconAdd != '' && iconAdd != null">
<q-btn
size="12px"
flat
round
color="add"
@click="addleave"
icon="mdi-plus"
>
<q-tooltip>เพมขอม</q-tooltip>
</q-btn>
<!-- <q-btn size="12px" flat round color="add" @click="add" :icon="iconAdd">
<div v-if="!profileStore.isVerified">
<div class="q-gutter-sm q-mx-sm" v-if="addData == false">
<q-btn
size="12px"
v-if="!edit"
flat
round
:disabled="disable"
:color="edit ? 'grey-7' : 'primary'"
@click="ClickEdit"
icon="mdi-pencil-outline"
>
<q-tooltip>แกไขขอม</q-tooltip>
</q-btn>
<q-btn
size="12px"
flat
round
v-if="edit"
:color="!edit ? 'grey-7' : 'public'"
@click="save"
icon="mdi-content-save-outline"
>
<q-tooltip>นทกขอม</q-tooltip>
</q-btn>
<q-btn
size="12px"
flat
round
v-if="edit && !addEmployee"
:color="!edit ? 'grey-7' : 'red'"
@click="ClickCancel"
icon="mdi-undo"
>
<q-tooltip>ยกเล</q-tooltip>
</q-btn>
</div>
<div class="q-pl-sm" v-else-if="iconAdd != '' && iconAdd != null">
<q-btn
size="12px"
flat
round
color="add"
@click="addleave"
icon="mdi-plus"
>
<q-tooltip>เพมขอม</q-tooltip>
</q-btn>
<!-- <q-btn size="12px" flat round color="add" @click="add" :icon="iconAdd">
<q-tooltip>สรปวนลา</q-tooltip>
</q-btn> -->
</div>
<div class="q-pl-sm" v-else>
<q-btn
size="12px"
flat
round
:disabled="disable"
color="add"
@click="add"
icon="mdi-plus"
>
<q-tooltip>เพมขอม</q-tooltip>
</q-btn>
</div>
</div>
<div class="q-pl-sm" v-else>
<q-btn
size="12px"
flat
round
:disabled="disable"
color="add"
@click="add"
icon="mdi-plus"
>
<q-tooltip>เพมขอม</q-tooltip>
</q-btn>
</div>
<q-space />
<q-btn
color="info"
@ -96,6 +99,9 @@
</div>
</template>
<script setup lang="ts">
import { useProfileDataStore } from "@/modules/04_registry/store";
const profileStore = useProfileDataStore();
const props = defineProps({
header: {
type: String,

View file

@ -153,81 +153,87 @@
</div>
</div>
<q-space />
<q-btn
v-if="
profileType == 'officer' ||
(profileType == 'employee' && employeeClass == 'perm')
"
round
flat
:color="reasonStatus ? 'primary' : 'pink-5'"
:icon="
reasonStatus ? 'mdi-home-import-outline' : 'mdi-home-export-outline'
"
<q-btn flat round color="green" icon="verified" @click="onClickVerified"
><q-tooltip>ตรวจสอบขอม</q-tooltip></q-btn
>
<q-menu transition-show="jump-down" transition-hide="jump-up">
<q-list dense style="min-width: 160px">
<q-item
clickable
v-close-popup
@click="helpPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>วยราชการ</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="repatriationPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>งตวกล</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="appointPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>แตงต-เลอน-าย</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="appointEmployeePost"
v-if="profileType == 'employee'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>ปรบระดบชนงาน - าย</q-item-section>
</q-item>
<q-separator />
<q-item clickable v-close-popup @click="clickPassaway">
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>งแกกรรม</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="outPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>ใหออกจากราชการ</q-item-section>
</q-item>
<!-- <q-separator />
<div v-if="!roleKeyregistry && !roleRegistryverify">
<q-btn
v-if="
profileType == 'officer' ||
(profileType == 'employee' && employeeClass == 'perm')
"
round
flat
:color="reasonStatus ? 'primary' : 'pink-5'"
:icon="
reasonStatus
? 'mdi-home-import-outline'
: 'mdi-home-export-outline'
"
>
<q-menu transition-show="jump-down" transition-hide="jump-up">
<q-list dense style="min-width: 160px">
<q-item
clickable
v-close-popup
@click="helpPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>วยราชการ</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="repatriationPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>งตวกล</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="appointPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>แตงต-เลอน-าย</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="appointEmployeePost"
v-if="profileType == 'employee'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>ปรบระดบชนงาน - าย</q-item-section>
</q-item>
<q-separator />
<q-item clickable v-close-popup @click="clickPassaway">
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>งแกกรรม</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="outPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>ใหออกจากราชการ</q-item-section>
</q-item>
<!-- <q-separator />
<q-item
clickable
v-close-popup
@ -249,22 +255,23 @@
</q-item-section>
<q-item-section>ไลออกจากราชการ</q-item-section>
</q-item> -->
<q-separator />
<q-item
clickable
v-close-popup
@click="otherPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>นๆ</q-item-section>
</q-item>
<q-separator />
</q-list>
</q-menu>
<!-- <q-tooltip>งรายช</q-tooltip> -->
</q-btn>
<q-separator />
<q-item
clickable
v-close-popup
@click="otherPost"
v-if="profileType == 'officer'"
>
<q-item-section style="min-width: 0px" avatar class="q-py-sm">
</q-item-section>
<q-item-section>นๆ</q-item-section>
</q-item>
<q-separator />
</q-list>
</q-menu>
<!-- <q-tooltip>งรายช</q-tooltip> -->
</q-btn>
</div>
<!-- ดไปเพราะทำสวนของพนราชการแล -->
<!-- <q-btn
@ -781,6 +788,7 @@ import type { DataOption } from "@/modules/04_registry/interface/index/Main";
import http from "@/plugins/http";
import config from "@/app.config";
import { useProfileDataStore } from "@/modules/04_registry/store";
import keycloak from "@/plugins/keycloak";
const $q = useQuasar();
const store = useDataStore();
@ -871,10 +879,30 @@ const reasonOptions = ref<DataOption[]>([
},
]);
const roleKeyregistry = ref<boolean>(false);
const roleRegistryverify = ref<boolean>(false);
function onClickVerified() {
dialogConfirm(
$q,
async () => {},
"ยืนยันการตรวจสอบข้อมูล",
"ต้องการยืนยันการตรวจสอบข้อมูลนี้หรือไม่ ?"
);
}
onMounted(async () => {
// await checkProfileData();
await fetchData();
if (keycloak.tokenParsed != null) {
roleKeyregistry.value = await keycloak.tokenParsed.role.includes(
"keyregistry"
);
roleRegistryverify.value = await keycloak.tokenParsed.role.includes(
"registryverify"
);
}
console.log(roleKeyregistry.value, roleRegistryverify.value);
await changeTab("information");
await fetchData();
await checIsVerified();
});
const fetchData = async () => {
@ -907,21 +935,29 @@ const fetchData = async () => {
});
};
const checkProfileData = async () => {
showLoader();
const isVerified = ref<boolean>(false);
async function checIsVerified() {
// showLoader();
await http
.get(config.API.profileCheckId(profileId.value))
.get(config.API.profileInforId(profileId.value))
.then((res) => {
let data = res.data.result;
if (data == false) router.push("/registry");
const data = res.data.result;
profileStore.isVerified = data.isVerified
? true
: roleRegistryverify.value
? true
: roleKeyregistry.value
? false
: false;
})
.catch((e) => {
router.push("/registry");
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
// hideLoader();
});
};
}
const fetchAvatarHistory = async () => {
showLoader();
@ -1502,7 +1538,12 @@ const clickSaveDeceased = async () => {
watch(
() => profileStore.isLoad,
() => {
const num = profileType.value === 'officer' ? 32:employeeClass.value === 'temp' ? 29:31
const num =
profileType.value === "officer"
? 32
: employeeClass.value === "temp"
? 29
: 31;
profileStore.isLoad >= num && hideLoader();
}
);

View file

@ -31,6 +31,7 @@ interface RequestItemsObject {
insigniaLast: String;
isLeave: String;
leaveDateOrder: Date | string | null;
isVerified: boolean;
}
//columns

View file

@ -32,6 +32,7 @@ interface ResponseObject {
insigniaLast: String;
isLeave: boolean;
leaveDateOrder: Date | null;
isVerified: boolean;
}
export type { ResponseObject };

View file

@ -2,6 +2,7 @@ import { ref, computed } from "vue";
import { defineStore } from "pinia";
export const useProfileDataStore = defineStore("profile", () => {
const isVerified = ref<boolean>(false);
const emplployeeClass = ref<string | null>("");
interface profile {
main: { columns: String[] };
@ -77,6 +78,7 @@ export const useProfileDataStore = defineStore("profile", () => {
return {
isLoad,
isVerified,
profileData,
changeProfileColumns,
birthDate,

View file

@ -94,26 +94,39 @@
<div v-if="col.name == 'no'" class="table_ellipsis">
{{ props.rowIndex + 1 }}
</div>
<div v-else-if="col.name == 'isVerified'">
<q-icon
v-if="props.row.isVerified"
name="verified"
color="green"
size="2rem"
/>
</div>
<div v-else-if="col.name == 'fullname'">
<div class="row col-12 wrap items-center">
<img
v-if="props.row.avatar == null"
src="@/assets/avatar_user.jpg"
class="col-4 img-info"
/>
<img
v-else
:src="props.row.avatar"
class="col-4 img-info"
/>
<div class="col-4">
<div class="text-weight-medium">
{{ props.row.fullname }}
</div>
<div class="text-weight-light">
{{ props.row.citizenId }}
</div>
</div>
<q-item>
<q-item-section avatar>
<img
v-if="props.row.avatar == null"
src="@/assets/avatar_user.jpg"
class="col-4 img-info"
/>
<img
v-else
:src="props.row.avatar"
class="col-4 img-info"
/>
</q-item-section>
<q-item-section>
<div class="text-weight-medium">
{{ props.row.fullname }}
</div>
<div class="text-weight-light">
{{ props.row.citizenId }}
</div>
</q-item-section>
</q-item>
</div>
</div>
<div v-else class="table_ellipsis">
@ -182,6 +195,7 @@ const selected = ref<string>("");
const nodesTree = ref<treeTab[]>([]);
const visibleColumns = ref<String[]>([]);
visibleColumns.value = [
"isVerified",
"no",
"fullname",
"fullnameOld",
@ -209,6 +223,7 @@ visibleColumns.value = [
];
const visibleColumnsOfficer = ref<String[]>([]);
visibleColumnsOfficer.value = [
"isVerified",
"no",
"fullname",
"fullnameOld",
@ -235,6 +250,14 @@ visibleColumnsOfficer.value = [
"leaveDateOrder",
];
const columns = ref<QTableProps["columns"]>([
{
name: "isVerified",
align: "center",
label: "",
sortable: true,
field: "isVerified",
headerStyle: "min-width: 50px",
},
{
name: "no",
align: "left",
@ -542,6 +565,7 @@ const columns = ref<QTableProps["columns"]>([
const rows = ref<RequestItemsObject[]>([]);
const visibleColumnsEmployee = ref<String[]>([]);
visibleColumnsEmployee.value = [
"isVerified",
"no",
"fullname",
"fullnameOld",
@ -567,6 +591,14 @@ visibleColumnsEmployee.value = [
"leaveDateOrder",
];
const columnsEmployee = ref<QTableProps["columns"]>([
{
name: "isVerified",
align: "center",
label: "",
sortable: true,
field: "isVerified",
headerStyle: "min-width: 50px",
},
{
name: "no",
align: "left",
@ -845,6 +877,7 @@ const columnsEmployee = ref<QTableProps["columns"]>([
]);
const visibleColumnsEmployeeTemp = ref<String[]>([]);
visibleColumnsEmployeeTemp.value = [
"isVerified",
"no",
"fullname",
"fullnameOld",
@ -870,6 +903,14 @@ visibleColumnsEmployeeTemp.value = [
"leaveDateOrder",
];
const columnsEmployeeTemp = ref<QTableProps["columns"]>([
{
name: "isVerified",
align: "center",
label: "",
sortable: true,
field: "isVerified",
headerStyle: "min-width: 50px",
},
{
name: "no",
align: "left",
@ -1316,6 +1357,7 @@ const doSearch = async () => {
})
.then((res) => {
let data = res.data.result;
rows.value = [];
data.map((e: ResponseObject) => {
rows.value.push({
@ -1358,6 +1400,7 @@ const doSearch = async () => {
? null
: date2Thai(new Date(e.leaveDateOrder)),
refSalary: e.refSalary,
isVerified: e.isVerified,
});
});
})