Polish saved view routes and issue details#2249
Merged
Merged
Conversation
5ecb1ec to
28c2dff
Compare
28c2dff to
819737a
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
This PR refactors saved-view routing to use human-friendly slugs, moves the events dashboard to /events, and adds issue detail deep links via /issues/{id} with a shared slideout/full-page details body.
Changes:
- Introduces saved-view slugs (client/server validation, duplicate detection) and updates navigation to link to
/events/{slug}and/issues/{slug}. - Moves the events dashboard route to
/eventsand updates event-detail routes to use anobjectidmatcher. - Adds issue details routing (
/issues/{stackId}) and a reusable Issue Details slideout/page body.
Reviewed changes
Copilot reviewed 54 out of 56 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs | Adds controller tests for slug validation and duplicate name/slug conflict handling; updates fixtures to include slugs. |
| src/Exceptionless.Web/Models/SavedView/ViewSavedView.cs | Adds Slug to the saved-view API response model. |
| src/Exceptionless.Web/Models/SavedView/UpdateSavedView.cs | Adds optional Slug with max length + regex validation. |
| src/Exceptionless.Web/Models/SavedView/NewSavedView.cs | Adds optional Slug with max length + regex validation for create requests. |
| src/Exceptionless.Web/Controllers/SavedViewController.cs | Normalizes/validates slugs, checks for duplicates, and ensures slug is populated in responses/updates. |
| src/Exceptionless.Web/ClientApp/src/routes/(auth)/login/+page.svelte | Updates default post-login redirect to issues. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/stream/+page.svelte | Updates event detail links to new /events/[eventId=objectid] route and table state access. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/sessions/+page.svelte | Updates event detail links to new /events/[eventId=objectid] route. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts | Points event navigation grouping at the new events route module and updates Events dashboard href. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/redirect-to-events.svelte.ts | Updates redirects and cache key base path to /events. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/payment/[id]/+page@.svelte | Redirects invalid payment access back to issues instead of the old root dashboard. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/+page.svelte | Switches issue list to deep-link to /issues/{stackId} and uses Issue Details sheet; updates saved-view slug handling and query override behavior. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/[stackId=objectid]/+page.svelte | Replaces “latest event in issue” logic with shared IssueDetails component. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/[slug=savedview]/+page.svelte | Adds saved-view slug route shim that reuses the issues page component. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/events/routes.svelte.ts | Updates event details navigation href to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/events/+page.svelte | Introduces the new /events dashboard page (moved from (app)/+page.svelte) with saved-view slug support. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/events/[slug=savedview]/+page.svelte | Adds saved-view slug route shim that reuses the events page component. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/events/[eventId=objectid]/+page.svelte | Updates fallback navigation back to /events. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte | Replaces old events dashboard at root with a redirect to issues. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte | Updates navigation defaults/shortcuts, saved-view href building to slug-based URLs, and filters deleted views from sidebar. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/navigation-command.svelte | Updates event/issue deep links and event search base route to /events. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar.svelte | Adjusts active-path detection and collapsible rendering for saved-view groups. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar-organization-switcher.svelte | Redirects organization impersonation flows back to issues. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte | Updates logo/home link target to issues. |
| src/Exceptionless.Web/ClientApp/src/params/savedview.ts | Adds a SvelteKit route matcher for saved-view slugs (excludes 24-hex ObjectIds). |
| src/Exceptionless.Web/ClientApp/src/params/objectid.ts | Adds a SvelteKit route matcher for 24-hex ObjectId route params. |
| src/Exceptionless.Web/ClientApp/src/lib/generated/schemas.ts | Updates generated validation schemas to include slug on saved-view models. |
| src/Exceptionless.Web/ClientApp/src/lib/generated/api.ts | Updates generated API types to include slug on saved-view models. |
| src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-details.svelte | Introduces shared Issue Details body used for slideout + full-page routes. |
| src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-detail-sheet.svelte | Adds Issue Details sheet component with deep-link “open in new window”. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/use-saved-views.test.ts | Updates saved-view helpers/tests and adds coverage for cache eviction on delete. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/use-saved-views.svelte.ts | Refactors saved-view state handling to support slug routes and query-param overrides. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/slugs.ts | Adds centralized slug utilities + href building for saved views. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte | Updates picker to pass whole view objects, adds dirty indicator dot, and improves optimistic delete behavior. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/save-view-dialog.svelte | Adds slug input + client-side validation and duplicate checks when saving. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/rename-view-dialog.svelte | Adds slug input + client-side validation and duplicate checks when renaming. |
| src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/api.svelte.ts | Adds optimistic delete tracking (deletedSavedViewIds) and broader cache eviction for deleted views. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/notifications/impersonation-notification.svelte | Updates stop-impersonating redirect target to issues. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/views/session-events.svelte | Updates event links and base events path to /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-simple-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-session-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-not-found-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-log-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-feature-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/stack-error-summary.svelte | Updates stack-to-events links to use /events. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-simple-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-session-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-not-found-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-log-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-feature-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/summary/event-error-summary.svelte | Updates event detail link to /events/[eventId=objectid]. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/log-level.svelte | Adjusts badge sizing/alignment for log levels. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte | Updates deep-link href to /events/[eventId=objectid]. |
| src/Exceptionless.Core/Models/SavedView.cs | Adds required Slug to the persisted SavedView model with validation attributes. |
Comments suppressed due to low confidence (1)
src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/use-saved-views.svelte.ts:184
- isModified currently returns false unless options.slug is present. That means pages that load saved views via
queryParams.saved(e.g. stream) will never show the dirty/modified state even when the current UI differs from the active saved view. Consider keying this check off the presence of an activeSavedView (or slug || queryParams.saved) instead of only slug.
return false;
}
if ((options.getFilter?.() ?? options.queryParams.filter ?? null) !== (view.filter ?? null)) {
return true;
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
819737a to
55f68a6
Compare
55f68a6 to
d2eb807
Compare
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.
Polishes the Svelte dashboard saved-view experience and adds issue detail routing/deep links.
Summary:
/events, redirect/nextto issues, and use route matchers to separate ObjectId detail routes from saved-view slug routes.Issue Detailsslideout and deep link to/issues/{id}, reusing the same detail body for the full page.Validation:
npm run checknpm run test:unit -- src/lib/features/saved-views/use-saved-views.test.tsdotnet test tests/Exceptionless.Tests/Exceptionless.Tests.csproj --artifacts-path artifacts/copilot-saved-view-test -- --filter-class Exceptionless.Tests.Controllers.SavedViewControllerTestshttps://web-ex.dev.localhost:7131/nextfor saved-view slugs, delete/dirty behavior, and issue detail slideout/full-page routes.Breaking changes: none intended.