Reduce schedule "Add" buttons to a single "+" icon

Task #190.

User wanted both add affordances in the Executive Meetings schedule
to show only the "+" symbol — no accompanying text in either
language.

Changes:
- artifacts/tx-os/src/pages/executive-meetings.tsx:
  - Add-row button: drops the visible label in idle state, renders
    only the <Plus> icon (aria-hidden). Loading state still shows
    "Loading..." for feedback. Added aria-label and aria-busy on
    the <button> so screen readers still announce the action and
    the loading state.
  - Add-attendee inline button: visible content is now the literal
    "+" character. aria-label preserved for assistive tech.
- artifacts/tx-os/src/locales/ar.json:
  - executiveMeetings.schedule.addRow: "أضف اجتماع جديد" → "أضف اجتماع"
  - executiveMeetings.schedule.addAttendee: "+ أضف حاضرًا" → "أضف حاضر"
- artifacts/tx-os/src/locales/en.json:
  - executiveMeetings.schedule.addAttendee: "+ Add attendee" → "Add attendee"

Both locale strings are now used solely as accessible names since
the visible glyph is hard-coded.

Verification: All 4 tests in
executive-meetings-edit-toggle.spec.mjs pass. Tests use
data-testid (em-add-row-button, em-add-attendee-*), not text, so
no test changes were required. Pre-existing TS errors in admin.tsx
and use-notifications-socket.ts are unrelated (api-client-react
codegen out of sync; tracked by other in-flight tasks).
This commit is contained in:
riyadhafraa
2026-04-30 05:52:39 +00:00
parent 11f169f8c5
commit 1df6ba41d4
4 changed files with 11 additions and 10 deletions
+2 -2
View File
@@ -854,13 +854,13 @@
"dragRow": "اسحب لإعادة الترتيب",
"editMeetingTitle": "تعديل عنوان الاجتماع",
"schedule": {
"addRow": "أضف اجتماع جديد",
"addRow": "أضف اجتماع",
"newMeetingDefaultAr": "اجتماع جديد",
"newMeetingDefaultEn": "New meeting",
"timeStart": "وقت البداية",
"timeEnd": "وقت النهاية",
"timeOrderError": "وقت النهاية يجب أن يكون بعد وقت البداية",
"addAttendee": "+ أضف حاضرًا",
"addAttendee": "أضف حاضر",
"addVirtualAttendee": "+ حاضر عبر الاتصال المرئي",
"addInternalAttendee": "+ حاضر داخلي",
"addExternalAttendee": "+ حاضر خارجي",
+1 -1
View File
@@ -809,7 +809,7 @@
"timeStart": "Start time",
"timeEnd": "End time",
"timeOrderError": "End time must be after start time",
"addAttendee": "+ Add attendee",
"addAttendee": "Add attendee",
"addVirtualAttendee": "+ Virtual",
"addInternalAttendee": "+ Internal",
"addExternalAttendee": "+ External",
@@ -1531,15 +1531,16 @@ function ScheduleSection({
type="button"
onClick={createRow}
disabled={creatingRow}
aria-label={t("executiveMeetings.schedule.addRow")}
aria-busy={creatingRow}
className="w-full flex items-center justify-center gap-2 py-2.5 text-sm text-[#0B1E3F] hover:bg-blue-50/60 focus:bg-blue-50/60 focus:outline-none transition-colors disabled:opacity-60"
data-testid="em-add-row-button"
>
<Plus className="w-4 h-4" />
<span>
{creatingRow
? t("common.loading")
: t("executiveMeetings.schedule.addRow")}
</span>
{creatingRow ? (
<span>{t("common.loading")}</span>
) : (
<Plus className="w-4 h-4" aria-hidden="true" />
)}
</button>
</td>
</tr>
@@ -3007,7 +3008,7 @@ function AttendeeFlow({
aria-label={addLabel}
className="text-xs text-blue-600 hover:text-blue-700 hover:bg-blue-50 rounded px-2 py-1 min-h-[1.5rem] border border-dashed border-blue-300 hover:border-blue-500 transition-colors"
>
{addLabel}
+
</button>
</li>
)}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB