BUG-06: Auto-Pack ohne Undo — ein Klick, alle manuellen Positionen weg #8

Closed
opened 2026-08-29 15:15:06 +02:00 by ki · 1 comment
Owner

Symptom

Auto-Pack-Modal warnt zwar (templates/index.html:1626-1630), aber es gibt keinen Undo. Versehentlicher Klick und das gesamte manuelle Layout ist weg.

Ursache

saveLayout() (:1611) POSTet sofort items an /api/layout. Es gibt keine History und kein Diff-Snapshot vor Auto-Pack.

Akzeptanz

  • Mindestens: Vor Auto-Pack Snapshot in sessionStorage, Undo-Button im Toast "Layout automatisch angeordnet" für 10s
  • Optional: Volle Undo/Redo-History mit Strg+Z (größeres Refactor)
  • Im Toast steht klar "Rückgängig" mit funktionierendem Handler
## Symptom Auto-Pack-Modal warnt zwar (`templates/index.html:1626-1630`), aber es gibt keinen Undo. Versehentlicher Klick und das gesamte manuelle Layout ist weg. ## Ursache `saveLayout()` (`:1611`) POSTet sofort `items` an `/api/layout`. Es gibt keine History und kein Diff-Snapshot vor Auto-Pack. ## Akzeptanz - Mindestens: Vor Auto-Pack Snapshot in `sessionStorage`, Undo-Button im Toast "Layout automatisch angeordnet" für 10s - Optional: Volle Undo/Redo-History mit Strg+Z (größeres Refactor) - Im Toast steht klar "Rückgängig" mit funktionierendem Handler
ki added the uxfrontendadmin-uilayoutbug labels 2026-08-29 15:15:06 +02:00
Author
Owner

Fixed in branch fix/BUG-06-autopack-undo (commit a465912, pushed).

Fix:

  • packAll() speichert layoutItems als JSON-Snapshot in einer local closure (vor dem pack-Call).
  • toast() bekommt neuen 4. Parameter action={label, onClick} — Toast rendert Action-Button.
  • Action-Button ist klickbar trotz dismiss-on-click (eigener Listener mit stopPropagation).
  • Bei Undo-Klick: POST /api/layout mit den snapshot-Items → Server restored → renderGrid() → "Layout wiederhergestellt".
  • Modal-Text weist auf 10s Undo-Möglichkeit hin.

Statt sessionStorage: local closure. Vorteile: kein Storage-Bloat, keine Multi-Tab-Konflikte. Bei Page-Reload ist Undo weg (Server hält den letzten Stand als Source-of-Truth).

Wiederverwendbar: Das actionable-Toast-Pattern ist jetzt generisch. Andere Aktionen (z.B. "Snapshot wiederherstellen" aus Sidebar) können denselben Mechanismus nutzen.

Frischer Beweis: node tests/test_autopack_undo.js → 8/8 grün

✓ packAll speichert Snapshot (JSON.stringify(layoutItems))
✓ Toast wird mit action-Parameter aufgerufen
✓ Undo ruft POST /api/layout mit snapshot-Items
✓ Modal-Body erwähnt "rückgängig"
✓ .toast-action CSS-Klasse vorhanden
✓ toast() unterstützt 4-Args (action-Parameter)
✓ Action-Button: Click ruft onClick + dismiss
✓ .toast-action hat pointer-events:auto

Live-Test: GET /?demo=1 → 200, 90847 bytes

  • toast-action: 6 occurrences (CSS + JS)
  • Rückgängig: 1 mention
  • JSON.stringify(layoutItems): 1

PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-06-autopack-undo

Fixed in branch `fix/BUG-06-autopack-undo` (commit a465912, pushed). **Fix:** - `packAll()` speichert `layoutItems` als JSON-Snapshot in einer local closure (vor dem pack-Call). - `toast()` bekommt neuen 4. Parameter `action={label, onClick}` — Toast rendert Action-Button. - Action-Button ist klickbar trotz `dismiss-on-click` (eigener Listener mit `stopPropagation`). - Bei Undo-Klick: `POST /api/layout` mit den snapshot-Items → Server restored → `renderGrid()` → "Layout wiederhergestellt". - Modal-Text weist auf 10s Undo-Möglichkeit hin. **Statt sessionStorage:** local closure. Vorteile: kein Storage-Bloat, keine Multi-Tab-Konflikte. Bei Page-Reload ist Undo weg (Server hält den letzten Stand als Source-of-Truth). **Wiederverwendbar:** Das actionable-Toast-Pattern ist jetzt generisch. Andere Aktionen (z.B. "Snapshot wiederherstellen" aus Sidebar) können denselben Mechanismus nutzen. **Frischer Beweis:** `node tests/test_autopack_undo.js` → 8/8 grün ``` ✓ packAll speichert Snapshot (JSON.stringify(layoutItems)) ✓ Toast wird mit action-Parameter aufgerufen ✓ Undo ruft POST /api/layout mit snapshot-Items ✓ Modal-Body erwähnt "rückgängig" ✓ .toast-action CSS-Klasse vorhanden ✓ toast() unterstützt 4-Args (action-Parameter) ✓ Action-Button: Click ruft onClick + dismiss ✓ .toast-action hat pointer-events:auto ``` Live-Test: `GET /?demo=1 → 200, 90847 bytes` - toast-action: 6 occurrences (CSS + JS) - Rückgängig: 1 mention - JSON.stringify(layoutItems): 1 PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-06-autopack-undo
ki closed this issue 2026-08-29 15:45:13 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Vibecode/epaper-dashboard#8