diff --git a/src/modules/05_placement/components/probation/FormAssign.vue b/src/modules/05_placement/components/probation/FormAssign.vue index 4202eb376..eeebdbda2 100644 --- a/src/modules/05_placement/components/probation/FormAssign.vue +++ b/src/modules/05_placement/components/probation/FormAssign.vue @@ -60,6 +60,10 @@ const position = ref(""); const monthSelect = ref(); +const optionCaretaker2 = ref([]); +const OPcommanderFn = ref([]); +const OPchairmanFn = ref([]); +const optionCaretaker = ref([]); const caretaker1 = ref(""); const caretaker2 = ref(""); const productivityCount = ref(1); @@ -70,6 +74,18 @@ const activity_desc = ref(Array(activityCount.value).fill("")); const goal_desc = ref(Array(activityCount.value).fill("")); const checkRule = ref([]); +const isDatePicker2Readonly = computed(() => { + return date_start.value === undefined; +}); +const activityArray = computed(() => { + return Array(activityCount.value).fill(""); +}); +const knowledgeArray = computed(() => { + return Array(knowledgeCount.value).fill(""); +}); +const ProductivityArray = computed(() => { + return Array(productivityCount.value).fill(""); +}); const OPmain = ref< Array<{ id: number; title: string; description: string; level: number }> >([]); @@ -131,7 +147,22 @@ const OPchairman = ref< }>[] >([]); -const dataEdit = async (id: string) => { +interface MonthOption { + value: number; + label: string; +} +interface CheckboxItem { + id: number; + parent_id: number; + description: string; + status_select: number; + checked: number; +} +/** + * update edit + * @param id personal id + */ +async function dataEdit(id: string) { await myForm.value.validate().then((result: boolean) => { if (result) { showLoader(); @@ -149,106 +180,127 @@ const dataEdit = async (id: string) => { dialogMessageNotify($q, "กรุณากรอกข้อมูลให้ครบ"); } }); -}; -const saveEdit = (id: string) => { - dialogConfirm($q, async () => await dataEdit(id)); -}; -const edit = () => { - status.value = true; -}; -const cancel = () => { - status.value = false; - getAssign(); -}; - -const filterData = (options: any[], excludedGroups: any[]) => { - return options.filter( - (item) => !excludedGroups.some((group) => group && group.id === item.id) - ); -}; -const filtermantor = (options: any[], excludedGroups: any[]) => { - return options.filter( - (item) => !excludedGroups.some((group) => group && group.id === item.id) - ); -}; -const filterMain = (options: any[], excludedGroups: any[]) => { - return options.filter( - (item) => !excludedGroups.some((group) => group && group.id === item.id) - ); -}; - -const clearDateExam = () => { - date_start.value = undefined; -}; -const clearDateExam2 = () => { - date_finish.value = undefined; -}; -const isDatePicker2Readonly = computed(() => { - return date_start.value === undefined; -}); - -interface MonthOption { - value: number; - label: string; } -//-----------------(3.1)-----------// +/** + * pop up confirm + * @param id personal id + */ +function saveEdit(id: string) { + dialogConfirm($q, async () => await dataEdit(id)); +} -const addActivity = () => { +/** open dialog */ +function edit() { + status.value = true; +} + +/** close dialog */ +function cancel() { + status.value = false; + getAssign(); +} + +/** + * ฟังก์ชันกรองข้อมูล + * @param options อาร์เรย์ข้อมูลที่จะถูกกรอง + * @param excludedGroups อาร์เรย์ของกลุ่มที่ไม่ต้องการรวม + * @returns {any[]} อาร์เรย์ข้อมูลที่ผ่านการกรอง + */ +function filterData(options: any[], excludedGroups: any[]) { + return options.filter( + (item) => !excludedGroups.some((group) => group && group.id === item.id) + ); +} + +/** + * ฟังก์ชันกรองข้อมูล + * @param options อาร์เรย์ข้อมูลที่จะถูกกรอง + * @param excludedGroups อาร์เรย์ของกลุ่มที่ไม่ต้องการรวม + * @returns {any[]} อาร์เรย์ข้อมูลที่ผ่านการกรอง + */ +function filtermantor(options: any[], excludedGroups: any[]) { + return options.filter( + (item) => !excludedGroups.some((group) => group && group.id === item.id) + ); +} + +/** + * ฟังก์ชันกรองข้อมูล + * @param options อาร์เรย์ข้อมูลที่จะถูกกรอง + * @param excludedGroups อาร์เรย์ของกลุ่มที่ไม่ต้องการรวม + * @returns {any[]} อาร์เรย์ข้อมูลที่ผ่านการกรอง + */ +function filterMain(options: any[], excludedGroups: any[]) { + return options.filter( + (item) => !excludedGroups.some((group) => group && group.id === item.id) + ); +} + +/** reset ค่าวันที่เริ่ม */ +function clearDateExam() { + date_start.value = undefined; +} + +/** reset ค่าวันที่สิ้นสุด */ +function clearDateExam2() { + date_finish.value = undefined; +} + +/** เพิ่ม ผลการปฏิบัติงาน*/ +function addActivity() { activityCount.value++; -}; -const deleteactivity = (item: number) => { +} + +/** + * ลบ ผลการปฏิบัติงาน + * @param item ตำเเหน่งของตัวที่ลบ เป็นตัวเลข + */ +function deleteactivity(item: number) { activity_desc.value.splice(item, 1); goal_desc.value.splice(item, 1); if (activityCount.value > 2) { activityCount.value--; } -}; -const activityArray = computed(() => { - return Array(activityCount.value).fill(""); -}); +} -//-----------------(3.2)-----------// - -const addKnowledge = () => { +/** เพิ่มความรู้ความสามารถ โดย สูงสุดที่ 6 item */ +function addKnowledge() { if (knowledgeCount.value < 6) { knowledgeCount.value++; } -}; +} -const knowledgeArray = computed(() => { - return Array(knowledgeCount.value).fill(""); -}); - -const deleteknowledge = (item: number) => { +/** + * ลบ ความรู้ความสามารถ + * @param item ตำเเหน่งของตัวที่ลบ เป็นตัวเลข + */ +function deleteknowledge(item: number) { knowledge.value.splice(item, 1); if (knowledgeCount.value > 3) { knowledgeCount.value--; } -}; +} -const deleteProductivitys = (item: number) => { +/** เพิ่ม ผลผลิตของงาน*/ +function addProductivity() { + productivityCount.value++; +} + +/** + * ลบ ผลผลิตของงาน + * @param item ตำเเหน่งของตัวที่ลบ เป็นตัวเลข + */ +function deleteProductivitys(item: number) { output_desc.value.splice(item, 1); indicator_desc.value.splice(item, 1); if (productivityCount.value > 1) { productivityCount.value--; } -}; -const addProductivity = () => { - productivityCount.value++; -}; -const ProductivityArray = computed(() => { - return Array(productivityCount.value).fill(""); -}); -interface CheckboxItem { - id: number; - parent_id: number; - description: string; - status_select: number; - checked: number; } -const getUser = async () => { +/** get ข้อมูล */ +async function getUser() { await http.get(config.API.userPlacement(personalId)).then((res: any) => { const data = res.data.result; OPcaretaker.value = data.caregiver.map((item: any) => ({ @@ -305,8 +357,13 @@ const getUser = async () => { position: item.position, })); }); -}; -const getAssignNew = async (id: string) => { +} + +/** + *ดึงข้อมูลที่ได้รับมอบหมาย + * @param id personal id + */ +async function getAssignNew(id: string) { await http.get(config.API.newAssign(id)).then((res: any) => { const data = res.data.data; const monthOption = { @@ -318,8 +375,13 @@ const getAssignNew = async (id: string) => { fullname.value = data.person.name; position.value = data.person.Position; }); -}; -const getcompetency = async (id: string) => { +} + +/** + * get ข้อมูล สมรรถนะหลัก + * @param id personal id + */ +async function getcompetency(id: string) { await http.get(config.API.competencyOptions(id)).then((res: any) => { const data = res.data.data; OPmain.value = data; @@ -329,8 +391,13 @@ const getcompetency = async (id: string) => { main4.value = data[3]; main5.value = data[4]; }); -}; -const getCompetencyGroup = async (id: string) => { +} + +/** + * get ข้อมูล สมรรถนะประจํากลุ่มงาน + * @param id personal id + */ +async function getCompetencyGroup(id: string) { await http.get(config.API.competencyGroupOptions(id)).then((res: any) => { const data = res.data.data; OPgroup.value = data; @@ -338,13 +405,23 @@ const getCompetencyGroup = async (id: string) => { group2.value = data[1]; group3.value = data[2]; }); -}; -const getKnowledge = async (id: string) => { +} + +/** + * get ข้อมูล ความรู้ความสามารถในการปฏิบัติงาน + * @param id personal id + */ +async function getKnowledge(id: string) { await http.get(config.API.knowledgeOptions(id)).then((res: any) => { OPknowledge.value = res.data.data; }); -}; -const getSkill = async (id: string) => { +} + +/** + * get ข้อมูล ทักษะ + * @param id personal id + */ +async function getSkill(id: string) { await http.get(config.API.skillOptions(id)).then((res: any) => { const skillData = res.data.data; OPcomputer.value = [skillData.computer]; @@ -356,13 +433,20 @@ const getSkill = async (id: string) => { skill3.value = skillData.information; skill4.value = skillData.resourse; }); -}; -const getLaw = async (id: string) => { +} + +/** + * get ข้อมูล ความรู้เรื่องกฎหมายและกฎระเบียบ + * @param id personal id + */ +async function getLaw(id: string) { await http.get(config.API.lawOptions(id)).then((res: any) => { checkRule.value = res.data.data; }); -}; -const postDateTime = async () => { +} + +/** ฟังชั่นส่ง วันที่ไปคำนวณ */ +async function postDateTime() { await http .post(config.API.calculateDate(), { month: monthSelect.value !== null ? parseInt(monthSelect.value) : null, @@ -376,8 +460,12 @@ const postDateTime = async () => { .finally(async () => { hideLoader(); }); -}; -const putDataEdit = (id: string) => { +} + +/** ฟังชั่น อัพเดต ข้อมูลที่จะส่ง + * @param id personal + */ +function putDataEdit(id: string) { const GUID = personalId; const assign_job = activityArray.value.map((item, index) => { const activityDesc = activity_desc.value[index]?.trim(); @@ -506,9 +594,12 @@ const putDataEdit = (id: string) => { })), }; return data; -}; +} -const putData = (id: string) => { +/** ฟังชั่น สร้างข้อมูลที่จะส่ง + * @param id personal + */ +function putData(id: string) { const GUID = personalId; const assign_job = activityArray.value.map((item, index) => { const activityDesc = activity_desc.value[index]?.trim(); @@ -628,9 +719,13 @@ const putData = (id: string) => { })), }; return data; -}; +} -const saveData = async (id: string) => { +/** + * เช็คข้อมูลก่อนบันทึก + * @param id personal id + */ +async function saveData(id: string) { await myForm.value.validate().then((result: boolean) => { if (result) { dialogConfirm($q, async () => await DataSave(id)); @@ -638,9 +733,13 @@ const saveData = async (id: string) => { dialogMessageNotify($q, "กรุณากรอกข้อมูลให้ครบ"); } }); -}; +} -const DataSave = async (id: string) => { +/** + * บันทึก + * @param id personal id + */ +async function DataSave(id: string) { const data = putData(id); await http .post(config.API.saveFinish(id), data) @@ -654,9 +753,10 @@ const DataSave = async (id: string) => { .finally(() => { hideLoader(); }); -}; +} -const getAssign = async () => { +/** get ข้อมูลรายการมอบหมาย */ +async function getAssign() { await http.get(config.API.probationsGetAssign(assignId.value)).then((res) => { status.value = false; const data = res.data.data; @@ -718,8 +818,14 @@ const getAssign = async () => { status_select: law.status_select, })); }); -}; -const downloadFile = (response: any, filename: string) => { +} + +/** + * download file + * @param response ไฟล์ + * @param filename ชื่อไฟล์ + */ +function downloadFile(response: any, filename: string) { const link = document.createElement("a"); var fileName = filename; link.href = window.URL.createObjectURL(new Blob([response.data])); @@ -727,9 +833,13 @@ const downloadFile = (response: any, filename: string) => { document.body.appendChild(link); link.click(); document.body.removeChild(link); -}; +} -const clickdownloadFile = async (type: string) => { +/** + * download file + * @param type type file + */ +async function clickdownloadFile(type: string) { showLoader(); await http .get(config.API.reportAssign(type, assignId.value), { @@ -747,8 +857,9 @@ const clickdownloadFile = async (type: string) => { .finally(() => { hideLoader(); }); -}; +} +/** เช็ค จำนวนเดือน เเละ วันที่เริ่ม ไม่เท่ากับ undefined*/ watch( () => [monthSelect.value, date_start.value], () => { @@ -757,24 +868,19 @@ watch( } } ); + +/** เช็ค ความรู้ทักษะ ไม่สามารถเลือก หัวข้อซ้ำ */ watch(knowledge.value, () => { knowledge.value.forEach((item) => { OPknowledge.value = OPknowledge.value.filter((e) => e.id != item.id); }); }); -onMounted(async () => { - await getUser(); - await getLaw(personalId); - await getcompetency(personalId); - await getCompetencyGroup(personalId); - await getSkill(personalId); - await getKnowledge(personalId); - await getAssignNew(personalId); - if (assignId.value !== undefined) { - await getAssign(); - } -}); -const optionCaretaker = ref([]); + +/** + * ฟิลเตอร์ผู้ดูเเลตาม ที่กรอก + * @param val รับค่า input + * @param update fn + */ function filterFnCaretaker(val: string, update: any) { if (val == "") { update(() => { @@ -790,7 +896,13 @@ function filterFnCaretaker(val: string, update: any) { }); } } -const optionCaretaker2 = ref([]); + +/** + * ฟิลเตอร์ผู้ดูเเลตาม ที่กรอก + * @param val รับค่า input + * @param update fn + */ + function filterFnCaretaker2(val: string, update: any) { if (val == "") { update(() => { @@ -806,7 +918,13 @@ function filterFnCaretaker2(val: string, update: any) { }); } } -const OPcommanderFn = ref([]); + +/** + * ฟิลเตอร์ผู้ดูเเลตาม ที่กรอก + * @param val รับค่า input + * @param update fn + */ + function filterFnCommander(val: string, update: any) { if (val == "") { update(() => { @@ -820,7 +938,13 @@ function filterFnCommander(val: string, update: any) { }); } } -const OPchairmanFn = ref([]); + +/** + * ฟิลเตอร์ผู้ดูเเลตาม ที่กรอก + * @param val รับค่า input + * @param update fn + */ + function filterFnChairman(val: string, update: any) { if (val == "") { update(() => { @@ -834,6 +958,20 @@ function filterFnChairman(val: string, update: any) { }); } } + +/** เมื่อโหลดหน้า เรียกใช้งานฟังชั่น */ +onMounted(async () => { + await getUser(); + await getLaw(personalId); + await getcompetency(personalId); + await getCompetencyGroup(personalId); + await getSkill(personalId); + await getKnowledge(personalId); + await getAssignNew(personalId); + if (assignId.value !== undefined) { + await getAssign(); + } +}); +
+
@@ -1095,8 +1244,9 @@ function filterFnChairman(val: string, update: any) { ไม่มีข้อมูล - + + + +
+ +
@@ -1176,6 +1329,7 @@ function filterFnChairman(val: string, update: any) { class="q-ml-sm" @click="addActivity" /> +
+ +
+ +
+ +
@@ -1257,6 +1417,7 @@ function filterFnChairman(val: string, update: any) { class="q-ml-sm" @click="addKnowledge" /> +
+ +
+ +
@@ -1403,6 +1568,7 @@ function filterFnChairman(val: string, update: any) { +
+
+
+
กฎหมายอื่น ๆ ที่เกี่ยวข้องกับการปฏิบัติงาน @@ -1480,6 +1649,7 @@ function filterFnChairman(val: string, update: any) {
+
ทักษะ
@@ -1512,6 +1682,7 @@ function filterFnChairman(val: string, update: any) {
+
+
สมรรถนะประจํากลุ่มงาน
@@ -1790,6 +1967,7 @@ function filterFnChairman(val: string, update: any) {
+
+
+
+
@@ -2169,6 +2351,7 @@ function filterFnChairman(val: string, update: any) {
+
+
+
+
ผู้ดูแลการทดลองปฏิบัติหน้าที่ราชการ
+
+ +
+ + +
ผู้บังคับบัญชาผู้มอบหมายงาน
+
+ +
+
@@ -2556,6 +2752,7 @@ function filterFnChairman(val: string, update: any) { + { +/** get ข้อมูลมอบหมายงาน */ +async function fecthAssign(){ showLoader(); await http .get(config.API.evaluateCreate(assignId.value)) @@ -117,7 +118,9 @@ const fecthAssign = async () => { hideLoader(); }); }; -const fetchEvaluate = async () => { + +/** get ข้อมูล แบบ ประเมิน*/ +async function fetchEvaluate(){ try { let data = await dataArr.value; evaluate_id.value = data.id; @@ -168,7 +171,8 @@ const fetchEvaluate = async () => { } }; -const savaForm = () => { +/** ตรวจเช็คข้อมูล */ +function savaForm(){ let hasError = false; behavio_strengthRef.value.validate(); if ( @@ -206,7 +210,9 @@ const savaForm = () => { notifyError($q, "กรุณากรอกข้อมูลให้ครบ"); } }; -const save = () => { + +/** อับเดต ข้อมูล*/ +function save(){ const data = { evaluate_no: evaluate_no.value, start_date: start_date.value, @@ -255,6 +261,7 @@ const save = () => { }); }); }; + watch(props, async () => { if (props.tab && props.action == "edit") { evaluate_no.value = Number(props.tab.charAt(4)); @@ -263,6 +270,7 @@ watch(props, async () => { fetchEvaluate(); } }); + onMounted(async () => { if (props.tab && props.action == "edit") { evaluate_no.value = Number(props.tab.charAt(4)); @@ -277,6 +285,7 @@ onMounted(async () => {
แบบประเมินผล (ผู้บังคับบัญชา)
+
{ แก้ไขข้อมูล
+
ยกเลิก @@ -306,23 +316,27 @@ onMounted(async () => {
+
+
ผู้ทดลองปฏิบัติหน้าที่ราชการ {{ probationStore.person.name }}
- +
ตำแหน่งในสายงาน {{ probationStore.person.PositionLineName }}
+
ระดับ {{ probationStore.person.PositionLevelName }}
+
สังกัด {{ probationStore.person.Oc }} @@ -360,12 +374,14 @@ onMounted(async () => {
+
1 ผลสัมฤทธิ์ของการทดลองปฏิบัติบัติหน้าที่ราชการ
+
@@ -741,6 +757,7 @@ onMounted(async () => {
+
@@ -789,6 +806,7 @@ onMounted(async () => {
+
@@ -837,6 +855,7 @@ onMounted(async () => {
+
@@ -907,6 +926,7 @@ onMounted(async () => {
+
@@ -970,6 +990,7 @@ onMounted(async () => {
+ { val="0" label=" ยังไม่ได้ดำเนินการ" /> +
@@ -996,6 +1018,7 @@ onMounted(async () => {
+ { val="0" label=" ยังไม่ได้ดำเนินการ" /> +
@@ -1022,6 +1046,7 @@ onMounted(async () => {
+ { val="0" label=" ยังไม่ได้ดำเนินการ" /> +
@@ -1050,6 +1076,7 @@ onMounted(async () => {
+ { val="0" label=" ยังไม่ได้ดำเนินการ" /> +
@@ -1079,6 +1107,7 @@ onMounted(async () => {
ผู้บังคับบัญชา
+ { label="ผู้บังคับบัญชา" disable /> +
(true); const activeTab = ref(""); const personalId = ref(route.params.personalId.toString()); +/** + * เปลี่ยน tab เมนู + * @param tab กำหนด tab + */ +function changeTab(tab: string){ + DataStore.mainTab = tab; + activeTab.value = DataStore.mainTab; +}; + +/** ปุ่มกลับ */ +function clickBack(){ + router.push(`/probation/detail/${personalId.value}`); + DataStore.mainTab = "tab1"; +}; + +/** เมื่อเริ่มโหลดหน้า ให้ tab เป็น tab1 */ onMounted(() => { if (DataStore.mainTab) { activeTab.value = DataStore.mainTab; } else activeTab.value = "tab1"; }); -const changeTab = (tab: string) => { - DataStore.mainTab = tab; - activeTab.value = DataStore.mainTab; -}; -const clickBack = () => { - router.push(`/probation/detail/${personalId.value}`); - DataStore.mainTab = "tab1"; -}; \ No newline at end of file + diff --git a/src/modules/05_placement/components/probation/ProbationDetail.vue b/src/modules/05_placement/components/probation/ProbationDetail.vue index 413ea32b1..09434854d 100644 --- a/src/modules/05_placement/components/probation/ProbationDetail.vue +++ b/src/modules/05_placement/components/probation/ProbationDetail.vue @@ -8,7 +8,6 @@ import { useQuasar } from "quasar"; import http from "@/plugins/http"; import config from "@/app.config"; - const router = useRouter(); const route = useRoute(); const personalId = ref(route.params.id as string); @@ -26,7 +25,12 @@ const position_line = ref(""); const position_level = ref(""); const probation_status = ref(); const probation_statusold = ref(""); - +const pagination = ref({ + sortBy: "desc", + descending: false, + page: 1, + rowsPerPage: 10, +}); const mixin = useCounterMixin(); const { messageError, @@ -36,6 +40,8 @@ const { date2Thai, dialogConfirm, } = mixin; + +/** ข้อมูลที่เเสดงในตาราง */ const visibleColumns = ref([ "no", "date_start", @@ -43,6 +49,8 @@ const visibleColumns = ref([ "mentors", "commander", ]); + +/** หัวตาราง */ const columns = ref([ { name: "no", @@ -91,6 +99,7 @@ const columns = ref([ }, ]); +/** option */ const probation_statusOP = ref([ { id: 1, @@ -99,12 +108,12 @@ const probation_statusOP = ref([ { id: 2, label: "พ้นการทดลองปฏิบัติหน้าที่ราชการ", - disable: true + disable: true, }, { id: 3, label: "ไม่พ้นการทดลองปฏิบัติหน้าที่ราชการ", - disable: true + disable: true, }, { id: 4, @@ -121,17 +130,17 @@ const probation_statusOP = ref([ { id: 7, label: "ขยายระยะเวลาทดลองปฏิบัติหน้าที่ราชการ", - disable: true + disable: true, }, { id: 8, label: "ดึงรายชื่อไปออกคำสั่งแล้ว", - disable: true + disable: true, }, ]); - -const getAssignList = async () => { +/** get ข้อมูล งานที่ได้รับมอบหมาย */ +async function getAssignList() { showLoader(); await http .get(config.API.probationGetAssignList(personalId.value)) @@ -151,8 +160,10 @@ const getAssignList = async () => { .finally(() => { hideLoader(); }); -}; -const getpersonalList = async () => { +} + +/** รายละเอียด ตาม id */ +async function getpersonalList() { showLoader(); await http .get(config.API.personal(personalId.value)) @@ -170,8 +181,10 @@ const getpersonalList = async () => { .finally(() => { hideLoader(); }); -}; -const selectStatus = async () => { +} + +/** เปลี่ยนสถานะ */ +async function selectStatus() { dialogConfirm( $q, async () => { @@ -198,29 +211,28 @@ const selectStatus = async () => { probation_status.value = probation_statusold.value; } ); -}; -// เปิดหน้ารายละเอียด -const clickSelect = (id: string) => { - router.push(`${route.fullPath}/${id}`); -}; +} -// รีเซ็ตค่าในช่อง input -const resetFilter = () => { +/** + * เปิดหน้ารายละเอียด + * @param id personal id + */ +function clickSelect(id: string) { + router.push(`${route.fullPath}/${id}`); +} + +/** รีเซ็ตค่าในช่อง input */ +function resetFilter() { filterKeyword.value = ""; filterRef.value.focus(); -}; +} -const pagination = ref({ - sortBy: "desc", - descending: false, - page: 1, - rowsPerPage: 10, -}); - -const paginationLabel = (start: string, end: string, total: string) => { +function paginationLabel(start: string, end: string, total: string){ if (paging.value == true) return " " + start + "-" + end + " ใน " + total; else return start + "-" + end + " ใน " + total; }; + +/** get ค่า เมื่อโหลดหน้า */ onMounted(async () => { await getpersonalList(); await getAssignList(); @@ -262,30 +274,39 @@ onMounted(async () => {
+
ตำแหน่งในสายงาน
{{ position_line }}
+
ระดับ
{{ position_level }}
+
สังกัด
{{ organization }}
+
สถานะการทดลองปฏิบัติหน้าที่ราชการ
{ > เพิ่มงานที่ได้รับมอบหมาย +
{ {{ col.value }}
- - +