From 640a9cfb3e13c45426dd85370a17e9746edb2a54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 31 May 2026 23:57:34 +0000 Subject: [PATCH 1/2] Initial plan From d05b347aa564aae53aec5e64904cec8a5dd66e8e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Jun 2026 00:25:36 +0000 Subject: [PATCH 2/2] Enable stack and session duration column sorting Co-authored-by: niemyjski <1020579+niemyjski@users.noreply.github.com> --- .../components/table/options.svelte.test.ts | 23 +++++++++++++++++++ .../events/components/table/options.svelte.ts | 3 --- .../components/session-table-columns.test.ts | 12 ++++++++++ .../components/session-table-columns.ts | 1 - 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.test.ts create mode 100644 src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.test.ts diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.test.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.test.ts new file mode 100644 index 0000000000..4012c1e266 --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.test.ts @@ -0,0 +1,23 @@ +import type { EventSummaryModel, StackSummaryModel, SummaryTemplateKeys } from '$features/events/components/summary'; + +import { describe, expect, it } from 'vitest'; + +import { getColumns } from './options.svelte'; + +describe('getColumns', () => { + it('keeps stack events, first, and last columns sortable', () => { + const result = getColumns>('stack_frequent'); + const columnsById = Object.fromEntries(result.map((column) => [column.id, column])); + + expect(columnsById.events?.enableSorting).toBeUndefined(); + expect(columnsById.first?.enableSorting).toBeUndefined(); + expect(columnsById.last?.enableSorting).toBeUndefined(); + }); + + it('keeps summary message column unsortable', () => { + const result = getColumns>('summary'); + const columnsById = Object.fromEntries(result.map((column) => [column.id, column])); + + expect(columnsById.message?.enableSorting).toBe(false); + }); +}); diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.ts index ef0726d78d..ba0641f5c8 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.ts @@ -154,7 +154,6 @@ export function getColumns>('total'), cell: (prop) => renderComponent(NumberFormatter, { value: prop.getValue() }), - enableSorting: false, header: 'Events', id: 'events', meta: { @@ -164,7 +163,6 @@ export function getColumns>('first_occurrence'), cell: (prop) => renderComponent(TimeAgo, { value: prop.getValue() }), - enableSorting: false, header: 'First', id: 'first', meta: { @@ -174,7 +172,6 @@ export function getColumns>('last_occurrence'), cell: (prop) => renderComponent(TimeAgo, { value: prop.getValue() }), - enableSorting: false, header: 'Last', id: 'last', meta: { diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.test.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.test.ts new file mode 100644 index 0000000000..a30e4dbbea --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, it } from 'vitest'; + +import { getSessionColumns } from './session-table-columns'; + +describe('getSessionColumns', () => { + it('keeps duration column sortable', () => { + const result = getSessionColumns(); + const columnsById = Object.fromEntries(result.map((column) => [column.id, column])); + + expect(columnsById.duration?.enableSorting).toBeUndefined(); + }); +}); diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.ts index cc3e1cd8d9..a5129eaf1a 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.ts +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/sessions/components/session-table-columns.ts @@ -40,7 +40,6 @@ export function getSessionColumns(): ColumnDef renderComponent(SessionDurationCell, { summary: prop.row.original }), - enableSorting: false, header: 'Duration', id: 'duration', meta: {