Skip to content

refactor(communicator): rebuild the communicator builder as a board management dashboard - #2293

Open
RodriSanchez1 wants to merge 81 commits into
masterfrom
refactor/communicatorBuild
Open

RodriSanchez1 wants to merge 81 commits into
masterfrom
refactor/communicatorBuild

Conversation

@RodriSanchez1

Copy link
Copy Markdown
Collaborator

Closes #2292.

Rewrites the communicator builder as a dashboard: a sidebar, a section header, and a board area that is the only thing that scrolls. Boards are selected first and acted on second, so every action ships with a visible label instead of hiding behind a ⋮ menu.

Quick access

The communicator section is no longer a second card grid. It is a short ordered tray — thumbnail, name, Home badge — with labelled Set as home board, Remove from quick access, Move up and Move down on each row, plus a dashed Add a board from My Boards row that jumps to the board library. Rows render in communicator.boards order and skip ids with no matching entry in availableBoards; a move reorders only the visible ids in place, so a board the user cannot currently see is never dropped from the communicator.

CommunicatorToolbar.container.js now maps over currentCommunicator.boards and looks each id up in availableBoards, instead of filtering availableBoards through includes(). The communicator bar and the tray finally agree on order, so reordering in the tray is immediately visible in the bar.

Board details

getBoardActions() returns one flat array of { key, label, icon, onClick, disabled, premium, destructive } descriptors. BoardDetails renders it, and BoardDetailsSurface picks the presentation — a sticky panel beside the list, or a bottom sheet on narrow viewports. There is no second surface that can drift out of sync.

Actions: Show, Edit, Clone, Export, Save as PDF, Publish / Unpublish, Set as home board, Add / Remove quick access, Delete, Info. Show sits first and closes the dialog; Delete sits last as the destructive one.

Clone ships disabled on purpose. The descriptor, icon, label and position land now; the handler is deliberately left for a follow-up. A labelled button that appears to work and silently does nothing is worse than a disabled one.

Export and PDF now report through showNotification on both success and failure — they previously disappeared into silent catch {} blocks — and run through a runBusy wrapper that disables the panel's action list while one is in flight, scoped so a slow action finishing late cannot clear the spinner of a different board.

Dialog layout

The dashboard never claimed the height of the dialog, so it grew as ordinary content inside FullScreenDialog's scroller and produced a scrollbar the content did not need:

  • the root used min-height: 100%, silently ignored because FullScreenDialog's content wrapper has height: auto — measured at 1280×800, the dashboard was 293px tall in an 800px dialog, which is also why the sidebar stopped mid-page;
  • the details panel measured itself against the viewport (top: 72px inside a container starting 64px down, max-height: calc(100vh - 96px)), putting its bottom at y=840 in an 800px viewport — ~40px of spurious scroll.

Now contentFullWidth carries height: 100% (only this dialog passes fullWidth), the dashboard is height: 100%; overflow: hidden, the content column is a flex column, and the board area is a flex: 1; min-height: 0; overflow-y: auto region. The header is a plain non-shrinking flex item — nothing scrolls under it, so the sticky positioning and backdrop blur are gone. The panel's offsets are now relative to that board area, and the permanent Drawer's docked root spans the full height.

Verified in Chrome at 1280×800 and 400×740: dialog paper and container both report scrollHeight === clientHeight. With 3000px of injected board content and 2000px of injected panel content, only the board area scrolls and the panel clamps inside the viewport.

Accessibility

  • Cards and rows are real buttons carrying aria-current when selected; activating one moves focus to the details heading, Escape returns focus to the originating card, and the phone sheet traps focus.
  • No icon-only controls in the details surface — every action renders its visible label. The compact controls that remain (the ★ toggle, the tray's four row actions) each carry a tooltip, an aria-label naming both action and board, and a 44×44 target.
  • Quick-access membership is never signalled by the ★ colour alone; the badge text carries the same information.
  • A polite live region — the first in the codebase — announces long operations, their results, reorder positions and search result counts.
  • Reordering never depends on dragging: Move up / Move down are ordinary labelled buttons, disabled at the ends of the list.
  • The bottom sheet respects prefers-reduced-motion.

Tests

New suites cover useBoardSelection, useBoardActions, useBoardsFetcher, boardActions, quickAccessOrder, QuickAccessTray, BoardDetails, BoardDetailsSurface, BoardCard and CommunicatorToolbar.container, plus the updated dashboard-shell snapshot. CommunicatorDialog, FullScreenDialog and CommunicatorToolbar: 15 suites, 81 tests, all passing.

Out of scope

  • Wiring the Clone handler (button ships disabled).
  • Multiple communicators.
  • Splitting My Boards into "created by me" and "saved from community".

🤖 Generated with Claude Code

RodriSanchez1 and others added 30 commits June 2, 2026 19:25
Introduce SECTIONS (MY_COMMUNICATOR / MY_BOARDS / COMMUNITY), SECTION_ORDER,
VIEW_MODES and SECTION_TO_TAB (maps the new sections onto the legacy tab
indexes so the tour keeps working) as the foundation for the dashboard UI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Section titles/hints, search placeholder, view toggle labels, board actions,
empty/error states and open-in-new-tab strings for the new layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
useBoardsFetcher: page-based pagination + debounced search per section, with
local filtering for the communicator source and API fallback for the others.
useBoardActions: all board/communicator business logic (recursive board clone,
add/remove, set root, publish, delete, update, report) pulled out of the old
container so it can be reused and unit-tested. Includes hook unit tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DashboardToolbar (persistent search + grid/list toggle + overflow menu + mobile
nav button), DashboardNav (sidebar / Drawer on xs), SectionHeader, BoardsView
(grid/list + loading/empty/error + pagination), BoardCard, BoardRow,
BoardActionsBar (primary action + overflow), BoardStatusIcons, BoardThumb and a
boardLocale helper. Styled with makeStyles, theme-driven dark mode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Single-instance dialogs controlled by the panel (BoardInfo, Confirm for
delete/copy, Edit for name/description/image with SymbolSearch, Publish and
Report), replacing the seven dialogs previously mounted per board item.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CommunicatorDialog.component becomes a functional dashboard (sidebar nav +
persistent search + grid/list toggle + section content) wiring the fetcher and
action hooks and mounting the shared dialogs once. The container is reduced to a
thin redux boundary (connect + injectIntl) keeping the open/onClose contract.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Point the Joyride walkthrough at the new selectors (nav items, search box, board
actions container) and drop the steps for removed elements. Reduce
CommunicatorDialog.css to the few classes the tour still renders.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Delete the 1k-line CommunicatorDialogBoardItem, the CommunicatorDialogButtons
search/menu component and their now-unused test and snapshot, superseded by the
dashboard components.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the obsolete tab-based test with shell rendering/section-switch tests
(messages mocked via Proxy since react-intl is auto-mocked) and refresh the
snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Refactored BoardCard and BoardRow components to include new styles for better visual hierarchy and interaction feedback.
- Introduced ContentToolbar for search and view mode selection, improving user experience in navigating boards.
- Updated DashboardNav and SectionHeader to include navigation buttons and improved layout.
- Added dashboardStyles for consistent styling across components, including hover effects and busy overlays.
- Enhanced BoardInfoDialog and ConfirmDialog with better layout and responsiveness.
- Improved PublishBoardDialog and ReportBoardDialog with consistent dialog sizing.
- Added skeleton loading states in BoardsView for better loading feedback.
… the dialog bundle

Export.helpers statically pulled in pdfmake + the 1.7MB vfs_fonts blob
at module scope, so every CommunicatorDialog mount paid that cost and
two unrelated test suites crashed under Jest's transform. Import the
adapters dynamically inside exportBoard/exportBoardToPdf instead, and
drop the jest.mock workarounds that papered over the crash.
…region

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The board-actions tour step for the quick access section was retargeted to
the details panel, which only renders on the other two sections, so the step
had no anchor on the section the dialog opens to.
…e announce timer

A slow action finishing after the user started another one cleared the wrong
board's spinner. The announce timeout could also fire after unmount.
RodriSanchez1 and others added 11 commits August 21, 2026 20:23
…ource

The dashboard refactor removed CommunicatorDialogBoardItem and
CommunicatorDialogButtons, leaving 12 message descriptors unused, and
added 3 more (boardActions, inQuickAccess, rootBoardChip) that were never
wired up. Remove all 15 from the descriptors and from cboard.json.

The new dashboard, quick access and export strings were never added to
cboard.json, so Crowdin never saw them and every locale fell back to the
English defaultMessage. Add the 37 missing ids.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EzdbbPnJQ2iuA853Vd5Ew1
The dashboard had two hand-rolled chip styles that meant the same thing —
a tinted ground with a same-hue label — and neither survived the cascade:
MUI injects .MuiChip-outlined after component styles, so a single-class
override loses at equal specificity and the chip falls back to the default
grey outline. TonalChip settles it by doubling its selectors, and derives
the label shade from the theme so it keeps contrast in dark mode too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EzdbbPnJQ2iuA853Vd5Ew1
The details panel stacked the meta caption and the status glyphs with no
spacing, and the glyphs only carried meaning through a tooltip — which a
keyboard user never reaches on a non-focusable <svg>. Give the header a
gap, split the dot-separated meta into wrappable parts, and show the
status as TonalChips instead.

Quick access rows get the same chips in place of their unlabelled root
Chip, limited to root and active: every board there is one of the user's
own, so a Private badge on each row is noise. SectionHeader's count chip
moves to TonalChip too, so a count and a status read as one component.

Both surfaces build their statuses from one shared list, so a board can't
read differently depending on where it is shown. The chips use new short
message ids rather than editing publicBoard and friends in place, which
are already translated on Crowdin; the full phrase stays as each chip's
accessible name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EzdbbPnJQ2iuA853Vd5Ew1
@magush27

magush27 commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator

When going to Quick Access for the first time and the steps go on, arriving on this step makes the interface unusable with the arrows not working and no way of quitting from the steps. This is what I see:
imagen

I'll try to solve it

magush27 and others added 16 commits October 5, 2026 13:59
… options menu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… refactor/communicatorBuild

Keep the quick access row menu layout and section tours; take the home
board, quick access star and plain-text search fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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.

Communicator builder: board management is thin, the communicator reads as a second board list, and the dialog adds an unnecessary scrollbar

2 participants