Merge branch 'develop' into devTee

This commit is contained in:
setthawutttty 2024-12-06 11:47:24 +07:00
commit f98a8f9a96
55 changed files with 715 additions and 382 deletions

View file

@ -82,7 +82,7 @@ watch(searchData, () => {
>
<div class="no-active-avatar">
<div class="new-avatar">
<q-icon name="mdi-plus" size="24px" color="primary" />
<q-icon name="mdi-plus" color="primary" />
</div>
</div>

View file

@ -186,10 +186,9 @@ onMounted(async () => {
<div class="q-pb-sm row">
<div>
<q-btn
size="14px"
flat
dense
color="blue"
color="primary"
@click="clickAdd"
icon="mdi-plus"
>
@ -232,8 +231,6 @@ onMounted(async () => {
map-options
emit-value
style="min-width: 140px"
class="gt-xs"
>
<template> </template>

View file

@ -140,10 +140,9 @@ onMounted(async () => {
<div class="q-pb-sm row">
<div>
<q-btn
size="14px"
flat
dense
color="blue"
color="primary"
@click="clickAdd"
icon="mdi-plus"
>

View file

@ -95,7 +95,7 @@ async function fecthQuestion() {
}));
question1Answer.value = Answer1;
question1Answer.value.push({
label: "อื่น ๆ (ระบุ)",
label: "อื่นๆ (ระบุ)",
value: Answer1.length,
});
question2Answer.value = data.question2Answer.map(
@ -110,7 +110,7 @@ async function fecthQuestion() {
}));
question3Answer.value = Answer3;
question3Answer.value.push({
label: "อื่น ๆ (ระบุ)",
label: "อื่นๆ (ระบุ)",
value: Answer3.length,
});
const Answer4 = data.question4Answer.map((e: any, index: number) => ({
@ -119,7 +119,7 @@ async function fecthQuestion() {
}));
question4Answer.value = Answer4;
question4Answer.value.push({
label: "อื่น ๆ (ระบุ)",
label: "อื่นๆ (ระบุ)",
value: Answer4.length,
});
question7Answer.value = data.question7Answer.map(

View file

@ -267,27 +267,29 @@ onMounted(async () => {
<template>
<div class="row">
<div class="col-xs-12 col-md-3 q-mt-sm q-pr-sm row">
<q-card class="col-12" flat bordered>
<div class="q-gutter-sm col-12">
<q-list class="rounded-borders q-pt-sm" dense>
<q-item
v-for="(item, i) in filterLists"
:key="i"
tag="label"
v-ripple
>
<q-checkbox
size="sm"
v-model="filterVal"
:val="item.id"
:color="item.color"
/>
<q-item-section>
<q-item-label>{{ item.name }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</div>
<q-card class="col-12" flat bordered >
<q-scroll-area style="height: 38vw">
<div class="q-gutter-sm col-12">
<q-list class="rounded-borders q-pt-sm" dense>
<q-item
v-for="(item, i) in filterLists"
:key="i"
tag="label"
v-ripple
>
<q-checkbox
size="sm"
v-model="filterVal"
:val="item.id"
:color="item.color"
/>
<q-item-section>
<q-item-label>{{ item.name }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</div>
</q-scroll-area>
</q-card>
</div>

View file

@ -499,9 +499,7 @@ watch(
<!-- าราชการแสดงเฉพาะทนใบลาไปแลวเทาน กจางไม workflow -->
<Workflow
v-if="
leaveStatus != 'DRAFT' && mainStore.officerType == 'OFFICER'
"
v-if="leaveStatus != 'DRAFT'"
:id="props.leaveId"
:sys-name="
mainStore.officerType == 'OFFICER'

View file

@ -50,9 +50,11 @@ const props = defineProps({
</div>
<div class="row">
<div class="col-xs-12 col-md-6 text-grey-8">
ลาครงสดทายในประเภทน เมอวนท
ลาครงสดทายเมอวนท
</div>
<div class="col-xs-12 col-md-6">
{{ props.data.leaveLastStart ?? "-" }}
</div>
<div class="col-xs-12 col-md-6">{{ props.data.leaveLastStart }}</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-6 text-grey-8">หมายเลขทดตอขณะลา</div>

View file

@ -175,7 +175,7 @@ function onClickOpenStat() {
/** function redirectTo ยื่นใบลา*/
async function addAbsence() {
await leaveStore.resetForm2();
leaveStore.resetForm2();
router.push(`/leave/add`);
}
@ -331,15 +331,8 @@ onMounted(async () => {
<div class="row col-12">
<div class="row items-center">
<div class="q-ml-sm">
<q-btn
round
dense
flat
size="13px"
class="q-px-sm"
@click="addAbsence"
>
<q-icon name="mdi-plus" size="22px" color="blue" />
<q-btn round dense flat class="q-px-sm" @click="addAbsence">
<q-icon name="mdi-plus" color="primary" />
<q-tooltip>สรางใบลา</q-tooltip>
</q-btn>
</div>

View file

@ -239,7 +239,6 @@ function checkSelectForm() {
? dialogConfirm(
$q,
async () => {
showLoader();
saveStep1();
},
"ยืนยันการดำเนินการ",
@ -250,6 +249,7 @@ function checkSelectForm() {
/** function บันทักตรวจสอบคุณสมบัติ*/
async function saveStep1() {
showLoader();
const salaries = formDetail.value.salaries.map((e: any) => ({
amount: e.amount,
date: e.date,
@ -286,9 +286,9 @@ async function saveStep1() {
userId: formDetail.value.id,
citizenId: formDetail.value.citizenId,
prefix: formDetail.value.prefix,
fullName: `${formDetail.value.firstName} ${formDetail.value.lastName}`,
fullName: `${formDetail.value.prefix}${formDetail.value.firstName} ${formDetail.value.lastName}`,
position: formDetail.value.position,
oc: formDetail.value.oc,
oc: formDetail.value.org,
salary: formDetail.value.salary ? formDetail.value.salary.toString() : null,
positionLevel: formDetail.value.positionLevel,
posNo: formDetail.value.posNo,

View file

@ -144,7 +144,7 @@ onMounted(() => {
:rows="store.row"
dense
:visible-columns="store.visibleColumns"
:rows-per-page-options="[1, 25, 50, 100]"
:rows-per-page-options="[10, 25, 50, 100]"
@update:pagination="updatePagination"
>
<template v-slot:header="props">

View file

@ -211,6 +211,7 @@ function fetcheSigner(id: string) {
.get(config.API.evaluationSignerDoc1(id))
.then((res) => {
const data = res.data.result;
formCommand.commanderFullname = data.commanderFullname;
formCommand.commanderPosition = data.commanderPosition;
formCommand.commanderAboveFullname = data.commanderAboveFullname;

View file

@ -83,6 +83,7 @@ async function fetchDetail() {
formDetail.posNo = data.rootShortName + data.posMasterNo;
formDetail.birthDate = data.birthDate;
formDetail.govAge = data.govAge; //
formDetail.salary = data.salary;
http.get(config.API.dataUserEducations).then((res) => {
formDetail.educations = res.data.result;
@ -102,11 +103,11 @@ async function fetchDetail() {
http.get(config.API.dataUserSalary).then((res) => {
formDetail.salaries = res.data.result;
formDetail.salary = formDetail.salaries
? formattedNumber(
formDetail.salaries[formDetail.salaries.length - 1].amount
)
: "";
// formDetail.salary = formDetail.salaries
// ? formattedNumber(
// formDetail.salaries[formDetail.salaries.length - 1].amount
// )
// : "";
});
http.get(config.API.dataUserCertificate("training")).then((res) => {

View file

@ -219,7 +219,6 @@ onMounted(async () => {
<div class="col-xs-12 col-sm-3 col-md-2">
<q-btn
v-if="statusSubmit"
size="12px"
flat
round
color="primary"
@ -307,7 +306,6 @@ onMounted(async () => {
:options="store.columns"
option-value="name"
style="min-width: 140px"
/>
</div>
</div>

View file

@ -259,7 +259,6 @@ onMounted(async () => {
<q-btn
id="addComplaints"
for="addComplaints"
size="12px"
flat
round
color="primary"
@ -370,7 +369,6 @@ onMounted(async () => {
map-options
:options="dataStore.columns"
option-value="name"
style="min-width: 140px"
class="col-xs-12 col-sm-3 col-md-2"
/>

View file

@ -51,7 +51,7 @@ async function redirectViewDetail(id: string) {
:paging="true"
dense
class="custom-table2"
:rows-per-page-options="[1, 25, 50, 100]"
:rows-per-page-options="[10, 25, 50, 100]"
:visible-columns="visibleColumns"
v-model:pagination="pagination"
@update:pagination="props.updatePagination"
@ -85,10 +85,7 @@ async function redirectViewDetail(id: string) {
<div class="q-pa-xs col-xs-12 col-sm-6 col-md-4 col-lg-3">
<q-card bordered flat @click="redirectViewDetail(props.row.id)">
<q-list>
<q-item
v-for="col in props.cols"
:key="col.name"
>
<q-item v-for="col in props.cols" :key="col.name">
<q-item-section>
<q-item-label caption>{{ col.label }}</q-item-label>

View file

@ -344,7 +344,7 @@ onMounted(() => {
/>
<Work
v-model:data="rows_03"
:title="`3. งานอื่น ๆ ที่ได้รับมอบหมาย`"
:title="`3. งานอื่นๆ ที่ได้รับมอบหมาย`"
:page="3"
:fetchList="fetchAssigned"
:total="totalResults3"

View file

@ -451,8 +451,8 @@ const title = computed(() => {
: "เพิ่มตัวชี้วัดตามหน้าที่ความรับผิดชอบ";
} else if (numpage.value === 3) {
name = isStatusEdit.value
? "แก้ไขตัวชี้วัดงานอื่น ๆ ที่ได้รับมอบหมาย"
: "เพิ่มตัวชี้วัดงานอื่น ๆ ที่ได้รับมอบหมาย";
? "แก้ไขตัวชี้วัดงานอื่นๆ ที่ได้รับมอบหมาย"
: "เพิ่มตัวชี้วัดงานอื่นๆ ที่ได้รับมอบหมาย";
}
return name;
});

View file

@ -423,7 +423,8 @@ watch(
<div
v-if="
formDataView.reasonEvaluator == null &&
store.rolePerson == 'EVALUATOR'
store.rolePerson == 'EVALUATOR' &&
store.tabMain === '2'
"
class="col-12"
align="right"
@ -475,7 +476,8 @@ watch(
<div
v-if="
formDataView.reasonCommander == null &&
store.rolePerson == 'COMMANDER'
store.rolePerson == 'COMMANDER' &&
store.tabMain === '2'
"
class="col-12"
align="right"

View file

@ -127,7 +127,7 @@ const projectTechniquesOp1 = ref<DataOptionTechnique[]>([
},
{ value: "problem_solving", label: "การแก้ปัญหา (Problem-solving)" },
{ value: "team_working", label: "การทำงานเป็นทีม (Team working)" },
{ value: "other1", label: "อื่น ๆ (ระบุ)" },
{ value: "other1", label: "อื่นๆ (ระบุ)" },
]);
const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "coaching", label: "การสอนงาน (Coaching)" },
@ -135,7 +135,7 @@ const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "team_meeting", label: "การประชุมทีม (Team meeting)" },
{ value: "consulting", label: "การให้คำปรึกษา (Consulting)" },
{ value: "feedback", label: "การให้ข้อคิดเห็น/เสนอแนะ (Feedback)" },
{ value: "other2", label: "อื่น ๆ (ระบุ)" },
{ value: "other2", label: "อื่นๆ (ระบุ)" },
]);
const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
@ -158,7 +158,7 @@ const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
},
{ value: "meeting", label: "การประชุม (Meeting)" },
{ value: "seminar", label: "การสัมมนา (Seminar)" },
{ value: "other3", label: "อื่น ๆ (ระบุ)" },
{ value: "other3", label: "อื่นๆ (ระบุ)" },
]);
/** ปิด Dialog */

View file

@ -220,7 +220,6 @@ onMounted(() => {
round
icon="mdi-plus"
color="primary"
size="12px"
dense
@click="onAdd()"
>

View file

@ -111,6 +111,57 @@ export const useKpiDataStore = defineStore("KPIDate", () => {
return competency?.name;
}
const statusOptions = ref<DataOptions[]>([
{
id: "",
name: "ทั้งหมด",
},
{
id: "NEW",
name: "จัดทำข้อตกลง",
},
{
id: "NEW_EVALUATOR",
name: "รอผู้ประเมินตรวจสอบข้อตกลง",
},
{
id: "NEW_COMMANDER",
name: "รอผู้บังคับบัญชาเหนือขึ้นไปตรวจสอบข้อตกลง",
},
{
id: "NEW_COMMANDER_HIGH",
name: "รอผู้บังคับบัญชาเหนือขึ้นไปอีกชั้นหนึ่งตรวจสอบข้อตกลง",
},
{
id: "APPROVE",
name: "รายงานความก้าวหน้า",
},
{
id: "EVALUATING",
name: "รายงานผลสำเร็จของงาน",
},
{
id: "EVALUATING_EVALUATOR",
name: "รอผู้ประเมินตรวจสอบผล",
},
{
id: "EVALUATING_COMMANDER",
name: "รอผู้บังคับบัญชาเหนือขึ้นไปตรวจสอบผล",
},
{
id: "EVALUATING_COMMANDER_HIGH",
name: "รอผู้บังคับบัญชาเหนือขึ้นไปอีกชั้นหนึ่งตรวจสอบผล",
},
{
id: "COMPLETE",
name: "รอประกาศผลการประเมิน",
},
{
id: "KP7",
name: "ประกาศและลงทะเบียนประวัติแล้ว",
},
]);
function convertStatus(val: string) {
switch (val) {
case "NEW":
@ -142,6 +193,45 @@ export const useKpiDataStore = defineStore("KPIDate", () => {
}
}
const resultsOptions = ref<DataOptions[]>([
{
id: "",
name: "ทั้งหมด",
},
{
id: "PENDING",
name: "รอดำเนินการ",
},
{
id: "PASSED",
name: "ผ่านการประเมิน",
},
{
id: "NOTPASSED",
name: "ไม่ผ่านการประเมิน",
},
{
id: "EXCELLENT",
name: "ดีเด่น",
},
{
id: "VERY_GOOD",
name: "ดีมาก",
},
{
id: "GOOD",
name: "ดี",
},
{
id: "FAIR",
name: "พอใช้",
},
{
id: "IMPROVEMENT",
name: "ต้องปรับปรุง",
},
]);
function convertResults(val: string) {
switch (val) {
case "EXCELLENT":
@ -159,7 +249,7 @@ export const useKpiDataStore = defineStore("KPIDate", () => {
}
}
const defaultCompetencyCoreLevel = ref<number|null>(null);
const defaultCompetencyCoreLevel = ref<number | null>(null);
const defaultCompetencyGroupLevel = ref<number | null>(null);
function checkCompetencyDefaultCompetencyLevel() {
const posTypeName = dataEvaluation.value.posTypeName;
@ -422,5 +512,8 @@ export const useKpiDataStore = defineStore("KPIDate", () => {
selected,
work,
isUpdate,
resultsOptions,
statusOptions,
};
});

View file

@ -115,6 +115,9 @@ const evaluatorIdMainOp = ref<DataOptions[]>([]);
const commanderIdMainOp = ref<DataOptions[]>([]);
const commanderHighMainOp = ref<DataOptions[]>([]);
const statusOp = ref<DataOptions[]>(store.statusOptions);
const resultOp = ref<DataOptions[]>(store.resultsOptions);
/** Dialog*/
const modalDialog = ref<boolean>(false);
const yearDialog = ref<number | null>(null);
@ -137,6 +140,8 @@ const formRound = reactive({
const formQuery = reactive({
page: 1,
pageSize: 10,
status: "",
results: "",
});
const total = ref<number>(0);
const totalList = ref<number>(1);
@ -151,7 +156,7 @@ const pagination = ref({
/**
* งขอมลรอบการประเม
* @param type
* @param type
*/
async function fetchRoundOption(type: string) {
const y = type === "main" ? year.value : yearDialog.value;
@ -194,11 +199,17 @@ async function fetchRoundOption(type: string) {
*/
async function fetchList() {
showLoader();
let queryParams = {
page: formQuery.page,
pageSize: formQuery.pageSize,
kpiPeriodId: round.value,
status: formQuery.status === "" ? undefined : formQuery.status,
results: formQuery.results === "" ? undefined : formQuery.results,
};
await http
.get(
config.API.kpiEvaluation +
`?page=${formQuery.page}&pageSize=${formQuery.pageSize}&kpiPeriodId=${round.value}`
)
.get(config.API.kpiEvaluation, {
params: queryParams,
})
.then(async (res) => {
const data = await res.data.result;
total.value = data.total;
@ -369,6 +380,21 @@ function filterOption(val: string, update: Function, refData: string) {
);
});
break;
case "status":
update(() => {
statusOp.value = store.statusOptions.filter(
(v: DataOptions) => v.name.indexOf(val) > -1
);
});
break;
case "result":
update(() => {
resultOp.value = store.resultsOptions.filter(
(v: DataOptions) => v.name.indexOf(val) > -1
);
});
break;
default:
break;
}
@ -405,161 +431,239 @@ onMounted(async () => {
<div class="col-12">
<q-card bordered class="q-pa-md">
<div class="row q-col-gutter-sm q-mb-sm">
<div class="col-xs-12 col-md-3">
<datepicker
menu-class-name="modalfix"
v-model="year"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
@update:model-value=" formQuery.page = 1,fetchRoundOption('main')"
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
lazy-rules
outlined
hide-bottom-space
:model-value="!!year ? year + 543 : null"
:label="`${'ปีงบประมาณ'}`"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
<div class="col-12 q-col-gutter-sm">
<div class="row col-12 q-col-gutter-sm">
<div class="col-xs-12 col-md-1">
<datepicker
menu-class-name="modalfix"
v-model="year"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
@update:model-value="
(formQuery.page = 1), fetchRoundOption('main')
"
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
lazy-rules
outlined
hide-bottom-space
:model-value="!!year ? year + 543 : null"
:label="`${'ปีงบประมาณ'}`"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
</div>
<div class="col-xs-2 col-md-2">
<q-btn
flat
round
color="primary"
icon="add"
@click="onClickAddList"
>
<q-tooltip> เพมขอม </q-tooltip>
</q-btn>
</div>
<q-space />
<div class="col-xs-12 col-md-2">
<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"
style="min-width: 140px"
/>
</div>
</div>
<div class="col-xs-10 col-md-3">
<q-select
v-model="round"
outlined
label="รอบการประเมิน"
dense
option-label="name"
option-value="id"
:options="roundMainOp"
emit-value
map-options
@update:model-value="changRound"
/>
</div>
<div class="col-12">
<q-card bordered class="col-12 filter-card q-pa-sm">
<div class="items-center col-12 row q-col-gutter-sm">
<div class="col-xs-12 col-md-2">
<q-select
v-model="round"
outlined
label="รอบการประเมิน"
dense
option-label="name"
option-value="id"
:options="roundMainOp"
emit-value
map-options
@update:model-value="changRound"
/>
</div>
<div class="col-xs-2 col-md-2">
<q-btn
flat
round
color="primary"
icon="add"
@click="onClickAddList"
>
<q-tooltip> เพมขอม </q-tooltip>
</q-btn>
</div>
<q-space />
<div class="col-xs-12 col-md-2">
<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"
style="min-width: 140px"
/>
</div>
</div>
<div class="col-12">
<d-table
ref="table"
:columns="columns"
:rows="rows"
:filter="filterKeyword"
row-key="id"
flat
bordered
:paging="true"
dense
:rows-per-page-options="[10, 25, 50, 100]"
:visible-columns="visibleColumns"
v-model:pagination="pagination"
@update:pagination="updatePagination"
>
<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">
<q-tr :props="props" class="cursor-pointer">
<q-td
v-for="col in props.cols"
:key="col.id"
@click="redirectViewDetail(props.row.id)"
>
<div>
{{ col.value ? col.value : "-" }}
</div>
</q-td>
</q-tr>
</template>
<template #item="props">
<div class="q-pa-xs col-xs-12 col-sm-6 col-md-4 col-lg-3">
<q-card bordered flat>
<q-list @click="redirectViewDetail(props.row.id)">
<q-item v-for="col in props.cols" :key="col.name">
<q-item-section>
<q-item-label caption>{{ col.label }}</q-item-label>
<q-item-label>
{{ col.value ? col.value : "-" }}</q-item-label
>
</q-item-section>
</q-item>
</q-list>
</q-card>
<div class="col-xs-12 col-md-3">
<q-select
v-model="formQuery.status"
label="สถานะการประเมิน"
class="select_ellipsis2"
dense
emit-value
map-options
:options="statusOp"
option-value="id"
option-label="name"
lazy-rules
hide-bottom-space
outlined
use-input
input-debounce="0"
@update:model-value="(formQuery.page = 1), fetchList()"
:clearable="formQuery.status !== ''"
@clear="
(formQuery.status = ''),
(statusOp = store.statusOptions)
"
@filter="(inputValue: string,
doneFn: Function) => filterOption(inputValue, doneFn, 'status'
)"
><template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
ไมอม
</q-item-section>
</q-item>
</template>
</q-select>
</div>
<div class="col-xs-12 col-md-3">
<q-select
v-model="formQuery.results"
label="ผลการประเมิน"
class="select_ellipsis3"
dense
emit-value
map-options
:options="resultOp"
option-value="id"
option-label="name"
lazy-rules
hide-bottom-space
outlined
@update:model-value="(formQuery.page = 1), fetchList()"
use-input
@clear="
(formQuery.results = ''),
(resultOp = store.resultsOptions)
"
input-debounce="0"
:clearable="formQuery.results !== ''"
@filter="(inputValue: string,
doneFn: Function) => filterOption(inputValue, doneFn, 'result'
)"
><template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
ไมอม
</q-item-section>
</q-item>
</template>
</q-select>
</div>
</div>
</template>
<template v-slot:pagination="scope">
งหมด {{ total }} รายการ
<q-pagination
v-model="formQuery.page"
active-color="primary"
color="dark"
:max="Number(totalList)"
size="sm"
boundary-links
direction-links
:max-pages="5"
@update:model-value="fetchList"
></q-pagination>
</template>
</d-table>
</q-card>
</div>
<div class="col-12">
<d-table
ref="table"
:columns="columns"
:rows="rows"
:filter="filterKeyword"
row-key="id"
flat
bordered
:paging="true"
dense
:rows-per-page-options="[10, 25, 50, 100]"
:visible-columns="visibleColumns"
v-model:pagination="pagination"
@update:pagination="updatePagination"
>
<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">
<q-tr :props="props" class="cursor-pointer">
<q-td
v-for="col in props.cols"
:key="col.id"
@click="redirectViewDetail(props.row.id)"
>
<div>
{{ col.value ? col.value : "-" }}
</div>
</q-td>
</q-tr>
</template>
<template #item="props">
<div class="q-pa-xs col-xs-12 col-sm-6 col-md-4 col-lg-3">
<q-card bordered flat>
<q-list @click="redirectViewDetail(props.row.id)">
<q-item v-for="col in props.cols" :key="col.name">
<q-item-section>
<q-item-label caption>{{ col.label }}</q-item-label>
<q-item-label>
{{ col.value ? col.value : "-" }}</q-item-label
>
</q-item-section>
</q-item>
</q-list>
</q-card>
</div>
</template>
<template v-slot:pagination="scope">
งหมด {{ total }} รายการ
<q-pagination
v-model="formQuery.page"
active-color="primary"
color="dark"
:max="Number(totalList)"
size="sm"
boundary-links
direction-links
:max-pages="5"
@update:model-value="fetchList"
></q-pagination>
</template>
</d-table>
</div>
</div>
</q-card>
</div>

View file

@ -45,7 +45,7 @@ const budgetSourceOp = ref<DataOptions[]>([
{ id: "HOSPITAL", name: "เงินบำรุงโรงพยาบาล" },
{ id: "FUND", name: "เงินกองทุน" },
{ id: "SUBSIDY", name: "เงินอุดหนุน" },
{ id: "OTHER", name: "เงินอื่น ๆ" },
{ id: "OTHER", name: "เงินอื่นๆ" },
]);
const formBody = reactive<FormsSholarship>({
@ -1075,9 +1075,7 @@ onMounted(async () => {
</div>
<div class="col-4 text-grey">-นามสก</div>
<div class="col-8 text-weight-medium">
{{
dataGuarantor.name ? dataGuarantor.name : "-"
}}
{{ dataGuarantor.name ? dataGuarantor.name : "-" }}
</div>
<div class="col-4 text-grey">ตำแหน</div>
<div class="col-8 text-weight-medium">

View file

@ -1,8 +1,8 @@
<script setup lang="ts">
import { ref, reactive, onMounted, computed } from "vue";
import { useCounterMixin } from "@/stores/mixin";
import { useDataStore } from "@/stores/data";
import { useQuasar, type QTableColumn, type QTableProps } from "quasar";
import { ref, reactive, onMounted, computed } from "vue";
import http from "@/plugins/http";
import config from "@/app.config";
@ -241,6 +241,20 @@ function onHistory() {
modalHistory.value = true;
}
const mainEmail = ref<string>("");
const mainPhone = ref<string>("");
const isCheckEmail = computed(() => {
return mainEmail.value === formDataInformation.email ? true : false;
});
const isCheckPhone = computed(() => {
console.log("mainPhone", mainPhone.value);
console.log("formDataInformation", formDataInformation.phone);
return mainPhone.value === formDataInformation.phone ? true : false;
});
/** get data */
async function getData() {
showLoader();
@ -264,6 +278,9 @@ async function getData() {
formDataInformation.phone = data.phone;
formDataInformation.email = data.email ? data.email.split("@")[0] : "";
mainEmail.value = data.email ? data.email.split("@")[0] : "";
mainPhone.value = data.phone ? data.phone : "";
email.value = data.email ? data.email.split("@")[0] : "";
phone.value = data.phone;
@ -525,16 +542,18 @@ onMounted(async () => {
color="edit"
@click="() => (editPhone = true)"
>
<q-tooltip>แกไข</q-tooltip>
<q-tooltip>แกไขอม</q-tooltip>
</q-btn>
</div>
<div v-else class="self-center col-3">
<q-btn
:disable="isCheckPhone"
dense
flat
round
icon="save"
color="primary"
:color="isCheckPhone ? 'grey-6' : 'primary'"
@click="onSavePhone"
>
<q-tooltip>นท</q-tooltip>
@ -588,16 +607,17 @@ onMounted(async () => {
color="edit"
@click="() => (editEmail = true)"
>
<q-tooltip>แกไข</q-tooltip>
<q-tooltip>แกไขอม</q-tooltip>
</q-btn>
</div>
<div v-else class="self-center">
<q-btn
:disable="isCheckEmail"
:color="isCheckEmail ? 'grey-6' : 'primary'"
dense
flat
round
icon="save"
color="primary"
@click="onSaveEmail"
>
<q-tooltip>นท</q-tooltip>

View file

@ -82,7 +82,7 @@ const projectTechniquesOp1 = ref<DataOptionTechnique[]>([
},
{ value: "problem_solving", label: "การแก้ปัญหา (Problem-solving)" },
{ value: "team_working", label: "การทำงานเป็นทีม (Team working)" },
{ value: "other1", label: "อื่น ๆ (ระบุ)" },
{ value: "other1", label: "อื่นๆ (ระบุ)" },
]);
const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "coaching", label: "การสอนงาน (Coaching)" },
@ -90,7 +90,7 @@ const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "team_meeting", label: "การประชุมทีม (Team meeting)" },
{ value: "consulting", label: "การให้คำปรึกษา (Consulting)" },
{ value: "feedback", label: "การให้ข้อคิดเห็น/เสนอแนะ (Feedback)" },
{ value: "other2", label: "อื่น ๆ (ระบุ)" },
{ value: "other2", label: "อื่นๆ (ระบุ)" },
]);
const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
@ -113,7 +113,7 @@ const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
},
{ value: "meeting", label: "การประชุม (Meeting)" },
{ value: "seminar", label: "การสัมมนา (Seminar)" },
{ value: "other3", label: "อื่น ๆ (ระบุ)" },
{ value: "other3", label: "อื่นๆ (ระบุ)" },
]);
const choice = ref<string>("MANUAL");

View file

@ -1,10 +1,12 @@
<script setup lang="ts">
import avatar from "@/assets/avatar_user.jpg";
import { ref, reactive, onMounted } from "vue";
import axios from "axios";
import { useCounterMixin } from "@/stores/mixin";
import { useDataStore } from "@/stores/data";
import { useRegistryInFormationStore } from "@/modules/10_registry/store/registry";
import axios from "axios";
import genReport from "@/plugins/genreport";
//
import InformationPage from "@/modules/10_registry/tabs/01_information.vue";
import GovernmentPage from "@/modules/10_registry/tabs/02_government.vue";
@ -18,8 +20,6 @@ import http from "@/plugins/http";
import config from "@/app.config";
import { useQuasar } from "quasar";
const apiGenReport =
"https://report-server.frappet.synology.me/api/v1/report-template/docx";
const store = useRegistryInFormationStore();
const $q = useQuasar();
const dataStore = useDataStore();
@ -42,14 +42,20 @@ async function onClickDownloadKp7(type: string) {
showLoader();
const url =
type === "FULL"
? config.API.profileReportId(store.profileId, dataStore.officerType == "OFFICER" ? 'profile':'profile-employee')
: config.API.profileKp7ShortId(store.profileId, dataStore.officerType == "OFFICER" ? 'profile':'profile-employee');
? config.API.profileReportId(
store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee"
)
: config.API.profileKp7ShortId(
store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee"
);
const fileName = type === "FULL" ? "ก.พ.7/ก.ก.1" : "ประวัติแบบย่อ";
await http
.get(url)
.then(async (res) => {
const data = await res.data.result;
await genReport(data, fileName);
await genReport(data, fileName, "pdf");
hideLoader();
})
.catch((err) => {
@ -59,46 +65,6 @@ async function onClickDownloadKp7(type: string) {
.finally(() => {});
}
async function genReport(data: any, fileName: string) {
showLoader();
await axios
.post(apiGenReport, data, {
headers: {
accept: "application/pdf",
"content-Type": "application/json",
},
responseType: "arraybuffer",
})
.then((res) => {
const data = res.data;
if (data) {
// Blob array buffer
const blob = new Blob([data], {
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
});
// URL Blob
const url = URL.createObjectURL(blob);
//
const link = document.createElement("a");
link.href = url;
link.download = `${fileName}.pdf`; //
document.body.appendChild(link);
link.click();
// URL
URL.revokeObjectURL(url);
}
})
.catch((e) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
}
/**
* งชนกลบหนาหล
*/

View file

@ -33,9 +33,9 @@ import { useCounterMixin } from "@/stores/mixin";
*/
const $q = useQuasar();
const store = useRequestEditStore();
const link = ref<string>('')
const link = ref<string>("");
const router = useRouter();
const dataStore = useDataStore()
const dataStore = useDataStore();
const { showLoader, hideLoader, messageError, dialogRemove, success } =
useCounterMixin();
@ -150,7 +150,9 @@ function fetchListRequset() {
};
showLoader();
http
.get(config.API.requestEditByType(link.value) + `user`, { params: queryParams })
.get(config.API.requestEditByType(link.value) + `user`, {
params: queryParams,
})
.then((res) => {
const data = res.data.result;
maxPage.value = Math.ceil(data.total / pageSize.value);
@ -276,7 +278,7 @@ watch(
}
);
onMounted(async() => {
onMounted(async () => {
link.value = await dataStore.getProFileType();
fetchListRequset();
});
@ -374,7 +376,6 @@ onMounted(async() => {
map-options
:options="columns"
option-value="name"
class="col-xs-12 col-sm-3 col-md-2"
style="min-width: 140px"
/>
</div>

View file

@ -1674,7 +1674,7 @@ onMounted(async () => {
<div class="col-12">
<div class="col-12 text-top2">
กฎหมายอ เกยวของกบการปฏงาน
กฎหมายอเกยวของกบการปฏงาน
</div>
<div class="col-12 row q-col-gutter-md">
<div class="col-12">
@ -2067,7 +2067,7 @@ onMounted(async () => {
<div class="col-12 row">
<div class="col-12 text-weight-bold text-dark">
<q-icon name="mdi-label" color="grey-4" class="q-pr-sm" />
3.5 (าม)
3.5 (าม)
</div>
<div class="col-12">
<q-input
@ -2186,7 +2186,7 @@ onMounted(async () => {
</div>
<div class="col-12 text-top2 items-center">
<q-icon name="mdi-label" color="grey-4" class="q-pr-sm" />
4.4 การอบรมอ หนวยงานกำหนด (าม)
4.4 การอบรมอหนวยงานกำหนด (าม)
</div>
</div>
<div class="col-12">

View file

@ -453,9 +453,7 @@ onMounted(() => {
<div
class="row q-pa-sm text-weight-medium items-center q-col-gutter-sm"
>
<div class="col-8">
4. การอบรมอ ตามทหนวยงานกำหนด (าม)
</div>
<div class="col-8">4. การอบรมอนๆ ตามทหนวยงานกำหนด (าม)</div>
<div class="col-2">
<q-input
bg-color="white"
@ -511,7 +509,7 @@ onMounted(() => {
/>
</div>
<div class="col-12 text-dark text-weight-bold">
เหตผลอ ในการพจารณา
เหตผลอในการพจารณา
</div>
<div class="col-12">
<q-input

View file

@ -99,8 +99,8 @@ function nextPage() {
</q-tab>
</q-tabs>
<div>
<q-btn color="blue" flat dense icon="mdi-plus" @click="nextPage">
<q-tooltip> เพ </q-tooltip>
<q-btn color="primary" flat dense icon="mdi-plus" @click="nextPage">
<q-tooltip> เพอม </q-tooltip>
</q-btn>
</div>
</div>

View file

@ -1988,7 +1988,7 @@ onMounted(async () => {
<q-item dense tag="label" v-ripple>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด (าม)</q-item-label
>4. การอบรมอตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
<q-item-section side>
@ -2134,8 +2134,7 @@ onMounted(async () => {
<q-item dense>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด
(าม)</q-item-label
>4. การอบรมอนๆ ตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
</q-item>

View file

@ -1528,8 +1528,7 @@ onMounted(async () => {
<q-item dense tag="label" v-ripple>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด
(าม)</q-item-label
>4. การอบรมอนๆ ตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
<q-item-section side>
@ -1645,8 +1644,7 @@ onMounted(async () => {
<q-item dense tag="label" v-ripple>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด
(าม)</q-item-label
>4. การอบรมอนๆ ตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
<q-item-section side>

View file

@ -568,8 +568,15 @@ onMounted(async () => {
</q-list>
</q-menu>
</q-btn>
<q-btn color="blue" rounded flat dense icon="mdi-plus" @click="addData">
<q-tooltip> เพ </q-tooltip>
<q-btn
color="primary"
rounded
flat
dense
icon="mdi-plus"
@click="addData"
>
<q-tooltip> เพมขอม </q-tooltip>
</q-btn>
</q-toolbar>
</div>
@ -2106,7 +2113,7 @@ onMounted(async () => {
<q-item dense tag="label" v-ripple>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด (าม)</q-item-label
>4. การอบรมอตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
<q-item-section side>
@ -2251,7 +2258,7 @@ onMounted(async () => {
<q-item dense>
<q-item-section>
<q-item-label
>4. การอบรมอ ตามทหนวยงานกำหนด (าม)</q-item-label
>4. การอบรมอตามทหนวยงานกำหนด (าม)</q-item-label
>
</q-item-section>
</q-item>

View file

@ -275,10 +275,9 @@ onMounted(async () => {
<div class="row">
<q-btn
@click="router.push(`/probation/add/${profileId}`)"
size="12px"
flat
round
color="add"
color="primary"
icon="mdi-plus"
>
<q-tooltip>เพมงานทไดบมอบหมาย</q-tooltip>
@ -315,7 +314,6 @@ onMounted(async () => {
outlined
emit-value
map-options
options-dense
option-value="name"
style="min-width: 140px"

View file

@ -135,10 +135,9 @@ onMounted(async () => {
<div class="q-pb-sm row">
<div>
<q-btn
size="14px"
flat
dense
color="blue"
color="primary"
@click="clickAdd"
icon="mdi-plus"
>

View file

@ -381,7 +381,7 @@ onMounted(async () => {
row-key="id"
:paging="true"
:visible-columns="visibleColumns"
:rows-per-page-options="[1, 25, 50, 100]"
:rows-per-page-options="[10, 25, 50, 100]"
@update:pagination="updatePagination"
>
<template v-slot:header="props">

View file

@ -102,7 +102,7 @@ const itemsDevelopmentAction = ref<DataItemsDevelopment[]>([
},
{
value: "other1",
label: "อื่น ๆ (ระบุ)",
label: "อื่นๆ (ระบุ)",
},
]);
//20 (Coach/Mentor/Consulting)
@ -112,7 +112,7 @@ const itemsDevelopmentPerson = ref<DataItemsDevelopment[]>([
{ value: "team_meeting", label: "การประชุมทีม (Team meeting)" },
{ value: "consulting", label: "การให้คำปรึกษา (Consulting)" },
{ value: "feedback", label: "การให้ข้อคิดเห็น/เสนอแนะ (Feedback)" },
{ value: "other2", label: "อื่น ๆ (ระบุ)" },
{ value: "other2", label: "อื่นๆ (ระบุ)" },
]);
//10
const itemsDevelopmentTraining = ref<DataItemsDevelopment[]>([
@ -135,7 +135,7 @@ const itemsDevelopmentTraining = ref<DataItemsDevelopment[]>([
},
{ value: "meeting", label: "การประชุม (Meeting)" },
{ value: "seminar", label: "การสัมมนา (Seminar)" },
{ value: "other3", label: "อื่น ๆ (ระบุ)" },
{ value: "other3", label: "อื่นๆ (ระบุ)" },
]);
/**

View file

@ -304,9 +304,7 @@ onMounted(() => {
</div>
<q-separator class="q-my-xs" />
<div class="row q-gutter-md align-center q-pl-md">
<div class="col-8">
4. การอบรมอ ตามทหนวยงานกำหนด (าม)
</div>
<div class="col-8">4. การอบรมอนๆ ตามทหนวยงานกำหนด (าม)</div>
<div class="col">
<q-input
outlined
@ -366,7 +364,7 @@ onMounted(() => {
<div class="col-xs-12 col-sm-11">
<div class="col-12 text-top0 row items-center">
เหตผลอ ในการพจารณา
เหตผลอในการพจารณา
</div>
<q-input
type="textarea"