diff --git a/artifacts/tx-os/src/pages/executive-meetings.tsx b/artifacts/tx-os/src/pages/executive-meetings.tsx index 6ea6f082..88d46038 100644 --- a/artifacts/tx-os/src/pages/executive-meetings.tsx +++ b/artifacts/tx-os/src/pages/executive-meetings.tsx @@ -102,7 +102,7 @@ import { import { CSS } from "@dnd-kit/utilities"; import { GripVertical } from "lucide-react"; import { EditableCell } from "@/components/editable-cell"; -import { safeHtml } from "@/lib/safe-html"; +import { safeHtml, htmlToPlainText, wrapAsParagraph } from "@/lib/safe-html"; import { ALERT_COLOR_PRESETS, DEFAULT_ALERT_PREFS, @@ -5462,8 +5462,8 @@ function ManageSection({ function openEdit(m: Meeting) { setEditing({ id: m.id, - titleAr: m.titleAr, - titleEn: m.titleEn ?? "", + titleAr: htmlToPlainText(m.titleAr), + titleEn: htmlToPlainText(m.titleEn ?? ""), meetingDate: m.meetingDate, dailyNumber: String(m.dailyNumber), startTime: m.startTime ? m.startTime.slice(0, 5) : "", @@ -5480,7 +5480,11 @@ function ManageSection({ // the dialog don't have one until after save, so we always assign // `_sid` here for uniformity. The save projection enumerates wire // fields and naturally drops `_sid`. - attendees: m.attendees.map((a) => ({ ...a, _sid: genAttendeeSid() })), + attendees: m.attendees.map((a) => ({ + ...a, + name: htmlToPlainText(a.name), + _sid: genAttendeeSid(), + })), }); } @@ -5499,7 +5503,7 @@ function ManageSection({ // for new meetings, while preserving any pre-existing English // title on edits (the dialog hides the field but openEdit still // loads it into MeetingFormState). - const titleEn = editing.titleEn.trim() || editing.titleAr.trim(); + const titleEnPlain = editing.titleEn.trim() || editing.titleAr.trim(); // Prefer the dialog-supplied canonical values from the time // picker's commit() result over the controlled `editing.*` // state — the picker's onChange suppresses ambiguous/invalid @@ -5514,8 +5518,8 @@ function ManageSection({ : editing.endTime || null; setSaving(true); const body: Record = { - titleAr: editing.titleAr.trim(), - titleEn, + titleAr: wrapAsParagraph(editing.titleAr), + titleEn: wrapAsParagraph(titleEnPlain), meetingDate: editing.meetingDate, startTime, endTime, @@ -5526,7 +5530,7 @@ function ManageSection({ isHighlighted: editing.isHighlighted ? 1 : 0, notes: editing.notes.trim() || null, attendees: editing.attendees.map((a, idx) => ({ - name: a.name, + name: wrapAsParagraph(a.name), title: a.title, attendanceType: a.attendanceType, sortOrder: idx, @@ -6404,16 +6408,6 @@ function MeetingFormDialog({ {t("executiveMeetings.manage.attendees.removeAll")} )} - +