Dashboard overhaul: context menus, drag-to-regroup, configurable columns, Traffic & Triage - #35
Merged
Merged
Conversation
The dashboard's right-click channel menu now matches the Channels view: adds an Enable/Disable toggle (channels:write) and wires Clone/Export/Delete on both the flat and grouped tables via a shared useChannelCrud hook (clone/delete dialogs + export rendered once on the Dashboard). Extracted downloadChannelExport into a util; added ChannelContextMenu render tests. Part of the Dashboard overhaul (Channels view will be retired). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
New Channel, Import, and Export-all now live in the Dashboard header (New Channel gated on channels:write). Group management is already covered on the dashboard (New Group + the grouped-view group menu). This makes the Dashboard the single hub for channel work ahead of retiring the Channels view. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
Tag chips now render next to the channel name in both dashboard tables, using a luminance-aware text color so labels are readable on light and dark tag colors (also fixes the hardcoded-#fff contrast issue). Data was already loaded on the Dashboard; added a shared TagChips component + tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
…ase 3b) Adds Source / Data Types / Rev / Updated as toggleable dashboard columns, plus per-user show/hide for every non-essential column, persisted via the (previously unused) user-preferences API. The statistics summary now returns the channel metadata (one query, all channels) so the dashboard needs no extra paginated fetch. Shared column model + cell renderers keep the flat and grouped tables in lockstep; group-total rows aggregate only the numeric columns. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
Group headers now open a menu on right-click (as well as the kebab), and the menu adds Deploy/Start/Stop/Undeploy-all for the group — each fires only for channels in an applicable state, so no spurious errors for channels already in the target state. Rename/Delete retained. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
Grouped-view channel rows now have a drag handle; dragging a row onto another group header re-assigns it, persisted via the group-membership API (remove from current + add to target; dropping on Ungrouped removes all memberships). Optimistic move with revert-on-error, a DragOverlay preview, and drop-target highlighting via @dnd-kit/core. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
The channel list + CRUD now live entirely on the Dashboard, so the Channels view is removed: /channels redirects to the Dashboard (bookmarks still work), the nav item and ChannelsPage are gone. Channel editor / per-channel messages / statistics routes stay. Updated the Playwright specs (channel-crud + statistics rewritten to drive the Dashboard header + context menu; message-flow tweaked) and the testing checklists (02-channels-list deprecated -> 09-dashboard gains the overhaul scenarios). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
Reframes the top-level Messages view (now 'Traffic') as an engine-wide ops view: - 'Needs Attention' tab: a live feed of errored messages across ALL channels with one-click Reprocess + Open-in-browser, and an error-count badge. - Engine-wide traffic summary strip (received/sent/errored/queued totals). - 'Search' tab: the existing cross-channel search (status + date filters). Reuses the cross-channel-search endpoint (status=ERROR for triage) and the reprocess mutation; per-channel browsing stays behind each channel. Nav 'Messages' -> 'Traffic'. Updated the cross-channel Playwright spec + testing checklist. Cross-channel *flow tracing* (a message splitting across channels) remains a separate future feature, as discussed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
…move row actions - Channel name click now opens the channel's message browser (not the editor) - Errored count: on-hover tooltip shows error rate (errored/received %), click navigates to messages filtered to ERROR - Remove "Statistics" item from the channel context menu (stats are columns now) - Remove inline row-action controls (Statistics icon + three-dot deploy menu) from both the flat and grouped dashboard tables; delete ChannelActions - Retire the per-channel Statistics page: delete ChannelStatisticsPage, components/statistics/*, per-channel stats hooks (useChannelStatistics, useResetStatistics) and its route; keep the dashboard summary hook - Group header right-click opens the group menu (Deploy/Start/Stop/Undeploy all, Rename, Delete), not the channel menu - Docs: update 09-dashboard, 53-context-menus, 57-breadcrumbs, 61-confirm-dialogs; delete 52-channel-statistics-page - E2E: retire statistics.spec; add name→messages, Edit→editor, no-Statistics, and group-context-menu coverage in channel-crud.spec Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi
There was a problem hiding this comment.
Pull request overview
This PR delivers a major Dashboard-centered UI overhaul: channel management is consolidated into the Dashboard (context menus, bulk/group actions, drag-to-regroup, configurable columns), the standalone Channels view is retired, and Messages is reframed as a global Traffic & Triage view.
Changes:
- Adds Dashboard channel/group context menus, shared CRUD dialogs, and drag-to-regroup (persisted via group memberships).
- Introduces per-user configurable dashboard columns (persisted via user preferences) and inline tag chips.
- Replaces the top-level Messages page with Traffic & Triage (summary + Needs Attention feed + Search tab) and removes per-channel Statistics UI.
Reviewed changes
Copilot reviewed 42 out of 43 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| pnpm-lock.yaml | Locks new dependencies for drag-to-regroup (@dnd-kit/core) and its transitive deps. |
| packages/web/src/pages/TrafficPage.tsx | New Traffic & Triage page (triage feed + search). |
| packages/web/src/pages/DashboardPage.tsx | Moves channel authoring actions to Dashboard header; wires columns/tags/CRUD handlers. |
| packages/web/src/pages/CrossChannelSearchPage.tsx | Removes legacy global Messages search page in favor of Traffic. |
| packages/web/src/pages/ChannelStatisticsPage.tsx | Removes legacy per-channel Statistics page. |
| packages/web/src/pages/ChannelsPage.tsx | Removes standalone Channels list page (Dashboard becomes canonical). |
| packages/web/src/lib/dashboard-columns.ts | Defines configurable dashboard column model + connector labels. |
| packages/web/src/lib/channel-export.ts | Centralizes channel export download logic. |
| packages/web/src/hooks/use-statistics.ts | Extends stats summary shape to include channel metadata fields. |
| packages/web/src/hooks/use-dashboard-columns.ts | Adds per-user persisted dashboard column visibility. |
| packages/web/src/hooks/use-channel-crud.tsx | Adds shared clone/delete/export handlers + dialogs for reuse across views. |
| packages/web/src/components/traffic/TrafficSummary.tsx | Adds engine-wide totals strip for Traffic view. |
| packages/web/src/components/traffic/MessageResultsTable.tsx | Shared cross-channel results table for triage + search. |
| packages/web/src/components/traffic/tests/MessageResultsTable.test.tsx | Unit tests for MessageResultsTable behavior. |
| packages/web/src/components/statistics/StatsSummaryCards.tsx | Removes Statistics-page-only component. |
| packages/web/src/components/statistics/ConnectorStatsTable.tsx | Removes Statistics-page-only component. |
| packages/web/src/components/layout/AppLayout.tsx | Updates nav: removes Channels, renames Messages to Traffic. |
| packages/web/src/components/dashboard/GroupedChannelTable.tsx | Adds group context menu + drag-to-regroup + configurable columns + tag chips; wires context menu actions. |
| packages/web/src/components/dashboard/ColumnsButton.tsx | Adds UI control to toggle persisted column visibility. |
| packages/web/src/components/dashboard/ChannelStatusTable.tsx | Applies configurable columns + tag chips + context menu CRUD hooks in flat view. |
| packages/web/src/components/dashboard/ChannelColumnCells.tsx | Shared rendering for configurable config/stat columns and group totals. |
| packages/web/src/components/dashboard/ChannelActions.tsx | Removes inline per-row quick actions menu (replaced by context menu). |
| packages/web/src/components/dashboard/tests/ChannelColumnCells.test.tsx | Unit tests for configurable column cell rendering. |
| packages/web/src/components/common/TagChips.tsx | Adds luminance-aware tag chips next to channel names. |
| packages/web/src/components/common/ChannelContextMenu.tsx | Expands context menu (enable/disable, clone/delete signature updates; removes Statistics). |
| packages/web/src/components/common/tests/TagChips.test.tsx | Unit tests for TagChips + contrast logic. |
| packages/web/src/components/common/tests/ChannelContextMenu.test.tsx | Unit tests for new context menu behaviors (enable/disable, clone/delete). |
| packages/web/src/components/channels/ExportButton.tsx | Refactors to use shared export download helper + notifications. |
| packages/web/src/App.tsx | Routes: redirects /channels to /; swaps /messages to Traffic page; removes statistics/channels pages. |
| packages/web/package.json | Adds @dnd-kit/core dependency to support drag-to-regroup. |
| packages/server/src/services/statistics.service.ts | Extends stats summary query to include channel metadata fields for dashboard columns. |
| e2e/statistics.spec.ts | Removes obsolete Statistics E2E suite. |
| e2e/message-flow.spec.ts | Updates flow tests for Dashboard replacing Channels list. |
| e2e/cross-channel-search.spec.ts | Updates E2E coverage for Traffic & Triage (tabs/filters). |
| e2e/channel-crud.spec.ts | Rewrites CRUD E2E to drive via Dashboard + context menus + columns UI. |
| docs/testing/61-confirm-dialogs.md | Removes Statistics reset checklist items. |
| docs/testing/57-breadcrumbs.md | Removes Statistics breadcrumb checklist items. |
| docs/testing/53-context-menus.md | Updates manual checklist for new channel/group context menus. |
| docs/testing/52-channel-statistics-page.md | Removes retired Statistics manual test checklist. |
| docs/testing/49-cross-channel-search.md | Replaces cross-channel search checklist with Traffic & Triage checklist. |
| docs/testing/09-dashboard.md | Updates dashboard manual test plan for new interactions (context menus, columns, drag-to-regroup). |
| docs/testing/02-channels-list.md | Marks Channels list as retired and points to Dashboard checklist. |
| docs/progress/CHANGELOG.md | Documents the overhaul phases and testing notes. |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+298
to
+317
| // Optimistically move the row; revert if persistence fails. | ||
| const prevOverride = dragOverride; | ||
| const next = new Map(dragOverride); | ||
| next.set(channelId, targetGroupId); | ||
| setDragOverride(next); | ||
|
|
||
| void (async () => { | ||
| try { | ||
| if (fromGroupId !== '__ungrouped__') { | ||
| await removeMember.mutateAsync({ groupId: fromGroupId, channelId }); | ||
| } | ||
| if (targetGroupId !== null) { | ||
| await addMember.mutateAsync({ groupId: targetGroupId, channelId }); | ||
| } | ||
| } catch (err) { | ||
| setDragOverride(prevOverride); | ||
| notify(err instanceof Error ? err.message : 'Failed to move channel', 'error'); | ||
| } | ||
| })(); | ||
| }, [dragOverride, removeMember, addMember, notify]); |
Comment on lines
+223
to
+226
| for (const c of targets) { | ||
| deployAction.mutate({ channelId: c.channelId, action }); | ||
| } | ||
| notify(`${action.charAt(0).toUpperCase() + action.slice(1)} sent to ${String(targets.length)} channel(s)`, 'success'); |
Comment on lines
+69
to
72
| // The channel list lives on the Dashboard now; keep the path as a | ||
| // redirect so old bookmarks/links don't 404. | ||
| { path: 'channels', element: <Navigate to="/" replace /> }, | ||
| { path: 'channels/new', element: lazyRoute(<ChannelEditorPage />) }, |
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.
Summary
Dashboard / Channels / Messages overhaul: do everything from the Dashboard, retire the standalone Channels view, and reframe Messages as a global Traffic & Triage view.
Highlights
Refinements (final pass)
Channel name opens messages; Statistics removed from the context menu with an on-hover error-rate tooltip on the dashboard; inline row actions removed; group right-click opens the group menu (not the channel menu).
Testing
pnpm build+pnpm lint --max-warnings 0clean.docs/testing/checklists updated for the overhaul (context menus, dashboard, breadcrumbs, confirm dialogs; statistics-page spec/doc retired).Notes
Branched from the same base as the merged Collections/bridges PR (#34); this branch merges the updated
main(Collections + IO bridges + Data Sources) cleanly — the two touch disjoint areas.🤖 Generated with Claude Code
https://claude.ai/code/session_01F1ad6jb5mCYxzFVXHbksqi