From 1ae02d8ed8bcc6f9afe71713f468e21b31f0014f Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 21 Jul 2026 13:35:31 +0200 Subject: [PATCH] refactor addTaginTable and deleteTagInTable, add missing logic for automated tags in case of manual adding --- public/js/helpers/TagHelper.js | 67 +++++++++++++++++++++++---- public/js/tabulator/formatter/tags.js | 4 ++ 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/public/js/helpers/TagHelper.js b/public/js/helpers/TagHelper.js index 9282aa167..0573858d9 100644 --- a/public/js/helpers/TagHelper.js +++ b/public/js/helpers/TagHelper.js @@ -6,9 +6,52 @@ export function addTagInTable(addedTag, rows, matchKey, tagsKey = "tags") rows.forEach(row => { const rowData = row.getData(); - let updated = false; - addedTag.response.forEach(tag => + //add save check if String or Array and avoid same reference later for mutations + let raw = rowData[tagsKey]; + let tags = typeof raw === "string" + ? JSON.parse(raw || "[]") + : Array.isArray(raw) + ? [...raw] + : []; + + let updated = false; + for (const tag of addedTag.response) + { + if (rowData[matchKey] !== tag[matchKey]) + continue; + + //avoid double inserts + if (tags.some(x => x.id === tag.id)) + continue; + + const newTag = { + id: tag.id, + prestudent_id: tag.prestudent_id, + //add also information of addedTag + beschreibung: addedTag.beschreibung, + notiz: addedTag.notiz ?? "", + style: addedTag.style, + done: addedTag.done ?? false, + typ_kurzbz: addedTag.tag_typ_kurzbz ?? addedTag.typ_kurzbz, //here seem to be 2 variations + automatisiert: addedTag.automatisiert + }; + + tags.unshift(newTag); + updated = true; + } + + if (updated) + { + row.update({ + [tagsKey]: JSON.stringify(tags) + }); + + row.reformat(); + } + }); + +/* addedTag.response.forEach(tag => { if (rowData[matchKey] !== tag[matchKey]) return; @@ -36,7 +79,7 @@ export function addTagInTable(addedTag, rows, matchKey, tagsKey = "tags") if (updated) row.update(rowData); - }); + });*/ } export function deleteTagInTable(deletedTag, rows, tagsKeys = ['tags']) @@ -49,26 +92,30 @@ export function deleteTagInTable(deletedTag, rows, tagsKeys = ['tags']) let updates = {}; let changed = false; - tagsKeys.forEach(key => { - let tags; + for (const key of tagsKeys) { + let raw = rowData[key]; + let tags = []; try { - tags = JSON.parse(rowData[key] || "[]"); + if (typeof raw === "string") { + tags = JSON.parse(raw || "[]"); + } else if (Array.isArray(raw)) { + tags = [...raw]; + } } catch (e) { tags = []; } if (!Array.isArray(tags)) - return; + continue; let filtered = tags.filter(tag => tag?.id !== deletedTag); - if (filtered.length !== tags.length) - { + if (filtered.length !== tags.length) { updates[key] = JSON.stringify(filtered); changed = true; } - }); + } if (changed) { row.update(updates); diff --git a/public/js/tabulator/formatter/tags.js b/public/js/tabulator/formatter/tags.js index 367a8a5fb..f334bb8df 100644 --- a/public/js/tabulator/formatter/tags.js +++ b/public/js/tabulator/formatter/tags.js @@ -49,6 +49,10 @@ export function tagFormatter(cell, tagComponent) tagElement.title = tag.notiz; tagElement.className = "tag " + tag.style; if (tag.done) tagElement.className += " tag_done"; + if (tag.automatisiert){ + tagElement.className += " tag_auto"; + tagElement.innerHTML = " " + tag.beschreibung; + } const tagDef = mappedData.find(t => t.typ_kurzbz === tag.typ_kurzbz);