hrms-recruit/src/views/MainLayout.vue
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 9406822f64 fix:คำผิด
2025-11-04 11:57:11 +07:00

226 lines
5.7 KiB
Vue

<script setup lang="ts">
import { useQuasar } from 'quasar'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { useExamDataStore } from '@/modules/01_exam/store'
import { useDataStore } from '@/stores/data'
import { useCounterMixin } from '@/stores/mixin'
import { storeToRefs } from 'pinia'
import keycloak from '@/plugins/keycloak'
import http from '@/plugins/http'
import config from '@/app.config'
const route = useRoute()
const $q = useQuasar()
const mixin = useCounterMixin() //เรียกฟังก์ชันกลาง
const { statusCandidate, messageError } = mixin
const storeExam = useExamDataStore()
const store = useDataStore()
const { loader } = storeToRefs(store)
const dataStore = useDataStore()
const { loaderPage } = dataStore
const status = ref<string>('register')
const examId = ref<string>('')
const positionId = ref<string>('')
onMounted(async () => {
examId.value = route.params.id ? route.params.id.toString() : ''
positionId.value = route.params.positionId ? route.params.positionId.toString() : ''
await fetchStatus()
})
/**
* logout keycloak
* confirm ก่อนออกจากระบบ
*/
const doLogout = () => {
$q.dialog({
title: 'ยืนยันการออกจากระบบ',
message: `ต้องการออกจากระบบใช่หรือไม่?`,
cancel: 'ยกเลิก',
ok: 'ยืนยัน',
persistent: true
}).onOk(() => {
keycloak.logout()
})
}
const fetchStatus = async () => {
loaderPage(true)
await http
.get(config.API.candidateStatus(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
status.value = data
})
.catch((e) => {
// messageError($q, e)
})
.finally(() => {
loaderPage(false)
})
}
const getFontColor = (val: string) => {
switch (val) {
case 'register':
return 'text-blue'
case 'checkRegister':
return 'text-orange'
case 'payment':
return 'text-blue'
case 'rejectRegister':
return 'text-red-12'
case 'checkPayment':
return 'text-orange'
case 'rejectPayment':
return 'text-red-12'
case 'checkSeat':
return 'text-blue'
case 'checkPoint':
return 'text-blue'
case 'done':
return 'text-green'
case 'waiver':
return 'text-orange'
default:
return '-'
}
}
</script>
<!-- โครงเว -->
<template>
<!-- ปรบใหบหน รายละเอยดรายการสอบทงหมด -->
<q-layout view="lHh LpR lff" class="bgColor text-dark">
<!-- header -->
<q-header flat class="bg-white text-white row justify-center header" height-hint="7">
<q-toolbar style="padding: 0% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<q-toolbar-title shrink class="row items-center no-wrap">
<q-btn flat class="bg-white" dense round>
<q-avatar size="35px">
<img src="../assets/logo.png" />
</q-avatar>
</q-btn>
<div class="row q-ml-md text-dark" v-if="$q.screen.gt.xs">
<div class="col-12 textline1">ระบบทรพยากรบคคล</div>
<div class="text-caption textline2">กรงเทพมหานคร</div>
</div>
</q-toolbar-title>
<q-space />
<div class="q-mr-md text-bold" :class="getFontColor(storeExam.status)">
{{ statusCandidate(storeExam.status) }}&nbsp;&nbsp;
</div>
<q-btn
v-if="$q.screen.gt.xs"
class="bg-amber-1 text-amber-9"
icon="mdi-logout-variant"
size="12px"
label="ออกจากระบบ"
flat
v-close-popup
@click="doLogout"
/>
<q-btn
v-else
class="bg-amber-1 text-amber-9"
icon="mdi-logout-variant"
flat
v-close-popup
@click="doLogout"
/>
</q-toolbar>
</q-header>
<!-- end header -->
<q-page-container class="row justify-center">
<q-page style="padding: 1.5% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<router-view :key="$route.fullPath" />
</q-page>
</q-page-container>
<full-loader :visibility="loader" />
</q-layout>
</template>
<style>
.bgColor {
background: #f6f9fa;
}
.tabNative {
color: grey;
padding-left: 8%;
border-radius: 100px 0px 0px 100px;
}
.tabActive {
padding-left: 8%;
background: #e4f2ff;
border-radius: 100px 0px 0px 100px;
}
.q-card {
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261);
}
.q-card--bordered {
border: 1px solid #92b4c847;
box-shadow: none !important;
}
.q-stepper {
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261);
}
.q-menu {
box-shadow: 3px 3px 10px 1px rgba(95, 95, 95, 0.15) !important;
}
.toptitle {
font-size: 1.2rem;
font-weight: bold;
}
.q-field--outlined .q-field__control {
border-radius: 5px;
}
.q-field--outlined .q-field__control:before,
.q-field .q-field__control:before {
border-color: #c8d3db;
}
.q-field--outlined .q-icon {
color: #7474747f;
}
/* custom scrollbar */
::-webkit-scrollbar {
width: 20px;
height: 20px;
}
::-webkit-scrollbar-track {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: #d6dee1;
border-radius: 20px;
border: 6px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
background-color: #a8bbbf;
}
.header {
border-bottom: 1px solid #92b4c847;
height: 50px;
}
.textline1 {
font-size: 0.9rem;
line-height: 1.2rem !important;
font-weight: 500;
}
.textline2 {
line-height: 1rem !important;
font-weight: 400;
color: #96a9ad;
}
</style>