hrms-user/src/modules/06_evaluate/views/EvaluateMain.vue
2024-01-05 14:24:54 +07:00

179 lines
5.2 KiB
Vue

<script setup lang="ts">
import { ref, onMounted } from "vue";
import { useQuasar } from "quasar";
import { useRouter } from "vue-router";
import http from "@/plugins/http";
import config from "@/app.config";
/** import Type*/
import type { ListMenu } from "@/modules/06_evaluate/interface/evalute";
/** import Components*/
import TableListEvaluate from "@/modules/06_evaluate/components/TableListEvaluate.vue"; // ตารางประเมิน
import DialogMain from "@/modules/06_evaluate/components/DialogMain.vue"; // popup การเพิ่มประเมิน
/** import Store*/
import { useEvaluateStore } from "@/modules/06_evaluate/store";
import { useCounterMixin } from "@/stores/mixin";
/** use*/
const mixin = useCounterMixin();
const store = useEvaluateStore();
const router = useRouter();
const $q = useQuasar();
const { showLoader, hideLoader, messageError } = mixin;
/** ตัวแปร*/
const modal = ref<boolean>(false);
const menu = ref<ListMenu>();
const listMenu = ref<ListMenu[]>([
{
val: "EXPERT",
label: "ประเมินชำนาญการ",
},
{
val: "SPECIAL_EXPERT",
label: "ประเมินชำนาญการพิเศษ",
},
]);
/**
* function เปืด popup เพิ่มการประเมิน
* @param data
*/
function onclickAddEvaluate(data: ListMenu) {
modal.value = !modal.value;
menu.value = data;
}
/** ตัวแปร Paging*/
const page = ref<number>(1);
const pageSize = ref<number>(25);
const maxPage = ref<number>(10);
/** function เรียกรายการประเมิน*/
async function fetchEvaluteList() {
showLoader();
await http
.get(
config.API.evaluationList() +
`?page=${page.value}&pageSize=${pageSize.value}`
)
.then((res) => {
maxPage.value = Math.ceil(res.data.result.total / pageSize.value);
store.fetchEvaluateList(res.data.result.data);
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
/**
* function updatePaging
* @param newPagination ข้อมูลใหม่ของ Paging
* @param currentPage หน้า Page
*/
async function updatePaging(newPagination: any, currentPage: number) {
page.value = currentPage;
pageSize.value = newPagination.rowsPerPage;
await fetchEvaluteList();
}
/** hook lifecycle*/
onMounted(async () => {
await fetchEvaluteList();
});
</script>
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
@click="router.go(-1)"
/>
<div>ประเมนบคคล</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-11 row q-col-gutter-md">
<div class="col-12 row">
<q-card bordered class="col-12 row caedNone q-pa-md">
<div class="row col-12 q-mb-sm q-col-gutter-sm">
<div class="col-xs-12 col-sm-3 col-md-2">
<q-btn size="12px" flat round color="primary" icon="mdi-plus">
<q-menu>
<q-list style="min-width: auto">
<q-item
v-for="(item, index) in listMenu"
:key="index"
clickable
v-close-popup
@click.stop="onclickAddEvaluate(item)"
>
<q-item-section>{{ item.label }}</q-item-section>
<q-tooltip>{{ item.label }}</q-tooltip>
</q-item>
</q-list>
</q-menu>
<q-tooltip>เพมการประเมนบคคล</q-tooltip>
</q-btn>
</div>
<q-space />
<div class="col-xs-12 col-sm-3 col-md-2">
<q-input
dense
outlined
v-model="store.filterKeyword"
label="ค้นหา"
debounce="300"
>
<template v-slot:append>
<q-icon name="search" />
</template>
</q-input>
</div>
<div class="col-xs-12 col-sm-3 col-md-2">
<q-select
v-model="store.visibleColumns"
multiple
outlined
dense
options-dense
:display-value="$q.lang.table.columns"
emit-value
map-options
:options="store.columns"
option-value="name"
options-cover
/>
</div>
</div>
<div class="col-12">
<TableListEvaluate
:page="page"
:pageSize="pageSize"
:maxPage="maxPage"
@update:pagination="updatePaging"
/>
</div>
</q-card>
</div>
</div>
</div>
<DialogMain :modal="modal" :menu="menu" :close="onclickAddEvaluate" />
</template>
<style lang="scss" scoped></style>