Skip to content

Dashboard overhaul: context menus, drag-to-regroup, configurable columns, Traffic & Triage - #35

Merged
MichaelLeeHobbs merged 11 commits into
mainfrom
feature/dashboard-overhaul
Jul 14, 2026
Merged

Dashboard overhaul: context menus, drag-to-regroup, configurable columns, Traffic & Triage#35
MichaelLeeHobbs merged 11 commits into
mainfrom
feature/dashboard-overhaul

Conversation

@MichaelLeeHobbs

Copy link
Copy Markdown
Owner

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

  • Right-click context menu on dashboard channels (Edit, Messages, Enable/Disable, state-aware deploy lifecycle, Send Message, Change Group, Clone, Export, Delete).
  • Group context menu (Deploy/Start/Stop/Undeploy all, Rename, Delete) on group headers.
  • Drag-to-regroup channels between groups (@dnd-kit), persisted.
  • Per-user configurable columns (source, data types, rev, updated) via the user-preferences API; tag chips next to channel names.
  • Channel name → messages (not the editor); errored-count tooltip shows the error rate and links to filtered messages.
  • Removed the redundant inline row actions (Statistics icon + three-dot deploy menu) and the per-channel Statistics page/components/hooks/route — stats live on the dashboard columns now.
  • Messages → Traffic & Triage: engine-wide summary + Needs-Attention feed + cross-channel search.

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

  • Unit: all suites green — web 90, server 995, engine 359, core-models 256, connectors 486, cli 22, core-util 88.
  • Full pnpm build + pnpm lint --max-warnings 0 clean.
  • E2E specs and 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

MichaelLeeHobbs and others added 11 commits July 13, 2026 06:49
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
…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
Copilot AI review requested due to automatic review settings July 14, 2026 21:01
@MichaelLeeHobbs
MichaelLeeHobbs merged commit 0fae07c into main Jul 14, 2026
1 of 3 checks passed
@MichaelLeeHobbs
MichaelLeeHobbs deleted the feature/dashboard-overhaul branch July 14, 2026 21:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 thread packages/web/src/App.tsx
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 />) },
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants