Skip to content

Next: Sessions Dashboard#2106

Open
niemyjski wants to merge 12 commits intomainfrom
feature/next-sessions
Open

Next: Sessions Dashboard#2106
niemyjski wants to merge 12 commits intomainfrom
feature/next-sessions

Conversation

@niemyjski
Copy link
Member

No description provided.

@niemyjski niemyjski self-assigned this Feb 8, 2026
@niemyjski niemyjski force-pushed the feature/next-sessions branch 3 times, most recently from a94c669 to 7d29e7f Compare February 14, 2026 18:16
@github-actions
Copy link

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.Insulation 24% 23% 206
Exceptionless.Core 66% 59% 7446
Exceptionless.AppHost 25% 14% 55
Exceptionless.Web 55% 42% 3489
Summary 61% (11867 / 19535) 53% (5656 / 10704) 11196

@niemyjski niemyjski force-pushed the feature/next-sessions branch from 644fbe3 to c921b7c Compare February 17, 2026 03:20
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.
@niemyjski niemyjski force-pushed the feature/next-sessions branch from c921b7c to 3d69d39 Compare March 17, 2026 00:33
Copilot AI review requested due to automatic review settings March 17, 2026 00:33
Copy link
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

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)/sessions page 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)))]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

2 participants