Merge branch 'develop' into devTee

This commit is contained in:
setthawutttty 2023-11-07 18:02:15 +07:00
commit a09dbbd849
14 changed files with 750 additions and 668 deletions

View file

@ -223,8 +223,8 @@ const clickSave = async () => {
// //
const searchcardid = async () => { const searchcardid = async () => {
showLoader();
if (cardid.value.length === 13) { if (cardid.value.length === 13) {
showLoader();
const node = await listPerson.value.find( const node = await listPerson.value.find(
(e: any) => e.citizenId === cardid.value (e: any) => e.citizenId === cardid.value
); );

View file

@ -14,24 +14,22 @@ const $q = useQuasar();
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const { dialogConfirm, date2Thai } = mixin; const { dialogConfirm, date2Thai } = mixin;
const currentDate = ref<Date | null>(new Date()); const currentDate = ref<Date | null>(new Date());
const startTimeMorningRef = ref<Object | null>(null); const checkInRef = ref<Object | null>(null);
const endTimeMorningRef = ref<Object | null>(null); const checkOutRef = ref<Object | null>(null);
const checkInStatusRef = ref<Object | null>(null); const checkInStatusRef = ref<Object | null>(null);
const checkOutStatusRef = ref<Object | null>(null); const checkOutStatusRef = ref<Object | null>(null);
const formData = reactive<dataRowRound>({ const formData = reactive<dataRowRound>({
startTimeMorning: "", checkIn: "",
endTimeMorning: "", checkOut: "",
startTimeAfternoon: "",
endTimeAfternoon: "",
note: "", note: "",
checkInStatus: "", checkInStatus: "",
checkOutStatus: "", checkOutStatus: "",
}); });
const objectRound: MyObjectRoundRef = { const objectRound: MyObjectRoundRef = {
startTimeMorning: startTimeMorningRef, checkIn: checkInRef,
endTimeMorning: endTimeMorningRef, checkOut: checkOutRef,
checkInStatus: checkInStatusRef, checkInStatus: checkInStatusRef,
checkOutStatus: checkOutStatusRef, checkOutStatus: checkOutStatusRef,
}; };
@ -81,17 +79,13 @@ watch(
() => props.modal, () => props.modal,
(newDetailData, oldDetailData) => { (newDetailData, oldDetailData) => {
if (props.editCheck === "APPROVE") { if (props.editCheck === "APPROVE") {
formData.startTimeMorning = ""; formData.checkIn = "";
formData.endTimeMorning = ""; formData.checkOut = "";
formData.startTimeAfternoon = "";
formData.endTimeAfternoon = "";
formData.note = ""; formData.note = "";
} else if (props.editCheck === "PENDING") { } else if (props.editCheck === "PENDING") {
if (props.detailData) { if (props.detailData) {
formData.startTimeMorning = props.detailData.startTimeMorning; formData.checkIn = props.detailData.checkIn;
formData.endTimeMorning = props.detailData.endTimeMorning; formData.checkOut = props.detailData.checkOut;
formData.startTimeAfternoon = props.detailData.startTimeAfternoon;
formData.endTimeAfternoon = props.detailData.endTimeAfternoon;
formData.note = props.detailData.note; formData.note = props.detailData.note;
} }
} }
@ -174,27 +168,21 @@ watch(
<div class="row justify-between q-my-sm items-start"> <div class="row justify-between q-my-sm items-start">
<p class="q-ma-none mt">เวลาเขางาน</p> <p class="q-ma-none mt">เวลาเขางาน</p>
<q-input <q-input
ref="startTimeMorningRef" ref="checkInRef"
class="inputgreen" class="inputgreen"
dense dense
lazy-rules lazy-rules
borderless borderless
outlined outlined
v-model="formData.startTimeMorning" v-model="formData.checkIn"
:rules="[ :rules="[
(val) => !!val || 'กรุณากรอกเวลาเข้างาน', (val) => !!val || 'กรุณากรอกเวลาเข้างาน',
(val) => { (val) => {
if (val && formData.endTimeMorning) { if (val && formData.checkOut) {
if (val > formData.endTimeMorning) { if (val > formData.checkOut) {
return 'ต้องน้อยกว่าเวลาออกงาน'; return 'ต้องน้อยกว่าเวลาออกงาน';
} }
if ( if (val === formData.checkOut) {
val >= formData.startTimeAfternoon &&
val <= formData.endTimeAfternoon
) {
return 'ช่วงเวลาทับซ้อนกับช่วงบ่าย';
}
if (val === formData.endTimeMorning) {
return 'เวลาเข้างานช่วงเช้าต้องไม่ซ้ำกับออกงานเช้า'; return 'เวลาเข้างานช่วงเช้าต้องไม่ซ้ำกับออกงานเช้า';
} }
} }
@ -210,27 +198,21 @@ watch(
<div class="row items-start q-my-sm justify-between"> <div class="row items-start q-my-sm justify-between">
<p class="q-ma-none mt">เวลาออกงาน</p> <p class="q-ma-none mt">เวลาออกงาน</p>
<q-input <q-input
ref="endTimeMorningRef" ref="checkOutRef"
class="inputgreen" class="inputgreen"
dense dense
v-model="formData.endTimeMorning" v-model="formData.checkOut"
lazy-rules lazy-rules
borderless borderless
outlined outlined
:rules="[ :rules="[
(val) => !!val || 'กรุณากรอกเวลาออกงาน', (val) => !!val || 'กรุณากรอกเวลาออกงาน',
(val) => { (val) => {
if (val && formData.startTimeMorning) { if (val && formData.checkIn) {
if (val < formData.startTimeMorning) { if (val < formData.checkIn) {
return 'ต้องมากกว่าเวลาเข้างาน'; return 'ต้องมากกว่าเวลาเข้างาน';
} }
if ( if (val === formData.checkIn) {
val >= formData.startTimeAfternoon &&
val <= formData.endTimeAfternoon
) {
return 'ช่วงเวลาทับซ้อนกับช่วงบ่าย';
}
if (val === formData.startTimeMorning) {
return 'เวลาออกงานช่วงเช้าต้องไม่ซ้ำกับเข้างานเช้า'; return 'เวลาออกงานช่วงเช้าต้องไม่ซ้ำกับเข้างานเช้า';
} }
} }

View file

@ -10,5 +10,7 @@ interface ListData {
status: string; status: string;
checkInStatus: string; checkInStatus: string;
checkOutStatus: string; checkOutStatus: string;
checkOut: string;
checkIn: string;
} }
export type { ListData }; export type { ListData };

View file

@ -8,17 +8,15 @@ interface DataRows {
status: string; status: string;
} }
interface dataRowRound { interface dataRowRound {
startTimeMorning: string; checkIn: string;
endTimeMorning: string; checkOut: string;
startTimeAfternoon: string;
endTimeAfternoon: string;
checkInStatus: string; checkInStatus: string;
checkOutStatus: string; checkOutStatus: string;
note: string; note: string;
} }
interface MyObjectRoundRef { interface MyObjectRoundRef {
startTimeMorning: object | null; checkIn: object | null;
endTimeMorning: object | null; checkOut: object | null;
checkInStatus: object | null; checkInStatus: object | null;
checkOutStatus: object | null; checkOutStatus: object | null;
[key: string]: any; [key: string]: any;

View file

@ -31,6 +31,8 @@ export const useSpecialTimeStore = defineStore("LeaveSpecialTime", () => {
endTimeMorning: e.endTimeMorning, endTimeMorning: e.endTimeMorning,
startTimeAfternoon: e.startTimeAfternoon, startTimeAfternoon: e.startTimeAfternoon,
endTimeAfternoon: e.endTimeAfternoon, endTimeAfternoon: e.endTimeAfternoon,
checkIn: e.checkOut,
checkOut: e.checkOut,
status: e.status, status: e.status,
checkInStatus: convertStatus(e.checkInStatus), checkInStatus: convertStatus(e.checkInStatus),
checkOutStatus: convertStatus(e.checkOutStatus), checkOutStatus: convertStatus(e.checkOutStatus),

View file

@ -76,6 +76,8 @@ onMounted(async () => {
status: "PENDING", status: "PENDING",
checkInStatus: "normal", checkInStatus: "normal",
checkOutStatus: "late", checkOutStatus: "late",
checkIn: "08:00",
checkOut: "12.00",
}, },
{ {
id: "00000000-0000-0000-0000-000000000000", id: "00000000-0000-0000-0000-000000000000",
@ -89,6 +91,8 @@ onMounted(async () => {
status: "APPROVE", status: "APPROVE",
checkInStatus: "normal", checkInStatus: "normal",
checkOutStatus: "late", checkOutStatus: "late",
checkIn: "08:00",
checkOut: "12.00",
}, },
{ {
id: "00000000-0000-0000-0000-000000000000", id: "00000000-0000-0000-0000-000000000000",
@ -102,6 +106,8 @@ onMounted(async () => {
status: "REJECT", status: "REJECT",
checkInStatus: "normal", checkInStatus: "normal",
checkOutStatus: "late", checkOutStatus: "late",
checkIn: "08:00",
checkOut: "12.00",
}, },
]); ]);
}); });

View file

@ -228,7 +228,7 @@ watch(props.data, async () => {
<form @submit.prevent="validateForm"> <form @submit.prevent="validateForm">
<div class="col-12 row q-pa-md"> <div class="col-12 row q-pa-md">
<div <div
class="col-xs-12 col-sm-12 row q-col-gutter-x-md q-col-gutter-y-xs" class="col-xs-12 col-sm-12 row q-col-gutter-md"
> >
<div class="col-xs-12 col-sm-3" id="complainantType"> <div class="col-xs-12 col-sm-3" id="complainantType">
<q-select <q-select
@ -243,6 +243,7 @@ watch(props.data, async () => {
option-label="name" option-label="name"
emit-value emit-value
map-options map-options
hide-bottom-space
:rules="[(val) => !!val || `${'กรุณาเลือกผู้ร้องเรียน'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกผู้ร้องเรียน'}`]"
lazy-rules lazy-rules
@update:model-value=" @update:model-value="
@ -278,6 +279,7 @@ watch(props.data, async () => {
label="รายชื่อจากทะเบียรประวัติ" label="รายชื่อจากทะเบียรประวัติ"
option-value="id" option-value="id"
option-label="name" option-label="name"
hide-bottom-space
emit-value emit-value
map-options map-options
:rules="[(val) => !!val || `${'กรุณาเลือกรายชื่อ'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกรายชื่อ'}`]"
@ -305,6 +307,7 @@ watch(props.data, async () => {
name="office" name="office"
ref="officeRef" ref="officeRef"
dense dense
hide-bottom-space
outlined outlined
v-model="formData.office" v-model="formData.office"
label="เลือกสำนักงาน" label="เลือกสำนักงาน"
@ -323,6 +326,7 @@ watch(props.data, async () => {
label="หน่วยงานที่พิจารณา" label="หน่วยงานที่พิจารณา"
option-value="id" option-value="id"
option-label="name" option-label="name"
hide-bottom-space
emit-value emit-value
map-options map-options
:rules="[(val) => !!val || `${'กรุณาเลือกหน่วยงาน'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกหน่วยงาน'}`]"
@ -347,6 +351,7 @@ watch(props.data, async () => {
ref="topicComplaintRef" ref="topicComplaintRef"
dense dense
outlined outlined
hide-bottom-space
v-model="formData.topicComplaint" v-model="formData.topicComplaint"
:rules="[(val) => !!val || 'กรุณาการข้อมูล']" :rules="[(val) => !!val || 'กรุณาการข้อมูล']"
lazy-rules lazy-rules
@ -361,6 +366,7 @@ watch(props.data, async () => {
ref="detailRef" ref="detailRef"
dense dense
outlined outlined
hide-bottom-space
v-model="formData.detail" v-model="formData.detail"
:rules="[(val) => !!val || 'กรุณาการข้อมูล']" :rules="[(val) => !!val || 'กรุณาการข้อมูล']"
lazy-rules lazy-rules
@ -391,6 +397,7 @@ watch(props.data, async () => {
ref="datereceiveRef" ref="datereceiveRef"
outlined outlined
dense dense
hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value=" :model-value="
formData.datereceive != null formData.datereceive != null
@ -428,6 +435,7 @@ watch(props.data, async () => {
option-value="id" option-value="id"
option-label="name" option-label="name"
emit-value emit-value
hide-bottom-space
map-options map-options
:rules="[(val) => !!val || `${'กรุณาเลือกระดับการพิจารณา'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกระดับการพิจารณา'}`]"
lazy-rules lazy-rules
@ -464,6 +472,7 @@ watch(props.data, async () => {
: null : null
" "
label="วันที่กำหนดวันพิจารณา" label="วันที่กำหนดวันพิจารณา"
hide-bottom-space
:rules="[ :rules="[
(val) => !!val || `${'กรุณาเลือกวันที่กำหนดวันพิจารณา'}`, (val) => !!val || `${'กรุณาเลือกวันที่กำหนดวันพิจารณา'}`,
]" ]"
@ -493,6 +502,7 @@ watch(props.data, async () => {
option-value="id" option-value="id"
option-label="name" option-label="name"
emit-value emit-value
hide-bottom-space
map-options map-options
:rules="[(val) => !!val || `${'กรุณาเลือกลักษณะความผิด'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกลักษณะความผิด'}`]"
lazy-rules lazy-rules
@ -521,6 +531,7 @@ watch(props.data, async () => {
ref="datewarnRef" ref="datewarnRef"
outlined outlined
dense dense
hide-bottom-space
class="full-width datepicker" class="full-width datepicker"
:model-value=" :model-value="
formData.datewarn != null formData.datewarn != null
@ -557,6 +568,7 @@ watch(props.data, async () => {
label="รับเรื่องร้องเรียน" label="รับเรื่องร้องเรียน"
option-value="id" option-value="id"
option-label="name" option-label="name"
hide-bottom-space
emit-value emit-value
map-options map-options
:rules="[(val) => !!val || `${'กรุณาเลือกรับเรื่องร้องเรียน'}`]" :rules="[(val) => !!val || `${'กรุณาเลือกรับเรื่องร้องเรียน'}`]"
@ -573,16 +585,18 @@ watch(props.data, async () => {
label="ผู้ร้องเรียน" label="ผู้ร้องเรียน"
:rules="[(val) => !!val || `${'กรุณากรอกข้อมูล'}`]" :rules="[(val) => !!val || `${'กรุณากรอกข้อมูล'}`]"
lazy-rules lazy-rules
hide-bottom-space
type="textarea" type="textarea"
rows="5" rows="5"
/> />
</div> </div>
<div class="col-xs-12 col-sm-6" id="files"> <div class="col-12" id="files">
<q-file <q-file
for="inputFiles" for="inputFiles"
ref="filesRef" ref="filesRef"
outlined outlined
dense dense
class="fit"
v-model="formData.files" v-model="formData.files"
@added="fileUploadDoc" @added="fileUploadDoc"
label="ไฟล์เอกสารหลักฐาน" label="ไฟล์เอกสารหลักฐาน"

View file

@ -117,11 +117,9 @@ watch(props.data, async () => {
</script> </script>
<template> <template>
<q-card flat bordered class="col-12 q-mt-sm"> <q-card flat bordered class="col-12 q-mt-sm">
<div class="q-pa-md">
<form @submit.prevent="validateForm"> <form @submit.prevent="validateForm">
<div class="row col-12"> <div class="q-pa-md">
<div class="col-12 row bg-white q-col-gutter-md"> <div class="col-xs-12 row items-center q-col-gutter-md">
<div class="col-xs-12 row items-center">
<div class="col-12"> <div class="col-12">
<q-input <q-input
for="#complaint" for="#complaint"
@ -138,8 +136,7 @@ watch(props.data, async () => {
type="textarea" type="textarea"
/> />
</div> </div>
<div class="row no-wrap col-12"> <div class="col-6">
<div class="col-4 q-my-md q-mr-xs">
<q-select <q-select
for="#fault" for="#fault"
outlined outlined
@ -153,6 +150,7 @@ watch(props.data, async () => {
map-options map-options
option-label="name" option-label="name"
option-value="id" option-value="id"
hide-bottom-space
use-input use-input
@filter="(inputValue: any, @filter="(inputValue: any,
doneFn: Function) => filterFnOptionsType(inputValue, doneFn, 'faultOp' doneFn: Function) => filterFnOptionsType(inputValue, doneFn, 'faultOp'
@ -166,7 +164,7 @@ watch(props.data, async () => {
</template> </template>
</q-select> </q-select>
</div> </div>
<div class="col-4 q-my-md q-mr-xs"> <div class="col-6">
<q-select <q-select
for="#investigation" for="#investigation"
outlined outlined
@ -182,6 +180,7 @@ watch(props.data, async () => {
map-options map-options
option-label="name" option-label="name"
option-value="id" option-value="id"
hide-bottom-space
use-input use-input
@filter="(inputValue: any, @filter="(inputValue: any,
doneFn: Function) => filterFnOptionsType(inputValue, doneFn, 'investigationOp' doneFn: Function) => filterFnOptionsType(inputValue, doneFn, 'investigationOp'
@ -195,10 +194,9 @@ watch(props.data, async () => {
</template> </template>
</q-select> </q-select>
</div> </div>
</div>
<div <div
v-if="formData.investigation === '003'" v-if="formData.investigation === '003'"
class="col-12 q-mb-md" class="col-12"
> >
<q-input <q-input
for="#other" for="#other"
@ -219,24 +217,24 @@ watch(props.data, async () => {
]" ]"
/> />
</div> </div>
<div class="row col-12">
<div class="row items-start col-12"> <q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<p <div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-sm q-px-md">
class="text-weight-medium q-ma-none text-center align-top q-pt-sm"
>
นทบสวน นทบสวน
</p>
<q-checkbox <q-checkbox
for="#clickTime" for="#clickTime"
size="md" size="md"
v-model="formData.clickTime" v-model="formData.clickTime"
label="ขยายเวลา" label="ขยายเวลา"
color="primary" color="primary"
dense
class="text-weight-medium q-ml-sm" class="text-weight-medium q-ml-sm"
keep-color keep-color
/> />
<div v-if="formData.clickTime !== true" class="self-start row"> </div>
<div class="q-mx-xs"> <div class="col-12"><q-separator /></div>
<div class="col-xs-12 col-sm-12 q-pa-sm row">
<div v-if="formData.clickTime !== true" class="q-col-gutter-sm row">
<datepicker <datepicker
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.date" v-model="formData.date"
@ -258,6 +256,7 @@ watch(props.data, async () => {
dense dense
lazy-rules lazy-rules
borderless borderless
hide-bottom-space
:model-value=" :model-value="
formData.date ? date2Thai(formData.date) : null formData.date ? date2Thai(formData.date) : null
" "
@ -278,8 +277,6 @@ watch(props.data, async () => {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
</div>
<div class="q-mx-xs q-">
<datepicker <datepicker
menu-class-name="modalfix" menu-class-name="modalfix"
v-model="formData.dateEnd" v-model="formData.dateEnd"
@ -300,6 +297,7 @@ watch(props.data, async () => {
outlined outlined
dense dense
lazy-rules lazy-rules
hide-bottom-space
borderless borderless
:model-value=" :model-value="
formData.dateEnd formData.dateEnd
@ -324,8 +322,7 @@ watch(props.data, async () => {
</template> </template>
</datepicker> </datepicker>
</div> </div>
</div> <div v-else class="q-mx-xs col-xs-12 col-sm-6">
<div v-else class="q-mx-xs">
<q-select <q-select
for="#daysExtend" for="#daysExtend"
outlined outlined
@ -336,6 +333,7 @@ watch(props.data, async () => {
:options="investigateFactStore.daysExtendOp" :options="investigateFactStore.daysExtendOp"
label="จำนวนวันที่ต้องการขยาย" label="จำนวนวันที่ต้องการขยาย"
emit-value emit-value
hide-bottom-space
map-options map-options
:rules="[ :rules="[
(val) => (val) =>
@ -359,7 +357,9 @@ watch(props.data, async () => {
</q-select> </q-select>
</div> </div>
</div> </div>
<div class="col-12 q-my-xs"> </q-card>
</div>
<div class="col-12 ">
<q-input <q-input
for="#complaintdetail" for="#complaintdetail"
class="full-width inputgreen cursor-pointer" class="full-width inputgreen cursor-pointer"
@ -377,7 +377,7 @@ watch(props.data, async () => {
type="textarea" type="textarea"
/> />
</div> </div>
<div class="col-12 q-my-sm"> <div class="col-12">
<q-file <q-file
for="#fileComplaint" for="#fileComplaint"
outlined outlined
@ -394,7 +394,7 @@ watch(props.data, async () => {
</template> </template>
</q-file> </q-file>
</div> </div>
<div class="col-12 q-my-sm"> <div class="col-12">
<q-input <q-input
for="#detail" for="#detail"
class="full-width inputgreen cursor-pointer" class="full-width inputgreen cursor-pointer"
@ -410,7 +410,7 @@ watch(props.data, async () => {
type="textarea" type="textarea"
/> />
</div> </div>
<div class="col-12 q-my-xs"> <div class="col-12">
<q-file <q-file
for="#evidenceFiles" for="#evidenceFiles"
outlined outlined
@ -427,7 +427,7 @@ watch(props.data, async () => {
</template> </template>
</q-file> </q-file>
</div> </div>
<div class="row col-12 items-start q-mt-sm"> <div class="row col-12 items-start">
<div class="col-4"> <div class="col-4">
<q-input <q-input
for="#results" for="#results"
@ -439,6 +439,7 @@ watch(props.data, async () => {
outlined outlined
debounce="300" debounce="300"
placeholder="ผลการสืบสวน" placeholder="ผลการสืบสวน"
hide-bottom-space
> >
</q-input> </q-input>
</div> </div>
@ -446,7 +447,7 @@ watch(props.data, async () => {
<q-btn <q-btn
id="#confirm" id="#confirm"
label="ยืนยันผลการสืบสวน" label="ยืนยันผลการสืบสวน"
color="public" color="primary"
class="q-py-sm q-ml-sm" class="q-py-sm q-ml-sm"
> >
<q-tooltip>นยนผลการสบสวน</q-tooltip> <q-tooltip>นยนผลการสบสวน</q-tooltip>
@ -455,7 +456,6 @@ watch(props.data, async () => {
</div> </div>
</div> </div>
</div> </div>
</div>
<q-separator /> <q-separator />
<div class="row col-12 q-pa-sm"> <div class="row col-12 q-pa-sm">
<q-space /> <q-space />
@ -464,6 +464,5 @@ watch(props.data, async () => {
> >
</div> </div>
</form> </form>
</div>
</q-card> </q-card>
</template> </template>

View file

@ -22,6 +22,7 @@ const visibleColumns2 = ref<string[]>([
"duty", "duty",
"email", "email",
"telephone", "telephone",
"role"
]); ]);
const columns2 = ref<QTableProps["columns"]>([ const columns2 = ref<QTableProps["columns"]>([
{ {
@ -90,6 +91,17 @@ const columns2 = ref<QTableProps["columns"]>([
sort: (a: string, b: string) => sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }), a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
}, },
{
name: "role",
align: "left",
label: "จำนวนเรื่องสืบสวน",
sortable: true,
field: "role",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
]); ]);
const props = defineProps({ const props = defineProps({
@ -138,15 +150,12 @@ watchEffect(() => {
<q-card style="width: 1200px; max-width: 80vw"> <q-card style="width: 1200px; max-width: 80vw">
<DialogHeader title="เลือกรายชื่อกรรมการ" :close="clickClose" /> <DialogHeader title="เลือกรายชื่อกรรมการ" :close="clickClose" />
<q-separator /> <q-separator />
<q-card-section class="q-pt-none"> <q-card-section >
<div>
<div>
<q-toolbar style="padding: 0">
<q-input <q-input
borderless borderless
outlined outlined
dense dense
class="col-12" class="col-12 q-mb-sm"
debounce="300" debounce="300"
:model-value="filterKeyword2" :model-value="filterKeyword2"
@update:model-value="updateInput" @update:model-value="updateInput"
@ -163,10 +172,6 @@ watchEffect(() => {
/> />
</template> </template>
</q-input> </q-input>
</q-toolbar>
</div>
</div>
<d-table <d-table
:columns="columns2" :columns="columns2"
:rows="rows2" :rows="rows2"
@ -208,6 +213,8 @@ watchEffect(() => {
</d-table> </d-table>
</q-card-section> </q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white text-teal"> <q-card-actions align="right" class="bg-white text-teal">
<q-btn <q-btn
label="เพิ่มรายชื่อกรรมการ" label="เพิ่มรายชื่อกรรมการ"

View file

@ -30,6 +30,7 @@ onMounted(async () => {
duty: "ประธาน", duty: "ประธาน",
email: "e@email.com", email: "e@email.com",
telephone: "0800808080", telephone: "0800808080",
role: "4",
}, },
{ {
nameDirector: "นาย สรวิชญ์ พลสิทธิ์", nameDirector: "นาย สรวิชญ์ พลสิทธิ์",
@ -37,6 +38,7 @@ onMounted(async () => {
duty: "เลขานุการ", duty: "เลขานุการ",
email: "g@gmail.com", email: "g@gmail.com",
telephone: "0614565145", telephone: "0614565145",
role: "6",
}, },
]); ]);
await hideLoader(); await hideLoader();
@ -213,10 +215,8 @@ watch(props.data, async () => {
<form @submit.prevent="validateForm"> <form @submit.prevent="validateForm">
<div class="col-12"> <div class="col-12">
<q-card bordered> <q-card bordered>
<div class="col-12 row q-col-gutter-md q-pa-md"> <div class="col-12 row q-pa-md">
<div class="col-xs-12 col-sm-12 row"> <div class="col-12 row q-col-gutter-md">
<q-separator />
<div class="col-12 row q-pa-sm q-col-gutter-sm">
<q-input <q-input
class="col-12" class="col-12"
dense dense
@ -225,6 +225,7 @@ watch(props.data, async () => {
for="#Complaint" for="#Complaint"
ref="complaintRef" ref="complaintRef"
label="เรื่องร้องเรียน" label="เรื่องร้องเรียน"
hide-bottom-space
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกเรื่องร้องเรียน'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกเรื่องร้องเรียน'}`]"
/> />
@ -251,6 +252,7 @@ watch(props.data, async () => {
outlined outlined
dense dense
class="full-width datepicker" class="full-width datepicker"
hide-bottom-space
:model-value=" :model-value="
dateInvestigate != null dateInvestigate != null
? date2Thai(dateInvestigate) ? date2Thai(dateInvestigate)
@ -293,6 +295,7 @@ watch(props.data, async () => {
outlined outlined
dense dense
class="col-xs-12 col-sm-4" class="col-xs-12 col-sm-4"
hide-bottom-space
:model-value=" :model-value="
dateAllegation != null dateAllegation != null
? date2Thai(dateAllegation) ? date2Thai(dateAllegation)
@ -338,6 +341,7 @@ watch(props.data, async () => {
outlined outlined
dense dense
class="full-width datepicker" class="full-width datepicker"
hide-bottom-space
:model-value=" :model-value="
dateEvident != null ? date2Thai(dateEvident) : null dateEvident != null ? date2Thai(dateEvident) : null
" "
@ -358,21 +362,27 @@ watch(props.data, async () => {
</q-input> </q-input>
</template> </template>
</datepicker> </datepicker>
<div class="col-xs-12 col-sm-12 text-bold"> <div class="row col-12">
<q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md">
กรรมการ กรรมการ
<q-btn <q-btn
size="12px" size="12px"
flat flat
round round
dense
color="add" color="add"
class="q-ml-sm"
@click="popup()" @click="popup()"
icon="mdi-plus" icon="mdi-plus"
> >
<q-tooltip>เพมกรรมการ</q-tooltip> <q-tooltip>เพมกรรมการ</q-tooltip>
</q-btn> </q-btn>
</div> </div>
<div class="col-xs-12 col-sm-12 q-pb-md"> <div class="col-12"><q-separator /></div>
<div class="col-xs-12 q-pa-sm row">
<Table <Table
class="col-12"
style="max-height: 80vh" style="max-height: 80vh"
:rows="rows" :rows="rows"
:columns="investigateDis.columnsDirector" :columns="investigateDis.columnsDirector"
@ -416,7 +426,8 @@ watch(props.data, async () => {
</template> </template>
</Table> </Table>
</div> </div>
</q-card>
</div>
<q-input <q-input
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
dense dense
@ -425,12 +436,14 @@ watch(props.data, async () => {
v-model="formData.casefault" v-model="formData.casefault"
for="#casefault" for="#casefault"
label="กรณีมีความผิด" label="กรณีมีความผิด"
hide-bottom-space
:rules="[(val) => !!val || `${'กรุณากรอกกรณีมีความผิด'}`]" :rules="[(val) => !!val || `${'กรุณากรอกกรณีมีความผิด'}`]"
lazy-rules lazy-rules
/> />
<q-input <q-input
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
dense dense
hide-bottom-space
outlined outlined
for="#whereInvestigate" for="#whereInvestigate"
ref="whereInvestigateRef" ref="whereInvestigateRef"
@ -450,6 +463,7 @@ watch(props.data, async () => {
option-value="id" option-value="id"
emit-value emit-value
map-options map-options
hide-bottom-space
:options="investigateDis.optionsTypefault" :options="investigateDis.optionsTypefault"
label="ลักษณะความผิด" label="ลักษณะความผิด"
/> />
@ -464,13 +478,15 @@ watch(props.data, async () => {
option-value="id" option-value="id"
emit-value emit-value
map-options map-options
hide-bottom-space
:options="investigateDis.optionsfaultLevel" :options="investigateDis.optionsfaultLevel"
label="ระดับโทษความผิด" label="ระดับโทษความผิด"
/> />
<q-input <q-input
class="col-xs-12 col-sm-6 q-pb-md" class="col-xs-12 col-sm-6"
dense dense
for="#refLaw" for="#refLaw"
hide-bottom-space
outlined outlined
ref="refLawRef" ref="refLawRef"
v-model="formData.refLaw" v-model="formData.refLaw"
@ -484,6 +500,7 @@ watch(props.data, async () => {
class="col-12" class="col-12"
dense dense
outlined outlined
hide-bottom-space
for="#detailComplaint" for="#detailComplaint"
ref="detailComplaintRef" ref="detailComplaintRef"
v-model="formData.detailComplaint" v-model="formData.detailComplaint"
@ -495,6 +512,7 @@ watch(props.data, async () => {
class="col-12" class="col-12"
dense dense
outlined outlined
hide-bottom-space
for="#trueDetail" for="#trueDetail"
ref="trueDetailRef" ref="trueDetailRef"
v-model="formData.trueDetail" v-model="formData.trueDetail"
@ -502,19 +520,27 @@ watch(props.data, async () => {
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกรายละเอียดสืบสวนข้อเท็จจริง'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกรายละเอียดสืบสวนข้อเท็จจริง'}`]"
/> />
<div class="row col-12">
<q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md">
หลกฐานสนบสนนขอกลาวหา
</div>
<div class="col-12"><q-separator /></div>
<div class="col-xs-12 q-pa-sm row">
<q-input <q-input
class="col-12" class="col-12"
dense dense
outlined outlined
for="#evidence" for="#evidence"
ref="evidenceRef" ref="evidenceRef"
hide-bottom-space
v-model="formData.evidence" v-model="formData.evidence"
label="สรุปพยานหลักฐานสนับสนุนข้อกล่าวหา" label="สรุปพยานหลักฐานสนับสนุนข้อกล่าวหา"
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกสรุปพยานหลักฐานสนับสนุนข้อกล่าวหา'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกสรุปพยานหลักฐานสนับสนุนข้อกล่าวหา'}`]"
/> />
<q-file <q-file
class="col-12 q-pb-md" class="col-12 q-mt-sm"
outlined outlined
dense dense
ref="filesEvidenceRef" ref="filesEvidenceRef"
@ -530,6 +556,16 @@ watch(props.data, async () => {
<q-icon name="attach_file" /> <q-icon name="attach_file" />
</template> </template>
</q-file> </q-file>
</div>
</q-card>
</div>
<div class="row col-12">
<q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md">
นทกถอยคำของผกลาวหา
</div>
<div class="col-12"><q-separator /></div>
<div class="col-xs-12 q-pa-sm row">
<q-input <q-input
class="col-12" class="col-12"
dense dense
@ -538,11 +574,12 @@ watch(props.data, async () => {
for="#recordAccuser" for="#recordAccuser"
v-model="formData.recordAccuser" v-model="formData.recordAccuser"
label="บันทึกถ้อยคำของผู้กล่าวหา" label="บันทึกถ้อยคำของผู้กล่าวหา"
hide-bottom-space
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกบันทึกถ้อยคำของผู้กล่าวหา'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกบันทึกถ้อยคำของผู้กล่าวหา'}`]"
/> />
<q-file <q-file
class="col-12 q-pb-md" class="col-12 q-mt-sm"
outlined outlined
dense dense
ref="filesRecordAccuserRef" ref="filesRecordAccuserRef"
@ -558,6 +595,16 @@ watch(props.data, async () => {
<q-icon name="attach_file" /> <q-icon name="attach_file" />
</template> </template>
</q-file> </q-file>
</div>
</q-card>
</div>
<div class="row col-12">
<q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md">
พยานและการบนทกถอยคำ
</div>
<div class="col-12"><q-separator /></div>
<div class="col-xs-12 q-pa-sm row">
<q-input <q-input
class="col-12" class="col-12"
dense dense
@ -566,11 +613,12 @@ watch(props.data, async () => {
ref="witnessesRef" ref="witnessesRef"
v-model="formData.witnesses" v-model="formData.witnesses"
label="พยานและการบันทึกถ้อยคำ" label="พยานและการบันทึกถ้อยคำ"
hide-bottom-space
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกพยานและการบันทึกถ้อยคำ'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกพยานและการบันทึกถ้อยคำ'}`]"
/> />
<q-file <q-file
class="col-12 q-pb-md" class="col-12 q-mt-sm"
outlined outlined
dense dense
ref="filesWitnessesRef" ref="filesWitnessesRef"
@ -586,6 +634,9 @@ watch(props.data, async () => {
<q-icon name="attach_file" /> <q-icon name="attach_file" />
</template> </template>
</q-file> </q-file>
</div>
</q-card>
</div>
<q-input <q-input
class="col-12" class="col-12"
dense dense
@ -594,6 +645,7 @@ watch(props.data, async () => {
ref="InvestResultsRef" ref="InvestResultsRef"
v-model="formData.InvestResults" v-model="formData.InvestResults"
label="ผลการสอบสวน" label="ผลการสอบสวน"
hide-bottom-space
type="textarea" type="textarea"
:rules="[(val:string) => !!val || `${'กรุณากรอกผลการสอบสวน'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกผลการสอบสวน'}`]"
/> />
@ -616,7 +668,6 @@ watch(props.data, async () => {
</q-file> </q-file>
</div> </div>
</div> </div>
</div>
<q-separator /> <q-separator />
<div class="row col-12 q-pa-sm"> <div class="row col-12 q-pa-sm">
<q-space /> <q-space />

View file

@ -71,6 +71,7 @@ const clickBack = () => {
outlined outlined
v-model="channel" v-model="channel"
for="channel" for="channel"
hide-bottom-space
label="กรอกชื่อช่องทาง" label="กรอกชื่อช่องทาง"
:rules="[(val:string) => !!val || `${'กรุณากรอกชื่อช่องทาง'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกชื่อช่องทาง'}`]"
/> />
@ -78,17 +79,13 @@ const clickBack = () => {
</div> </div>
</div> </div>
<q-separator /> <q-separator />
<q-separator />
<div class="row col-12 q-pa-sm"> <div class="row col-12 q-pa-sm">
<q-space /> <q-space />
<q-btn <q-btn
flat label="บันทึก"
round
color="public" color="public"
@click="checkSave" @click="checkSave"
icon="mdi-content-save-outline"
> >
<q-tooltip>{{ edit ? "แก้ไขข้อมูล" : "บันทึกข้อมูล" }}</q-tooltip>
</q-btn> </q-btn>
</div> </div>
</q-card> </q-card>

View file

@ -81,12 +81,17 @@ function onValidate() {
} }
</script> </script>
<template> <template>
<form @submit.prevent.stop="onValidate" class="q-gutter-md"> <form @submit.prevent.stop="onValidate">
<q-card bordered class="q-pa-md"> <q-card bordered>
<div v-if="data === null" class="row q-col-gutter-sm"> <div class="col-12 row q-pa-md">
<div class="col-3 row q-pa-md text-bold"> <div class="row q-col-gutter-md">
<label>นหาบคคลากรทอยในระบบ</label> <div class="row col-12" v-if="data === null">
<q-card bordered class="row col-12" style="border:1px solid #d6dee1;">
<div class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-sm q-px-md">
นหาบคคลากรทอยในระบบ
</div> </div>
<div class="col-12"><q-separator /></div>
<div class="col-xs-12 q-pa-sm row">
<div class="col-6"> <div class="col-6">
<q-input <q-input
dense dense
@ -95,6 +100,7 @@ function onValidate() {
label="รหัสบัตรประชาชน" label="รหัสบัตรประชาชน"
ref="idCardRef" ref="idCardRef"
for="idCardRef" for="idCardRef"
hide-bottom-space
:rules="[(val: string) => !!val || `${'กรุณากรอกรหัสบัตรประชาชน'}`]" :rules="[(val: string) => !!val || `${'กรุณากรอกรหัสบัตรประชาชน'}`]"
/> />
</div> </div>
@ -103,15 +109,15 @@ function onValidate() {
unelevated unelevated
dense dense
color="primary" color="primary"
class="q-px-md q-py-sm" class="q-px-md q-py-sm q-ml-sm"
@click="addEmployee" @click="addEmployee"
label="เพิ่มบุคลากร" label="เพิ่มบุคลากร"
id="addCustomer" id="addCustomer"
/> />
</div> </div>
</div> </div>
</q-card>
<div class="row q-px-md q-col-gutter-sm"> </div>
<div class="col-3"> <div class="col-3">
<q-input <q-input
dense dense
@ -120,6 +126,7 @@ function onValidate() {
label="คำนำหน้า" label="คำนำหน้า"
ref="prefixRef" ref="prefixRef"
for="prefixRef" for="prefixRef"
hide-bottom-space
:rules="[(val: string) => val !== null && val !== '' || `${'กรุณากรอกคำนำหน้า'}`]" :rules="[(val: string) => val !== null && val !== '' || `${'กรุณากรอกคำนำหน้า'}`]"
/> />
</div> </div>
@ -131,6 +138,7 @@ function onValidate() {
label="ชื่อ" label="ชื่อ"
ref="firstnameRef" ref="firstnameRef"
for="firstnameRef" for="firstnameRef"
hide-bottom-space
:rules="[(val: string) => val !== null && val !== '' || `${'กรุณากรอกชื่อ'}`]" :rules="[(val: string) => val !== null && val !== '' || `${'กรุณากรอกชื่อ'}`]"
/> />
</div> </div>
@ -142,6 +150,7 @@ function onValidate() {
label="นามสกุล" label="นามสกุล"
ref="lastnameRef" ref="lastnameRef"
for="lastnameRef" for="lastnameRef"
hide-bottom-space
:rules="[(val: string) => !!val || `${'กรุณากรอกนามสกุล'}`]" :rules="[(val: string) => !!val || `${'กรุณากรอกนามสกุล'}`]"
/> />
</div> </div>
@ -153,6 +162,7 @@ function onValidate() {
label="ตำแหน่ง" label="ตำแหน่ง"
ref="positionRef" ref="positionRef"
for="positionRef" for="positionRef"
hide-bottom-space
:rules="[(val: string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]" :rules="[(val: string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
/> />
</div> </div>
@ -164,6 +174,7 @@ function onValidate() {
label="เบอร์โทร" label="เบอร์โทร"
ref="phoneRef" ref="phoneRef"
for="phoneRef" for="phoneRef"
hide-bottom-space
:rules="[(val: string) => !!val || `${'กรุณากรอกเบอร์โทร'}`]" :rules="[(val: string) => !!val || `${'กรุณากรอกเบอร์โทร'}`]"
/> />
</div> </div>
@ -174,12 +185,13 @@ function onValidate() {
v-model="formData.email" v-model="formData.email"
label="อีเมล" label="อีเมล"
ref="emailRef" ref="emailRef"
hide-bottom-space
for="emailRef" for="emailRef"
:rules="[(val: string) => !!val || `${'กรุณากรอกอีเมล'}`]" :rules="[(val: string) => !!val || `${'กรุณากรอกอีเมล'}`]"
/> />
</div> </div>
</div> </div>
</div>
<q-separator /> <q-separator />
<div class="row col-12 q-pa-sm"> <div class="row col-12 q-pa-sm">
<q-space /> <q-space />
@ -193,5 +205,5 @@ function onValidate() {
> >
</div> </div>
</q-card> </q-card>
</form> </form>
</template> </template>

View file

@ -29,6 +29,7 @@ interface directorType {
duty: string; duty: string;
email: string; email: string;
telephone: string; telephone: string;
role: string;
} }
export type { export type {

View file

@ -51,6 +51,7 @@ export const useInvestigateDisStore = defineStore(
duty: e.duty, duty: e.duty,
email: e.email, email: e.email,
telephone: e.telephone, telephone: e.telephone,
role: e.role,
})); }));
rows2.value = datalistDirector; rows2.value = datalistDirector;
selected.value = rows2.value; selected.value = rows2.value;
@ -204,6 +205,7 @@ export const useInvestigateDisStore = defineStore(
"duty", "duty",
"email", "email",
"telephone", "telephone",
"role",
]); ]);
const columnsDirector = ref<QTableProps["columns"]>([ const columnsDirector = ref<QTableProps["columns"]>([
{ {
@ -260,6 +262,15 @@ export const useInvestigateDisStore = defineStore(
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "role",
align: "left",
label: "จำนวนเรื่องสืบสวน",
sortable: true,
field: "role",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
]); ]);
return { return {
fecthList, fecthList,