Summary
Follow-up to #1896 (core collapsible sections mechanics, merged as #1900). This issue covers the authoring experience and schema evolution for dashboard sections.
What was delivered (PR #1926)
Schema: DashboardSection → DashboardContainer
Introduced a polymorphic DashboardContainer abstraction with a type discriminator field ('section' for now). This future-proofs the data model for tabs and groups without requiring another migration.
DashboardSectionSchema → DashboardContainerSchema with type: enum(['section']).default('section')
sectionId → containerId on tiles
sections → containers on dashboards
- Updated across all packages (common-utils, API, app)
Authoring UX
| Action |
How |
| Create section |
Dashboard ... overflow menu → "Add Section" |
| Rename section |
Click the title text directly (inline editing, Kibana pattern) |
| Delete section |
Hover header → ... → Delete Section (tiles ungrouped, not deleted) |
| Collapse/expand |
Click section header |
| Toggle default collapsed |
Hover header → ... → Collapse/Expand by Default |
| Add tile to section |
Hover section header → + button |
| Move tile to/from section |
Hover tile → grid icon → pick section or "(Ungrouped)" |
UX decisions (from Grafana/Datadog/Kibana competitor research)
- Click-to-rename instead of menu → Rename → type (fewer steps)
- Hover-only edit controls —
... menu and + hidden in view mode (clean default)
- "Add Section" in overflow menu — not equal prominence to "Add Tile" (less frequent action)
- "Move to Section" before delete — more discoverable position in tile toolbar
Follow-up work (not in scope)
These are enabled by the data model but need separate implementation:
Dependencies
Summary
Follow-up to #1896 (core collapsible sections mechanics, merged as #1900). This issue covers the authoring experience and schema evolution for dashboard sections.
What was delivered (PR #1926)
Schema:
DashboardSection→DashboardContainerIntroduced a polymorphic
DashboardContainerabstraction with atypediscriminator field ('section'for now). This future-proofs the data model for tabs and groups without requiring another migration.DashboardSectionSchema→DashboardContainerSchemawithtype: enum(['section']).default('section')sectionId→containerIdon tilessections→containerson dashboardsAuthoring UX
...overflow menu → "Add Section"...→ Delete Section (tiles ungrouped, not deleted)...→ Collapse/Expand by Default+buttonUX decisions (from Grafana/Datadog/Kibana competitor research)
...menu and+hidden in view mode (clean default)Follow-up work (not in scope)
These are enabled by the data model but need separate implementation:
react-dndcustom drag layer;containerIdupdate is the only data change@dnd-kit/sortableor similar); just reordercontainersarray'tab'totypeenum, build tab bar UI'group'totypeenum, build bordered container UIDependencies