Dashboard widgets overlap on mixed-size rows (1-col + 2-col next to each other) #70
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Trigger
m 2026-05-21 10:37:
What's wrong
After the dashboard overhaul in m/paliad#69 (pasteur, merged at
f8c6206), widgets can visually overlap when they share a row at different column-spans — e.g. a 2-col-wide widget next to a 1-col widget where the layout's grid-coordinates don't account for the wider one's footprint.Likely root causes (to verify in code):
colspan > 1cells, leaving the next column 'free' even though the wider widget covers it.Acceptance
Continuity note
m asked the worker handling this be kept persistent for follow-ups (vs. fired-on-completion). Stay parked on branch after merge so the next dashboard-tweak ping has warm context.
Role
fixer — focused grid-occupancy bug; small-to-medium PR depending on whether the conflict resolution path (shift siblings vs reject) is implemented in this PR or deferred.
Fixed in commit 92d0340d7409ee481818186f5cf48f91e2cb8941 — PR #71.
Root cause:
computePlacementsinfrontend/src/client/dashboard.tstrusted explicit (x, y) without checking the colspan footprint of already-placed widgets, so a drag-drop swap with mismatched widths or a resize-grow into a sibling produced overlapping cells.Fix: extracted placement math into pure
./dashboard-grid.tswith an occupancy bitmap. Collisions are now resolved by scanning downward from the requested row for the first free w×h block (preferring the requested column). x+w overflow is clamped instead of rendered. 14 regression tests cover the mixed-width swap, resize-grow sibling shift, multi-row widgets, and the overflow clamp.Worker stays parked on
mai/tesla/dashboard-overlapfor follow-up tweaks.Shipped via tesla; merged at https://mgit.msbls.de/m/paliad/commit/875d0c1. Live after Dokploy deploy.