enhancement
major
minor
major
minor
Pietro (React-View-UI, 8.0.0-alpha10) zeigt in der Akte je Preset der Tabelle die Zahl seiner Zeilen: "Offen 42", "Meine 5", "Überfällig 2", "Vorgeschlagen 16". Die Zahl steht neben dem Wort, das sie definiert; das ersetzt einen Zähler im Reiter, den Leser als Zeilenzahl missverstanden haben. Gefunden in Openium/Pietro #1025 (2026-10-23).
Problem
Der Preset-Chip der Filterleiste (<table> mit <presets>/`<preset>` und <criterion>, gerendert in TableViewControl#refreshFilterBar) bekommt nur einen einmal aufgelösten Label-String. Es gibt
- keinen Zähler je Preset,
- keine CSS-Klasse je Preset (ein Preset, das "wartet auf eine Person" bedeutet, soll anders aussehen als die übrigen),
- keinen Platz für ein eigenes Element der Anwendung in der Zeile der Filterleiste.
Die Anwendung hat deshalb die Engine-Presets durch eine eigene React-Leiste ersetzt (view/PresetBarElement, ui-modules/pietro-preset-bar.tsx). Ergebnis: zwei Zeilen, Pietros Chips über der Filterleiste der Engine mit ihren aktiven Spaltenfiltern und der Suche, und ein Stück Nicht-Standard-UI, das der Eigner nicht will. Die Anwendung geht zurück auf die Engine-Presets ohne Zahlen, bis die Engine das kann.
Vorschlag
- <preset> bekommt ein optionales Attribut für einen Zähler, etwa count="...": ein TL-Script über die Zeilen der Tabelle (die Zeilen, die die Tabelle ohne Preset zeigt), oder einfacher: die Engine zählt selbst die Zeilen, die die Kriterien des Presets erfüllen, wenn count="true" gesetzt ist. Die Zahl steht nach dem Label im Chip, in einer eigenen Klasse (tlTableView__chipCount), und wird mit den observed-types der Tabelle aktualisiert, so wie die Tabelle selbst.
- <preset> bekommt ein optionales css-class, das auf den Chip geht (aktiv und inaktiv), damit eine Anwendung ein Preset farblich kennzeichnen kann, ohne die Engine-Klassen zu überschreiben.
- Der aktive Preset bleibt per active-preset-Kanal steuerbar wie heute.
Erledigt wenn
- Ein Preset mit Zähler zeigt die Zahl seiner Zeilen; nach einem Commit, der die beobachteten Typen trifft, stimmt die Zahl ohne Reload.
- Ein Preset ohne Zähler sieht aus wie heute.
- css-class eines Presets steht am Chip.
- Der Zähler stimmt mit der Zeilenzahl der Tabelle unter dem aktiven Preset überein, auch mit zusätzlichem Spaltenfilter oder Suche (dann zählt der Zähler die Zeilen unter Preset plus Filter, oder das Verhalten ist dokumentiert).
Nicht in diesem Ticket
- Ein Kanal für den aktiven Reiter von <tab-bar> (Pietro #1022/#1025 brauchte ihn für "Prüfen öffnet den Reiter Offene Punkte"; heute nur per eigener Unterklasse möglich).
- Zähler für die vom Anwender gespeicherten Filter und ein eigenes Element der Anwendung in der Filterleiste.
Lösung
- <preset count="true" css-class="...">: count (Standard false) zeigt hinter der Bezeichnung des Chips die Zahl der Zeilen, die das Preset auswählt; css-class steht am Chip, aktiv wie inaktiv. Ein Preset ohne beide sieht aus wie bisher.
- Bedeutung der Zahl: gezählt werden die Zeilen unter den Kriterien des Presets allein - genau die Zeilen, die ein Klick auf den Chip zeigt (ein Klick auf ein Preset setzt die Suche zurück). Die Spaltenfilter und die Suche, nach denen die Tabelle gerade gefiltert ist, ändern die Zahl nicht; jeder Chip sagt, was er zeigen würde. Sucht der Anwender innerhalb des aktiven Presets, bleibt die Zahl am Chip stehen, die Treffer nennt die Zeilenzahl der Tabelle. Ein zusätzlicher Spaltenfilter beendet das Preset (der Chip ist dann nicht mehr aktiv). Dokumentiert im Artikel view-layer/tables.
- Die Zahl wird bei jedem Neuaufbau der Filterleiste berechnet: nach einem Commit, der die beobachteten Typen der Tabelle trifft, und nach einer Änderung eines Eingangs, die die Kriterien der Presets neu auflöst - ohne Reload. Eine Tabelle, deren Zeilen sich nicht zählen lassen, ohne alle zu laden, zeigt keine Zahl.
- Die Zahl erscheint als zweiter, leiserer Text des Chips (Part Chip, Eigenschaft detail), die CSS-Klasse als className des Parts; ein Ersatz des Parts (z.B. MUI) übernimmt beides.
- Technisch: NamedFilter trägt die Darstellungsangaben (cssClass, counted); RowSource#matchCount(FilterSpec) (ListRowSource, TreeRowSource) und TableView#matchCount(NamedFilter) zählen die Zeilen unter einem Filter, ohne ihn anzuwenden.
- Mitbehoben: Wurden die Presets nach einer Eingangsänderung ohne neue Zeilen neu aufgelöst (z.B. ein Preset über die eigene Auswahl der Tabelle), erfuhr der Client davon nichts - die Chips und ein aktives, neu angewendetes Preset blieben veraltet, außer die Tabelle hatte eine Zeilenklasse. TableViewControl#refreshFilters() schickt die Tabelle jetzt neu (in TableElement, TreeTableElement, RowSetTableControl).
- Mitbehoben: Der leisere Text (detail) eines gedrückten Chips stand grau auf der Markenfläche und war kaum lesbar; er trägt jetzt die Farbe der Beschriftung.
- Demo: tl-demo-react, Tickets, Liste "Offen": alle vier Presets mit Zahl, "Ohne Kommentare" mit eigener CSS-Klasse in Warnfarben.