How-to: Einzelne Bausteine ergänzen
Zurück: FluentUI (Design-System-Bibliothek)
Für wen: Entwickler, die bereits eine bestehende Admin-Oberfläche haben (eigenes
Plugin oder wksqliteds als Vorbild) und einen einzelnen Baustein ergänzen
wollen, ohne den vollständigen Tutorial-Weg von
Null zu wiederholen. Jedes Rezept ist zielorientiert und kurz; Methodenverträge stehen
ausschließlich in FluentUI: Öffentliche Helper-API — dieses Rezept wiederholt sie
nicht, sondern verlinkt darauf.
Rezept: Eine Werkzeugleiste hinzufügen
Ziel: verstreute Buttons oberhalb einer Liste/eines Grids durch eine tastaturzugängliche Command-Bar ersetzen.
- Helfer laden (falls noch nicht geschehen):
$widgets = plugin_load('helper', 'wkfluentui_widgets');. - Jeden Button als fertiges HTML-Fragment bauen (eigene Farbsemantik, siehe Styles-Contract (--wk-*)).
- Fragmente in
$widgets→toolbar($items, $opts)einreichen; Buttons mit gleichemgroup-Wert werden nebeneinander mit Trennlinie gruppiert (z. B.group' => 'danger' für Lösch-Aktionen ganz rechts). - Ergebnis direkt oberhalb der Liste/des Grids ausgeben — keine eigene CSS-Klasse nötig,
toolbar()liefert bereitsrole=„toolbar“+ Tastaturnavigation (scripts/toolbar.js).
Vollständiger Parametervertrag:
toolbar → Grundlagen, Methode „toolbar()". Live-Vorbild: Table-Designer-Toolbar in
wksqliteds/dbadmin/DbAdmin.php.
Rezept: Ein Eigenschaften-Panel hinzufügen
Ziel: eine rechte Auxiliary-Bar, die die Eigenschaften der aktuellen Baum-/ Grid-Auswahl zeigt (ADS-Muster „Properties-Panel„).
- Region
<div class=„wk-shell-auxbar“>im.wkq-shell-Grid reservieren (siehe FluentUI: Basic Layout (vertieft) für die Grid-Komposition). - Auswahl über einen eigenen Query-Parameter transportieren (erster Wurf: Klick-Link, kein Live-JS — bewährte Konvention, nicht neu erfinden). Achtung Namenskollision: keinen Parameternamen wählen, der bereits von DokuWikis eigenem Routing verwendet wird (
do/pagesind reserviert fürdo=admin&page=<plugin>;wksqlitedsselbst wurde von genau dieser Kollision getroffen, siehe unten). - Auswahl serverseitig auflösen (Datensatz nachladen) und als
$widgets→propertyGrid($rows)rendern; Fallback-Text, wenn nichts ausgewählt ist oder der referenzierte Datensatz nicht mehr existiert.
Vollständiger Zeilen-Vertrag:
property-grid → Grundlagen, Methode „propertyGrid()". Live-Vorbild (zwei komplette Umsetzungen):
wksqliteds/dbadmin/DbAdmin.php::renderStructureAuxbar()/
renderBrowseAuxbar().
Rezept: Registerkarten hinzufügen
Ziel: mehrere Unteransichten desselben Datensatzes/Bereichs als Tab-Leiste anbieten (z. B. Spalten/Indizes/Fremdschlüssel/Trigger eines Table-Designer-Screens, oder Ergebnis/Meldungen eines Abfrage-Ergebnisses).
- Jede Registerkarte als
['key' => string, 'label' => string, 'href' => string]modellieren —hrefträgt den vollständigen Ziel-Link inkl. aller nötigen Query-Parameter. - Bereits per
url()/wl()HTML-kodierte Links (&statt&) nicht erneut durchhsc()schicken — führt zu Doppel-Escaping und damit zu kaputten Links (inwksqlitedszweimal aufgetreten; beide Male Symptom: Klick landet auf der generischen Startseite statt auf dem erwarteten Tab). Etablierte Konvention: eine privatexyzUrl($raw = false)- Wrapper-Methode wieDbAdmin::rtabUrl()/dselUrl(), die bei Bedarf$raw = trueanurl()durchreicht. $widgets→tabs($tabs, $active)aufrufen;$activevergleicht per String-Gleichheit gegenkey.
Vollständiger Parametervertrag:
tabcontrol → Grundlagen, Methode „tabs()". Live-Vorbild: Results/Messages-Tabs im SQL-Workbench,
wksqliteds/dbadmin/DbAdmin.php::renderResultsMessagesTabs().
Einschränkungen und Troubleshooting
- Query-Parameter-Namenskollision mit dem Routing:
do=admins eigenes Routing belegtpage(Plugin-Name). Ein eigener Listen-/Grid-Parameter gleichen Namens wird vonurl()sarray_merge()übernommen und überschreibt lautlos die Routing-Angabe — jeder generierte Link auf dem Screen kickt dann auf die generische Admin-Übersicht statt auf den erwarteten Zustand. Gefunden und behoben inwksqlitedss Browse-Paginierung (Parameter umbenanntpage→bpage) — bei jedem neuen Query-Parameter vorab gegen DokuWikis reservierte Namen (do,page,id,rev,sectok) prüfen. - CSS-Compiler-Fallen (sitewide fatal):
min()/calc()mit gemischten Einheiten und die Zeichenfolge*/im Kommentartext brechen die site-weite CSS-Kompilierung — siehe einschraenkungen_und_troubleshooting. - CodeMirror-Textareas in Playwright-Tests:
page.fill()erreicht die zugrundeliegende<textarea>nicht mehr, sobald CodeMirror sie ersetzt hat —page.evaluate()mitta.nextSibling.CodeMirror.setValue(…)verwenden.
Weiter
- Vollständiger Von-Null-Weg: Tutorial: Erste Admin-Oberfläche mit FluentUI bauen.
- Normative Regeln für Admin-Oberflächen: FluentUI: Admin-Bereich (vertieft).
- Vollständige Methodenverträge: FluentUI: Öffentliche Helper-API.
Verifiziert gegen: wkfluentui@a477094, wk-dw-msqlite-plugin@240c064