Skip to content

Commit 19827b2

Browse files
committed
Drop toggleVisibility, the toggle needs no javascript any more
With the toggle rendered as a plain link nothing calls the function, so it goes - together with the icon name arithmetic, the dark mode special case and the branching over list, tree and parent view. The helpers siblingMatching() and firstChildMatching() were left without a user and go with it: 180 lines out of generalDriver.js, 491 down to 311. Javascript is not under the bc promise, so no deprecation shim. Two test gaps close by disappearing rather than by being covered: the tree and parent branches of that function were never reachable in the devstack, which is why the vanilla rework could not verify them. Documentation follows in three places. Section 9 of the mootools notes was still headed "offene Entscheidung" and now records what was built, with the measurement of the variant case. The two spots describing fixes to the removed function carry a pointer so nobody hunts for it. The upgrade notes list the removed api, why the old model could not be fixed, and that the server side stayed additive. While there: the upgrade notes still recommended config/forceEdit for tables without a list view and claimed tl_metamodel_dca_combine carries it. Both went stale when the provider started stating it itself through EditOnlyDataProviderInterface - the flag keeps working, but the interface is the reliable source and the one that also answers which record aggregates a parent. Verified: toggle 6/6, variant inheritance 5/5, regression 19/19, drag and drop persists, tree 5/5. phpcq unchanged at 1 minor and 169 marginals.
1 parent 45f6be4 commit 19827b2

3 files changed

Lines changed: 95 additions & 219 deletions

File tree

docs/mootools-removal.md

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
> - [x] 11 – `generalDriver.js` auf Vanilla umbauen (Abschnitt 6)
2020
> - [x] 12 – `generalBase.js` auf Vanilla umbauen (Abschnitt 6)
2121
> - [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)
2223
>
2324
> **jQuery:** im dc-general nicht vorhanden — es gab und gibt keine Fundstelle.
2425
@@ -228,6 +229,9 @@ anzeigt. Im Light-Modus war der Postfix leer, also wurde `invisible.svg` in
228229
`invisible--dark.svg` gesucht — kein Treffer, das Bild blieb stehen. Das Suffix ist jetzt
229230
fest `--dark`. Nebenbei entfiel ein `console.log()`, das bei jedem Klick feuerte.
230231

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+
231235
## 5. Was bewusst bleibt
232236

233237
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
320324
dort nie, nur in `loadSubTree()`. Jeder Klick legte damit ein Overlay „Daten werden
321325
geladen…" über die Liste. Wieder entfernt; die Ladeanzeige bleibt allein am Aufklappen
322326
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.
323330
* **Der Schalter holte die ganze Folgeseite.** `Request.Contao` lief mit
324331
`followRedirects: false`; `fetch()` folgt Weiterleitungen dagegen von sich aus. Die
325332
Antwort auf das Umschalten ist eine Weiterleitung, also lud der Browser bei jedem Klick
@@ -395,21 +402,24 @@ abgeglichen (Controller-Name, Methodenname, Target-Name).
395402
einzelne Ankreuzen sind beim Entfernen von `picker_selector` geprüft worden, siehe 6.1)
396403
* „Alle bearbeiten"/„Alle überschreiben": Auswahl eines `fileTree`-Feldes zieht das
397404
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.
402405
* Der `helpwizard`-Zweig aus 4.5 — kein DCA in den Paketen setzt `eval.helpwizard`, der
403406
Zweig greift nur bei Fremd-DCAs und war deshalb nicht auslösbar.
404407
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+
405411
Zwei Fallen, die beim Testen Zeit gekostet haben:
406412
407413
> Klappt man ein Palette-Fieldset zu, merkt sich Contao das serverseitig. Ein verstecktes
408414
> Widget hat dann keine Bounding-Box, und ein Folgelauf scheitert scheinbar grundlos an
409415
> Drag&Drop.
410416
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.
413423
414424
## 8. Zustand der Nachbarpakete
415425
@@ -459,33 +469,54 @@ mitbringt — die Template-Hierarchie von Contao 5 löst Twig auch hier auf. Ebe
459469
berücksichtigt `TemplateList::getTemplatesForBaseFrom()` die Endung `.html.twig` bereits.
460470
Einer Twig-Fassung der MetaModels-RTE-Templates steht damit nichts im Weg.
461471
462-
## 9. Offene Entscheidung: das Modell des Sichtbarkeits-Schalters
472+
## 9. Umgesetzt: der Sichtbarkeits-Schalter folgt Contaos Modell
463473
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ß.
467477
468478
**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
472482
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
474484
Servers nachzubauen.
475485
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.

docs/upgrade-2.5.md

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,28 @@ session referer knew the actual history and needed no such distinction — anyon
2323
`getBackUrl()` in own code should be aware of the difference.
2424

2525
**Check your tables that have no list view.** A table whose data provider only serves the
26-
edit mode — `TableRowsAsRecordsDataProvider` is the one shipped here, it aggregates all rows
27-
of a parent into a single record and throws on `fetchAll()` — must say so through
28-
`config/forceEdit` in its DCA. The flag is not new, but with the session referer it rarely
29-
mattered; now the back url is built from the request and would otherwise point at a list
30-
that cannot be rendered. With the flag set, two things fall into place: the list handler
31-
forwards to the edit action instead of fetching a collection, and the back url leaves
32-
`table` and `pid` behind so that closing lands one level up.
26+
edit mode has no list to go back to - `TableRowsAsRecordsDataProvider` is the one shipped
27+
here: it aggregates all rows of a parent into a single record and throws on `fetchAll()`.
28+
With the session referer this rarely mattered, since it returned the page one came from. The
29+
back url is derived from the request now and would otherwise point at that missing list.
3330

34-
The symptom without it is an exception on "save and close", not a warning:
31+
The symptom is an exception on "save and close", not a warning:
3532

3633
```
3734
TableRowsAsRecordsDataProvider::fetchAll not available,
3835
as the data provider is intended for edit mode only.
3936
```
4037

41-
`tl_metamodel_dca_combine` in MetaModels was affected and carries the flag now.
38+
**Own providers say so through `EditOnlyDataProviderInterface`.** Implementing it settles
39+
both consumers: the back url leaves `table` and `pid` behind so that closing lands one level
40+
up, and the list handler forwards to the edit action instead of fetching a collection. The
41+
interface also answers which record aggregates a given parent, which the forward needs - the
42+
list url of such a table carries only `pid`, and forwarding without an id opens an empty mask
43+
that looks exactly like lost data.
44+
45+
The older `config/forceEdit` in the DCA keeps working and is honoured the same way. The
46+
interface is the more reliable source though: a flag is easy to forget, while a provider that
47+
cannot list knows it.
4248

4349
## Back-end javascript reworked (MooTools removal)
4450

@@ -70,6 +76,25 @@ The `_src` suffix is gone for good - there is no build step, the shipped file is
7076
`sendPost()` had no caller and was broken anyway - it passed the payload to
7177
`setRequestHeader()` instead of sending it as the body. Use `DcGeneral.post()`.
7278
- `BackendGeneral.setLegendState()` - see below.
79+
- `BackendGeneral.toggleVisibility()`. The visibility toggle is a plain link now, the way
80+
Contao renders its own toggle operation: the server flips the stored value and the list is
81+
rendered anew. Nothing swaps an icon any more, so the function, its icon name arithmetic,
82+
the dark mode special case and the branching over list, tree and parent view are gone -
83+
180 lines out of `generalDriver.js`, together with the helpers `siblingMatching()` and
84+
`firstChildMatching()` they left behind.
85+
86+
This fixes a defect that could not be solved in the old model: rows inheriting the value -
87+
variants inherit `published` from their base record - kept showing the stale state until a
88+
reload, because only the clicked icon was swapped. Reproducing the server's inheritance
89+
rules in the browser was never realistic.
90+
91+
Server side the change is additive. `ToggleHandler` still honours a `state` parameter and
92+
only flips the stored value when none is passed, so existing links keep working. It now
93+
redirects to the list once the new state is stored - the toggle action renders none itself,
94+
which was of no consequence while an ajax call threw the answer away.
95+
96+
**This needs Turbo Drive**, or every toggle turns into a visible page load. See
97+
`docs/turbo.md`.
7398

7499
**Added:** `BackendGeneral.toggleWrap(id)`, because Contao 5 dropped `Backend.toggleWrap()`
75100
without a replacement while the dc-general still offers the button.

0 commit comments

Comments
 (0)