Jede SENAITE-Nutzerin verbringt den grössten Teil des Tages in
einem Listing. Proben, Worksheets, Batches, Rechnungen. Die
Listings sehen schmucklos aus, weil sie es müssen: die Dichte
der Information ist das Feature. Kleine ergonomische Gewinne
summieren sich schnell auf. In diesem Halbjahr hat
senaite.app.listing gleich mehrere davon ausgeliefert.
Gespeicherte Filter-Presets
#174 setzt eine Lesezeichen-Pille neben das Suchfeld. Stellen Sie Ihre Ansicht ein (Review-State, Spaltenfilter, Sortierung, Seitengrösse, Suchbegriff), klicken Sie die Pille, speichern Sie sie als “Überfällige Serologie” oder “Wasserproben dieser Woche”. Am Montag ist das Preset ein Klick entfernt.
Der Storage-Key nutzt den listing_identifier der Ansicht (den
serverseitig berechneten Wert, den auch das
Spaltenkonfig-Feature verwendet), mit form_id als Fallback.
Das zählt, wenn dieselbe form_id in mehreren Kontexten
verwendet wird: Ihr kundenbezogenes Samples-Listing und das
globale Samples-Listing teilen sich Presets nicht mehr aus
Versehen.
Jedes Preset erfasst review_state, column_filters,
sort_on, sort_order, pagesize und filter. Umbenennen,
Löschen und Speichern läuft über Inline-Editoren (kein
window.prompt mehr), jeweils mit Enter zum Bestätigen und
Esc zum Abbrechen. Weicht die Live-Ansicht vom gespeicherten
Payload ab, bekommt das Preset einen “modified”-Tag mit inline
save und undo. Wählt man ein Default-Preset, wird es
beim Öffnen automatisch angewendet, sofern keine
URL-Parameter aktiv sind.
Derselbe PR hat einen subtileren Bug behoben: Die Dropdowns der
Spaltenfilter zeigten früher jeden möglichen Wert, ohne die
schon aktiven Filter zu berücksichtigen. Man wählte einen Wert
und landete in einer leeren Tabelle, weil zwei Filter einander
ausschlossen. Die neue Signatur
apply_column_filters(query, exclude=None) verengt jedes
Dropdown um alle übrigen aktiven Filter. Was man sieht, kann man
auch anwählen.
Label-Chips, click-to-filter
Als Gegenstück zu senaite.core#2958 rendert
#178
Proben-Labels als farbige Chips unter der Primärspalte. Ein
Klick auf einen Chip, die URL gewinnt ?labels=<name>, das
Listing filtert. Zweiter Chip, beide filtern. Denselben nochmal
klicken, er verschwindet. Eine Aktive-Filter-Zeile über dem
Suchfeld zeigt jeden ?labels=-Wert mit X zum Entfernen.
Der Reset-Button (der kleine Kreispfeil) räumt jetzt auch
?labels= ab. Gespeicherte Presets erfassen und rewenden
Label-Zustand per Navigation, damit ein geteilter Link mit
?labels= nicht von einem automatisch angewandten
Default-Preset überschrieben wird.
Entfernbare Filter-Chips in der Werkzeugleiste
Aktive Spaltenfilter waren nur als eingefärbtes Trichter-Icon in
der Kopfzeile sichtbar. Setzte man drei Filter und vergass
zwei davon, sah man eine leere Tabelle und musste die Trichter
jagen.
#180
rendert jeden aktiven Spaltenfilter als Chip
<Spalte>: <Wert> × in der Werkzeugleiste. Klick auf X, der
Filter fällt weg, das Listing lädt nach, alles andere bleibt.
Das ist generisch: jedes Listing mit Spaltenfiltern bekommt es
umsonst.

Column-Config als durchsuchbares Popover
Dreissig Spalten in einer horizontalen Chip-Zeile waren
Alt-Erbe.
#176
ersetzt das durch einen kleinen [⊟ Configure]-Button, der ein
strukturiertes Popover öffnet: Suchfeld oben mit Autofocus, Show
all / Hide all als Massenaktionen, ein Visible-Bereich (Drag-
Handles links, Augen-Icon zum Ausblenden rechts) und ein
Hidden-Bereich (alphabetisch, + stellt am Ende von Visible
wieder her).
Der Drop-Indikator ist eine 2-Pixel-Akzentlinie ober- oder
unterhalb der Zielreihe, berechnet aus der Cursor-Y-Position in
der Reihe. Kein Raten mehr, wo die Spalte landet. Das Popover
rendert per ReactDOM.createPortal an document.body,
entkommt dem overflow-x: auto der Table-Responsive-Hülle,
folgt dem Trigger bei Scroll und Resize und schliesst per
Aussenklick oder Esc.

Unter der Haube ist die gesamte Farbpalette in --sf-*,
--listing-* und --listing-bs-*-Tokens in einem einzigen
:root-Block gewandert. Add-ons, die eine Theme wollen, können
diese Tokens ohne Bundle-Rebuild überschreiben. Ein zukünftiger
[data-theme]-Selector kann die Ansicht zur Laufzeit
umskinnen.
Kleine Gewinne, die es wert sind
#179 hat KeywordIndex-Spaltenfilter dazu gebracht, ihre Autocomplete-Liste aus den tatsächlich indexierten Werten zu befüllen und mehrere Auswahlen mit UND zu verknüpfen statt mit ODER. Wählt man “Ca” und “Mg” im Analyse-Keyword-Filter, bekommt man Zeilen, die beides tragen, nicht mehr eines von beiden.