Compose N measurement panels with non-overlapping gridPos #35
Reference in New Issue
Block a user
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?
Type: slice
Depends on: #34
Estimate: M (1–2 days)
Slice — layers touched
dashboardAPI domain (layout engine) → templates (annotated with
panelHeight) → Grafana dashboard (multi-panel) → basic test → perf test.Context
Implements PRD F-4 and N-1. Anchors the layout convention before any other node-type templates are added.
Scope
gridPos: {{x, y, w, h}}such that panels don't overlap; simple two-column layout (x=0, x=12),yadvances bypanelHeightfrom the template.panelHeight(default 8 rows).Out of scope
Acceptance criteria
process.hrtime.bigint()).Slice #35 shipped on branch
slice/35-multi-panel-perf(offslice/34)dashboardAPI @ slice/35-multi-panel-perf— commitbdf87ffEVOLV @ slice/35-multi-panel-perf— commit042a5ccArchitectural reframe (worth flagging)
The PRD assumed "1 dashboardAPI → 1 dashboard with N panels, composer assigns gridPos." The actual implementation is "1 dashboardAPI → root dashboard + 1 per registered child, cross-linked", with each individual dashboard's panel layout authored explicitly inside
config/<softwareType>.json(per-panelgridPos).This is arguably a better UX (drill-down navigation, one focused dashboard per asset, doesn't get unwieldy at scale) and predates this work. So "non-overlapping gridPos for N children" doesn't apply — children get separate dashboard URLs, not stacked panels.
What the PRD's intent maps to in the actual model:
N-1, <500ms for 50 children) → test added (composes 50 children in <500ms).N-2, byte-identical regen) → test added.Acceptance criteria (status)
Closes #35.