Conversation
a94c669 to
7d29e7f
Compare
644fbe3 to
c921b7c
Compare
Updates the Exceptionless.DateTimeExtensions package to version 5.0.0. Adds missing words to cSpell configuration. Improves date-time parsing by enforcing lowercase units, aligning with backend validation. Adjusts UI element dimensions for better responsiveness.
Refactors UI elements to use consistent width classes. Updates skeleton heights for a more uniform look during loading states. Removes unused import. Moves session duration function to a more appropriate location.
c921b7c to
3d69d39
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a new Sessions reporting experience to the Svelte app (including a sessions list page, stats tiles, and a mini chart), refactors some event/session utilities, and includes a set of UI/style tweaks plus stricter date-math validation tests.
Changes:
- Add a new
/(app)/sessionspage with filtering, a “View Active” toggle, stats + chart, and event-details sheet. - Introduce sessions-related client API/query helpers and event utilities (session id + duration), and add a “Session Events” tab in the event details UI.
- Update date-math parsing to enforce case-sensitive Elastic units (notably rejecting
D) and adjust various UI classes/components.
Reviewed changes
Copilot reviewed 44 out of 44 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Exceptionless.Web/Exceptionless.Web.csproj | Adds package references (currently duplicates Scalar.AspNetCore versions). |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/sessions/+page.svelte | New Sessions report page (table + stats + chart + event sheet). |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts | Adds Sessions nav item under a new “Reports” group. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/usage/+page.svelte | Updates skeleton/chart sizing classes. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/usage/+page.svelte | Updates skeleton sizing classes. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/account/appearance/(components)/theme-preview.svelte | Updates preview sizing classes. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte | Hardens impersonation-org detection when user/org data is missing. |
| src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar.svelte | Adds sidebar rendering for “Reports” grouped routes. |
| src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/table/options.svelte.ts | Updates column width classes. |
| src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/dialogs/remove-webhook-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/users/components/table/options.svelte.ts | Updates column width classes. |
| src/Exceptionless.Web/ClientApp/src/lib/features/users/components/dialogs/remove-user-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/tokens/components/table/options.svelte.ts | Updates column width classes. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/utils/datemath.ts | Makes date-math regex case-sensitive; updates operation regex flags. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/utils/datemath.test.ts | Adds tests enforcing lowercase d (reject uppercase D). |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/tooltip/tooltip-content.svelte | Changes tooltip arrow color class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/separator/separator.svelte | Adjusts vertical separator sizing (min-h-full). |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/select/select-group.svelte | Binds ref on select group component. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/pagination/index.ts | Re-indents exports (no functional change intended). |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/field/field-error.svelte | Treats empty errors array as “no errors”. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/calendar/calendar-year-select.svelte | Adds dark-mode classes to hidden select overlay. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/ui/calendar/calendar-month-select.svelte | Adds dark-mode classes to hidden select overlay. |
| src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-multi-select.svelte | Uses size-* utilities for checkbox + icon sizing. |
| src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/sessions-stats-dashboard.svelte | New stats cards (sessions, users, avg duration, sessions/hour). |
| src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/sessions-dashboard-chart.svelte | New compact area chart with brush range selection. |
| src/Exceptionless.Web/ClientApp/src/lib/features/sessions/api.svelte.ts | New sessions API/query helpers (org count + session events). |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/options.svelte.ts | Updates column width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/project-log-level.svelte | Moves log-level helpers to new utils; updates skeleton sizing class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/reset-project-data-dialog.svelte | Updates truncation max-width class + wraps description text. |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-config-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/hooks/use-premium-feature.svelte.ts | New hook intended to enqueue a premium-feature notification (context-based). |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/organization-notifications.svelte | Adds premium feature name plumb-through to premium upgrade notification props. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/notifications/premium-upgrade-notification.svelte | Makes premium upgrade copy use a feature name instead of hard-coded “search”. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/remove-organization-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/leave-organization-dialog.svelte | Updates truncation max-width class. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/utils/index.ts | New shared event utils (log level normalization + session id/duration helpers). |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/models/event-data.ts | Removes log-level helpers that were moved to utils. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/views/session-events.svelte | New “Session Events” tab content (session summary + related events table). |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/views/overview.svelte | Uses new shared session-duration helper (removes local implementation). |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/log-level.svelte | Updates import to use new log level helper location. |
| src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte | Adds “Session Events” tab and renders SessionEvents view when available. |
| src/Exceptionless.Web/ClientApp/package.json | Renames/extends update scripts (ncu/shadcn/skills). |
| .vscode/settings.json | Adds cSpell words. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
23
to
+25
| <PackageReference Include="Scalar.AspNetCore" Version="2.13.9" /> | ||
| <PackageReference Include="Scalar.AspNetCore" Version="2.12.41" /> | ||
| <PackageReference Include="Scalar.AspNetCore" Version="2.12.40" /> |
Comment on lines
+72
to
+76
| <Live live={!event.data?.sessionend} liveTitle="Online" notLiveTitle="Ended" /> | ||
| <Duration value={getSessionStartDuration(event)} /> | ||
| {#if event.data?.sessionend} | ||
| (ended <TimeAgo value={event.data.sessionend} />) | ||
| {/if} |
Comment on lines
176
to
+178
| <TraceLog logs={eventQuery.data.data?.['@trace']}></TraceLog> | ||
| {:else if tab === 'Session Events'} | ||
| <SessionEvents event={eventQuery.data}></SessionEvents> |
Comment on lines
+1
to
+43
| import { getContext, onDestroy } from 'svelte'; | ||
|
|
||
| const NOTIFICATION_CONTEXT_KEY = 'organizationNotifications'; | ||
|
|
||
| interface Notification { | ||
| feature: string; | ||
| id: number; | ||
| message: string; | ||
| timestamp: number; | ||
| type: 'premium-feature'; | ||
| } | ||
|
|
||
| /** | ||
| * Triggers a premium feature notification for the current organization. | ||
| * @param featureName Feature name to display in the notification. | ||
| */ | ||
| export function usePremiumFeature(featureName?: string) { | ||
| const notifications = getContext(NOTIFICATION_CONTEXT_KEY) as undefined | { update: (fn: (n: Notification[]) => Notification[]) => void }; | ||
| let notificationId: null | number = null; | ||
|
|
||
| if (notifications && featureName) { | ||
| const id = Date.now() + Math.floor(Math.random() * 10000); | ||
| notificationId = id; | ||
| notifications.update((n: Notification[]) => [ | ||
| ...n, | ||
| { | ||
| feature: featureName, | ||
| id, | ||
| message: `The feature "${featureName}" is available on premium plans.`, | ||
| timestamp: Date.now(), | ||
| type: 'premium-feature' | ||
| } | ||
| ]); | ||
| } | ||
|
|
||
| onDestroy(() => { | ||
| if (!notifications || notificationId == null) { | ||
| return; | ||
| } | ||
|
|
||
| notifications.update((n: Notification[]) => n.filter((notification: Notification) => notification.id !== notificationId)); | ||
| notificationId = null; | ||
| }); |
| {data} | ||
| x="date" | ||
| xScale={scaleUtc()} | ||
| yDomain={[0, Math.max(1, Math.max(...data.map((d) => d.sessions)))]} |
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.
No description provided.