eb25beec29
Two issues reported on the new "اجتماع خارجي" toggle from #635: 1. "Doesn't save." Investigation: the server schema, PATCH/POST handlers, GET endpoint (full-row select), and DB column are all correct, and `docker/migrate.sh` runs `pnpm --filter @workspace/db run push-force` on every `docker compose up`, so the production schema does receive the `is_external` column. The likeliest real-world cause is a stale API image (column existed but the post-review API code that persists the flag wasn't deployed yet), or a transient stale-state render where `state.isExternal` was undefined and silently dropped from the PATCH body. Hardened the client so neither can happen again: - Both save sites (Manage dialog `save()` ~6700, inline Schedule edit save body ~3421) now send `Boolean(state.isExternal)` instead of the raw value, so an undefined state coerces to `false` rather than dropping the field. 2. "Overlaps other fields." The toggle row was sharing a row with the date input in the 2-col grid and used a fixed `h-9` wrapper that sat awkwardly next to the taller time pickers on narrow screens. - Made the FormRow `full` so it spans both columns on its own row, above the time pickers. - Dropped the fixed `h-9` and switched to `py-1` + `gap-3` + `text-sm` so it matches the form's vertical rhythm on iPhone, iPad portrait, iPad landscape, and desktop. Out of scope / not changed - No server changes (the server already accepts boolean | number and coerces to boolean; `Boolean(data.isExternal ?? false)` on POST and `if (data.isExternal !== undefined)` on PATCH are unchanged). - No new badge / copy — that lives under separate proposed work. - Postpone / cascade rules unchanged.