Merge branch 'develop' into setthawut

# Conflicts:
#	src/views/HomeView.vue
This commit is contained in:
setthawutttty 2025-03-20 13:13:44 +07:00
commit 06c7083eff
6 changed files with 82 additions and 44 deletions

View file

@ -20,7 +20,6 @@ const {
hideLoader, hideLoader,
messageError, messageError,
convertDateToAPI, convertDateToAPI,
convertDatetimeToAPI,
} = useCounterMixin() } = useCounterMixin()
/** /**
@ -42,6 +41,10 @@ const props = defineProps({
console.log('fetchData func') console.log('fetchData func')
}, },
}, },
action: {
type: String,
default: '',
},
}) })
const dataByIdVal = ref<DataCheckIn>() // const dataByIdVal = ref<DataCheckIn>() //
@ -84,6 +87,13 @@ function onCkickSave() {
} }
} }
} }
//
if (props.action === 'special') {
checkboxIn.value = true
checkboxOut.value = true
}
if (checkboxIn.value === false && checkboxOut.value === false) { if (checkboxIn.value === false && checkboxOut.value === false) {
checkstatusBox.value = true checkstatusBox.value = true
} }
@ -94,7 +104,7 @@ function onCkickSave() {
) { ) {
dialogConfirm($q, async () => { dialogConfirm($q, async () => {
const data: FormTimeStemp = { const data: FormTimeStemp = {
checkDate: convertDatetimeToAPI(date.value as Date), checkDate: convertDateToAPI(date.value as Date),
checkInEdit: checkboxIn.value, checkInEdit: checkboxIn.value,
checkOutEdit: checkboxOut.value, checkOutEdit: checkboxOut.value,
description: reason.value, description: reason.value,
@ -151,10 +161,11 @@ onMounted(() => {
if (dataByIdVal.value == null) { if (dataByIdVal.value == null) {
statusAction.value = true statusAction.value = true
} else { } else {
date.value = convertDatetimeToAPI(new Date(dataByIdVal.value.checkInDateTime)) date.value = convertDateToAPI(new Date(dataByIdVal.value.checkInDateTime))
} }
}) })
</script> </script>
<template> <template>
<div class="col-12 row"> <div class="col-12 row">
<div class="row q-col-q-gutter-sm q-pa-md"> <div class="row q-col-q-gutter-sm q-pa-md">
@ -201,7 +212,11 @@ onMounted(() => {
outlined outlined
dense dense
:model-value="date !== null ? date2Thai(new Date(date)) : null" :model-value="date !== null ? date2Thai(new Date(date)) : null"
:label="`${'วันที่ขอแก้ไข'}`" :label="`${
action === 'edit'
? 'วันที่ขอแก้ไข'
: 'วันที่ขอลงเวลากรณีพิเศษ'
}`"
format-header="YYYY-MM-DD" format-header="YYYY-MM-DD"
lazy-rules lazy-rules
:rules="[(val:string) => !!val || 'กรุณาเลือกวันที่']" :rules="[(val:string) => !!val || 'กรุณาเลือกวันที่']"
@ -221,6 +236,7 @@ onMounted(() => {
</q-card> </q-card>
<q-card <q-card
v-if="action === 'edit'"
flat flat
bordered bordered
class="q-pa-sm col-12 q-mt-sm" class="q-pa-sm col-12 q-mt-sm"
@ -257,7 +273,12 @@ onMounted(() => {
กรณาเลอก กรณาเลอก
</div> </div>
<q-card flat bordered class="q-pa-sm col-12 q-mt-sm"> <q-card
flat
bordered
class="q-pa-sm col-12 q-mt-sm"
:style="action == 'special' ? 'margin-bottom: 150px' : ''"
>
<q-input <q-input
ref="reasonRef" ref="reasonRef"
dense dense

View file

@ -31,6 +31,10 @@ const props = defineProps({
type: Function, type: Function,
default: () => console.log('not function'), default: () => console.log('not function'),
}, },
action: {
type: String,
default: '',
},
}) })
const data = ref<DataCheckIn>() // const data = ref<DataCheckIn>() //
@ -56,7 +60,7 @@ watch(
) )
</script> </script>
<template> <template>
<q-dialog v-model="props.modal" persistent> <q-dialog v-model="props.modal" persistent m>
<q-card :style="$q.screen.lt.sm ? 'width: 100%;' : 'width: 320px;'"> <q-card :style="$q.screen.lt.sm ? 'width: 100%;' : 'width: 320px;'">
<HeaderPopup :title="props.title" :clickClose="clickClosePopup" /> <HeaderPopup :title="props.title" :clickClose="clickClosePopup" />
@ -64,6 +68,7 @@ watch(
:data-byId="data" :data-byId="data"
:close-popup="clickClosePopup" :close-popup="clickClosePopup"
:fetch-data="props.fetchData" :fetch-data="props.fetchData"
:action="props.action"
/> />
</q-card> </q-card>
</q-dialog> </q-dialog>

View file

@ -361,7 +361,11 @@ watch(
</q-td> </q-td>
<q-td v-if="tab === 'history'"> <q-td v-if="tab === 'history'">
<q-btn <q-btn
v-if="!props.row.isEdit" v-if="
!props.row.isEdit &&
(props.row.checkInStatus != 'ปกติ' ||
props.row.checkOutStatus != 'ปกติ')
"
style="min-width: 110px" style="min-width: 110px"
outline outline
icon="edit" icon="edit"
@ -495,6 +499,7 @@ watch(
:click-close="closePopup" :click-close="closePopup"
:title="titlePopup" :title="titlePopup"
:data-ById="dataRow" :data-ById="dataRow"
action="edit"
/> />
</template> </template>

View file

@ -30,7 +30,7 @@ const filterYear = ref<number>(stores.year) //ปีงบประมาณ
const titleName = ref<string>('เพิ่มรายการลงเวลากรณีพิเศษ') // popup const titleName = ref<string>('เพิ่มรายการลงเวลากรณีพิเศษ') // popup
const dateMonth = ref<DataDateMonthObject>({ const dateMonth = ref<DataDateMonthObject>({
month: new Date().getMonth(), month: new Date().getMonth(),
year: stores.year ? stores.year:new Date().getFullYear(), year: stores.year ? stores.year : new Date().getFullYear(),
}) })
const modalPopup = ref<boolean>(false) // modal const modalPopup = ref<boolean>(false) // modal
@ -154,6 +154,7 @@ watch(
<q-space /> <q-space />
<q-btn <q-btn
v-if="tab === 'time'"
unelevated unelevated
icon="add" icon="add"
:dense="$q.screen.lt.sm" :dense="$q.screen.lt.sm"
@ -168,6 +169,7 @@ watch(
:title="titleName" :title="titleName"
:clickClose="onClickClose" :clickClose="onClickClose"
:fetchData="props.fetchData" :fetchData="props.fetchData"
action="special"
/> />
</template> </template>

View file

@ -17,8 +17,8 @@ const { date2Thai, showLoader, hideLoader, messageError, dialogConfirm } = mixin
const $q = useQuasar() const $q = useQuasar()
const modalTime = ref<boolean>(false) // Dailog const modalTime = ref<boolean>(false) // Dailog
const stetusCheckin = ref<boolean>(true) // ,
const checkStatus = ref<string>('') const checkStatus = ref<string>('')
const statusCheckin = ref<boolean>(true) // ,
const msgCheckTime = ref<string>('') // const msgCheckTime = ref<string>('') //
const isDisabledCheckTime = ref<boolean>(false) // const isDisabledCheckTime = ref<boolean>(false) //
@ -31,7 +31,7 @@ async function fetchCheckTime() {
.get(config.API.checkTime()) .get(config.API.checkTime())
.then(async (res) => { .then(async (res) => {
const data = await res.data.result const data = await res.data.result
stetusCheckin.value = data.checkInId ? false : true statusCheckin.value = data.checkInId ? false : true
checkInId.value = data.checkInId ? data.checkInId : '' checkInId.value = data.checkInId ? data.checkInId : ''
}) })
.catch((err) => { .catch((err) => {
@ -103,7 +103,7 @@ const model = ref<string>('') // สถานที่ทำงาน
// //
const options = ref<string[]>([ const options = ref<string[]>([
'ปฏิบัติงานที่บ้าน', 'ปฏิบัติงานที่บ้าน',
'ลืมลงเวลาปฏิบัติงาน', // '',
'ไปประชุม/อบรม/สัมมนา/ปฏิบัติงานที่บ้านนอกสถานที่', 'ไปประชุม/อบรม/สัมมนา/ปฏิบัติงานที่บ้านนอกสถานที่',
'ขออนุญาตออกนอกสถานที่', 'ขออนุญาตออกนอกสถานที่',
'อื่นๆ', 'อื่นๆ',
@ -189,9 +189,9 @@ function validateForm() {
} }
} }
if (hasError.every((result) => result === true)) { if (hasError.every((result) => result === true)) {
if (stetusCheckin.value == false) { if (statusCheckin.value == false) {
getCheck() getCheck()
} else if (stetusCheckin.value) { } else if (statusCheckin.value) {
confirm() confirm()
} }
} }
@ -268,8 +268,8 @@ async function getCheck() {
/** ปิด popup แสดงการลงเวลา*/ /** ปิด popup แสดงการลงเวลา*/
async function onClickConfirm() { async function onClickConfirm() {
showLoader() showLoader()
if (!stetusCheckin.value) { if (!statusCheckin.value) {
stetusCheckin.value = true statusCheckin.value = true
} }
// await fetchCheckTime() // await fetchCheckTime()
@ -289,19 +289,19 @@ function updateWorkplace() {
/** /**
* เทนร class นหล * เทนร class นหล
* @param val stetusCheckin * @param val statusCheckin
*/ */
const getClass = (val: boolean) => { const getClass = (val: boolean) => {
return { return {
'bg-primary text-white col-12 row items-center q-px-md q-py-sm ': val, 'bg-primary text-white col-12 row items-center q-px-md q-py-sm ': val,
'bg-red-9 text-white col-12 row items-center q-px-md q-py-sm ': !val, 'bg-red-8 text-white col-12 row items-center q-px-md q-py-sm ': !val,
} }
} }
const getClassXS = (val: boolean) => { const getClassXS = (val: boolean) => {
return { return {
'bg-topIn text-white q-pa-lg col-12 row': val, 'text-white q-pa-lg col-12 row bg-primary': val,
'bg-topOut text-white q-pa-lg col-12 row': !val, 'text-white q-pa-lg col-12 row bg-red-8': !val,
} }
} }
const inQueue = ref<boolean>(false) const inQueue = ref<boolean>(false)
@ -367,22 +367,18 @@ onMounted(async () => {
" "
> >
<!-- <q-header elevated class="bg-purple"> --> <!-- <q-header elevated class="bg-purple"> -->
<div :class="getClass(stetusCheckin)" class="gt-xs"> <div :class="getClass(statusCheckin)" class="gt-xs">
<div class="col"> <div class="col">
<div class="row col-12 justify-center q-py-sm text-subtitle1"> <div class="row col-12 justify-center q-py-sm text-subtitle1">
<!-- <strong v-if="stetusCheckin" style="font-size: 1rem"> <strong v-if="!statusCheckin && inQueue">
ลงเวลาเขางาน
</strong> -->
<!-- <strong v-else style="font-size: 1rem">ลงเวลาออกงาน</strong> -->
<strong v-if="!stetusCheckin && inQueue">
ลงเวลาออกงาน (ระบบกำลงประมวลผล) ลงเวลาออกงาน (ระบบกำลงประมวลผล)
</strong> </strong>
<strong v-else-if="stetusCheckin && inQueue"> <strong v-else-if="statusCheckin && inQueue">
ลงเวลาเขางาน (ระบบกำลงประมวลผล) ลงเวลาเขางาน (ระบบกำลงประมวลผล)
</strong> </strong>
<strong v-else-if="stetusCheckin && !inQueue"> <strong v-else-if="statusCheckin && !inQueue">
ลงเวลาเขางาน ลงเวลาเขางาน
</strong> </strong>
@ -701,8 +697,10 @@ onMounted(async () => {
*หมายเหต คลกลงเวลาเขางานแลวระบบจะลงเวลาทนท *หมายเหต คลกลงเวลาเขางานแลวระบบจะลงเวลาทนท
</p> </p>
<q-btn <q-btn
:label="stetusCheckin ? 'ลงเวลาเข้างาน' : 'ลงเวลาออกงาน'" :label="statusCheckin ? 'ลงเวลาเข้างาน' : 'ลงเวลาออกงาน'"
:color="img == null ? 'grey-6' : 'primary'" :color="
img == null ? 'grey-6' : statusCheckin ? 'primary' : 'red-8'
"
push push
size="18px" size="18px"
:class="$q.screen.gt.xs ? 'q-px-md' : 'full-width q-pa-sm'" :class="$q.screen.gt.xs ? 'q-px-md' : 'full-width q-pa-sm'"
@ -725,23 +723,23 @@ onMounted(async () => {
<!-- top page sticky หนามอถ--> <!-- top page sticky หนามอถ-->
<q-page-sticky expand position="top" v-if="$q.screen.xs"> <q-page-sticky expand position="top" v-if="$q.screen.xs">
<div :class="getClassXS(stetusCheckin)"> <div :class="getClassXS(statusCheckin)">
<div class="col"> <div class="col">
<div class="row col-12 justify-right items-center text-body1"> <div class="row col-12 justify-right items-center text-subtitle1">
<strong v-if="!stetusCheckin && inQueue"> <strong v-if="!statusCheckin && inQueue">
ลงเวลาออกงาน (ระบบกำลงประมวลผล) ลงเวลาออกงาน (ระบบกำลงประมวลผล)
</strong> </strong>
<strong v-else-if="stetusCheckin && inQueue"> <strong v-else-if="statusCheckin && inQueue">
ลงเวลาเขางาน (ระบบกำลงประมวลผล) ลงเวลาเขางาน (ระบบกำลงประมวลผล)
</strong> </strong>
<strong v-else-if="stetusCheckin && !inQueue"> ลงเวลาเขางาน </strong> <strong v-else-if="statusCheckin && !inQueue"> ลงเวลาเขางาน </strong>
<strong v-else> ลงเวลาออกงาน </strong> <strong v-else> ลงเวลาออกงาน </strong>
</div> </div>
<div <div
class="text-white text-body2 row col-12" class="text-white text-subtitle1 row col-12"
style="line-height: 1.5rem" style="line-height: 1.5rem"
> >
{{ date2Thai(Thai) }} {{ date2Thai(Thai) }}
@ -781,8 +779,8 @@ onMounted(async () => {
*หมายเหต คลกลงเวลาเขางานแลวระบบจะลงเวลาทนท *หมายเหต คลกลงเวลาเขางานแลวระบบจะลงเวลาทนท
</p> </p>
<q-btn <q-btn
:label="stetusCheckin ? 'ลงเวลาเข้างาน' : 'ลงเวลาออกงาน'" :label="statusCheckin ? 'ลงเวลาเข้างาน' : 'ลงเวลาออกงาน'"
:color="img == null ? 'grey-6' : 'primary'" :color="img == null ? 'grey-6' : statusCheckin ? 'primary' : 'red-8'"
push push
size="18px" size="18px"
:class="$q.screen.gt.xs ? 'q-px-md' : 'full-width q-pa-sm'" :class="$q.screen.gt.xs ? 'q-px-md' : 'full-width q-pa-sm'"
@ -800,20 +798,27 @@ onMounted(async () => {
<!-- แสดงการลงเวลา --> <!-- แสดงการลงเวลา -->
<q-dialog v-model="modalTime" persistent> <q-dialog v-model="modalTime" persistent>
<q-card class="full-width cardNone"> <q-card class="full-width cardNone">
<div :class="getClass(stetusCheckin)"> <div class="col-12 row items-center q-px-md q-py-sm bg-grey-2">
<div class="text-body1 text-center col-12 text-weight-bold"> <div class="text-body1 text-center col-12 text-weight-bold">
<span v-if="stetusCheckin">ลงเวลาเข้างานของคุณ</span> <span v-if="statusCheckin">ลงเวลาเข้างานของคุณ</span>
<span v-else>ลงเวลาออกงานของคุณ</span> <span v-else>ลงเวลาออกงานของคุณ</span>
</div> </div>
</div> </div>
<q-card-section class="row col-12 justify-center"> <q-card-section class="row col-12 justify-center">
<div class="bg-grey-2 rounded-borders q-pa-md col-11"> <div
<div class="col-12 text-subtitle1 text-center text-weight-medium"> class="rounded-borders q-pa-md col-11"
:class="statusCheckin ? 'bg-primary' : 'bg-red-8'"
>
<div
class="col-12 text-subtitle1 text-center text-white text-weight-medium"
>
{{ date2Thai(Thai) }} {{ date2Thai(Thai) }}
</div> </div>
<div class="row col-12 justify-center q-pt-sm"> <div class="row col-12 justify-center q-pt-sm">
<div class="text-h3 text-weight-bold"></div> <!-- <div class="text-h3 text-white text-weight-bold"></div> -->
<div class="text-h3 text-weight-bold">{{ timeChickin }}</div> <div class="text-h3 text-white text-weight-bold">
{{ timeChickin }}
</div>
</div> </div>
</div> </div>
<div class="col-12 text-center row q-pt-md"> <div class="col-12 text-center row q-pt-md">

View file

@ -99,7 +99,7 @@ const location = ref<string>('')
const model = ref<string>('') const model = ref<string>('')
const options = ref<string[]>([ const options = ref<string[]>([
'ปฏิบัติงานที่บ้าน', 'ปฏิบัติงานที่บ้าน',
'ลืมลงเวลาปฏิบัติงาน', // '',
'ไปประชุม/อบรม/สัมมนา/ปฏิบัติงานที่บ้านนอกสถานที่', 'ไปประชุม/อบรม/สัมมนา/ปฏิบัติงานที่บ้านนอกสถานที่',
'ขออนุญาตออกนอกสถานที่', 'ขออนุญาตออกนอกสถานที่',
'อื่นๆ', 'อื่นๆ',