hrms-mgt/src/modules/06_retirement/components/resign/Resign.vue

546 lines
17 KiB
Vue
Raw Normal View History

<script setup lang="ts">
2023-08-14 16:45:23 +07:00
import { ref, onMounted, computed } from "vue";
import { useQuasar } from "quasar";
import { useRouter } from "vue-router";
import { useCounterMixin } from "@/stores/mixin";
2023-08-14 16:45:23 +07:00
import { useRetirementDataStore } from "@/modules/06_retirement/store";
2023-08-29 15:40:02 +07:00
import DialogHeader from "@/modules/06_retirement/components/DialogHeader.vue";
2023-08-14 16:45:23 +07:00
import http from "@/plugins/http";
import config from "@/app.config";
2023-08-14 16:45:23 +07:00
import type { QTableProps } from "quasar";
import type { ResponseItems } from "@/modules/06_retirement/interface/response/Main";
const $q = useQuasar(); //ใช้ noti quasar
const router = useRouter();
const mixin = useCounterMixin();
2023-08-14 16:45:23 +07:00
const RetirementData = useRetirementDataStore();
const { messageError, date2Thai, showLoader, hideLoader, success } = mixin;
const { statusText } = RetirementData;
2023-08-14 16:45:23 +07:00
const rows = ref<ResponseItems[]>([]);
const columns = ref<QTableProps["columns"]>([
2023-08-14 16:45:23 +07:00
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: true,
field: "no",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "prefix",
align: "left",
label: "คำนำหน้า",
sortable: true,
field: "prefix",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "fullname",
align: "left",
label: "ชื่อ-นามสกุล",
sortable: true,
field: "fullname",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "location",
align: "left",
label: "สถานที่ยื่นขอลาออกจากราชการ",
sortable: true,
field: "location",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
2023-08-14 16:45:23 +07:00
{
name: "positionTypeOld",
align: "left",
label: "ตำแหน่งในสายงาน",
sortable: true,
field: "positionTypeOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "positionLevelOld",
align: "left",
label: "ระดับ",
sortable: true,
field: "positionLevelOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "positionNumberOld",
align: "left",
label: "เลขที่",
sortable: true,
field: "positionNumberOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2023-08-14 16:45:23 +07:00
name: "organizationPositionOld",
align: "left",
2023-08-14 16:45:23 +07:00
label: "สังกัด",
sortable: true,
field: "organizationPositionOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "datetext",
align: "left",
label: "วันที่ดำเนินการ",
sortable: true,
field: "datetext",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
sortOrder: "da",
},
2023-08-14 16:45:23 +07:00
{
name: "statustext",
align: "left",
label: "สถานะ",
sortable: true,
field: "statustext",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
]);
const visibleColumns = ref<string[]>([
"no",
"prefix",
"fullname",
"location",
2023-08-14 16:45:23 +07:00
"positionTypeOld",
"positionLevelOld",
"positionNumberOld",
"organizationPositionOld",
"datetext",
2023-08-14 16:45:23 +07:00
"statustext",
]);
const filters = ref<ResponseItems[]>([]);
const rows2 = ref<ResponseItems[]>([]);
const columns2 = ref<QTableProps["columns"]>([
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "no",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2023-08-14 16:45:23 +07:00
name: "prefix",
align: "left",
label: "คำนำหน้า",
sortable: true,
field: "prefix",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "fullname",
align: "left",
label: "ชื่อ-นามสกุล",
sortable: true,
field: "fullname",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "positionTypeOld",
align: "left",
label: "ตำแหน่งในสายงาน",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "positionTypeOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2023-08-14 16:45:23 +07:00
name: "positionLevelOld",
align: "left",
label: "ระดับ",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "positionLevelOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2023-08-14 16:45:23 +07:00
name: "positionNumberOld",
align: "left",
2023-08-14 16:45:23 +07:00
label: "เลขที่",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "positionNumberOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2023-08-14 16:45:23 +07:00
name: "organizationPositionOld",
align: "left",
label: "สังกัด",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "organizationPositionOld",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "datetext",
align: "left",
label: "วันที่ดำเนินการ",
sortable: true,
field: "datetext",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
sortOrder: "da",
},
{
2023-08-14 16:45:23 +07:00
name: "statustext",
align: "left",
label: "สถานะ",
sortable: true,
2023-08-14 16:45:23 +07:00
field: "statustext",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2023-08-14 16:45:23 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
]);
2023-08-14 16:45:23 +07:00
const visibleColumns2 = ref<string[]>([
"no",
"prefix",
"fullname",
2023-08-14 16:45:23 +07:00
"positionTypeOld",
"positionLevelOld",
"positionNumberOld",
"organizationPositionOld",
"datetext",
2023-08-14 16:45:23 +07:00
"statustext",
]);
2023-08-14 16:45:23 +07:00
const modal = ref<boolean>(false);
const filterKeyword2 = ref<string>("");
//ค้นหา คอลัมน์ คอลัมน์ที่แสดง
const filterKeyword = ref<string>("");
const filterRef = ref<any>(null);
const openModal = () => (modal.value = true);
const closeModal = () => (modal.value = false);
const selected = ref<ResponseItems[]>([]);
const checkSelected = computed(() => {
if (selected.value.length === 0) {
2023-08-14 16:45:23 +07:00
return true;
}
});
const resetFilter = () => {
filterKeyword.value = "";
filterRef.value.focus();
};
const openModalOrder = () => {
2023-08-14 16:45:23 +07:00
openModal();
const row = filters.value.filter(
(r: ResponseItems) =>
2023-09-08 17:53:02 +07:00
r.status == "PENDING" || r.status == "APPROVE" || r.status == "REJECT"
2023-08-14 16:45:23 +07:00
);
rows2.value = row;
2023-08-14 16:45:23 +07:00
};
onMounted(async () => {
await fecthlist();
});
const fecthlist = async () => {
showLoader();
await http
.get(config.API.listResign())
.then((res: any) => {
2023-08-14 16:45:23 +07:00
const data = res.data.result;
let list: ResponseItems[] = [];
data.map((r: ResponseItems) => {
list.push({
datetext:
r.createdAt == null ? "-" : date2Thai(new Date(r.createdAt)),
2023-08-14 16:45:23 +07:00
activeDate: new Date(),
createdAt: new Date(r.createdAt),
2023-08-14 16:45:23 +07:00
firstName: r.firstName ?? "",
id: r.id ?? "",
isActive: r.isActive ? r.isActive : false,
lastName: r.lastName ?? "",
location: r.location ?? "",
organizationPositionOld: r.organizationPositionOld ?? "",
positionLevelOld: r.positionLevelOld ?? "",
positionNumberOld: r.positionNumberOld ?? "",
positionTypeOld: r.positionTypeOld ?? "",
prefix: r.prefix ?? "",
profileId: r.profileId ?? "",
reason: r.reason ?? "",
salary: r.salary ? r.salary : 0,
sendDate: new Date(),
status: r.status ?? "",
statustext: status(r.status ?? ""),
2023-08-14 16:45:23 +07:00
fullname: `${r.firstName ?? ""} ${r.lastName ?? ""}`,
});
});
rows.value = list;
filters.value = list;
})
.catch((e: any) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
};
2023-08-14 16:45:23 +07:00
const saveOrder = async () => {
const id = selected.value.map((r) => r.id);
const body = {
id,
};
2023-08-14 16:45:23 +07:00
showLoader();
await http
.post(config.API.resignReport, body)
.then((res: any) => {
// const data = res.data.result;
// console.log(data);
success($q, "ส่งไปออกคำสั่งลาออกสำเร็จ");
closeModal();
})
.catch((e) => {
messageError($q, e);
})
.finally(async () => {
await fecthlist();
hideLoader();
});
};
const status = (val: string) => {
switch (val) {
2023-09-08 17:53:02 +07:00
case "WAITTING":
return "รอดำเนินการ";
case "PENDING":
return "เลือกตำแหน่งแล้ว";
case "APPROVE":
return "อนุมัติ";
case "REJECT":
return "ยับยั้ง";
case "DELETE":
return "ยกเลิกการลาออก";
case "REPORT":
return "ส่งรายชื่อไปออกคำสั่ง";
case "DONE":
return "ออกคำสั่งเสร็จแล้ว";
default:
return "-";
}
};
</script>
<template>
<div class="toptitle text-dark col-12 row items-center">รายการลาออก</div>
<q-card flat bordered class="col-12 q-mt-sm">
<q-separator />
<div class="col-12 row q-pa-md">
<div class="row col-12">
<div class="row col-12 q-col-gutter-sm">
2023-09-08 17:53:02 +07:00
<q-btn @click="openModalOrder" size="14px" flat round color="add" icon="mdi-account-arrow-right">
2023-08-14 16:45:23 +07:00
<q-tooltip>งไปออกคำสงลาออก</q-tooltip>
</q-btn>
<q-space />
2023-09-08 17:53:02 +07:00
<q-input class="col-xs-12 col-sm-3 col-md-2" standout dense v-model="filterKeyword" ref="filterRef" outlined
debounce="300" placeholder="ค้นหา">
<template v-slot:append>
<q-icon v-if="filterKeyword == ''" name="search" />
2023-09-08 17:53:02 +07:00
<q-icon v-if="filterKeyword !== ''" name="clear" class="cursor-pointer" @click="resetFilter" />
</template>
</q-input>
2023-09-08 17:53:02 +07:00
<q-select v-model="visibleColumns" multiple outlined dense options-dense :display-value="$q.lang.table.columns"
emit-value map-options :options="columns" option-value="name" options-cover style="min-width: 150px"
class="col-xs-12 col-sm-3 col-md-2" />
</div>
<div class="col-12 q-pt-sm">
2023-09-08 17:53:02 +07:00
<d-table :columns="columns" :rows="rows" :filter="filterKeyword" row-key="id" :visible-columns="visibleColumns">
<template v-slot:header="props">
<q-tr :props="props">
<q-th v-for="col in props.cols" :key="col.name" :props="props">
<span class="text-weight-medium">{{ col.label }}</span>
</q-th>
</q-tr>
</template>
<template v-slot:body="props">
2023-09-08 17:53:02 +07:00
<q-tr :props="props" class="cursor-pointer" @click="router.push(`/retirement/resign/${props.row.id}`)">
2023-08-14 16:45:23 +07:00
<q-td key="no" :props="props">
{{ props.rowIndex + 1 }}
2023-08-14 16:45:23 +07:00
</q-td>
<q-td key="prefix" :props="props">
{{ props.row.prefix }}
</q-td>
<q-td key="fullname" :props="props">
{{ props.row.fullname }}
</q-td>
<q-td key="location" :props="props">
{{ props.row.location }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="positionTypeOld" :props="props">
{{ props.row.positionTypeOld }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="positionLevelOld" :props="props">
{{ props.row.positionLevelOld }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="positionNumberOld" :props="props">
{{ props.row.positionNumberOld }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="organizationPositionOld" :props="props">
<div class="table_ellipsis">
{{ props.row.organizationPositionOld }}
</div>
</q-td>
<q-td key="datetext" :props="props">
{{ props.row.datetext }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="statustext" :props="props">
{{ props.row.statustext }}
</q-td>
</q-tr>
</template>
2023-08-14 16:45:23 +07:00
</d-table>
</div>
</div>
</div>
</q-card>
2023-08-14 16:45:23 +07:00
<q-dialog v-model="modal">
<q-card style="width: 1200px; max-width: 80vw">
<DialogHeader title="ส่งไปออกคำสั่ง" :close="closeModal" />
2023-08-14 16:45:23 +07:00
<q-separator />
<q-card-section class="q-pt-none">
<div class="row justify-end">
<div class="col-5">
<q-toolbar style="padding: 0">
2023-09-08 17:53:02 +07:00
<q-input borderless outlined dense debounce="300" v-model="filterKeyword2" placeholder="ค้นหา"
style="width: 850px; max-width: auto">
2023-08-14 16:45:23 +07:00
<template v-slot:append>
<q-icon v-if="filterKeyword2 == ''" name="search" />
2023-09-08 17:53:02 +07:00
<q-icon v-if="filterKeyword2 !== ''" name="clear" class="cursor-pointer" @click="resetFilter" />
2023-08-14 16:45:23 +07:00
</template>
</q-input>
2023-09-08 17:53:02 +07:00
<q-select v-model="visibleColumns2" multiple outlined dense options-dense
:display-value="$q.lang.table.columns" emit-value map-options :options="columns2" option-value="name"
options-cover style="min-width: 150px" class="gt-xs q-ml-sm" />
2023-08-14 16:45:23 +07:00
</q-toolbar>
</div>
</div>
2023-09-08 17:53:02 +07:00
<d-table :columns="columns2" :rows="rows2" :filter="filterKeyword2" row-key="id"
:visible-columns="visibleColumns2" selection="multiple" v-model:selected="selected">
2023-08-14 16:45:23 +07:00
<template v-slot:header-selection="scope">
2023-09-08 17:53:02 +07:00
<q-checkbox keep-color color="primary" dense v-model="scope.selected" />
2023-08-14 16:45:23 +07:00
</template>
2023-08-14 16:45:23 +07:00
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td>
2023-09-08 17:53:02 +07:00
<q-checkbox keep-color color="primary" dense v-model="props.selected" />
2023-08-14 16:45:23 +07:00
</q-td>
<q-td key="no" :props="props">
{{ props.rowIndex + 1 }}
</q-td>
<q-td key="prefix" :props="props">
{{ props.row.prefix }}
</q-td>
<q-td key="fullname" :props="props">
{{ props.row.fullname }}
</q-td>
<q-td key="positionTypeOld" :props="props">
{{ props.row.positionTypeOld }}
</q-td>
<q-td key="positionLevelOld" :props="props">
{{ props.row.positionLevelOld }}
</q-td>
<q-td key="positionNumberOld" :props="props">
{{ props.row.positionNumberOld }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="organizationPositionOld" :props="props">
<div class="table_ellipsis">
{{ props.row.organizationPositionOld }}
</div>
</q-td>
<q-td key="datetext" :props="props">
{{ props.row.datetext }}
</q-td>
2023-08-14 16:45:23 +07:00
<q-td key="statustext" :props="props">
{{ props.row.statustext }}
</q-td>
</q-tr>
</template>
</d-table>
</q-card-section>
2023-08-14 16:45:23 +07:00
<q-card-actions align="right" class="bg-white text-teal">
2023-09-08 17:53:02 +07:00
<q-btn label="ส่งไปออกคำสั่ง" @click="saveOrder" :disable="checkSelected" color="public" />
2023-08-14 16:45:23 +07:00
</q-card-actions>
</q-card>
</q-dialog>
</template>
<style scoped lang="scss"></style>