แก้ไขตัวชี้วัดตามแผน (U)

This commit is contained in:
oat_dev 2024-04-19 10:58:23 +07:00
parent 34cb5f6c8e
commit cb76bf12c1
2 changed files with 296 additions and 182 deletions

View file

@ -101,11 +101,15 @@ function updateSelected(data: any) {
planData.strategyChildPlannedId = data.id; planData.strategyChildPlannedId = data.id;
planData.strategyChildPlannedNode = data.level; planData.strategyChildPlannedNode = data.level;
} }
function updateSelectedAgency(data: any) {
planData.agencyId = data.orgTreeId;
planData.agencyLevel = data.orgLevel;
}
onMounted(() => { onMounted(async () => {
// fetchData(); // fetchData();
fetchTree(); await fetchTree();
fetchOrganizationActive(); await fetchOrganizationActive();
setTimeout(async () => { setTimeout(async () => {
store.activeId && (await fetchDataTree(store.activeId)); store.activeId && (await fetchDataTree(store.activeId));
}, 200); }, 200);
@ -116,38 +120,6 @@ onMounted(() => {
<q-form @submit.prevent greedy @validation-success="onSubmit()"> <q-form @submit.prevent greedy @validation-success="onSubmit()">
<div> <div>
<div class="row q-col-gutter-md q-pa-md"> <div class="row q-col-gutter-md q-pa-md">
<div class="col-8">
<q-input
outlined
v-model="planData.tree"
label="หน่วยงาน/ส่วนราชการ"
bg-color="white"
dense
class="inputgreen"
:rules="[(val) => !!val || `${'หน่วยงาน/ส่วนราชการ'}`]"
hide-bottom-space
/>
</div>
<div class="col-2">
<q-select
dense
outlined
v-model="planData.round"
:options="roundOp"
label="รอบการประเมิน"
hide-bottom-space
option-label="name"
option-value="id"
map-options
emit-value
lazy-rules
class="inputgreen"
:rules="[
(val:string) =>
!!val || `${'กรุณาเลือกรอบการประเมิน'}`,
]"
/>
</div>
<div class="col-2"> <div class="col-2">
<datepicker <datepicker
menu-class-name="modalfix" menu-class-name="modalfix"
@ -179,7 +151,27 @@ onMounted(() => {
</template> </template>
</datepicker> </datepicker>
</div> </div>
<div class="col-3"> <div class="col-2">
<q-select
dense
outlined
v-model="planData.round"
:options="roundOp"
label="รอบการประเมิน"
hide-bottom-space
option-label="name"
option-value="id"
map-options
emit-value
lazy-rules
class="inputgreen"
:rules="[
(val:string) =>
!!val || `${'กรุณาเลือกรอบการประเมิน'}`,
]"
/>
</div>
<div class="col-2">
<q-input <q-input
outlined outlined
v-model="planData.Data1" v-model="planData.Data1"
@ -257,11 +249,11 @@ onMounted(() => {
<q-input <q-input
outlined outlined
v-model="planData.point5" v-model="planData.point5"
label="ระดับคะแนน" label="กรอกผลสำเร็จของงาน"
bg-color="white" bg-color="white"
dense dense
class="inputgreen" class="inputgreen"
:rules="[(val) => !!val || `${'กรุณากรอกระดับคะแนน'}`]" :rules="[(val) => !!val || `${'กรุณากรอกผลสำเร็จของงาน'}`]"
hide-bottom-space hide-bottom-space
/> />
</div> </div>
@ -274,11 +266,11 @@ onMounted(() => {
<q-input <q-input
outlined outlined
v-model="planData.point4" v-model="planData.point4"
label="ระดับคะแนน" label="กรอกผลสำเร็จของงาน"
bg-color="white" bg-color="white"
dense dense
class="inputgreen" class="inputgreen"
:rules="[(val) => !!val || `${'กรุณากรอกระดับคะแนน'}`]" :rules="[(val) => !!val || `${'กรุณากรอกผลสำเร็จของงาน'}`]"
hide-bottom-space hide-bottom-space
/> />
</div> </div>
@ -291,11 +283,11 @@ onMounted(() => {
<q-input <q-input
outlined outlined
v-model="planData.point3" v-model="planData.point3"
label="ระดับคะแนน" label="กรอกผลสำเร็จของงาน"
bg-color="white" bg-color="white"
dense dense
class="inputgreen" class="inputgreen"
:rules="[(val) => !!val || `${'กรุณากรอกระดับคะแนน'}`]" :rules="[(val) => !!val || `${'กรุณากรอกผลสำเร็จของงาน'}`]"
hide-bottom-space hide-bottom-space
/> />
</div> </div>
@ -308,11 +300,11 @@ onMounted(() => {
<q-input <q-input
outlined outlined
v-model="planData.point2" v-model="planData.point2"
label="ระดับคะแนน" label="กรอกผลสำเร็จของงาน"
bg-color="white" bg-color="white"
dense dense
class="inputgreen" class="inputgreen"
:rules="[(val) => !!val || `${'กรุณากรอกระดับคะแนน'}`]" :rules="[(val) => !!val || `${'กรุณากรอกผลสำเร็จของงาน'}`]"
hide-bottom-space hide-bottom-space
/> />
</div> </div>
@ -325,11 +317,11 @@ onMounted(() => {
<q-input <q-input
outlined outlined
v-model="planData.point1" v-model="planData.point1"
label="ระดับคะแนน" label="กรอกผลสำเร็จของงาน"
bg-color="white" bg-color="white"
dense dense
class="inputgreen" class="inputgreen"
:rules="[(val) => !!val || `${'กรุณากรอกระดับคะแนน'}`]" :rules="[(val) => !!val || `${'กรุณากรอกผลสำเร็จของงาน'}`]"
hide-bottom-space hide-bottom-space
/> />
</div> </div>
@ -367,7 +359,7 @@ onMounted(() => {
<div <div
class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md" class="col-xs-12 col-sm-12 text-weight-medium bg-grey-1 q-py-xs q-px-md"
> >
หนวยงาน หนวยงาน/วนราชการ
</div> </div>
<q-separator /> <q-separator />
@ -384,11 +376,12 @@ onMounted(() => {
</template> </template>
</q-input> </q-input>
<q-tree <q-tree
style="height: 350px; overflow: scroll"
dense dense
:nodes="nodeAgency" :nodes="nodeAgency"
node-key="orgTreeId" node-key="orgTreeId"
label-key="labelName" label-key="labelName"
default-expand-all selected-color="primary"
:filter="filterAgency" :filter="filterAgency"
:no-results-label="notFound" :no-results-label="notFound"
:no-nodes-label="noData" :no-nodes-label="noData"
@ -397,8 +390,8 @@ onMounted(() => {
<template v-slot:default-header="prop"> <template v-slot:default-header="prop">
<q-item <q-item
clickable clickable
@click.stop="updateSelectedAgency(prop.node)"
:active="nodeId == prop.node.orgTreeId" :active="nodeId == prop.node.orgTreeId"
@click.stop="updateSelected(prop.node)"
active-class="my-list-link text-primary text-weight-medium" active-class="my-list-link text-primary text-weight-medium"
class="row col-12 items-center text-dark q-py-xs q-pl-sm rounded-borders my-list" class="row col-12 items-center text-dark q-py-xs q-pl-sm rounded-borders my-list"
> >
@ -445,6 +438,7 @@ onMounted(() => {
</template> </template>
</q-input> </q-input>
<q-tree <q-tree
style="height: 350px; overflow: scroll"
dense dense
:nodes="nodeplan" :nodes="nodeplan"
selected-color="primary" selected-color="primary"

View file

@ -5,11 +5,13 @@ import { useRouter } from "vue-router";
/** importStore*/ /** importStore*/
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import http from "@/plugins/http";
import config from "@/app.config";
/** use*/ /** use*/
const $q = useQuasar(); const $q = useQuasar();
const router = useRouter(); const router = useRouter();
const { showLoader, hideLoader, dialogRemove, success } = useCounterMixin(); const { showLoader, hideLoader, dialogRemove, success, messageError } =
useCounterMixin();
/** หัวตาราง */ /** หัวตาราง */
const rows = ref<any>([]); const rows = ref<any>([]);
@ -42,6 +44,10 @@ const columns = ref<QTableProps["columns"]>([
style: "font-size: 14px", style: "font-size: 14px",
}, },
]); ]);
const node = ref<any>([]);
const expanded = ref<any>([]);
const filter = ref<string>("");
const filterMain = ref<string>("");
const visibleColumns = ref<string[]>([ const visibleColumns = ref<string[]>([
"indicatorNo", "indicatorNo",
"indicatorPass", "indicatorPass",
@ -66,6 +72,11 @@ const formFilter = reactive({
keyword: "", keyword: "",
}); });
const nodeData = reactive<any>({
node: null,
nodeId: null,
});
function fetchList() { function fetchList() {
showLoader(); showLoader();
const data = [ const data = [
@ -101,8 +112,49 @@ function onClickDelete(id: number) {
}); });
} }
function fetchActive() {
showLoader();
http
.get(config.API.activeOrganization)
.then((res) => {
const data = res.data.result;
fetchTree(data.activeId);
})
.catch((err) => {
messageError($q, err);
hideLoader();
});
}
async function fetchTree(id: string) {
showLoader();
http
.get(config.API.orgByid(id.toString()))
.then((res) => {
const data = res.data.result;
node.value = data;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
function updateSelectedTreeMain(data: any) {
if (nodeData.node === data.orgLevel && nodeData.nodeId === data.orgTreeId) {
nodeData.node = null;
nodeData.nodeId = null;
} else {
nodeData.node = data.orgLevel;
nodeData.nodeId = data.orgTreeId;
}
}
onMounted(() => { onMounted(() => {
fetchList(); fetchList();
fetchActive();
}); });
</script> </script>
@ -111,139 +163,207 @@ onMounted(() => {
รายการตวชดตามแผนฯ รายการตวชดตามแผนฯ
</div> </div>
<q-card flat bordered class="q-pa-md"> <q-card flat bordered class="q-pa-md">
<q-toolbar class="q-pa-none"> <div class="row q-col-gutter-sm">
<div class="row q-gutter-x-sm"> <q-card bordered class="col-4">
<div> <q-card-section class="q-py-sm">
<q-select <div class="text-subtitle2 text-bold">หนวยงาน/วนราชการ</div>
dense </q-card-section>
outlined <div class="col-xs-12 col-sm-3 row">
v-model="formFilter.org" <div class="col-12 row no-wrap">
:options="orgOp" <div class="col-12 q-py-sm q-px-sm">
label="หน่วยงาน/ส่วนราชการ" <div class="q-gutter-sm">
option-label="name" <q-input dense outlined v-model="filterMain" label="ค้นหา">
option-value="id" <template v-slot:append>
emit-value <q-icon
map-options v-if="filterMain !== ''"
/> name="clear"
</div> class="cursor-pointer"
<div> @click="filterMain = ''"
<q-select />
dense <q-icon v-else name="search" color="grey-5" />
outlined </template>
v-model="formFilter.round" </q-input>
:options="roundOp" <div>
label="รอบการประเมิน" <q-tree
option-label="name" class="tree-container"
option-value="id" dense
emit-value :nodes="node"
map-options node-key="orgTreeName"
/> label-key="labelName"
</div> v-model:expanded="expanded"
</div> :filter="filterMain"
<q-toolbar-title> no-results-label="ไม่พบข้อมูลที่ค้นหา"
<q-btn no-nodes-label="ไม่มีข้อมูล"
flat v-model:selected="nodeData.nodeId"
round >
dense <template v-slot:default-header="prop">
icon="add" <q-item
color="primary" clickable
@click="onClickAddOrView()" @click.stop="updateSelectedTreeMain(prop.node)"
> :active="nodeData.nodeId === prop.node.orgTreeId"
<q-tooltip>เพ</q-tooltip> active-class="my-list-link text-primary text-weight-medium"
</q-btn> class="row col-12 items-center text-dark q-py-xs q-pl-sm rounded-borders my-list"
</q-toolbar-title> >
<div>
<q-space /> <div class="text-weight-medium">
<div class="row q-gutter-sm"> {{ prop.node.orgTreeName }}
<div> </div>
<q-input <div class="text-weight-light text-grey-8">
standout {{
dense prop.node.orgCode == null
v-model="formFilter.keyword" ? null
ref="filterRef" : prop.node.orgCode
outlined }}
debounce="300" {{
placeholder="ค้นหา" prop.node.orgTreeShortName == null
> ? null
<template v-slot:append> : prop.node.orgTreeShortName
<q-icon v-if="formFilter.keyword == ''" name="search" /> }}
<q-icon </div>
v-if="formFilter.keyword !== ''" </div>
name="clear" </q-item>
class="cursor-pointer" </template>
@click="formFilter.keyword = ''" </q-tree>
/> </div>
</template>
</q-input>
</div>
<div>
<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"
options-cover
style="min-width: 150px"
/>
</div>
</div>
</q-toolbar>
<div class="col-12">
<d-table
for="table"
ref="table"
:columns="columns"
:rows="rows"
row-key="subject"
flat
bordered
dense
class="custom-header-table"
:visible-columns="visibleColumns"
>
<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-th auto-width />
</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.name"
:props="props"
@click="onClickAddOrView(true, props.row.id)"
>
<div class="table_ellipsis">
{{ col.value ? col.value : "-" }}
</div> </div>
</q-td> </div>
<q-td> <div class="col-12 row">
<q-btn <q-separator :vertical="!$q.screen.lt.md" />
flat </div>
round </div>
icon="delete" </div>
color="red" </q-card>
@click.stop.pervent="onClickDelete(props.rowIndex)" <div class="col-8">
> <div class="row q-col-gutter-sm q-mb-sm">
<q-tooltip>ลบขอม </q-tooltip> <div class="col-3">
</q-btn> <q-select
</q-td> dense
</q-tr> outlined
</template> v-model="formFilter.round"
</d-table> :options="roundOp"
label="รอบการประเมิน"
option-label="name"
option-value="id"
emit-value
map-options
/>
</div>
<div class="col-2">
<q-btn
flat
round
dense
icon="add"
color="primary"
@click="onClickAddOrView()"
>
<q-tooltip>เพ</q-tooltip>
</q-btn>
</div>
<div class="col-4">
<q-input
standout
dense
v-model="formFilter.keyword"
ref="filterRef"
outlined
debounce="300"
placeholder="ค้นหา"
>
<template v-slot:append>
<q-icon v-if="formFilter.keyword == ''" name="search" />
<q-icon
v-if="formFilter.keyword !== ''"
name="clear"
class="cursor-pointer"
@click="formFilter.keyword = ''"
/>
</template>
</q-input>
</div>
<div class="col-3">
<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"
options-cover
style="min-width: 150px"
/>
</div>
</div>
<div class="col-12">
<d-table
for="table"
ref="table"
:columns="columns"
:rows="rows"
row-key="subject"
flat
bordered
dense
class="custom-header-table"
:visible-columns="visibleColumns"
>
<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-th auto-width />
</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.name"
:props="props"
@click="onClickAddOrView(true, props.row.id)"
>
<div class="table_ellipsis">
{{ col.value ? col.value : "-" }}
</div>
</q-td>
<q-td>
<q-btn
flat
round
icon="delete"
color="red"
@click.stop.pervent="onClickDelete(props.rowIndex)"
>
<q-tooltip>ลบขอม </q-tooltip>
</q-btn>
</q-td>
</q-tr>
</template>
</d-table>
</div>
</div>
</div> </div>
</q-card> </q-card>
</template> </template>
<style scoped></style> <style lang="scss" scoped>
.tree-container {
overflow: auto;
height: 65vh;
border: 1px solid #e6e6e7;
border-radius: 10px;
}
.my-list-link {
color: rgb(118, 168, 222);
border-radius: 5px;
background: #a3d3fb48 !important;
font-weight: 600;
border: 1px solid rgba(175, 185, 196, 0.217);
}
</style>