Merge branch 'develop' of https://github.com/Frappet/bma-ehr-frontend into develop

This commit is contained in:
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 2024-07-17 16:18:39 +07:00
commit b3ba722e5a
3 changed files with 413 additions and 22 deletions

View file

@ -1,19 +1,113 @@
<script setup lang="ts"> <script setup lang="ts">
import DialogHeader from "@/components/DialogHeader.vue"; import DialogHeader from "@/components/DialogHeader.vue";
import { ref, reactive, watch } from "vue"; import { ref, reactive, watch, computed } from "vue";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
import http from "@/plugins/http"; import http from "@/plugins/http";
import config from "@/app.config"; import config from "@/app.config";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import type { DataOptionTechnique } from "@/modules/14_KPI/interface/index/Main";
const props = defineProps({ const props = defineProps({
getAll: Function, getAll: Function,
}); });
const route = useRoute(); const route = useRoute();
const idKpi = ref<string>(route.params.id.toLocaleString()); const idKpi = ref<string>(route.params.id.toLocaleString());
const development = ref<any[]>([]);
const reasonDevelopment70 = ref<string>("");
const reasonDevelopment20 = ref<string>("");
const reasonDevelopment10 = ref<string>("");
const checkOtherBox11 = computed<boolean>(() => {
return development.value.includes("other1");
});
const checkOtherBox12 = computed<boolean>(() => {
return development.value.includes("other2");
});
const checkOtherBox13 = computed<boolean>(() => {
return development.value.includes("other3");
});
const isDevelopment70 = computed(() => {
return projectTechniquesOp1.value.some((txt) =>
development.value.includes(txt.value)
);
});
const isDevelopment20 = computed(() => {
return projectTechniquesOp2.value.some((txt) =>
development.value.includes(txt.value)
);
});
const isDevelopment10 = computed(() => {
return projectTechniquesOp3.value.some((txt) =>
development.value.includes(txt.value)
);
});
const projectTechniquesOp1 = ref<DataOptionTechnique[]>([
{
value: "on_the_job_training",
label: "การฝึกปฏิบัติในงาน (On the job training)",
},
{
value: "job_project_assignment",
label: "การมอบหมายงาน/โครงการ (Job/Project assignment)",
},
{
value: "job_shadowing",
label: "การติดตามเรียนรู้รูปแบบการทำงานของผู้บริหาร (Job shadowing)",
},
{
value: "job_enlargement",
label: "การมอบหมายงานเพิ่มขึ้น (Job enlargement)",
},
{
value: "internal_trainer",
label: "การเป็นวิทยากรภายในหน่วยงาน (Internal trainer)",
},
{ value: "rotation", label: "การหมุนเวียนงาน (Rotation)" },
{ value: "activity", label: "การทำกิจกรรม (Activity)" },
{ value: "site_visit", label: "การศึกษาดูงานนอกสถานที่ (Site visit)" },
{
value: "benchmarking",
label: "การแลกเปลี่ยน เทียบเคียงความรู้ ประสมการณ์ (Benchmarking)",
},
{ value: "problem_solving", label: "การแก้ปัญหา (Problem-solving)" },
{ value: "team_working", label: "การทำงานเป็นทีม (Team working)" },
{ value: "other1", label: "อื่น ๆ (ระบุ)" },
]);
const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "coaching", label: "การสอนงาน (Coaching)" },
{ value: "mentoring", label: "การเป็นพี่เลี้ยง (Mentoring)" },
{ value: "team_meeting", label: "การประชุมทีม (Team meeting)" },
{ value: "consulting", label: "การให้คำปรึกษา (Consulting)" },
{ value: "feedback", label: "การให้ข้อคิดเห็น/เสนอแนะ (Feedback)" },
{ value: "other2", label: "อื่น ๆ (ระบุ)" },
]);
const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
{
value: "self_learning",
label: "การเรียนรู้ด้วยตนเอง แบบ online/offline (Self learning)",
},
{ value: "classroom_training", label: "การฝึกอบรม (Classroom training)" },
{
value: "in_house_training",
label: "การฝึกอบรมภายในองค์กร (In house training)",
},
{
value: "public_training",
label: "การฝึกอบรมจากองค์กรภายนอก (Public training)",
},
{
value: "e_training",
label: "การฝึกอบรมผ่าน online (e training / e learning)",
},
{ value: "meeting", label: "การประชุม (Meeting)" },
{ value: "seminar", label: "การสัมมนา (Seminar)" },
{ value: "other3", label: "อื่น ๆ (ระบุ)" },
]);
const $q = useQuasar(); const $q = useQuasar();
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const { const {
@ -59,9 +153,9 @@ function close() {
function onSubmit() { function onSubmit() {
if ( if (
formData.isDevelopment70 == false && isDevelopment70.value == false &&
formData.isDevelopment20 == false && isDevelopment20.value == false &&
formData.isDevelopment10 == false isDevelopment10.value == false
) { ) {
dialogMessageNotify($q, "กรุณาเลือกวิธีการพัฒนา อย่างน้อย 1 ตัวเลือก"); dialogMessageNotify($q, "กรุณาเลือกวิธีการพัฒนา อย่างน้อย 1 ตัวเลือก");
} else { } else {
@ -75,10 +169,15 @@ function onSubmit() {
achievement10: formData.achievement10, achievement10: formData.achievement10,
achievement5: formData.achievement5, achievement5: formData.achievement5,
achievement0: formData.achievement0, achievement0: formData.achievement0,
isDevelopment70: formData.isDevelopment70, isDevelopment70: isDevelopment70.value,
isDevelopment20: formData.isDevelopment20, isDevelopment20: isDevelopment20.value,
isDevelopment10: formData.isDevelopment10, isDevelopment10: isDevelopment10.value,
kpiUserEvaluationId: idKpi.value, kpiUserEvaluationId: idKpi.value,
developmentProjects: development.value,
reasonDevelopment70:checkOtherBox11 ? reasonDevelopment70.value:'',
reasonDevelopment20:checkOtherBox12 ? reasonDevelopment20.value:'',
reasonDevelopment10:checkOtherBox13 ? reasonDevelopment10.value:'',
}; };
showLoader(); showLoader();
http[id.value ? "put" : "post"](url, body) http[id.value ? "put" : "post"](url, body)
@ -113,6 +212,10 @@ watch(
formData.achievement10 = data.achievement10; formData.achievement10 = data.achievement10;
formData.achievement5 = data.achievement5; formData.achievement5 = data.achievement5;
formData.achievement0 = data.achievement0; formData.achievement0 = data.achievement0;
development.value = data.developmentProjects;
reasonDevelopment70.value = data.developmentProjects.includes("other1") ? data.reasonDevelopment70:'';
reasonDevelopment20.value = data.developmentProjects.includes("other2") ? data.reasonDevelopment20:'';
reasonDevelopment10.value = data.developmentProjects.includes("other3") ? data.reasonDevelopment10:'';
}) })
.catch((e) => { .catch((e) => {
messageError($q, e); messageError($q, e);
@ -126,7 +229,7 @@ watch(
</script> </script>
<template> <template>
<q-dialog persistent v-model="modal"> <q-dialog persistent v-model="modal">
<q-card style="width: 80%"> <q-card style="min-width: 90vw">
<q-form greedy @submit.prevent @validation-success="onSubmit"> <q-form greedy @submit.prevent @validation-success="onSubmit">
<DialogHeader <DialogHeader
:tittle="`${id ? 'แก้ไข' : 'เพิ่ม'}การพัฒนาตนเอง`" :tittle="`${id ? 'แก้ไข' : 'เพิ่ม'}การพัฒนาตนเอง`"
@ -151,8 +254,88 @@ watch(
<div class="col-12"> <div class="col-12">
<span class="text-weight-medium">การพฒนา</span> <span class="text-weight-medium">การพฒนา</span>
</div> </div>
<div class="column"> <div class="row q-col-gutter-md full-width">
<q-checkbox <div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-medium"
>70 การลงมอปฏ (โดยผงคบบญชามอบหมาย)</span
>
<q-option-group
class="check_box q-mt-sm"
keep-color
color="primary"
dense
v-model="development"
:options="projectTechniquesOp1"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox11">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment70"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-medium"
>20 การเรยนรจากผ (Coach/Mentor/Consulting)</span
>
<q-option-group
class="check_box q-mt-sm"
keep-color
color="primary"
dense
v-model="development"
:options="projectTechniquesOp2"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox12">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment20"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-medium">10 การฝกอบรมอนๆ</span>
<q-option-group
class="check_box q-mt-sm"
keep-color
color="primary"
dense
v-model="development"
:options="projectTechniquesOp3"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox13">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment10"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
<!-- <q-checkbox
v-model="formData.isDevelopment70" v-model="formData.isDevelopment70"
label="70 การลงมือปฏิบัติ (โดยผู้บังคับบัญชามอบหมาย)" label="70 การลงมือปฏิบัติ (โดยผู้บังคับบัญชามอบหมาย)"
/> />
@ -163,7 +346,7 @@ watch(
<q-checkbox <q-checkbox
v-model="formData.isDevelopment10" v-model="formData.isDevelopment10"
label="10 การฝึกอบรมอื่นๆ" label="10 การฝึกอบรมอื่นๆ"
/> /> -->
</div> </div>
<div class="col-12"> <div class="col-12">
<q-input <q-input
@ -256,3 +439,14 @@ watch(
</q-card> </q-card>
</q-dialog> </q-dialog>
</template> </template>
<style scoped>
:deep(.check_box .q-checkbox) {
align-items: start;
}
.other_custom_input {
position: absolute;
top: -25px;
width: 100%;
}
</style>

View file

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from "vue"; import { ref, watch, computed } from "vue";
import { useQuasar, type QTableProps } from "quasar"; import { useQuasar, type QTableProps } from "quasar";
import http from "@/plugins/http"; import http from "@/plugins/http";
import config from "@/app.config"; import config from "@/app.config";
import type { DataOptionTechnique } from "@/modules/14_KPI/interface/index/Main";
/** /**
* importType * importType
*/ */
@ -25,6 +25,102 @@ import { useCounterMixin } from "@/stores/mixin";
/** /**
* use * use
*/ */
const development = ref<any[]>([]);
const reasonDevelopment70 = ref<string>("");
const reasonDevelopment20 = ref<string>("");
const reasonDevelopment10 = ref<string>("");
const checkOtherBox11 = computed<boolean>(() => {
return development.value.includes("other1");
});
const checkOtherBox12 = computed<boolean>(() => {
return development.value.includes("other2");
});
const checkOtherBox13 = computed<boolean>(() => {
return development.value.includes("other3");
});
const isDevelopment70 = computed(() => {
return projectTechniquesOp1.value.some((txt) =>
development.value.includes(txt.value)
);
});
const isDevelopment20 = computed(() => {
return projectTechniquesOp2.value.some((txt) =>
development.value.includes(txt.value)
);
});
const isDevelopment10 = computed(() => {
return projectTechniquesOp3.value.some((txt) =>
development.value.includes(txt.value)
);
});
const projectTechniquesOp1 = ref<DataOptionTechnique[]>([
{
value: "on_the_job_training",
label: "การฝึกปฏิบัติในงาน (On the job training)",
},
{
value: "job_project_assignment",
label: "การมอบหมายงาน/โครงการ (Job/Project assignment)",
},
{
value: "job_shadowing",
label: "การติดตามเรียนรู้รูปแบบการทำงานของผู้บริหาร (Job shadowing)",
},
{
value: "job_enlargement",
label: "การมอบหมายงานเพิ่มขึ้น (Job enlargement)",
},
{
value: "internal_trainer",
label: "การเป็นวิทยากรภายในหน่วยงาน (Internal trainer)",
},
{ value: "rotation", label: "การหมุนเวียนงาน (Rotation)" },
{ value: "activity", label: "การทำกิจกรรม (Activity)" },
{ value: "site_visit", label: "การศึกษาดูงานนอกสถานที่ (Site visit)" },
{
value: "benchmarking",
label: "การแลกเปลี่ยน เทียบเคียงความรู้ ประสมการณ์ (Benchmarking)",
},
{ value: "problem_solving", label: "การแก้ปัญหา (Problem-solving)" },
{ value: "team_working", label: "การทำงานเป็นทีม (Team working)" },
{ value: "other1", label: "อื่น ๆ (ระบุ)" },
]);
const projectTechniquesOp2 = ref<DataOptionTechnique[]>([
{ value: "coaching", label: "การสอนงาน (Coaching)" },
{ value: "mentoring", label: "การเป็นพี่เลี้ยง (Mentoring)" },
{ value: "team_meeting", label: "การประชุมทีม (Team meeting)" },
{ value: "consulting", label: "การให้คำปรึกษา (Consulting)" },
{ value: "feedback", label: "การให้ข้อคิดเห็น/เสนอแนะ (Feedback)" },
{ value: "other2", label: "อื่น ๆ (ระบุ)" },
]);
const projectTechniquesOp3 = ref<DataOptionTechnique[]>([
{
value: "self_learning",
label: "การเรียนรู้ด้วยตนเอง แบบ online/offline (Self learning)",
},
{ value: "classroom_training", label: "การฝึกอบรม (Classroom training)" },
{
value: "in_house_training",
label: "การฝึกอบรมภายในองค์กร (In house training)",
},
{
value: "public_training",
label: "การฝึกอบรมจากองค์กรภายนอก (Public training)",
},
{
value: "e_training",
label: "การฝึกอบรมผ่าน online (e training / e learning)",
},
{ value: "meeting", label: "การประชุม (Meeting)" },
{ value: "seminar", label: "การสัมมนา (Seminar)" },
{ value: "other3", label: "อื่น ๆ (ระบุ)" },
]);
const $q = useQuasar(); const $q = useQuasar();
const { showLoader, messageError, hideLoader } = useCounterMixin(); const { showLoader, messageError, hideLoader } = useCounterMixin();
@ -96,6 +192,11 @@ function fetchDetailIndividual() {
.map((key) => `isDevelopment${key}`); .map((key) => `isDevelopment${key}`);
target.value = data.target; target.value = data.target;
development.value = data.developmentProjects;
reasonDevelopment70.value = data.developmentProjects.includes("other1") ? data.reasonDevelopment70:'';
reasonDevelopment20.value = data.developmentProjects.includes("other2") ? data.reasonDevelopment20:'';
reasonDevelopment10.value = data.developmentProjects.includes("other3") ? data.reasonDevelopment10:'';
const achievements = ["10", "5", "0"]; const achievements = ["10", "5", "0"];
rows.value = achievements.map((i) => ({ rows.value = achievements.map((i) => ({
achievement: i, achievement: i,
@ -130,13 +231,13 @@ watch(
<template> <template>
<q-dialog v-model="modal" persistent> <q-dialog v-model="modal" persistent>
<q-card style="width: 500px; max-width: 60vw"> <q-card style="min-width: 90vw" class="no-scroll">
<DialogHeader <DialogHeader
:tittle="'รายละเอียดแผนพัฒนาการปฏิบัติราชการรายบุคคล'" :tittle="'รายละเอียดแผนพัฒนาการปฏิบัติราชการรายบุคคล'"
:close="onCloseDialoh" :close="onCloseDialoh"
/> />
<q-separator /> <q-separator />
<q-card-section> <q-card-section class="scroll" style="max-height: 90vh">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-12"> <div class="col-12">
<q-input <q-input
@ -158,6 +259,91 @@ watch(
disable disable
/> />
</div> </div>
<div class="row q-col-gutter-md full-width">
<div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-bold"
>70 การลงมอปฏ (โดยผงคบบญชามอบหมาย)</span
>
<q-option-group
class="check_box q-mt-sm"
keep-color
color="primary"
dense
disable
v-model="development"
:options="projectTechniquesOp1"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox11">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment70"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-bold"
>20 การเรยนรจากผ (Coach/Mentor/Consulting)</span
>
<q-option-group
class="check_box q-mt-sm"
keep-color
disable
color="primary"
dense
v-model="development"
:options="projectTechniquesOp2"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox12">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment20"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
<div class="col-12 col-sm-6 col-md-6 col-lg-4">
<span class="text-weight-bold">10 การฝกอบรมอนๆ</span>
<q-option-group
class="check_box q-mt-sm"
keep-color
color="primary"
dense
disable
v-model="development"
:options="projectTechniquesOp3"
type="checkbox"
/>
<div class="row q-pb-md" v-if="checkOtherBox13">
<div class="offset-4 col-8 q-mt-sm relative-position">
<div class="other_custom_input">
<q-input
v-model="reasonDevelopment10"
dense
outlined
class="inputgreen"
label="กรุณาระบุ"
></q-input>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<div class="col-12"> <div class="col-12">
<q-input <q-input
@ -219,11 +405,6 @@ watch(
</q-td> </q-td>
</q-tr> </q-tr>
</template> </template>
<!-- <template v-slot:no-data="{ icon, message }">
<div class="q-pa-md text-weight-bold full-width text-center">
<span style="font-size: 16px">ไมพบขอมลสมรรถนะ</span>
</div>
</template> -->
</q-table> </q-table>
</div> </div>
</div> </div>
@ -232,4 +413,14 @@ watch(
</q-dialog> </q-dialog>
</template> </template>
<style scoped></style> <style scoped>
:deep(.check_box .q-checkbox) {
align-items: start;
}
.other_custom_input {
position: absolute;
top: -25px;
width: 100%;
}
</style>

View file

@ -11,6 +11,11 @@ interface ItemsTab {
name: string; name: string;
} }
interface DataOptionTechnique {
label: string;
value: string;
}
interface ItemsMenu { interface ItemsMenu {
label: string; label: string;
value: string; value: string;
@ -84,4 +89,5 @@ export type {
ItemsTab, ItemsTab,
OptionCheckbox, OptionCheckbox,
DataAchievement, DataAchievement,
DataOptionTechnique
}; };