|
19 | 19 | > - [x] 11 – `generalDriver.js` auf Vanilla umbauen (Abschnitt 6) |
20 | 20 | > - [x] 12 – `generalBase.js` auf Vanilla umbauen (Abschnitt 6) |
21 | 21 | > - [x] 13 – Marker-Klassen für deprecated Helfer aus dem Markup (Abschnitt 6.1) |
| 22 | +> - [x] 14 – Sichtbarkeits-Schalter auf Contaos Link-Modell (Abschnitt 9) |
22 | 23 | > |
23 | 24 | > **jQuery:** im dc-general nicht vorhanden — es gab und gibt keine Fundstelle. |
24 | 25 |
|
@@ -228,6 +229,9 @@ anzeigt. Im Light-Modus war der Postfix leer, also wurde `invisible.svg` in |
228 | 229 | `invisible--dark.svg` gesucht — kein Treffer, das Bild blieb stehen. Das Suffix ist jetzt |
229 | 230 | fest `--dark`. Nebenbei entfiel ein `console.log()`, das bei jedem Klick feuerte. |
230 | 231 |
|
| 232 | +> Historisch: Die Funktion, die hier korrigiert wurde, ist seit Abschnitt 9 entfallen — der |
| 233 | +> Schalter tauscht keine Icons mehr, der Server rendert die Liste neu. |
| 234 | +
|
231 | 235 | ## 5. Was bewusst bleibt |
232 | 236 |
|
233 | 237 | Diese Contao-APIs haben in 5.7 **keinen** vanilla- oder Stimulus-Ersatz. Sie sind kein |
@@ -320,6 +324,9 @@ weil jede von ihnen eine Lehre über die Übersetzung MooTools → vanilla enth |
320 | 324 | dort nie, nur in `loadSubTree()`. Jeder Klick legte damit ein Overlay „Daten werden |
321 | 325 | geladen…" über die Liste. Wieder entfernt; die Ladeanzeige bleibt allein am Aufklappen |
322 | 326 | des Baums, wo das Warten sichtbar sein soll. |
| 327 | + |
| 328 | +> Historisch: Die ersten beiden Punkte betrafen `toggleVisibility()`, die es seit |
| 329 | +> Abschnitt 9 nicht mehr gibt. Die Lehre zu den `fetch()`-Vorgaben gilt weiter. |
323 | 330 | * **Der Schalter holte die ganze Folgeseite.** `Request.Contao` lief mit |
324 | 331 | `followRedirects: false`; `fetch()` folgt Weiterleitungen dagegen von sich aus. Die |
325 | 332 | Antwort auf das Umschalten ist eine Weiterleitung, also lud der Browser bei jedem Klick |
@@ -395,21 +402,24 @@ abgeglichen (Controller-Name, Methodenname, Target-Name). |
395 | 402 | einzelne Ankreuzen sind beim Entfernen von `picker_selector` geprüft worden, siehe 6.1) |
396 | 403 | * „Alle bearbeiten"/„Alle überschreiben": Auswahl eines `fileTree`-Feldes zieht das |
397 | 404 | zugehörige Order-Feld mit |
398 | | -* Sichtbarkeits-Schalter in der **Baum-** und der **Parent-Ansicht** — `toggleVisibility` |
399 | | - verzweigt dort anders, und in keiner der beiden Ansichten der Testdaten gibt es einen |
400 | | - solchen Button. Für genau diese Zweige fehlt die Absicherung; sollte der Schalter auf |
401 | | - Contaos Link-Modell umgestellt werden (Abschnitt 9), entfallen sie ohnehin. |
402 | 405 | * Der `helpwizard`-Zweig aus 4.5 — kein DCA in den Paketen setzt `eval.helpwizard`, der |
403 | 406 | Zweig greift nur bei Fremd-DCAs und war deshalb nicht auslösbar. |
404 | 407 |
|
| 408 | +Die früher hier geführten Zweige von `toggleVisibility` in Baum- und Parent-Ansicht sind |
| 409 | +**entfallen, nicht geschlossen worden**: Die Funktion gibt es seit Abschnitt 9 nicht mehr. |
| 410 | +
|
405 | 411 | Zwei Fallen, die beim Testen Zeit gekostet haben: |
406 | 412 |
|
407 | 413 | > Klappt man ein Palette-Fieldset zu, merkt sich Contao das serverseitig. Ein verstecktes |
408 | 414 | > Widget hat dann keine Bounding-Box, und ein Folgelauf scheitert scheinbar grundlos an |
409 | 415 | > Drag&Drop. |
410 | 416 |
|
411 | | -> Der Icon-Tausch von `toggleVisibility` passiert erst im `onSuccess` des Requests. Wer |
412 | | -> mit einer festen Wartezeit statt auf die Antwort prüft, bekommt sporadische Fehlschläge. |
| 417 | +> **Nie mit festen Wartezeiten prüfen.** Der Unterbaum-Request antwortet mit rund 9,5 kB, |
| 418 | +> die der Client anschließend einbaut; eine feste Wartezeit liest den Zustand des vorigen |
| 419 | +> Klicks. Das hat einen scheinbaren Turbo-Fehler beim Baum erzeugt, der keiner war. Auf |
| 420 | +> `waitForResponse` bzw. eine Bedingung im DOM umstellen. Unter Turbo ist ein Linkklick |
| 421 | +> ohnehin keine Browser-Navigation mehr, sondern `fetch` plus `pushState` — auf |
| 422 | +> `waitForNavigation` zu warten läuft dort in den Timeout. |
413 | 423 |
|
414 | 424 | ## 8. Zustand der Nachbarpakete |
415 | 425 |
|
@@ -459,33 +469,54 @@ mitbringt — die Template-Hierarchie von Contao 5 löst Twig auch hier auf. Ebe |
459 | 469 | berücksichtigt `TemplateList::getTemplatesForBaseFrom()` die Endung `.html.twig` bereits. |
460 | 470 | Einer Twig-Fassung der MetaModels-RTE-Templates steht damit nichts im Weg. |
461 | 471 |
|
462 | | -## 9. Offene Entscheidung: das Modell des Sichtbarkeits-Schalters |
| 472 | +## 9. Umgesetzt: der Sichtbarkeits-Schalter folgt Contaos Modell |
463 | 473 |
|
464 | | -Der Schalter ist die letzte Stelle, an der der dc-general grundsätzlich anders arbeitet als |
465 | | -der Core — und daran hängt ein Anzeigefehler, der sich im jetzigen Modell nicht sauber |
466 | | -beheben lässt. |
| 474 | +Der Schalter war die letzte Stelle, an der der dc-general grundsätzlich anders arbeitete als |
| 475 | +der Core — und daran hing ein Anzeigefehler, der sich im alten Modell nicht sauber beheben |
| 476 | +ließ. |
467 | 477 |
|
468 | 478 | **Der Befund.** In der Baumansicht einer Variantenhierarchie erben die Varianten Werte vom |
469 | | -nicht-varianten Datensatz, unter anderem `published`. Schaltet man den Elternsatz um, |
470 | | -ändert sich der Zustand der Varianten fachlich mit — ihre Icons bleiben aber stehen, bis |
471 | | -die Seite neu geladen wird. Das ist folgerichtig: `toggleVisibility()` tauscht nach der |
| 479 | +nicht-varianten Datensatz, unter anderem `published`. Schaltete man den Elternsatz um, |
| 480 | +änderte sich der Zustand der Varianten fachlich mit — ihre Icons blieben aber stehen, bis |
| 481 | +die Seite neu geladen wurde. Das war folgerichtig: `toggleVisibility()` tauschte nach der |
472 | 482 | Antwort genau **eine** Bildquelle aus, nämlich die des angeklickten Eintrags. Von der |
473 | | -Vererbung weiß der Client nichts, und er kann es auch nicht wissen, ohne die Regeln des |
| 483 | +Vererbung wusste der Client nichts, und er konnte es auch nicht wissen, ohne die Regeln des |
474 | 484 | Servers nachzubauen. |
475 | 485 |
|
476 | | -**Contaos Modell.** Dort ist der Schalter ein gewöhnlicher Link. Turbo Drive fängt ihn ab, |
477 | | -holt die Antwort und tauscht den `<body>`; der Server rendert dabei jede Zeile neu, und |
478 | | -abgeleitete Zustände stimmen ohne Zutun des Clients. Ein Umstieg würde |
479 | | -
|
480 | | -* diesen Fehler strukturell erledigen statt ihn zu umgehen, |
481 | | -* `toggleVisibility()` samt Icon-Tausch, Dark-Mode-Sonderfall (4.6) und den beiden in 6.2 |
482 | | - beschriebenen Fallen ersatzlos entfallen lassen, |
483 | | -* den Schalter dem Verhalten des Cores angleichen, das Redakteure ohnehin kennen. |
484 | | -
|
485 | | -Dagegen steht, dass jeder Klick eine vollständige Liste rendert statt eines |
486 | | -Statuswechsels — bei großen Listen und teuren Renderern der dc-general ist das nicht |
487 | | -umsonst zu haben, und die Baum- und Parent-Ansicht müssten mitgezogen werden. |
488 | | -
|
489 | | -**Stand:** zur Entscheidung im Team. Bis dahin bleibt das jetzige Verhalten; der |
490 | | -Anzeigefehler betrifft ausschließlich die geerbten Icons der Varianten, der gespeicherte |
491 | | -Zustand ist in allen Fällen korrekt. |
| 486 | +**Umgesetzt in drei Schritten:** |
| 487 | +
|
| 488 | +1. **Server** (`ToggleHandler`) — `determineNewState()` kippt den gespeicherten Wert, wenn |
| 489 | + kein `state`-Parameter kommt. Der Parameter behält Vorrang, PHP fällt unter die |
| 490 | + BC-Zusage. Nach dem Speichern leitet der Handler auf die Liste weiter, die die |
| 491 | + Toggle-Aktion selbst nicht rendert; das macht die URL zugleich idempotent. |
| 492 | +2. **Markup** (`ButtonRenderer::buildToggleAttributes()`) — der Link trägt nur noch |
| 493 | + `data-action="contao--scroll-offset#store"`, kein `onclick` mehr. |
| 494 | +3. **JavaScript** — `toggleVisibility()` ist ersatzlos entfallen, mit ihr die |
| 495 | + Icon-Namens-Arithmetik, der Dark-Mode-Sonderfall aus 4.6 und die Verzweigung nach |
| 496 | + Listen-, Baum- und Parent-Ansicht. Zusammen mit den dadurch verwaisten Helfern |
| 497 | + `siblingMatching()` und `firstChildMatching()` sind **180 Zeilen** aus |
| 498 | + `generalDriver.js` verschwunden (491 → 311). JavaScript fällt nicht unter die |
| 499 | + BC-Zusage, deshalb ohne Deprecation-Hülle. |
| 500 | +
|
| 501 | +**Nachgewiesen.** Der Varianten-Fall, der das Vorhaben ausgelöst hat, ist behoben: Nach dem |
| 502 | +Klick auf den Basis-Datensatz folgen alle drei erbenden Varianten **ohne Reload**, Zeilen |
| 503 | +anderer Gruppen bleiben unberührt (`verify-variant-toggle.js`, dreimal 5/5). Der Schalter |
| 504 | +selbst 6/6 ohne JS-Fehler. |
| 505 | +
|
| 506 | +**Zwei Funde, die der Umbau erst sichtbar machte:** |
| 507 | +
|
| 508 | +* Das Inline-Skript für das Sortier-Drag-&-Drop in `dcbe_general_common_list` deklarierte |
| 509 | + `const table` global. Es steht in einer Schleife, konnte also schon bei mehreren Gruppen |
| 510 | + auf einer Seite kollidieren, und Turbo führt die Skripte eines ausgetauschten Body erneut |
| 511 | + aus — jeder Toggle-Klick warf `Identifier 'table' has already been declared`. Jetzt in |
| 512 | + einen Funktionsausdruck gekapselt. |
| 513 | +* Die Toggle-Aktion rendert selbst keine Liste. Beim Ajax-Aufruf war das gleichgültig, weil |
| 514 | + die Antwort verworfen wurde; als Link zeigt der Browser sie. Daher die Weiterleitung. |
| 515 | +
|
| 516 | +**Voraussetzung war Turbo.** Der Body-Austausch trägt das Modell, und Turbo war im |
| 517 | +MetaModels-Backend pauschal abgeschaltet. Siehe `docs/turbo.md`: aktiv für Navigation, die |
| 518 | +Formulare dieses Bundles bleiben ausgenommen. |
| 519 | +
|
| 520 | +**Was das erledigt hat.** Die in Abschnitt 7 als offen geführten Zweige von |
| 521 | +`toggleVisibility` in Baum- und Parent-Ansicht gibt es nicht mehr — die Testlücke ist |
| 522 | +entfallen, statt geschlossen worden zu sein. |
0 commit comments