Two small UX polish items on the executive-meetings schedule:
1. Arabic label rename
- artifacts/tx-os/src/locales/ar.json: changed
editToggle / editToggleAria / editToggleOn / editToggleOff
from "تحرير" / "وضع التحرير" → "تعديل" / "وضع التعديل".
- English strings unchanged (user only asked about Arabic
wording). No other key/UI re-uses these strings.
2. Row color now wraps the # (number) cell
- In MeetingRow's case "number", added an IIFE-built
numberCellInlineStyle that applies backgroundColor following
a strict priority chain:
(a) highlight || isCancelled → no inline bg, so the
bg-red-600 utility on numberCellCls keeps winning.
(b) tintBg (current-meeting wash) → highlightColor + white
text (unchanged behavior).
(c) rowBg (user-picked row color) → tints the # cell to
match the rest of the row. Palette is all light tints,
so the existing dark text remains readable.
(d) otherwise → falls back to bg-white from numberCellCls.
Tests
- Added a focused Playwright spec in
tests/executive-meetings-row-actions-menu.spec.mjs that:
* picks a non-current, non-cancelled row (CSS
:not([data-current-meeting="true"]) + a runtime "starts
white" precondition, so it cannot accidentally target a
red-badge row),
* opens the kebab → Row color → red swatch,
* asserts the # cell's computed background is rgb(254,226,226),
* resets to "default" and asserts it returns to white.
test.skip is used (rather than fail) when seed data has no
eligible row, so the regression guard never produces false
negatives on a sparse schedule.
Verification
- All 6 specs in executive-meetings-row-actions-menu.spec.mjs +
executive-meetings-edit-toggle.spec.mjs pass locally.
- Type-check shows no new errors in executive-meetings.tsx.
Code review (architect, evaluate_task) flagged the original test's
filter({ hasNot }) as unreliable for excluding current rows; the
test was rewritten before commit per that feedback.
The schedule's per-row affordances (delete, row color, merge cells)
used to render as three separate hover-revealed icon buttons stacked
inside the same narrow cell, which collided visually on iPad and
small screens. Replaced them with a single MoreVertical kebab trigger
that opens a Radix popover with three views (main / color / merge),
plus a "Back" affordance to return from sub-views to the main menu.
Implementation:
- New RowActionsMenu component (artifacts/tx-os/src/pages/executive-meetings.tsx)
rendered once per row, anchored at the trailing-top of the first
visible cell (matching the previous overlay anchor logic). Resets
to "main" view on close.
- Old DeleteRowButton, RowColorPicker, and MergeMenu components removed.
- Existing testids preserved on the popover items so external tests
still target em-delete-row-{id}, em-row-color-trigger, and
em-merge-trigger-{id}. New testids added: em-row-actions-{id} for
the kebab trigger, em-row-actions-back for the Back button.
- Locale keys added in ar.json/en.json: rowActions.label, rowActions.back.
- New imports: MoreVertical, ChevronLeft, ChevronRight (RTL-aware Back arrow).
- Merged-cell branch also uses RowActionsMenu so merge/unmerge stays
reachable when the # column is hidden.
Tests:
- New regression spec: executive-meetings-row-actions-menu.spec.mjs
exercises the full menu flow (open → color → back → main → merge → escape).
- Existing executive-meetings-edit-toggle.spec.mjs and
executive-meetings-schedule-features.spec.mjs continue to pass —
legacy testids remain absent in view mode and present inside the
popover when opened in edit mode.
Pre-existing test failures (NOT caused by this change):
- "non-mutate user (executive_viewer)" spec fails because seeded user
"ahmed" is missing from the dev DB (parallel task #131 drizzle work).
- TS errors in admin.tsx tracked by other tasks (api-client codegen
out of sync).
Follow-up proposed:
- #192: show row color + merge previews inline in the main menu items.