Skip to content

feat(dashboards): multi-select tag filter on Dashboards and Saved Searches#2379

Draft
alex-fedotyev wants to merge 2 commits into
mainfrom
alex/dashboards-multi-select-tag-filter
Draft

feat(dashboards): multi-select tag filter on Dashboards and Saved Searches#2379
alex-fedotyev wants to merge 2 commits into
mainfrom
alex/dashboards-multi-select-tag-filter

Conversation

@alex-fedotyev
Copy link
Copy Markdown
Contributor

Summary

Replace the single-tag dropdown on the Dashboards and Saved Searches list pages with a multi-select chip filter. Each dashboard or saved search now renders exactly once in the grid view, even when it carries multiple selected tags.

  • Selecting multiple chips returns the union (OR semantics) of matching items.
  • URL state moves to ?tags=a,b via nuqs parseAsArrayOf(parseAsString). Existing ?tag=foo shared links and bookmarks continue to load and migrate onto the new state on mount.
  • The groupByTags utility that produced the duplicate render is removed; the grid renders directly from the filtered list.

Closes the duplication symptom reported on #1253. Also relevant to #1929 (different surface; that one is intra-dashboard panel organization).

Test plan

  • yarn jest src/components/Dashboards/__tests__/DashboardsListPage.test.tsx src/components/SavedSearches/__tests__/SavedSearchesListPage.test.tsx (6 new RTL tests pass)
  • yarn ci:lint (lint + tsc + stylelint pass)
  • yarn jest (1756 tests pass; 9 skipped; no regressions)
  • Local dev stack: filter dashboards by one chip, by two chips, by zero; verify each item appears once even when multi-tagged. Confirm legacy ?tag=foo URL selects the chip and rewrites to ?tags=foo.
  • Same drive on Saved Searches.
  • Light + dark theme parity (Mantine MultiSelect honors both).
  • Empty state copy reads "No matching dashboards yet" / "No matching saved searches yet" when chips are set but nothing matches.

Screenshots to attach before marking ready: before-grid (current duplication), after-grid (single render), multi-select interaction in light + dark.

…rches

Replace the single-Select tag filter on the Dashboards and Saved
Searches list pages with a Mantine MultiSelect chip control. Drop
the `groupByTags` grid utility that rendered multi-tagged items
once per tag header; the grid now renders each item exactly once,
with OR semantics across selected chips.

URL state moves from `?tag=foo` (single string) to `?tags=a,b`
(array via nuqs `parseAsArrayOf(parseAsString)`). A mount-only
useEffect migrates legacy single-tag URLs onto the new state so
existing bookmarks and shared links keep working; the modern
`?tags=...` wins when both are present.

Closes the duplication symptom reported on #1253.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 29, 2026

🦋 Changeset detected

Latest commit: fd3aa27

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@hyperdx/app Patch
@hyperdx/api Patch
@hyperdx/otel-collector Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link
Copy Markdown

vercel Bot commented May 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyperdx-oss Ready Ready Preview, Comment May 29, 2026 11:55pm
hyperdx-storybook Ready Ready Preview, Comment May 29, 2026 11:55pm

Request Review

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 2026

E2E Test Results

All tests passed • 191 passed • 3 skipped • 1310s

Status Count
✅ Passed 191
❌ Failed 0
⚠️ Flaky 4
⏭️ Skipped 3

Tests ran across 4 shards in parallel.

View full report →

…ct swap

The DashboardsListPage and SavedSearchesListPage e2e page objects
looked the filter input up by `getByPlaceholder('Filter by tag')`,
which broke for two reasons after the multi-select swap:
- placeholder text changed to 'Filter by tags' (plural).
- Mantine's MultiSelect hides the placeholder once any chip is
  selected, so even a singular match would not survive the second
  interaction in any future multi-tag test.

Switch the locator to a stable `data-testid="tag-filter"` on the
MultiSelect, simplify the placeholder back to an unconditional
'Filter by tags', and press Escape after selection so the still-open
combobox does not block subsequent card clicks. clearTagFilter()
keeps the same CSS-target on the sibling clear button; Mantine v9's
ComboboxClearButton still carries aria-hidden so role-based queries
remain unreliable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant