Tree List: Expand/Collapse
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: [Live].
2. Voraussetzungen
Tree-List-
Basiskontrakt bereits verstanden (expanded/childrenKey).
3. Konzepte
Client-/Server-Dualismus wie bei Sorting: $opts['expandUrl']
liefert den No-JS-Fallback (analog zu sortUrl bei
dataGrid()
Sorting); scripts/treelist.js übernimmt bei vorhandenem
JavaScript das Auf-/Zuklappen clientseitig, ohne Seiten-Reload.
4. Erste Schritte
$expandUrl = static fn (string $key, bool $expand) => wl($ID, ['toggle' => $key, 'x' => $expand ? 1 : 0]); echo $widgets->treeList($columns, $rows, [ 'rowKey' => 'id', 'expanded' => $_SESSION['treelist_expanded'] ?? [], 'expandUrl' => $expandUrl, ]);
5. Verwendung
| Bedarf | Muster |
|---|---|
| Einzelne Zeile auf-/zuklappen | expandUrl je Zeile |
| Alle Zeilen auf einmal | Toolbar-Buttons „Alle aufklappen„/„Alle zuklappen“ (Abschnitt 6) |
6. API-Referenz: No-JS-Basis
Jede Elternzeile trägt einen sichtbaren Auf-/Zuklapp-Link
(.wk-treelist__toggle, ▶/▼, mit dynamischem
aria-label „Aufklappen„/„Zuklappen“) in ihrer ersten Spalte:
$opts['expandUrl'](string $key, bool $expand) liefert die
Server-URL, die $opts['expanded'] für den nächsten Render
aktualisiert.
Alle aufklappen / zuklappen: rendert expandUrl automatisch als
Toolbar oberhalb der Liste (toolbar()-Aufruf) — die Buttons rufen
dasselbe Callable mit den Pseudo-Keys *all bzw. *none auf;
der Server setzt expanded auf alle Elternzeilen-Keys bzw. ein leeres
Array. Normale Links, kein Sonderfall gegenüber einer einzelnen Zeile.
Client-Schicht (scripts/treelist.js): bereits gerenderte
(server-aufgeklappte) Teilbäume klappen clientseitig ohne Reload zu und
wieder auf (hidden-Attribut, aria-expanded-Sync); das Aufklappen
einer server-zugeklappten Zeile folgt dem Link — deren Kinder sind
bewusst nicht im DOM (Render-Grenze aus
Grundlagen).
7. Parameter, Optionen und Zustände
| Schlüssel | Typ | Bedeutung |
|---|---|---|
$opts['expandUrl'] | callable (string $key, bool $expand): string | Toggle-Link je Elternzeile; Pseudo-Keys *all/*none für die Sammel-Buttons |
$opts['expanded'] | array | aufgeklappte rowKey-Werte (Server-Zustand, z. B. Session) |
8. Vollständige Beispiele
Siehe Abschnitt 4; der Screen-Handler aktualisiert expanded aus dem
toggle/x-Parameter (bzw. setzt bei *all/*none alle/
keine) und rendert neu.
9. Einschränkungen und Randfälle
- Client-Zuklappen ist rein visuell — der Server-Zustand (
expanded) ändert sich erst über die Links; nach einem Reload gilt wieder der Server-Zustand.
10. Accessibility und Kompatibilität
Der Auf-/Zuklapp-Toggle ist ein nativer, fokussierbarer Link mit
dynamischem aria-label — Tastatur- und Screenreader-Bedienung
funktioniert ohne Zusatzcode; aria-expanded an der Zeile folgt dem
Zustand.
11. Troubleshooting
Symptom: „Alle aufklappen„ wirkt, aber einzelne Zeilen klappen nach Reload wieder zu.
Ursache: der Screen-Handler persistiert expanded nicht (z. B.
Session vergessen).
Lösung: expanded serverseitig speichern und beim Render
durchreichen (Abschnitt 4).
12. Verwandte Themen
- Demo-Übersicht — alle Kategorien
- DataGrid: Sorting — Vorbild für den Client-/Server-Dualismus