BUG-04: Add-Item packt das ganze Layout um — bestehende Items verschwinden woanders #6

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

Reproduktion

  1. Layout hat 5 Items manuell platziert (config.json wie aktuell)
  2. Klick auf "+ Hinzufügen" mit hello Plugin
  3. Bestehende Items sind plötzlich an anderen Positionen

Ursache

admin.py:303-305 ruft nach jedem Add layout_mod.pack() auf alle Items auf. pack() (layout.py:98-141) sortiert nach Fläche absteigend und platziert greedy — ein 1×1-hello kann dabei ein 2×1-spotify aus seiner Position drängen.

Erwartung

Ein neues Item soll in der ersten freien Zelle platziert werden, ohne bestehende Items zu verschieben. Auto-Pack nur als expliziter User-Wunsch (Button "Auto-Pack"), nicht als versteckte Add-Nebenwirkung.

Akzeptanz

  • Nach Add eines 1×1 in ein Layout mit Lücken bleibt jedes bestehende Item an (x,y)
  • Wenn kein Platz → Fehler-Toast mit Hinweis auf Auto-Pack-Button
  • Auto-Pack-Button bleibt separat und explicit (vgl. BUG-06)
## Reproduktion 1. Layout hat 5 Items manuell platziert (config.json wie aktuell) 2. Klick auf "+ Hinzufügen" mit `hello` Plugin 3. Bestehende Items sind plötzlich an anderen Positionen ## Ursache `admin.py:303-305` ruft nach jedem Add `layout_mod.pack()` auf alle Items auf. `pack()` (layout.py:98-141) sortiert nach Fläche absteigend und platziert greedy — ein 1×1-hello kann dabei ein 2×1-spotify aus seiner Position drängen. ## Erwartung Ein neues Item soll in der ersten freien Zelle platziert werden, ohne bestehende Items zu verschieben. Auto-Pack nur als expliziter User-Wunsch (Button "Auto-Pack"), nicht als versteckte Add-Nebenwirkung. ## Akzeptanz - Nach Add eines 1×1 in ein Layout mit Lücken bleibt jedes bestehende Item an (x,y) - Wenn kein Platz → Fehler-Toast mit Hinweis auf Auto-Pack-Button - Auto-Pack-Button bleibt separat und explicit (vgl. BUG-06)
ki added the uxfrontendadmin-uilayoutbug labels 2026-08-29 15:15:06 +02:00
Author
Owner

Fixed in branch fix/BUG-04-add-no-repack (commit c6919c5, pushed).

Frischer Beweis (gegen den gemockten Server, voll reproduzierbar via tests/):

BEFORE: [('c1',0,0), ('w1',2,0), ('st1',0,2), ('sp1',2,2), ('sv1',3,2)]
POST /api/layout/add  plugin=hello  →  status=200
  c1@0,0  w1@2,0  st1@0,2  sp1@2,2  sv1@3,2  [NEW] hello@(2,3)
Preserved: True   ✓

Flood to 16/16 cells, POST /api/layout/add → status=409
  body: {"error":"kein Platz für 1×1-Item — bitte Auto-Pack...",
         "hint":"use_auto_pack","ok":false}

Was sich ändert:

  • layout.py: neue first_fit(item, others) — platziert ein Item in der ersten freien scan-line Zelle ohne andere zu verändern
  • admin.py /api/layout/add: nutzt first_fit. Kein globales pack() mehr nach Add.
  • templates/index.html: 409 wird als warn-Toast mit Auto-Pack-Hinweis gezeigt

Tests: 5 grün (python -m unittest discover -s tests).
PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-04-add-no-repack

Fixed in branch `fix/BUG-04-add-no-repack` (commit c6919c5, pushed). **Frischer Beweis** (gegen den gemockten Server, voll reproduzierbar via `tests/`): ``` BEFORE: [('c1',0,0), ('w1',2,0), ('st1',0,2), ('sp1',2,2), ('sv1',3,2)] POST /api/layout/add plugin=hello → status=200 c1@0,0 w1@2,0 st1@0,2 sp1@2,2 sv1@3,2 [NEW] hello@(2,3) Preserved: True ✓ Flood to 16/16 cells, POST /api/layout/add → status=409 body: {"error":"kein Platz für 1×1-Item — bitte Auto-Pack...", "hint":"use_auto_pack","ok":false} ``` **Was sich ändert:** - `layout.py`: neue `first_fit(item, others)` — platziert ein Item in der ersten freien scan-line Zelle ohne andere zu verändern - `admin.py` `/api/layout/add`: nutzt `first_fit`. Kein globales `pack()` mehr nach Add. - `templates/index.html`: 409 wird als `warn`-Toast mit Auto-Pack-Hinweis gezeigt **Tests:** 5 grün (`python -m unittest discover -s tests`). PR: https://git.pkop.de/Vibecode/epaper-dashboard/pulls/new/fix/BUG-04-add-no-repack
ki closed this issue 2026-08-29 15:20:38 +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#6