- Shipped
- August 7, 2026 at 6:18 AM UTC
- Author
- kamo
- Commit
- 47a5bdc
The department dialog's contact email was free text, so it could name an address the org does not own. It becomes a picker over the org's real mailboxes -- the same list **************** offers, so "the assignable mailboxes" means the same set wherever it is offered. Optional, and "None" is both the default and how you unassign; a clear button in the field does it in one click. Behavior-labeling Contact Information keeps its email text field exactly as it was and gains the same picker beneath it. The two are independent: the text field is what the org publishes, the mailbox names one of the org's own. One MailboxSelect serves both screens so they cannot drift, over a shared cached fetch so Contact Information's read row and its picker do not each request the list. The states are kept distinct on purpose: an org with no mailboxes, a mail backend that is down, and a mailbox removed provider-side would otherwise all render as an empty field. The last one shows as "no longer available" rather than looking unassigned, because a stale pointer has to be visible to whoever fixes it. Department saves send the resolved address alongside the pointer. A SecurityService built before mailboxId existed ignores it and reads email, so without that this change would clear every department's address the first time one was saved against the currently deployed build. The rebuilt service ignores the field; remove the bridge once every environment is past that build.