feat(ui): rename Issues to Stacks across the frontend#2262
Merged
Conversation
- Rename route directories: /(app)/issues → /(app)/stacks - Rename components: issue-detail-sheet → stack-detail-sheet, issue-details → stack-details - Update sidebar nav label and icon (bug → layers) - Update all navigation links, keyboard shortcuts, page titles - Update chart and stats dashboard labels - Update command palette search headings and result labels - Update project settings: Issue Management → Stack Management - Keep view_type 'issues' as DB-stored value for backward compatibility
e5228e5 to
42c90e4
Compare
- Update ViewType validation regex and ValidViewTypes array - Update ValidColumnIds to use 'stacks' key - Update predefined-saved-views.json keys and viewType values - Update frontend VIEW constant and viewToHref mapping - Update all test data and assertions
42c90e4 to
34014a2
Compare
- Same day: 'May 24, 10:01 AM – 3:02 PM' (date shown once) - Range > 1 day: omit seconds from both sides - Different days within a day: full labels for each
The data seed now detects stale system org views (e.g., viewType changed from 'issues' to 'stacks') and re-seeds them. Also bumps PredefinedSavedViewsVersion to 4 so user orgs re-upsert.
ca971b0 to
e8dc1b8
Compare
The string and number faceted filters now apply automatically after the user stops typing for 500ms, without needing to press Enter or close the popover. Enter still applies immediately, Escape cancels.
eea0cf4 to
b68a7b9
Compare
The keyword filter was a separate component that was missed when adding debounce to string and number filters.
Prevents the filter from being removed when the user backspaces to clear the input. Clearing requires an explicit action (Enter or the clear button).
- Add isInternalFilterUpdate flag to skip URL watch when the change originates from user interaction (typing/clearing filters). This prevents the URL round-trip from re-deriving filters and destroying dynamically-added filters (e.g. keyword with empty value). - Normalize empty strings to undefined in keyword and string filter debounce callbacks. For StringFilter this prevents producing invalid filter expressions like 'message:' (empty value). For KeywordFilter this ensures consistent undefined state. - Remove stale empty-value guard from number filter debounce that prevented auto-apply when value is cleared. - Only set the skip flag when the URL will actually change to avoid stale flags when the computed filter matches the current URL.
- Rename Issues icon import to Stacks across page components - Rename totalIssues/newIssues to totalStacks/newStacks - Rename issueSearchQuery/issueMatches to stackSearchQuery/stackMatches in navigation command - Update validation messages from 'issue id' to 'stack id' - Update IssueDetails/IssueDetailSheet references to Stack equivalents
Contributor
There was a problem hiding this comment.
Pull request overview
This PR renames the “Issues” dashboard concept to “Stacks” across the Svelte frontend and the saved-view model layer, aligning UI/routes with the backend /api/v2/stacks terminology and updating predefined saved views accordingly.
Changes:
- Renamed frontend routes, navigation, labels, and keyboard shortcuts from
/issuesto/stacks. - Updated saved view
ViewTypevalidation and predefined saved view definitions fromissuestostacks, including related backend/frontend tests. - Added/adjusted some shared UI behavior (debounced faceted-filter inputs, improved date-range labels, and filter/URL sync guard logic in dashboards).
Reviewed changes
Copilot reviewed 45 out of 45 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Exceptionless.Tests/Serializer/Models/SavedViewSerializerTests.cs | Updates saved view serialization test to expect view_type: stacks. |
| tests/Exceptionless.Tests/Mapping/SavedViewMapperTests.cs | Updates mapper tests to use ViewType = stacks. |
| tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs | Updates controller tests for predefined views + valid view types to use stacks. |
| src/Exceptionless.Web/Models/SavedView/NewSavedView.cs | Changes allowed view types/column ids from issues to stacks. |
| src/Exceptionless.Web/Controllers/SavedViewController.cs | Bumps predefined views version and updates docs string to mention stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte | Changes default post-login redirect to /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/stacks/+page.svelte | Updates stacks dashboard route/hrefs + internal URL/filter synchronization logic. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/stacks/[stackId=objectid]/+page.svelte | Renames stack detail page UI/imports from Issue* to Stack*. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/stacks/[slug=savedview]/+page.svelte | Adds saved-view slug route shim for stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts | Updates main nav item from Issues→Stacks (icon, href, shortcut). |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/stacks/+page.svelte | Renames project settings page text/links to stacks management. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/stacks/[stackId]/+page.svelte | Renames headings/error strings to Stack Details and updates back-link. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/routes.svelte.ts | Updates project settings nav to Stack Management and /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/manage/+page.svelte | Renames “Go To Issues” button to “Go To Stacks” + route/icon. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/payment/[id]/+page@.svelte | Updates fallback redirects to /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/manage/+page.svelte | Renames “Go To Issues” to “Go To Stacks” + route/icon. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/[slug=savedview]/+page.svelte | Removes the old issues saved-view slug shim route. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/events/+page.svelte | Updates dashboard stats naming to stacks + adds internal URL/filter sync guard. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte | Changes app root redirect to /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte | Updates shortcut handler + view-to-href mapping from issues→stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/navigation-command.svelte | Renames command-palette search group from Issues→Stacks + hrefs/query keys. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar-organization-switcher.svelte | Updates impersonation navigation target to /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte | Updates logo/home link to /stacks. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/keyboard-shortcuts-dialog.svelte | Renames shortcut label to “Go to Stacks”. |
| src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/options.svelte.ts | Updates persisted column visibility key from issues→stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-details.svelte | Renames “issue has no events” copy to “stack has no events”. |
| src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-detail-sheet.svelte | Renames sheet title/aria text + href + component import to Stack*. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/url.test.ts | Updates redirect sanitization tests to reference /app/stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/keyboard-shortcuts.ts | Renames issues shortcut entry to stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/dates.ts | Adjusts date label formatting rules and adds date-range formatting helper. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/formatters/date-math.svelte | Uses new formatDateRangeLabel for time-range expressions. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-string.svelte | Adds debounced apply behavior for string filter inputs. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-number.svelte | Adds debounced apply behavior for numeric filter inputs. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-keyword.svelte | Adds debounced apply behavior for keyword filter inputs. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/use-saved-views.test.ts | Updates saved views cache tests from issues to stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/slugs.ts | Updates saved-view slug routing base from /issues to /stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/save-view-dialog.svelte | Updates reserved-slug error message to mention stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/rename-view-dialog.svelte | Updates reserved-slug error message to mention stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/project-actions-cell.svelte | Updates project actions menu navigation target to /stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/notifications/impersonation-notification.svelte | Updates “stop impersonating” navigation to /stacks. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-stats-dashboard.svelte | Renames metrics/props from issues→stacks in UI + tooltip copy. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-dashboard-chart.svelte | Renames chart label from Issues→Stacks for the stacks series. |
| src/Exceptionless.Core/Seed/PredefinedSavedViewsDataSeed.cs | Updates predefined saved view seeding logic and supports viewType rename. |
| src/Exceptionless.Core/Seed/predefined-saved-views.json | Renames predefined saved view keys/viewType values from issues→stacks. |
| src/Exceptionless.Core/Models/SavedView.cs | Updates ViewType regex/docs to accept stacks instead of issues. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Add legacy key fallback in PredefinedSavedViewsDataSeed for issues:* -> stacks:* migration - Update PredefinedKey in ApplyDefinition so existing views get the new key - Rename Bug icon import to Stacks in navigation-command - Fix project-actions-cell: rename Issues icon/label to Stacks - Add onDestroy cleanup for debounce timers in faceted-filter components - Move startLabel/endLabel computation after rangeExceedsDay check in dates.ts - Rename issuesFilter -> stacksFilter in SavedViewControllerTests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Renames "Issues" to "Stacks" throughout the frontend UI and backend saved view type, aligning with the backend API terminology (
/api/v2/stacks) and the legacy Angular app.Route changes
/(app)/issues→/(app)/stacks/(app)/issues/[stackId=objectid]→/(app)/stacks/[stackId=objectid]/(app)/issues/[slug=savedview]→/(app)/stacks/[slug=savedview]/(app)/project/[projectId]/issues→/(app)/project/[projectId]/stacks/(app)/project/[projectId]/issues/[stackId]→/(app)/project/[projectId]/stacks/[stackId]Component renames
issue-detail-sheet.svelte→stack-detail-sheet.svelteissue-details.svelte→stack-details.svelteSaved view type:
issues→stacksViewTypevalidation regex updated:^(events|stacks|stream)$ValidViewTypesarray andValidColumnIdsdictionary keys updatedviewTypevalues updatedVIEWconstant andviewToHrefmapping updatedUI label changes
layersicon (wasbug)Why
"Issues" doesn't work for all event types (404s, feature usage, etc.). The backend API uses
/api/v2/stacksand the legacy Angular app used "Stacks" — this aligns the new frontend and saved view data model.Breaking changes
/issuesto/stacksview_typevalue changed fromissuestostacks— existing saved views withview_type: 'issues'will need to be re-seeded (index reset planned)