Task #198: Edit→Save toggle + bulk-clear attendees + multi-select delete meetings

Three executive-meetings polish features on the Schedule view:

1. Edit-mode toggle now flips its label (Edit↔Save) and icon
   (Pencil↔Check) so a second click reads as "I'm done editing."
2. New-/edit-meeting dialog gained a "Remove all attendees" button
   next to "+ Add attendee" with a confirm prompt; only renders
   when ≥1 attendee is present.
3. Per-row select checkboxes (only in edit mode) drive a floating
   bulk toolbar showing "Selected N of M" with "Delete selected"
   + "Clear selection". Single confirm wipes all checked meetings.

Implementation notes:
- Bulk-select checkbox is rendered as an absolute overlay on the
  first visible non-merged cell of every row (and on the merged
  <td> for merged rows) instead of being inlined inside the # cell.
  This (a) preserves the # cell's grip handle so dnd-kit drag still
  works, (b) keeps the checkbox reachable when users hide # via the
  column customizer, and (c) keeps it reachable on rows whose merge
  swallows the leading cells.
- Locale text added to ar.json/en.json for saveToggle.*, bulk*,
  removeAll, schedule.bulkSelectRow.

Tests:
- New spec executive-meetings-bulk-actions.spec.mjs (5 tests):
  edit toggle flip, dialog remove-all-attendees, multi-select
  delete with DB verify, hidden-# overlay survival, merged-row
  overlay survival. All pass.
- Verified no regressions in executive-meetings-edit-toggle (4/4),
  -row-actions-menu (2/2), -schedule-features (4/4, including
  drag-row reorder), -manage-create (1/1), home-clock-persistence
  (1/1), order-undo-toast (2/2).

Code review (architect, 2 rounds):
- Round 1 flagged checkbox-in-#-cell breaks when # is hidden →
  fixed by lifting to absolute overlay.
- Round 2 flagged merged rows skipped overlay → fixed by sharing
  the overlay JSX between renderCell (first unmerged cell) and the
  merged <td>, plus added the merged-row e2e regression test.

Pre-existing failures unrelated to this task: 2 PDF tests in
api-server (Tasks #172/#179) — untouched.
This commit is contained in:
riyadhafraa
2026-04-30 08:15:59 +00:00
parent 1eee44799a
commit bb87166469
4 changed files with 708 additions and 13 deletions
+15 -2
View File
@@ -878,7 +878,18 @@
"editToggle": "تعديل",
"editToggleAria": "تبديل وضع التعديل",
"editToggleOn": "وضع التعديل مفعّل",
"editToggleOff": "وضع التعديل معطّل"
"editToggleOff": "وضع التعديل معطّل",
"saveToggle": "حفظ",
"saveToggleAria": "إنهاء التعديل وحفظ التغييرات",
"bulkSelectRow": "تحديد الاجتماع",
"bulkSelectAll": "تحديد الكل",
"bulkSelectionCount": "محدد: {{n}} من {{total}}",
"bulkClearSelection": "إلغاء التحديد",
"bulkDeleteSelected": "حذف المحدد",
"bulkDeleteConfirm": "حذف {{n}} اجتماعاً؟\n\nلا يمكن التراجع عن هذا الإجراء.",
"bulkDeleteResultAll": "تم حذف {{n}} اجتماعاً",
"bulkDeletePartial": "تم حذف {{ok}} من {{total}} اجتماعاً، فشل {{failed}}",
"bulkDeleteResultNone": "فشل حذف الاجتماعات المحددة"
},
"rowColor": {
"label": "لون الصف"
@@ -956,7 +967,9 @@
"add": "إضافة حاضر",
"remove": "إزالة",
"moveUp": "تحريك للأعلى",
"moveDown": "تحريك للأسفل"
"moveDown": "تحريك للأسفل",
"removeAll": "حذف جميع الحضور",
"removeAllConfirm": "حذف جميع الحضور ({{count}})؟\n\nسيتم تطبيق التغيير عند حفظ الاجتماع."
},
"duplicate": "تكرار",
"duplicateToDate": "تكرار إلى تاريخ",