Skip to content

Polish saved view routes and issue details#2249

Merged
ejsmith merged 1 commit into
mainfrom
polish-saved-view-issue-details
May 21, 2026
Merged

Polish saved view routes and issue details#2249
ejsmith merged 1 commit into
mainfrom
polish-saved-view-issue-details

Conversation

@ejsmith
Copy link
Copy Markdown
Member

@ejsmith ejsmith commented May 21, 2026

Polishes the Svelte dashboard saved-view experience and adds issue detail routing/deep links.

Summary:

  • Move the events dashboard to /events, redirect /next to issues, and use route matchers to separate ObjectId detail routes from saved-view slug routes.
  • Add saved-view URL names with client/server validation, duplicate checks, and cache-safe save/rename/delete behavior.
  • Add issue-specific details UI: issues now open an Issue Details slideout and deep link to /issues/{id}, reusing the same detail body for the full page.
  • Fix saved-view dirty state, sidebar saved-view navigation, level badge sizing, and route/query-param handling.

Validation:

  • npm run check
  • npm run test:unit -- src/lib/features/saved-views/use-saved-views.test.ts
  • dotnet test tests/Exceptionless.Tests/Exceptionless.Tests.csproj --artifacts-path artifacts/copilot-saved-view-test -- --filter-class Exceptionless.Tests.Controllers.SavedViewControllerTests
  • Browser QA against https://web-ex.dev.localhost:7131/next for saved-view slugs, delete/dirty behavior, and issue detail slideout/full-page routes.

Breaking changes: none intended.

@ejsmith ejsmith force-pushed the polish-saved-view-issue-details branch from 5ecb1ec to 28c2dff Compare May 21, 2026 19:52
@ejsmith ejsmith requested a review from Copilot May 21, 2026 19:53
@ejsmith ejsmith force-pushed the polish-saved-view-issue-details branch from 28c2dff to 819737a Compare May 21, 2026 19:58
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 /events and updates event-detail routes to use an objectid matcher.
  • 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.

Comment thread src/Exceptionless.Web/Controllers/SavedViewController.cs
@ejsmith ejsmith force-pushed the polish-saved-view-issue-details branch from 819737a to 55f68a6 Compare May 21, 2026 21:18
@ejsmith ejsmith force-pushed the polish-saved-view-issue-details branch from 55f68a6 to d2eb807 Compare May 21, 2026 21:31
@github-actions
Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.Web 60% 47% 3982
Exceptionless.AppHost 18% 9% 82
Exceptionless.Insulation 25% 23% 203
Exceptionless.Core 67% 61% 7741
Summary 63% (12868 / 20491) 55% (6394 / 11546) 12008

@ejsmith ejsmith merged commit 52f0baf into main May 21, 2026
9 checks passed
@ejsmith ejsmith deleted the polish-saved-view-issue-details branch May 21, 2026 21:40
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.

2 participants