From 69b19562f4975fa4d804bbbbd56be6e90c5d2612 Mon Sep 17 00:00:00 2001 From: Ivymaster Date: Tue, 30 Jun 2026 10:27:16 +0200 Subject: [PATCH] BUG: add issue fix for tag ordering --- application/controllers/api/v1/system/Tag.php | 1 + application/core/Tag_Controller.php | 7 ++++++- application/libraries/stv/StudentListLib.php | 3 ++- .../models/education/Lehreinheit_model.php | 5 +++-- .../components/DetailHeader/DetailHeader.js | 10 +++++++++- public/js/components/Tag/Tag.js | 9 ++++++--- public/js/components/Tag/tagFormatter.js | 2 +- public/js/helpers/TagHelper.js | 16 ++++++++++++++- .../tabulator/filters/extendedHeaderFilter.js | 20 ++++++++++++------- public/js/tabulator/formatter/tags.js | 2 +- 10 files changed, 57 insertions(+), 18 deletions(-) diff --git a/application/controllers/api/v1/system/Tag.php b/application/controllers/api/v1/system/Tag.php index 7ce375217..df3003b44 100644 --- a/application/controllers/api/v1/system/Tag.php +++ b/application/controllers/api/v1/system/Tag.php @@ -37,6 +37,7 @@ class Tag extends API_Controller if (isset($tag)) { + $this->TagModel->addJoin('public.tbl_notiz_typ', 'typ_kurzbz', 'typ_kurzbz'); $result = $this->TagModel->load($tag); $this->response($result, REST_Controller::HTTP_OK); diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php index fb14563ba..322831022 100644 --- a/application/core/Tag_Controller.php +++ b/application/core/Tag_Controller.php @@ -70,6 +70,7 @@ class Tag_Controller extends FHCAPI_Controller tbl_notiz.notiz_id, tbl_notiz_typ.style, tbl_notiz_typ.automatisiert, + tbl_notiz_typ.prioritaet, tbl_notiz.erledigt as done, tbl_notiz.insertamum, tbl_notiz.updateamum, @@ -103,7 +104,8 @@ class Tag_Controller extends FHCAPI_Controller style, beschreibung, tag, - automatisiert + automatisiert, + prioritaet " ); $this->NotiztypModel->addOrder('prioritaet'); @@ -311,6 +313,7 @@ class Tag_Controller extends FHCAPI_Controller tbl_notiz.notiz_id, tbl_notiz_typ.style, tbl_notiz_typ.automatisiert, + tbl_notiz_typ.prioritaet, tbl_notiz.erledigt as done, tbl_notiz.insertamum, tbl_notiz.updateamum, @@ -330,6 +333,8 @@ class Tag_Controller extends FHCAPI_Controller $this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id'); + $this->NotizModel->addOrder('done'); + $this->NotizModel->addOrder('tbl_notiz_typ.prioritaet'); $notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id)); diff --git a/application/libraries/stv/StudentListLib.php b/application/libraries/stv/StudentListLib.php index a00f92822..5ce9f354d 100644 --- a/application/libraries/stv/StudentListLib.php +++ b/application/libraries/stv/StudentListLib.php @@ -321,7 +321,7 @@ class StudentListLib $subQueryTag = "( SELECT tag.prestudent_id, - COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags + COALESCE(json_agg(tag ORDER BY tag.done, tag.prioritaet), '[]'::json) AS tags FROM ( SELECT DISTINCT ON (n.notiz_id) n.notiz_id AS id, @@ -330,6 +330,7 @@ class StudentListLib n.text AS notiz, nt.style, n.erledigt AS done, + nt.prioritaet AS prioritaet, nz.prestudent_id, n.start, n.ende diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index 2f955c295..5b2cc2cf1 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -719,7 +719,7 @@ EOSQL; return "tag_data_agg AS ( SELECT lehreinheit_id, - COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags + COALESCE(json_agg(tag ORDER BY done, prioritaet), '[]'::json) AS tags FROM ( SELECT DISTINCT ON (public.tbl_notiz.notiz_id) tbl_notiz.notiz_id AS id, @@ -728,7 +728,8 @@ EOSQL; text AS notiz, style, erledigt AS done, - lehreinheit_id + lehreinheit_id, + prioritaet FROM public.tbl_notizzuordnung JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz diff --git a/public/js/components/DetailHeader/DetailHeader.js b/public/js/components/DetailHeader/DetailHeader.js index 3509761e3..a444c7957 100644 --- a/public/js/components/DetailHeader/DetailHeader.js +++ b/public/js/components/DetailHeader/DetailHeader.js @@ -300,7 +300,15 @@ export default { return this.$api .call(ApiTag.getAllTagsPrestudent({prestudent_id})) .then(result => { - this.tagData = result.data; + this.tagData = result.data.sort((a, b) => { + let adone = a.done ? 1 : 0; + let bdone = b.done ? 1 : 0; + + if (adone !== bdone) { + return adone - bdone; + } + return a.prioritaet - b.prioritaet; + }); }) .catch(this.$fhcAlert.handleSystemError); }, diff --git a/public/js/components/Tag/Tag.js b/public/js/components/Tag/Tag.js index 894da343e..faef12f15 100644 --- a/public/js/components/Tag/Tag.js +++ b/public/js/components/Tag/Tag.js @@ -47,7 +47,8 @@ export default { updatevon: "", response: "", start: "", - ende: "" + ende: "", + prioritaet: 100, }, mode: "create" }; @@ -94,7 +95,8 @@ export default { this.tagData.automatisiert = item.automatisiert; this.tagData.start = this.formatDateTimeDay(item.start); this.tagData.ende = this.formatDateTimeDay(item.ende); - + this.tagData.prioritaet = item.prioritaet || 100; + if (item && item.notiz_id) { this.selectedTagId = item.notiz_id; @@ -192,7 +194,8 @@ export default { updateamum: "", bearbeiter: "", response: "", - readonly: false + readonly: false, + prioritaet: 100, }; this.selectedTagId = null; this.mode = "create"; diff --git a/public/js/components/Tag/tagFormatter.js b/public/js/components/Tag/tagFormatter.js index 4040111b9..072906be8 100644 --- a/public/js/components/Tag/tagFormatter.js +++ b/public/js/components/Tag/tagFormatter.js @@ -59,7 +59,7 @@ export function idTagFormatter (id, tagData, tagComponent, typeId, semesterStart let bdone = b.done ? 1 : 0; if (adone !== bdone) return adone - bdone; - return b.id - a.id; + return a.prioritaet - b.prioritaet; }); const tagsToShow = expanded diff --git a/public/js/helpers/TagHelper.js b/public/js/helpers/TagHelper.js index 3d287c792..826e4126a 100644 --- a/public/js/helpers/TagHelper.js +++ b/public/js/helpers/TagHelper.js @@ -33,8 +33,14 @@ export function addTagInTable(addedTag, rows, matchKey, tagsKey = "tags") let newTag = { ...addedTag, id: tag.id }; - tags.unshift(newTag); + tags.push(newTag); + tags.sort((a, b) => { + let adone = a.done ? 1 : 0; + let bdone = b.done ? 1 : 0; + if (adone !== bdone) return adone - bdone; + return a.prioritaet - b.prioritaet; + }); rowData[tagsKey] = JSON.stringify(tags); updated = true; }); @@ -122,6 +128,14 @@ export function updateTagInTable(updatedTag, rows, fields = ['tags']) if (index !== -1) { fieldData[index] = { ...updatedTag }; + fieldData.sort((a, b) => { + let adone = a.done ? 1 : 0; + let bdone = b.done ? 1 : 0; + + if (adone !== bdone) return adone - bdone; + return a.prioritaet - b.prioritaet; + }); + let updatedFieldData = JSON.stringify(fieldData); if (updatedFieldData !== rowData[field]) diff --git a/public/js/tabulator/filters/extendedHeaderFilter.js b/public/js/tabulator/filters/extendedHeaderFilter.js index 6e58758a2..c3e51f815 100644 --- a/public/js/tabulator/filters/extendedHeaderFilter.js +++ b/public/js/tabulator/filters/extendedHeaderFilter.js @@ -4,20 +4,23 @@ const TAG_FILTER_CONNECTORS = { key: "AND", label: "AND", operator: "&&", + isVisible: false, }, OR: { key: "OR", label: "OR", operator: "||", + isVisible: true, }, NOT: { key: "NOT", label: "NOT", operator: "!", + isVisible: true, }, }; const TAG_FILTER_CONNECTOR_ORDER = [ - TAG_FILTER_CONNECTORS.AND, + //TAG_FILTER_CONNECTORS.AND, TAG_FILTER_CONNECTORS.OR, TAG_FILTER_CONNECTORS.NOT, ]; @@ -67,6 +70,9 @@ export function buildTagOptionsFromRows(rows = []) { ...new Map( getRawTagValuesFromRows(rows) .filter((tag) => tag && tag.done !== true) + .sort((a, b) => { + return a.prioritaet - b.prioritaet; + }) .map((tag) => { return { label: tag.beschreibung || tag.typ_kurzbz, @@ -90,11 +96,7 @@ export function syncTagHeaderFilterOptions( const options = buildTagOptionsFromRows(rows) || []; if (Array.isArray(initialOptions)) { - initialOptions.splice( - 0, - initialOptions.length, - ...options, - ); + initialOptions.splice(0, initialOptions.length, ...options); } if (Array.isArray(selectedOptions)) { @@ -116,7 +118,11 @@ export function syncSelectedTagOptionsWithHeaderFilters( tagsEnabled = true, field = "tags", ) { - if (!tagsEnabled || !Array.isArray(selectedOptions) || !selectedOptions.length) { + if ( + !tagsEnabled || + !Array.isArray(selectedOptions) || + !selectedOptions.length + ) { return false; } diff --git a/public/js/tabulator/formatter/tags.js b/public/js/tabulator/formatter/tags.js index 48a66a10c..5cd848bbd 100644 --- a/public/js/tabulator/formatter/tags.js +++ b/public/js/tabulator/formatter/tags.js @@ -35,7 +35,7 @@ export function tagFormatter(cell, tagComponent, onRendered) { if (adone !== bbone) { return adone - bbone; } - return b.id - a.id; + return a.prioritaet - b.prioritaet; }); const tagsToShow = rowData._tagExpanded ? parsedTags