Skip to content

feat: add stacks dashboard page#2239

Merged
niemyjski merged 46 commits into
mainfrom
niemyjski/feature-stacks-dashboard
May 18, 2026
Merged

feat: add stacks dashboard page#2239
niemyjski merged 46 commits into
mainfrom
niemyjski/feature-stacks-dashboard

Conversation

@niemyjski
Copy link
Copy Markdown
Member

@niemyjski niemyjski commented May 16, 2026

Why

The legacy Angular UI has separate views for different stack statuses (fixed, regressed, snoozed, ignored, discarded), but discarded stacks disappear after the retention period -- making them unrecoverable. Users need a unified view to manage all stacks regardless of retention.

Approach

Added a new /stacks route in the Svelte 5 app that follows the exact same patterns as the issues and sessions pages:

  • Data fetching: useFetchClient() with client.getJSON<Stack[]>() -- no custom query wrappers
  • Table: createTable(getSharedTableOptions<Stack>(...)) with offset pagination
  • Components: StacksDataTable wrapper (mirrors EventsDataTable), proper column definitions using NumberFormatter, TimeAgo, and custom cell components for status badges and tags
  • Filtering: Reuses the existing FacetedFilter system with OrganizationDefaultsFacetedFilterBuilder -- supports status, project, date, and custom Lucene filters
  • Bulk actions: Uses the existing TableStacksBulkActionsDropdownMenu component (not a duplicate)
  • Real-time: Listens for StackChanged WebSocket events to update/refresh the table
  • Navigation: Placed in "Reports" group alongside Sessions

Additional fixes included

  • Clear persisted organization ID when an account has zero organizations
  • Re-select first valid organization when persisted ID is stale/deleted
  • Hide Manage organization / Billing links when no valid current organization exists
  • Prevent organization settings layout from redirecting to /organization/undefined

Key files

  • src/.../routes/(app)/stacks/+page.svelte -- main page (rewritten from scratch)
  • src/.../stacks/components/table/options.svelte.ts -- column definitions
  • src/.../stacks/components/table/stacks-data-table.svelte -- table wrapper
  • src/.../stacks/components/table/stack-status-cell.svelte -- status badge cell
  • src/.../stacks/components/table/stack-tags-cell.svelte -- tags cell
  • src/.../routes/(app)/+layout.svelte -- organization selection reconciliation
  • src/.../routes/(app)/(components)/layouts/sidebar-user.svelte -- hide org-only links when invalid
  • src/.../routes/(app)/organization/[organizationId]/+layout.svelte -- guard invalid redirect

Cleanup

  • Deleted stacks-bulk-actions-button.svelte (was a broken duplicate of the existing dropdown menu)
  • Removed getStacksQuery() and the non-standard list query key from api.svelte.ts
  • Moved nav item from "Dashboards" to "Reports" group

niemyjski and others added 5 commits May 15, 2026 22:35
- Add getStacksQuery function for listing stacks with filtering
- Create /stacks route with basic stacks list page
- Support filtering by status, tags, date ranges, and custom Lucene expressions
- Display stack information: title, tags, event count, first/last occurrence, status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove complex TanStack table setup that was causing build errors
- Use semantic HTML table with Tailwind styling for simplicity
- Implement row selection with checkboxes and bulk actions UI
- Support filter input, limit selector, and pagination controls
- Display stack properties: title, tags, event count, last occurrence, status
- Add loading and empty state handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Create StacksBulkActionsButton component for simplified bulk operations
- Support mark open/fixed/snoozed/ignored/discarded and delete actions
- Integrate with RemoveStackDialog and status change dialogs
- Wire bulk actions into stacks page with selection tracking
- All dialogs and confirmations included

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add stacks navigation item to Dashboards group
- Use layers icon for visual consistency
- Place between issues and event stream
- Accessible from sidebar navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add filter query examples (status:discarded, tags:production, type:error)
- Add bulk operation examples (change status, mark fixed, mark snoozed, delete)
- Document filtering syntax for stacks dashboard feature
- Help users understand query capabilities

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@niemyjski niemyjski marked this pull request as ready for review May 16, 2026 11:14
- Rewrote stacks page using useFetchClient, createTable,
  getSharedTableOptions, and DataTable components matching the
  issues/sessions page patterns
- Created proper table column definitions with NumberFormatter,
  TimeAgo, and badge components for status/tags
- Created StacksDataTable component mirroring EventsDataTable
- Uses existing TableStacksBulkActionsDropdownMenu (deleted the
  duplicate stacks-bulk-actions-button.svelte)
- Moved navigation from Dashboards to Reports group
- Removed broken getStacksQuery and list query key from api.svelte.ts
- Uses FacetedFilter system for filtering (status, project, date, etc.)
- WebSocket StackChanged event handling for real-time updates
- Offset-based pagination with page size selector
- Fixed organization abbreviation (never use org)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@niemyjski niemyjski changed the title feat: Add stacks dashboard with filtering and bulk operations feat: add stacks dashboard page May 16, 2026
niemyjski and others added 16 commits May 16, 2026 06:43
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Clear persisted organization id when no organizations remain
- Re-select first valid organization when persisted id is stale
- Hide manage/billing links when current organization is invalid
- Prevent organization settings layout from redirecting to undefined ids

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Keep impersonated organization selections from being overwritten by org sync
- Refresh stacks table on non-removed StackChanged events with throttling
- Correct stacks HTTP samples to match ids path-segment routes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add getStacksQuery function for listing stacks with filtering
- Create /stacks route with basic stacks list page
- Support filtering by status, tags, date ranges, and custom Lucene expressions
- Display stack information: title, tags, event count, first/last occurrence, status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove complex TanStack table setup that was causing build errors
- Use semantic HTML table with Tailwind styling for simplicity
- Implement row selection with checkboxes and bulk actions UI
- Support filter input, limit selector, and pagination controls
- Display stack properties: title, tags, event count, last occurrence, status
- Add loading and empty state handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Create StacksBulkActionsButton component for simplified bulk operations
- Support mark open/fixed/snoozed/ignored/discarded and delete actions
- Integrate with RemoveStackDialog and status change dialogs
- Wire bulk actions into stacks page with selection tracking
- All dialogs and confirmations included

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add stacks navigation item to Dashboards group
- Use layers icon for visual consistency
- Place between issues and event stream
- Accessible from sidebar navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add filter query examples (status:discarded, tags:production, type:error)
- Add bulk operation examples (change status, mark fixed, mark snoozed, delete)
- Document filtering syntax for stacks dashboard feature
- Help users understand query capabilities

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Rewrote stacks page using useFetchClient, createTable,
  getSharedTableOptions, and DataTable components matching the
  issues/sessions page patterns
- Created proper table column definitions with NumberFormatter,
  TimeAgo, and badge components for status/tags
- Created StacksDataTable component mirroring EventsDataTable
- Uses existing TableStacksBulkActionsDropdownMenu (deleted the
  duplicate stacks-bulk-actions-button.svelte)
- Moved navigation from Dashboards to Reports group
- Removed broken getStacksQuery and list query key from api.svelte.ts
- Uses FacetedFilter system for filtering (status, project, date, etc.)
- WebSocket StackChanged event handling for real-time updates
- Offset-based pagination with page size selector
- Fixed organization abbreviation (never use org)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Clear persisted organization id when no organizations remain
- Re-select first valid organization when persisted id is stale
- Hide manage/billing links when current organization is invalid
- Prevent organization settings layout from redirecting to undefined ids

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Keep impersonated organization selections from being overwritten by org sync
- Refresh stacks table on non-removed StackChanged events with throttling
- Correct stacks HTTP samples to match ids path-segment routes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…cks-dashboard

# Conflicts:
#	src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte
#	src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/+layout.svelte
#	src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/+layout.svelte
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…rd' into niemyjski/feature-stacks-dashboard

# Conflicts:
#	src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/options.svelte.ts
#	src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-status-cell.svelte
#	src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-tags-cell.svelte
#	src/Exceptionless.Web/ClientApp/src/routes/(app)/stacks/+page.svelte
Comment thread src/Exceptionless.Web/Startup.cs Fixed
Comment thread src/Exceptionless.Web/Startup.cs Fixed
niemyjski and others added 5 commits May 17, 2026 20:43
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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

Adds a new Svelte-based Stacks dashboard (and project-scoped issue management views) to provide a unified way to browse/manage stacks across statuses (including discarded), while also reworking saved-views availability and several navigation/layout behaviors.

Changes:

  • Introduces new /(app)/stacks page (plus project-scoped issue management pages) using the shared faceted-filter + TanStack table patterns and StackChanged real-time refresh.
  • Expands saved views to support the new stacks view type (including server-side validation updates) and updates saved view UI error handling.
  • Updates sidebar/navigation + table pagination/body behaviors, and adds stack-event paging support in event detail views.

Reviewed changes

Copilot reviewed 46 out of 46 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
tests/http/stacks.http Adds more stack API examples (filters + bulk ops).
tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs Adds tests for stacks saved views + adjusts feature-disabled expectations.
tests/Exceptionless.Tests/Controllers/Data/openapi.json Updates OpenAPI description for viewType values.
src/Exceptionless.Web/Startup.cs Serves optional /next static build and normalizes fallback paths.
src/Exceptionless.Web/Models/SavedView/NewSavedView.cs Allows stacks view type + validates stacks column IDs.
src/Exceptionless.Web/Controllers/SavedViewController.cs Removes saved-views feature gating on write operations.
src/Exceptionless.Web/ClientApp/src/routes/(app)/stream/+page.svelte Always renders SavedViewPicker in stream header.
src/Exceptionless.Web/ClientApp/src/routes/(app)/stacks/+page.svelte New organization-scoped stacks dashboard page.
src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts Adjusts nav grouping (Sessions).
src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/routes.svelte.ts Adds “Issue Management” project settings nav item.
src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/manage/+page.svelte Updates “Go To Issues” to project issue management route.
src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/issues/+page.svelte New project-scoped issue management list/table.
src/Exceptionless.Web/ClientApp/src/routes/(app)/project/[projectId]/issues/[stackId]/+page.svelte New project-scoped issue detail page (event overview/stack card).
src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/routes.svelte.ts Updates Organizations nav icon.
src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/routes.svelte.ts Reworks org routes + show conditions (and duplicates groups).
src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/features/+page.svelte Uses centralized org feature definitions list; supports “none available”.
src/Exceptionless.Web/ClientApp/src/routes/(app)/organization/[organizationId]/+layout.svelte Filters org settings routes based on show() and guards redirects.
src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/+page.svelte Updates issue list behavior + adds issue detail sheet linking.
src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/[stackId]/+page.svelte New issue detail route for org-wide issues list.
src/Exceptionless.Web/ClientApp/src/routes/(app)/event/[eventId]/+page.svelte Enables stack pager and supports event-to-event navigation.
src/Exceptionless.Web/ClientApp/src/routes/(app)/account/routes.svelte.ts Renames “Account” nav item to “General”.
src/Exceptionless.Web/ClientApp/src/routes/(app)/account/+layout.svelte Simplifies account layout (removes SplitLayout wrapper).
src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte Always renders SavedViewPicker in events dashboard header.
src/Exceptionless.Web/ClientApp/src/routes/(app)/+layout.svelte Org selection reconciliation + saved-view nav children additions + stacks href mapping.
src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar.svelte Major sidebar UX changes (collapsed flyouts, settings/project settings grouping).
src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/sidebar-user.svelte Hides org-only links when current org is invalid.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/stack-filter-support.ts New helper to enforce stacks-view supported filters.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stacks-data-table.svelte New stacks table wrapper component.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-type-badge.svelte New stack type badge rendering.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-tags-cell.svelte New tags cell (filter/copy interactions).
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-status-cell.svelte New status badge rendering.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/stack-severity-cell.svelte New “Critical” boolean/severity cell rendering.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/table/options.svelte.ts New stacks TanStack column definitions.
src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/filters/stack-faceted-filter-builder.svelte New stacks-oriented faceted filter builder.
src/Exceptionless.Web/ClientApp/src/lib/features/shared/table.svelte.ts Adjusts pageCount calculation when total is missing.
src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/data-table/data-table-pagination.svelte Makes page derived from table pagination state.
src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/data-table/data-table-body.svelte Updates click handling + adds keyboard row activation.
src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/use-saved-views.svelte.ts Removes org feature-flag gating; exposes isLoading.
src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte Adds 422 field/form error handling to save dialog.
src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/save-view-dialog.svelte Displays form/name error messages.
src/Exceptionless.Web/ClientApp/src/lib/features/organizations/organization-features.ts Adds centralized org feature definitions list (currently empty).
src/Exceptionless.Web/ClientApp/src/lib/features/events/components/filters/models.svelte.ts Changes TagFilter multi-value join operator.
src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte Adds stack pager + stack events query for prev/next.
src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte Allows overriding “open in new window” href.
src/Exceptionless.Web/ClientApp/src/lib/features/events/api.svelte.ts Fixes stack-events query key to include params.
src/Exceptionless.Core/Models/SavedView.cs Allows stacks ViewType via regex + doc update.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/http/stacks.http
Comment thread src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts
Comment thread src/Exceptionless.Web/Controllers/SavedViewController.cs
Comment thread src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/+page.svelte Outdated
niemyjski added 6 commits May 18, 2026 08:41
Reverted: Startup.cs (next build path), SavedView model/tests, organization-features
extraction, events-overview pager, saved-view 422 error handling hack,
issues page filter changes, project manage page link change.
The stacks dashboard was not ready for inclusion. Removed the route and
its sidebar link from the layout.
- Renamed stack-severity-cell to stack-critical-cell (matches column name)
- Added tooltip with Kbd for platform-agnostic shortcut hints on tags
- Made overflow tags clickable in tooltip dropdown
- Added getProjectStacksQuery tanstack wrapper in stacks API
- Moved defaultColumnVisibility and getTableOptions to options file
Replaced manual useFetchClient calls with getProjectStacksQuery and
getTableOptions from the options file. Removed unused showStackPager
and onEventChange props from stack/event detail pages.
- Removed extra blank lines in events and stream pages
- Simplified account layout margin from mx-6 my-6 to m-6
- Extracted detailsHref into a \ in event-detail-sheet
@niemyjski niemyjski requested a review from Copilot May 18, 2026 13:46
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

Copilot reviewed 46 out of 46 changed files in this pull request and generated 7 comments.

Comments suppressed due to low confidence (9)

src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts:1

  • PR description says the nav item was moved from "Dashboards" to "Reports" (alongside Sessions), but this change moves Sessions into "Dashboards". Either the description or this grouping appears incorrect—please align them so navigation matches the intended IA.
    tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs:1
  • These test names still reference the saved-views feature being disabled, but they now assert success responses. Renaming them (and updating the related inline comments) would prevent confusion about the intended behavior now that feature gating has been removed.
    tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs:1
  • These test names still reference the saved-views feature being disabled, but they now assert success responses. Renaming them (and updating the related inline comments) would prevent confusion about the intended behavior now that feature gating has been removed.
    tests/Exceptionless.Tests/Controllers/SavedViewControllerTests.cs:1
  • These test names still reference the saved-views feature being disabled, but they now assert success responses. Renaming them (and updating the related inline comments) would prevent confusion about the intended behavior now that feature gating has been removed.
    src/Exceptionless.Web/Startup.cs:1
  • The /next static-file registration is duplicated in two places, which makes future changes easy to miss and can lead to drift (e.g., differing options/headers). Consider extracting this into a small helper method (or shared configuration) invoked from both locations.
    src/Exceptionless.Web/Startup.cs:1
  • The /next static-file registration is duplicated in two places, which makes future changes easy to miss and can lead to drift (e.g., differing options/headers). Consider extracting this into a small helper method (or shared configuration) invoked from both locations.
    tests/http/stacks.http:1
  • These examples use the same {{stackId}} placeholder twice, which doesn’t actually demonstrate a multi-id call. Consider using distinct placeholders (e.g., {{stackId1}}, {{stackId2}}) and, for snoozeUntilUtc, use an unambiguous ISO-8601 UTC value to reduce confusion when copy/pasting.
    tests/http/stacks.http:1
  • These examples use the same {{stackId}} placeholder twice, which doesn’t actually demonstrate a multi-id call. Consider using distinct placeholders (e.g., {{stackId1}}, {{stackId2}}) and, for snoozeUntilUtc, use an unambiguous ISO-8601 UTC value to reduce confusion when copy/pasting.
    tests/http/stacks.http:1
  • These examples use the same {{stackId}} placeholder twice, which doesn’t actually demonstrate a multi-id call. Consider using distinct placeholders (e.g., {{stackId1}}, {{stackId2}}) and, for snoozeUntilUtc, use an unambiguous ISO-8601 UTC value to reduce confusion when copy/pasting.

@niemyjski niemyjski requested a review from Copilot May 18, 2026 13:51
Comment thread src/Exceptionless.Core/Models/SavedView.cs Outdated
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

Copilot reviewed 39 out of 39 changed files in this pull request and generated 7 comments.

Comment thread tests/http/stacks.http
Comment thread tests/http/stacks.http
Comment thread src/Exceptionless.Web/Controllers/SavedViewController.cs
Comment thread src/Exceptionless.Web/ClientApp/src/routes/(app)/routes.svelte.ts
niemyjski added 9 commits May 18, 2026 08:59
The stacks page was removed per review. These model changes adding
'stacks' as a valid ViewType are no longer needed.
- Don't intercept clicks on links/buttons in table cells (was breaking
  link navigation when rowHref not set)
- Added keyboard accessibility (Enter/Space) to table cells
- Fixed stacks.http filter: tags: → tag: (correct filter term)
- Settings group now has all the same entries as Organization Settings
  (General, Usage, Billing, Features) for navigation consistency
- Removed stale 'stacks' from SavedViewController viewType doc comment
  to match the reverted model validation
Multi-tag filter should use OR (show events with any selected tag)
not AND (require all tags). AND was an accidental breaking change.
- Move tabindex from individual cells to row level (reduces tab stops)
- Remove per-cell keydown handler, use row-level Enter/Space instead
- Fix snoozeUntilUtc to use ISO-8601 format (2030-12-31T00:00:00Z)
- Fix prettier formatting in data-table-body.svelte (multiline onkeydown)
- Remove 3 WhenFeatureDisabled tests since feature gate was removed from
  SavedViewController (saved views are now available to all orgs)
@niemyjski niemyjski merged commit 21a817c into main May 18, 2026
8 checks passed
@niemyjski niemyjski deleted the niemyjski/feature-stacks-dashboard branch May 18, 2026 17:39
@github-actions
Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.Web 60% 46% 3904
Exceptionless.AppHost 18% 9% 82
Exceptionless.Insulation 25% 23% 203
Exceptionless.Core 67% 61% 7728
Summary 63% (12753 / 20367) 55% (6318 / 11458) 11917

niemyjski added a commit that referenced this pull request May 19, 2026
* feat: Add stacks dashboard page route and API query

- Add getStacksQuery function for listing stacks with filtering
- Create /stacks route with basic stacks list page
- Support filtering by status, tags, date ranges, and custom Lucene expressions
- Display stack information: title, tags, event count, first/last occurrence, status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* build: Simplify stacks page to avoid table library issues

- Remove complex TanStack table setup that was causing build errors
- Use semantic HTML table with Tailwind styling for simplicity
- Implement row selection with checkboxes and bulk actions UI
- Support filter input, limit selector, and pagination controls
- Display stack properties: title, tags, event count, last occurrence, status
- Add loading and empty state handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: Add stacks bulk actions button with all operations

- Create StacksBulkActionsButton component for simplified bulk operations
- Support mark open/fixed/snoozed/ignored/discarded and delete actions
- Integrate with RemoveStackDialog and status change dialogs
- Wire bulk actions into stacks page with selection tracking
- All dialogs and confirmations included

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: Add stacks dashboard to navigation menu

- Add stacks navigation item to Dashboards group
- Use layers icon for visual consistency
- Place between issues and event stream
- Accessible from sidebar navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: Add stacks filter and bulk operation examples to HTTP tests

- Add filter query examples (status:discarded, tags:production, type:error)
- Add bulk operation examples (change status, mark fixed, mark snoozed, delete)
- Document filtering syntax for stacks dashboard feature
- Help users understand query capabilities

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: rewrite stacks dashboard using proper patterns

- Rewrote stacks page using useFetchClient, createTable,
  getSharedTableOptions, and DataTable components matching the
  issues/sessions page patterns
- Created proper table column definitions with NumberFormatter,
  TimeAgo, and badge components for status/tags
- Created StacksDataTable component mirroring EventsDataTable
- Uses existing TableStacksBulkActionsDropdownMenu (deleted the
  duplicate stacks-bulk-actions-button.svelte)
- Moved navigation from Dashboards to Reports group
- Removed broken getStacksQuery and list query key from api.svelte.ts
- Uses FacetedFilter system for filtering (status, project, date, etc.)
- WebSocket StackChanged event handling for real-time updates
- Offset-based pagination with page size selector
- Fixed organization abbreviation (never use org)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: lint errors in stacks page

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: clear stale organization selection state

- Clear persisted organization id when no organizations remain
- Re-select first valid organization when persisted id is stale
- Hide manage/billing links when current organization is invalid
- Prevent organization settings layout from redirecting to undefined ids

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: preserve impersonation and stabilize stack refresh handling

- Keep impersonated organization selections from being overwritten by org sync
- Refresh stacks table on non-removed StackChanged events with throttling
- Correct stacks HTTP samples to match ids path-segment routes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: Add stacks dashboard page route and API query

- Add getStacksQuery function for listing stacks with filtering
- Create /stacks route with basic stacks list page
- Support filtering by status, tags, date ranges, and custom Lucene expressions
- Display stack information: title, tags, event count, first/last occurrence, status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* build: Simplify stacks page to avoid table library issues

- Remove complex TanStack table setup that was causing build errors
- Use semantic HTML table with Tailwind styling for simplicity
- Implement row selection with checkboxes and bulk actions UI
- Support filter input, limit selector, and pagination controls
- Display stack properties: title, tags, event count, last occurrence, status
- Add loading and empty state handling

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: Add stacks bulk actions button with all operations

- Create StacksBulkActionsButton component for simplified bulk operations
- Support mark open/fixed/snoozed/ignored/discarded and delete actions
- Integrate with RemoveStackDialog and status change dialogs
- Wire bulk actions into stacks page with selection tracking
- All dialogs and confirmations included

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: Add stacks dashboard to navigation menu

- Add stacks navigation item to Dashboards group
- Use layers icon for visual consistency
- Place between issues and event stream
- Accessible from sidebar navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: Add stacks filter and bulk operation examples to HTTP tests

- Add filter query examples (status:discarded, tags:production, type:error)
- Add bulk operation examples (change status, mark fixed, mark snoozed, delete)
- Document filtering syntax for stacks dashboard feature
- Help users understand query capabilities

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: rewrite stacks dashboard using proper patterns

- Rewrote stacks page using useFetchClient, createTable,
  getSharedTableOptions, and DataTable components matching the
  issues/sessions page patterns
- Created proper table column definitions with NumberFormatter,
  TimeAgo, and badge components for status/tags
- Created StacksDataTable component mirroring EventsDataTable
- Uses existing TableStacksBulkActionsDropdownMenu (deleted the
  duplicate stacks-bulk-actions-button.svelte)
- Moved navigation from Dashboards to Reports group
- Removed broken getStacksQuery and list query key from api.svelte.ts
- Uses FacetedFilter system for filtering (status, project, date, etc.)
- WebSocket StackChanged event handling for real-time updates
- Offset-based pagination with page size selector
- Fixed organization abbreviation (never use org)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: lint errors in stacks page

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: clear stale organization selection state

- Clear persisted organization id when no organizations remain
- Re-select first valid organization when persisted id is stale
- Hide manage/billing links when current organization is invalid
- Prevent organization settings layout from redirecting to undefined ids

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: preserve impersonation and stabilize stack refresh handling

- Keep impersonated organization selections from being overwritten by org sync
- Refresh stacks table on non-removed StackChanged events with throttling
- Correct stacks HTTP samples to match ids path-segment routes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: align issue management and settings navigation UX

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: polish row interactions and issue detail links

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: clean up settings sidebar context

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: nest project settings under projects nav

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: show project submenu hierarchy in settings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: render project settings as nested sidebar tree

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: add settings separator after organizations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Polish sidebar hierarchy and issue management framing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Move sessions into dashboards navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add collapsed sidebar hover flyouts for child nav

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revert out-of-scope changes per PR review

Reverted: Startup.cs (next build path), SavedView model/tests, organization-features
extraction, events-overview pager, saved-view 422 error handling hack,
issues page filter changes, project manage page link change.

* Remove stacks page and navigation link per PR review

The stacks dashboard was not ready for inclusion. Removed the route and
its sidebar link from the layout.

* Improve stacks table: rename severity to critical, fix tags cell UX

- Renamed stack-severity-cell to stack-critical-cell (matches column name)
- Added tooltip with Kbd for platform-agnostic shortcut hints on tags
- Made overflow tags clickable in tooltip dropdown
- Added getProjectStacksQuery tanstack wrapper in stacks API
- Moved defaultColumnVisibility and getTableOptions to options file

* Refactor project issues page to use TanStack Query

Replaced manual useFetchClient calls with getProjectStacksQuery and
getTableOptions from the options file. Removed unused showStackPager
and onEventChange props from stack/event detail pages.

* Cosmetic fixes: remove double newlines, simplify margin, extract \

- Removed extra blank lines in events and stream pages
- Simplified account layout margin from mx-6 my-6 to m-6
- Extracted detailsHref into a \ in event-detail-sheet

* Apply code formatting (npm run format)

* Revert stacks view type additions from saved view models

The stacks page was removed per review. These model changes adding
'stacks' as a valid ViewType are no longer needed.

* Fix data-table click handling and stacks.http filter syntax

- Don't intercept clicks on links/buttons in table cells (was breaking
  link navigation when rowHref not set)
- Added keyboard accessibility (Enter/Space) to table cells
- Fixed stacks.http filter: tags: → tag: (correct filter term)

* Make org settings routes consistent, fix stacks viewType doc

- Settings group now has all the same entries as Organization Settings
  (General, Usage, Billing, Features) for navigation consistency
- Removed stale 'stacks' from SavedViewController viewType doc comment
  to match the reverted model validation

* Revert tag filter from AND back to OR semantics

Multi-tag filter should use OR (show events with any selected tag)
not AND (require all tags). AND was an accidental breaking change.

* Fix data-table keyboard a11y and stacks.http date format

- Move tabindex from individual cells to row level (reduces tab stops)
- Remove per-cell keydown handler, use row-level Enter/Space instead
- Fix snoozeUntilUtc to use ISO-8601 format (2030-12-31T00:00:00Z)

* Fix CI: prettier formatting and remove obsolete feature-gate tests

- Fix prettier formatting in data-table-body.svelte (multiline onkeydown)
- Remove 3 WhenFeatureDisabled tests since feature gate was removed from
  SavedViewController (saved views are now available to all orgs)

* Fix ESLint curly rule: wrap if body in braces

* Refactor feature flag documentation: remove specific feature references and clean up comments

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants