feat(app): unify alert actions and make the alert source legible - #3015
Conversation
…ource icons The alerts page row menu now opens the alert editor, so changing a threshold no longer means navigating into the alert first. The modal needs a range for its threshold preview; a list row has none, so it derives one from the alert's interval when the modal opens. Each row's source icon gains a tooltip and accessible label naming what the alert watches, a new filter narrows the list by that source, and free-text search matches it too. All three read one getAlertSourceLabel helper so their wording cannot drift. Named 'alert source' rather than 'type' (taken by detection type) or bare 'source' (reads as a data source). The creator moves out of the shared properties line into its own dimmed sub-line: it is provenance, not configuration, and at equal weight it pushed the line into a second row that broke mid-phrase. Remaining segments no longer wrap mid-phrase. Team settings tabs gain icons.
Edit, Delete and Terraform export move behind the overflow menu the alerts list already uses, so the header stops spreading four buttons across the top and the two surfaces cannot drift apart on which actions an alert offers. The menu gains an optional dateRange (the detail page has a picked range for the edit modal's threshold preview, where a list row does not) and an onDeleted callback so the page can navigate away once the alert is gone. The link to what the alert watches becomes an icon beside the alert name: it navigates to the alert's subject, so it belongs with the identity rather than with the verbs acting on the alert. The properties block separates configuration from provenance, moving the creator down to join the created and updated timestamps in one dimmed line.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
🦋 Changeset detectedLatest commit: d23adc8 The changes in this PR will be included in the next version bump. This PR includes changesets to release 3 packages
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 |
🟡 Tier 3 — StandardIntroduces new logic, modifies core functionality, or touches areas with non-trivial risk. Why this tier:
Review process: Full human review — logic, architecture, edge cases. Stats
|
E2E Test Results✅ All tests passed • 321 passed • 1 skipped • 1354s
Tests ran across 4 shards in parallel. |
Greptile SummaryThe PR unifies alert actions across list and detail views while making each alert’s source visible and filterable.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| packages/app/src/AlertDetailPage.tsx | Replaces separate detail-page actions with the shared alert menu and moves source navigation beside the alert title; the previously flagged styling issue is resolved. |
| packages/app/src/AlertsPage.tsx | Adds URL-backed alert-source filtering and source-label matching to free-text search. |
| packages/app/src/components/alerts/AlertRowMenu.tsx | Extends the shared row menu with alert editing, configurable preview ranges, and a post-deletion callback. |
| packages/app/src/components/alerts/AlertDetails.tsx | Adds accessible source labeling and separates creator provenance from the configuration summary. |
| packages/app/src/utils/alerts.ts | Introduces the shared alert-source label helper used by filtering, search, and source tooltips. |
Reviews (3): Last reviewed commit: "Merge branch 'main' into jordansimonovsk..." | Re-trigger Greptile
| <ActionIcon | ||
| component={Link} | ||
| href={alertUrl} | ||
| variant="subtle" |
There was a problem hiding this comment.
Styling bypasses semantic conventions
The new source action uses the raw Mantine gray palette, while the related summary changes introduce repeated raw style objects. This bypasses the repository's semantic color and Mantine style-prop conventions, making the new alert UI harder to keep consistent across themes.
Context Used: AGENTS.md (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Deep ReviewFrontend-only PR unifying alert actions into one shared overflow menu across the alerts list and detail page, making the alert source legible/filterable/searchable, and reorganizing creator/provenance metadata. Scope verified against base ✅ No critical issues found. No P0/P1 defects: imports are cleaned correctly ( 🟡 P2 -- recommended
🔵 P3 nitpicks (2)
Reviewers (10): correctness, testing, maintainability, project-standards, kieran-typescript, julik-frontend-races, adversarial, previous-comments, agent-native, learnings-researcher. Testing gaps: source filter, source-label search matching, and the accessible source-icon/tooltip in |
The source-link icon paired variant="subtle" with the raw Mantine gray palette, which the code style forbids; the variant already carries the intended treatment across themes. The properties line's repeated inline style objects move into AlertsPage.module.scss, matching how the other alert components style themselves. Also raises the AlertRowMenu suite's timeout above the 5s its own openMenu helper waits for the dropdown. The two were equal, so under parallel workers a slow transition consumed the whole per-test budget and timed the test out before its assertions ran.
Alert actions were split across two surfaces that disagreed: the list could delete and export to Terraform but not edit, the detail page could edit and delete but not export, and each had its own delete confirmation. Nothing on a list row said whether an alert watched a saved search or a dashboard tile — the icon carried that distinction silently. This gives both surfaces the same overflow menu and makes the alert's source legible and filterable.
CleanShot.2026-08-28.at.16.04.24.mp4
What changed
Alerts list
Alert detail page
Team settings tabs also gain icons.
Key decisions
One shared menu, not two parallel ones. The detail page's own edit modal, delete handler and confirmation are deleted in favour of the list's. Two surfaces maintaining separate action sets is how they drifted apart. The menu takes an optional
dateRange(the detail page has a picked range for the editor's threshold preview; a list row does not, and derives one from the alert's evaluation interval) and anonDeletedcallback so the page can navigate away after deletion."Alert source", not "type" or "source". "Type" already means detection type (anomaly vs static threshold) in the alerts UI, and a bare "source" reads as a data source (Logs/Traces/Metrics). The filter is labelled "Filter by alert source" and its query param is
alertSource.One label helper, three consumers. The tooltip, the filter options, and search all call
getAlertSourceLabel. The filter compares against the label text, so if these drifted the filter would silently match nothing.Creator out of the shared summary entirely. Both surfaces render it themselves now. Keeping it in the shared line at equal weight with the alert's configuration is what pushed the line into a second row that wrapped mid-phrase.
Source link beside the title, not among the actions. It navigates to the alert's subject, so it belongs with the identity rather than the verbs acting on the alert. The menu's own source-link item is suppressed on that page to avoid offering it twice.
Impact
Frontend only, no API or schema changes. The detail page's delete confirmation changes from
ConfirmDeleteMenuto the shareduseConfirmdialog, and deletion returns you to/alerts. The filter's value is a human-readable label carried in the URL (?alertSource=Saved%20search), so renaming a label invalidates shared links.Two commits, one per surface, if that reads more easily than the combined diff.
Implementation detail
hasFilters, which now includes the source filter.role="img"(naming is not exposed on a role-less span) and the glyphs arearia-hidden.alerts,saved-search,dashboards) as the removed detail-page handler; navigation moved intoonDeleted.getAlertSourceLabelincluding its fallback, the menu opening the editor, and the summary omitting the creator in both variants. Full app suite passes (3385).