From 3361ef16dda57792ff400f67bede6ee67aa36dc0 Mon Sep 17 00:00:00 2001 From: Gerd Date: Sat, 19 Sep 2026 10:39:11 +0200 Subject: [PATCH] feat: Treetable filter auf Kind-Knoten anwenden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der filter-Callback wird jetzt auch auf Kind-Knoten angewendet, nicht nur auf Top-Level-Nodes. Dadurch lässt sich bei hierarchischen Daten (z.B. Tag-Baum) die Suche auf den gesamten Teilbaum verfeinern — nur Knoten, die selbst matchen oder einen matchenden Nachfahren haben, werden gerendert. Abwärtskompatibel: Aufrufer ohne filter-Attribut sind unaffected. Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- Client/Components/widgets/Treetable_V2.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Client/Components/widgets/Treetable_V2.ts b/Client/Components/widgets/Treetable_V2.ts index 265089d..f0a04e6 100644 --- a/Client/Components/widgets/Treetable_V2.ts +++ b/Client/Components/widgets/Treetable_V2.ts @@ -88,7 +88,9 @@ export const Treetable: m.ClosureComponent = (vnode) => { onRowMarked: onRowMarked, isSelected: isSelected, isEven: ((z % 2) == 0), - hasSiblingsWithChildren: topHasSiblingsWithChildren} as iTreerow) + hasSiblingsWithChildren: topHasSiblingsWithChildren, + filter: vnode.attrs.filter, + searchvalue: searchvalue} as iTreerow) } else { return null @@ -114,6 +116,12 @@ interface iTreerow { * den Platzhalter-Pfeil nur dann zu rendern, wenn es Nodes mit * Pfeil gibt, an denen der Text ausgerichtet werden kann. */ hasSiblingsWithChildren?: boolean + /** Optional: Filter-Funktion, die auch auf Kind-Knoten angewendet wird. + * Wenn gesetzt, werden Kind-Knoten nur gerendert, wenn der Filter + * für sie true zurückgibt. */ + filter?: (row: iTreenode, searchvalue: string) => boolean + /** Aktueller Suchwert, der an den Filter weitergereicht wird. */ + searchvalue?: string } let Treerow: m.ClosureComponent = (vnode) => { @@ -178,7 +186,9 @@ let Treerow: m.ClosureComponent = (vnode) => { // Falls der Trennode Kinder hat und expandiert werden soll, wird rekursiv die Trennode-Komponente für // die Child-Nodes aufgerufen, ansonsten wir null zurückgegeben und die Einrückung hört auf vnode.attrs.treenode.hasChildren && vnode.attrs.treenode.expand - ? vnode.attrs.treenode.children.map((tn: iTreenode, z) => { + ? vnode.attrs.treenode.children + .filter(tn => !vnode.attrs.filter || vnode.attrs.filter(tn, vnode.attrs.searchvalue || "")) + .map((tn: iTreenode, z) => { return m(Treerow, { treenode: tn, level: vnode.attrs.level + 1, @@ -186,7 +196,9 @@ let Treerow: m.ClosureComponent = (vnode) => { onRowMarked: vnode.attrs.onRowMarked, isSelected: vnode.attrs.isSelected, isEven: ((z % 2) == 0), - hasSiblingsWithChildren: childHasSiblingsWithChildren + hasSiblingsWithChildren: childHasSiblingsWithChildren, + filter: vnode.attrs.filter, + searchvalue: vnode.attrs.searchvalue } as iTreerow) }) : null