Skip to content

feat: add stacks dashboard page#2239

Open
niemyjski wants to merge 9 commits into
mainfrom
niemyjski/feature-stacks-dashboard
Open

feat: add stacks dashboard page#2239
niemyjski wants to merge 9 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 3 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>
@github-actions
Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.Web 60% 46% 3906
Exceptionless.AppHost 18% 9% 82
Exceptionless.Insulation 25% 23% 203
Exceptionless.Core 65% 60% 7720
Summary 61% (12353 / 20211) 55% (6244 / 11454) 11911

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.

1 participant