Layout hat 5 Items manuell platziert (config.json wie aktuell)
Klick auf "+ Hinzufügen" mit hello Plugin
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)
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Reproduktion
helloPluginUrsache
admin.py:303-305ruft nach jedem Addlayout_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
Fixed in branch
fix/BUG-04-add-no-repack(commitc6919c5, pushed).Frischer Beweis (gegen den gemockten Server, voll reproduzierbar via
tests/):Was sich ändert:
layout.py: neuefirst_fit(item, others)— platziert ein Item in der ersten freien scan-line Zelle ohne andere zu verändernadmin.py/api/layout/add: nutztfirst_fit. Kein globalespack()mehr nach Add.templates/index.html: 409 wird alswarn-Toast mit Auto-Pack-Hinweis gezeigtTests: 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