Follow-up to #2015 (unified DashboardContainer with collapsible / bordered / tabbed options).
Why
The unified-group PR added three new persistent concepts to the dashboard document — containers[], per-container tabs[], and per-tile tabId — but the external API (packages/api/src/routers/external-api/v2/dashboards.ts) and its OpenAPI spec haven't been audited to confirm these round-trip correctly through create / update / get. External integrations that programmatically build dashboards currently can't take advantage of the new organization, and older automations may silently drop fields they don't understand.
Scope
Non-goals
- Changes to UI behavior (covered by #2015).
- External API auth / permissioning changes.
Parent
HDX-3729 (Dashboard: Sections, groups with tabs, and panel organization).
Follow-up to #2015 (unified DashboardContainer with collapsible / bordered / tabbed options).
Why
The unified-group PR added three new persistent concepts to the dashboard document —
containers[], per-containertabs[], and per-tiletabId— but the external API (packages/api/src/routers/external-api/v2/dashboards.ts) and its OpenAPI spec haven't been audited to confirm these round-trip correctly through create / update / get. External integrations that programmatically build dashboards currently can't take advantage of the new organization, and older automations may silently drop fields they don't understand.Scope
POST /dashboardsandPUT /dashboards/:idaccept the new schema shape (containers,tabs,containerId,tabId,collapsible,bordered).GET /dashboards/:idreturns containers + tabs fields (not silently stripped by a transform layer).packages/api/openapi.json) so theDashboardContainer/DashboardContainerTab/Tile.tabIdschemas are documented and generated SDKs pick them up.type: 'section'handling (spec should note the field is accepted but stripped).Non-goals
Parent
HDX-3729 (Dashboard: Sections, groups with tabs, and panel organization).