From 105a2f8970a4ed2c95f2225cae16e6de94e677fc Mon Sep 17 00:00:00 2001 From: Alex Fedotyev <61838744+alex-fedotyev@users.noreply.github.com> Date: Tue, 24 Mar 2026 06:58:30 -0700 Subject: [PATCH] Move section collapse state to URL query params (#1958) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Section expand/collapse is now tracked in URL query params (`collapsed`/`expanded`) instead of persisting to the DB on every chevron click - The DB-stored `collapsed` field on `DashboardContainer` becomes the default fallback — what viewers see when opening a dashboard fresh (no URL state) - Chevron click updates URL state only (per-viewer, shareable via link) - "Collapse by Default" / "Expand by Default" menu action in the section header saves to the DB (via `setDashboard`), setting the default for all viewers - `SectionHeader` now accepts separate `collapsed`/`defaultCollapsed` props and `onToggle`/`onToggleDefaultCollapsed` handlers - Adds 7 unit tests for `SectionHeader` Implements Drew's [review feedback on PR #1926](https://github.com/hyperdxio/hyperdx/pull/1926#discussion_r2966166505): > IMO, expanding/collapsing should not be persisted to the dashboard UNLESS this option is used. [...] I think it would be nice to persist normal expand collapse states in the URL, and then fallback to the default state (saved in the DB based on this option here) if there is no URL state. ## Demo ![Section collapse via URL params demo](https://raw.githubusercontent.com/hyperdxio/hyperdx/feat/url-based-collapse-state/docs/assets/collapse-url-state-demo.gif) Shows: expanded sections → chevron click collapses first section (URL updates to `?collapsed=...`) → menu shows "Collapse by Default" (DB action, separate from view state) ## Test plan - [x] Open a dashboard with sections — collapse/expand via chevron click, verify URL updates (`?collapsed=...` / `?expanded=...`) without saving to DB - [x] Copy the URL with collapse state and open in a new tab — verify sections reflect the URL state - [x] Open the section menu and click "Collapse by Default" — verify this saves to DB (persists after page refresh without URL params) - [x] Verify "Expand by Default" / "Collapse by Default" label reflects the DB default, not current view state - [x] Run `yarn ci:unit --testPathPatterns='SectionHeader'` — all 7 tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- docs/assets/collapse-url-state-demo.gif | Bin 0 -> 70069 bytes packages/app/src/DBDashboardPage.tsx | 166 +++++++++++++----- packages/app/src/components/SectionHeader.tsx | 45 +++-- .../__tests__/SectionHeader.test.tsx | 152 ++++++++++++++++ 4 files changed, 303 insertions(+), 60 deletions(-) create mode 100644 docs/assets/collapse-url-state-demo.gif create mode 100644 packages/app/src/components/__tests__/SectionHeader.test.tsx diff --git a/docs/assets/collapse-url-state-demo.gif b/docs/assets/collapse-url-state-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2411f9e92ff5ae1cfac791cae7c9d7559dbdaac9 GIT binary patch literal 70069 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 z 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 - const onAddTile = (containerId?: string) => { - // Auto-expand collapsed section so the new tile is visible - if (containerId && dashboard) { - const section = dashboard.containers?.find(s => s.id === containerId); - if (section?.collapsed) { - setDashboard( - produce(dashboard, draft => { - const s = draft.containers?.find(c => c.id === containerId); - if (s) s.collapsed = false; - }), - ); - } - } - setEditedTile({ - id: makeId(), - x: 0, - y: 0, - w: 8, - h: 10, - config: { - ...DEFAULT_CHART_CONFIG, - source: sources?.[0]?.id ?? '', - }, - ...(containerId ? { containerId } : {}), - }); - }; - const sections = useMemo( () => dashboard?.containers ?? [], [dashboard?.containers], ); const hasSections = sections.length > 0; + + // URL-based collapse state: tracks which sections the current viewer has + // explicitly collapsed/expanded. Falls back to the DB-stored default. + const [urlCollapsedIds, setUrlCollapsedIds] = useQueryState( + 'collapsed', + parseAsArrayOf(parseAsString).withOptions({ history: 'replace' }), + ); + const [urlExpandedIds, setUrlExpandedIds] = useQueryState( + 'expanded', + parseAsArrayOf(parseAsString).withOptions({ history: 'replace' }), + ); + + const collapsedIdSet = useMemo( + () => new Set(urlCollapsedIds ?? []), + [urlCollapsedIds], + ); + const expandedIdSet = useMemo( + () => new Set(urlExpandedIds ?? []), + [urlExpandedIds], + ); + + const isSectionCollapsed = useCallback( + (section: DashboardContainer): boolean => { + // URL state takes precedence over DB default + if (collapsedIdSet.has(section.id)) return true; + if (expandedIdSet.has(section.id)) return false; + return section.collapsed ?? false; + }, + [collapsedIdSet, expandedIdSet], + ); + const allTiles = useMemo(() => dashboard?.tiles ?? [], [dashboard?.tiles]); const handleMoveTileToSection = useCallback( @@ -1287,10 +1291,56 @@ function DBDashboardPage({ presetConfig }: { presetConfig?: Dashboard }) { [dashboard, setDashboard], ); - // Intentionally persists collapsed state to the server via setDashboard - // (same pattern as tile drag/resize). This matches Grafana and Kibana - // behavior where collapsed state is saved with the dashboard for all viewers. + // Helpers for updating URL-based collapse sets via immer. + const addToUrlSet = useCallback( + (setter: typeof setUrlCollapsedIds, containerId: string) => { + setter(prev => + produce(prev ?? [], draft => { + if (!draft.includes(containerId)) draft.push(containerId); + }), + ); + }, + [], + ); + + const removeFromUrlSet = useCallback( + (setter: typeof setUrlCollapsedIds, containerId: string) => { + setter(prev => { + const next = (prev ?? []).filter(id => id !== containerId); + return next.length > 0 ? next : null; + }); + }, + [], + ); + + // Toggle collapse in URL state only (per-viewer, shareable via link). + // Does NOT persist to DB — the DB `collapsed` field is the default. const handleToggleSection = useCallback( + (containerId: string) => { + const section = dashboard?.containers?.find(s => s.id === containerId); + const currentlyCollapsed = section ? isSectionCollapsed(section) : false; + + if (currentlyCollapsed) { + addToUrlSet(setUrlExpandedIds, containerId); + removeFromUrlSet(setUrlCollapsedIds, containerId); + } else { + addToUrlSet(setUrlCollapsedIds, containerId); + removeFromUrlSet(setUrlExpandedIds, containerId); + } + }, + [ + dashboard?.containers, + isSectionCollapsed, + addToUrlSet, + removeFromUrlSet, + setUrlCollapsedIds, + setUrlExpandedIds, + ], + ); + + // Toggle the DB-stored default collapsed state (menu action). + // This changes what all viewers see by default when opening the dashboard. + const handleToggleDefaultCollapsed = useCallback( (containerId: string) => { if (!dashboard) return; setDashboard( @@ -1303,6 +1353,28 @@ function DBDashboardPage({ presetConfig }: { presetConfig?: Dashboard }) { [dashboard, setDashboard], ); + const onAddTile = (containerId?: string) => { + // Auto-expand collapsed section via URL state so the new tile is visible + if (containerId) { + const section = dashboard?.containers?.find(s => s.id === containerId); + if (section && isSectionCollapsed(section)) { + handleToggleSection(containerId); + } + } + setEditedTile({ + id: makeId(), + x: 0, + y: 0, + w: 8, + h: 10, + config: { + ...DEFAULT_CHART_CONFIG, + source: sources?.[0]?.id ?? '', + }, + ...(containerId ? { containerId } : {}), + }); + }; + const handleAddSection = useCallback(() => { if (!dashboard) return; setDashboard( @@ -1752,26 +1824,32 @@ function DBDashboardPage({ presetConfig }: { presetConfig?: Dashboard }) { handleToggleSection(section.id)} + onToggleDefaultCollapsed={() => + handleToggleDefaultCollapsed(section.id) + } onRename={newTitle => handleRenameSection(section.id, newTitle) } onDelete={() => handleDeleteSection(section.id)} onAddTile={() => onAddTile(section.id)} /> - {!section.collapsed && sectionTiles.length > 0 && ( - - {sectionTiles.map(renderTileComponent)} - - )} + {!isSectionCollapsed(section) && + sectionTiles.length > 0 && ( + + {sectionTiles.map(renderTileComponent)} + + )} ); })} diff --git a/packages/app/src/components/SectionHeader.tsx b/packages/app/src/components/SectionHeader.tsx index 092acf54..db0e1190 100644 --- a/packages/app/src/components/SectionHeader.tsx +++ b/packages/app/src/components/SectionHeader.tsx @@ -13,14 +13,24 @@ import { export default function SectionHeader({ section, tileCount, + collapsed, + defaultCollapsed, onToggle, + onToggleDefaultCollapsed, onRename, onDelete, onAddTile, }: { section: DashboardContainer; tileCount: number; + /** Effective collapsed state (URL state ?? DB default). */ + collapsed: boolean; + /** The DB-stored default collapsed state. */ + defaultCollapsed: boolean; + /** Toggle collapse in URL state (chevron click). */ onToggle: () => void; + /** Toggle the DB-stored default collapsed state (menu action). */ + onToggleDefaultCollapsed?: () => void; onRename?: (newTitle: string) => void; onDelete?: () => void; onAddTile?: () => void; @@ -31,7 +41,7 @@ export default function SectionHeader({ const [menuOpen, setMenuOpen] = useState(false); const showControls = hovered || menuOpen; - const hasMenuControls = onDelete != null; + const hasMenuControls = onDelete != null || onToggleDefaultCollapsed != null; const handleSaveRename = () => { const trimmed = editedTitle.trim(); @@ -81,13 +91,13 @@ export default function SectionHeader({ } role="button" tabIndex={editing ? undefined : 0} - aria-expanded={!section.collapsed} + aria-expanded={!collapsed} aria-label={`Toggle ${section.title} section`} > {section.title} - {section.collapsed && tileCount > 0 && ( + {collapsed && tileCount > 0 && ( ({tileCount} {tileCount === 1 ? 'tile' : 'tiles'}) @@ -170,18 +180,21 @@ export default function SectionHeader({ - - ) : ( - - ) - } - onClick={onToggle} - > - {section.collapsed ? 'Expand by Default' : 'Collapse by Default'} - + {onToggleDefaultCollapsed && ( + + ) : ( + + ) + } + onClick={onToggleDefaultCollapsed} + data-testid={`section-toggle-default-${section.id}`} + > + {defaultCollapsed ? 'Expand by Default' : 'Collapse by Default'} + + )} {onDelete && ( <> diff --git a/packages/app/src/components/__tests__/SectionHeader.test.tsx b/packages/app/src/components/__tests__/SectionHeader.test.tsx new file mode 100644 index 00000000..54d5a4a9 --- /dev/null +++ b/packages/app/src/components/__tests__/SectionHeader.test.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { DashboardContainer } from '@hyperdx/common-utils/dist/types'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import SectionHeader from '../SectionHeader'; + +// Menu buttons have pointer-events:none when not hovered; skip that check. +const user = userEvent.setup({ pointerEventsCheck: 0 }); + +const makeSection = ( + overrides: Partial = {}, +): DashboardContainer => ({ + id: 'section-1', + type: 'section', + title: 'My Section', + collapsed: false, + ...overrides, +}); + +describe('SectionHeader', () => { + it('renders section title and tile count when collapsed', () => { + renderWithMantine( + , + ); + + expect(screen.getByText('My Section')).toBeInTheDocument(); + expect(screen.getByText('(3 tiles)')).toBeInTheDocument(); + }); + + it('does not show tile count when expanded', () => { + renderWithMantine( + , + ); + + expect(screen.getByText('My Section')).toBeInTheDocument(); + expect(screen.queryByText('(3 tiles)')).not.toBeInTheDocument(); + }); + + it('calls onToggle (URL state) when chevron area is clicked', async () => { + const onToggle = jest.fn(); + const onToggleDefaultCollapsed = jest.fn(); + + renderWithMantine( + , + ); + + await user.click( + screen.getByRole('button', { name: /Toggle My Section section/i }), + ); + + expect(onToggle).toHaveBeenCalledTimes(1); + expect(onToggleDefaultCollapsed).not.toHaveBeenCalled(); + }); + + it('shows "Collapse by Default" when DB default is expanded', async () => { + renderWithMantine( + , + ); + + // Open the menu + await user.click(screen.getByTestId('section-menu-section-1')); + expect(await screen.findByText('Collapse by Default')).toBeInTheDocument(); + }); + + it('shows "Expand by Default" when DB default is collapsed', async () => { + renderWithMantine( + , + ); + + await user.click(screen.getByTestId('section-menu-section-1')); + expect(await screen.findByText('Expand by Default')).toBeInTheDocument(); + }); + + it('calls onToggleDefaultCollapsed (DB state) from menu item', async () => { + const onToggle = jest.fn(); + const onToggleDefaultCollapsed = jest.fn(); + + renderWithMantine( + , + ); + + await user.click(screen.getByTestId('section-menu-section-1')); + await user.click(await screen.findByText('Collapse by Default')); + + expect(onToggleDefaultCollapsed).toHaveBeenCalledTimes(1); + expect(onToggle).not.toHaveBeenCalled(); + }); + + it('uses collapsed prop for visual state independent of section.collapsed', () => { + // section.collapsed is false (DB default), but collapsed prop is true (URL override) + renderWithMantine( + , + ); + + // Should show tile count because collapsed=true (URL state takes precedence) + expect(screen.getByText('(5 tiles)')).toBeInTheDocument(); + // The aria-expanded should reflect the effective state + expect( + screen.getByRole('button', { name: /Toggle My Section section/i }), + ).toHaveAttribute('aria-expanded', 'false'); + }); +});