@rapidmx/web-client 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +373 -373
  2. package/apps/admin/branding/index.tsx +39 -39
  3. package/apps/admin/data-requests/index.tsx +482 -480
  4. package/apps/admin/domains/[uid].tsx +164 -163
  5. package/apps/admin/escrow-scopes/[uid].tsx +348 -348
  6. package/apps/admin/index.tsx +127 -124
  7. package/apps/admin/mailboxes/[uid].tsx +269 -224
  8. package/apps/admin/mailboxes/new/index.tsx +28 -28
  9. package/apps/admin/plugins/index.tsx +15 -15
  10. package/apps/admin/retention-policy/index.tsx +39 -39
  11. package/apps/admin/signing-certificates/index.tsx +343 -343
  12. package/apps/escrow/audit-log/index.tsx +196 -196
  13. package/apps/escrow/matters/[uid].tsx +621 -621
  14. package/apps/shared/appearance/AppearanceForm.tsx +9 -1
  15. package/apps/shared/auth/adminAccess.ts +99 -99
  16. package/apps/shared/calendar/bookingPlugin.ts +100 -0
  17. package/apps/shared/calendar/calendarLiveUpdates.ts +27 -0
  18. package/apps/shared/components/admin/layout/AdminShell.tsx +378 -346
  19. package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +238 -0
  20. package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -152
  21. package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +194 -0
  22. package/apps/shared/components/admin/settings/BrandingForm.tsx +423 -423
  23. package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +119 -119
  24. package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +53 -4
  25. package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +198 -198
  26. package/apps/shared/components/admin/settings/PluginsManager.tsx +64 -10
  27. package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +182 -182
  28. package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +288 -288
  29. package/apps/shared/components/admin/setup/SetupWizard.tsx +444 -444
  30. package/apps/shared/components/admin/usePagedList.tsx +129 -129
  31. package/apps/shared/components/calendar/AppointmentQuickForm.tsx +327 -0
  32. package/apps/shared/components/calendar/DescriptionEditor.tsx +274 -0
  33. package/apps/shared/components/calendar/EventDescriptionView.tsx +70 -0
  34. package/apps/shared/components/calendar/EventDetails.tsx +401 -0
  35. package/apps/shared/components/calendar/EventEditor.tsx +635 -0
  36. package/apps/shared/components/calendar/EventExpandedForm.tsx +210 -0
  37. package/apps/shared/components/calendar/EventFormParts.tsx +591 -0
  38. package/apps/shared/components/calendar/EventModal.tsx +206 -946
  39. package/apps/shared/components/calendar/EventQuickForm.tsx +116 -0
  40. package/apps/shared/components/calendar/EventShell.tsx +202 -0
  41. package/apps/shared/components/calendar/FindATime.tsx +379 -0
  42. package/apps/shared/components/calendar/GuestInput.tsx +100 -0
  43. package/apps/shared/components/calendar/LazyDescriptionEditor.tsx +70 -0
  44. package/apps/shared/components/calendar/MonthView.tsx +185 -173
  45. package/apps/shared/components/calendar/QuickCreateFaces.tsx +87 -0
  46. package/apps/shared/components/calendar/QuickCreateTabs.tsx +81 -0
  47. package/apps/shared/components/calendar/QuickFaceFrame.tsx +81 -0
  48. package/apps/shared/components/calendar/RecurrenceEditor.tsx +227 -222
  49. package/apps/shared/components/calendar/RequestChangeForm.tsx +240 -0
  50. package/apps/shared/components/calendar/SplitDayView.tsx +144 -143
  51. package/apps/shared/components/calendar/TaskQuickForm.tsx +289 -0
  52. package/apps/shared/components/calendar/TimeGridView.tsx +246 -244
  53. package/apps/shared/components/calendar/allDay.ts +124 -124
  54. package/apps/shared/components/calendar/eventDialogFields.ts +86 -0
  55. package/apps/shared/components/calendar/eventForm.ts +108 -0
  56. package/apps/shared/components/calendar/eventFormat.ts +210 -0
  57. package/apps/shared/components/calendar/findTimeGrid.ts +90 -0
  58. package/apps/shared/components/calendar/layout/CalendarShell.tsx +201 -200
  59. package/apps/shared/components/calendar/swipeNavigation.ts +14 -0
  60. package/apps/shared/components/contacts/ContactForm.tsx +383 -383
  61. package/apps/shared/components/contacts/ContactsSidebar.tsx +1 -1
  62. package/apps/shared/components/contacts/ContactsToolbar.tsx +103 -98
  63. package/apps/shared/components/contacts/layout/ContactsShell.tsx +217 -216
  64. package/apps/shared/components/escrow/layout/EscrowShell.tsx +155 -155
  65. package/apps/shared/components/layout/AppShell.tsx +480 -480
  66. package/apps/shared/components/layout/FloatingActionButton.tsx +31 -0
  67. package/apps/shared/components/layout/KeyEnrollmentGate.tsx +398 -398
  68. package/apps/shared/components/layout/MailboxProvisioning.tsx +168 -168
  69. package/apps/shared/components/layout/ResponsiveToolbar.tsx +315 -315
  70. package/apps/shared/components/layout/ThemeSwitch.tsx +84 -84
  71. package/apps/shared/components/layout/UserMenu.tsx +439 -372
  72. package/apps/shared/components/mail/ConversationList.tsx +323 -271
  73. package/apps/shared/components/mail/ConversationThreadPane.tsx +130 -5
  74. package/apps/shared/components/mail/InviteCard.tsx +387 -0
  75. package/apps/shared/components/mail/MailSelectionBar.tsx +236 -227
  76. package/apps/shared/components/mail/MessageDetailPane.tsx +1559 -1537
  77. package/apps/shared/components/mail/SwipeRow.tsx +120 -0
  78. package/apps/shared/components/mail/compose/ComposeContext.tsx +312 -312
  79. package/apps/shared/components/mail/compose/ComposeToolbar.tsx +422 -422
  80. package/apps/shared/components/mail/compose/ComposeWindow.tsx +1681 -1673
  81. package/apps/shared/components/mail/compose/RecipientInput.tsx +54 -11
  82. package/apps/shared/components/mail/compose/RichTextEditor.tsx +147 -147
  83. package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -60
  84. package/apps/shared/components/mail/compose/quotedBody.ts +161 -161
  85. package/apps/shared/components/mail/invite/InviteRowChip.tsx +104 -0
  86. package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +271 -0
  87. package/apps/shared/components/mail/invite/InviteTimeline.tsx +200 -0
  88. package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +109 -0
  89. package/apps/shared/components/mail/invite/inviteFormat.ts +110 -0
  90. package/apps/shared/components/mail/invite/inviteStore.ts +114 -0
  91. package/apps/shared/components/mail/layout/FolderBadgeChip.tsx +21 -0
  92. package/apps/shared/components/mail/layout/MailShell.tsx +546 -490
  93. package/apps/shared/components/mail/layout/SidebarSection.tsx +66 -0
  94. package/apps/shared/components/mail/reading/PendingMessageCard.tsx +68 -0
  95. package/apps/shared/components/mail/verificationSeals.ts +125 -125
  96. package/apps/shared/components/rules/RuleBuilder.tsx +311 -311
  97. package/apps/shared/components/settings/SigningCertificateCard.tsx +344 -344
  98. package/apps/shared/components/settings/layout/SettingsShell.tsx +255 -253
  99. package/apps/shared/components/tasks/TasksSidebar.tsx +1 -1
  100. package/apps/shared/components/tasks/layout/TasksShell.tsx +218 -217
  101. package/apps/shared/gestures/useEnterSlide.ts +54 -0
  102. package/apps/shared/gestures/useSwipe.ts +114 -0
  103. package/apps/shared/gestures/useSwipeSlide.ts +113 -0
  104. package/apps/shared/gestures/useWheelPaging.ts +107 -0
  105. package/apps/shared/keyboard/GlobalShortcuts.tsx +51 -51
  106. package/apps/shared/keyboard/ShortcutProvider.tsx +62 -62
  107. package/apps/shared/keyboard/ShortcutsDialog.tsx +84 -84
  108. package/apps/shared/keyboard/dispatch.ts +124 -124
  109. package/apps/shared/keyboard/format.ts +89 -89
  110. package/apps/shared/keyboard/keymap.ts +114 -114
  111. package/apps/shared/keyboard/registry.ts +65 -65
  112. package/apps/shared/keyboard/targets.ts +79 -79
  113. package/apps/shared/mail/folderCounts.ts +17 -0
  114. package/apps/shared/mail/folderTree.ts +143 -143
  115. package/apps/shared/mail/listAllPages.ts +39 -39
  116. package/apps/shared/mail/newMailNotifications.ts +3 -15
  117. package/apps/shared/mail/outbox/outgoingReplies.ts +192 -0
  118. package/apps/shared/mail/outbox/sendJob.ts +19 -1
  119. package/apps/shared/mail/outbox/sendOutcomes.ts +13 -4
  120. package/apps/shared/mail/primaryMailbox.ts +71 -0
  121. package/apps/shared/mail/useCollapsedSections.ts +146 -0
  122. package/apps/shared/mail/useMailConnection.ts +205 -203
  123. package/apps/shared/mail/useMailLiveUpdates.ts +277 -277
  124. package/apps/shared/mail/useMarkMessageRead.ts +47 -47
  125. package/apps/shared/mail/useNewMailNotifications.ts +2 -2
  126. package/apps/shared/navigation/AppRouter.tsx +300 -300
  127. package/apps/shared/navigation/routerContext.tsx +83 -83
  128. package/apps/shared/notifications/preferences.ts +36 -0
  129. package/apps/shared/notifications/store.ts +9 -0
  130. package/apps/shared/search/LocalIndexLifecycle.tsx +114 -114
  131. package/apps/shared/search/crossMailboxSearch.ts +169 -0
  132. package/apps/shared/search/localIndexBuilder.ts +481 -481
  133. package/apps/shared/signing/enrollmentStorage.ts +33 -33
  134. package/apps/shared/signing/enrollmentTracker.ts +385 -385
  135. package/apps/shared/signing/enrollmentView.ts +251 -251
  136. package/apps/shared/signing/useNow.ts +19 -19
  137. package/apps/shared/signing/useSigningEnrollmentWatcher.ts +90 -90
  138. package/apps/shared/styles/app.css +396 -386
  139. package/apps/www/_routes.ts +1 -0
  140. package/apps/www/calendar/index.tsx +578 -469
  141. package/apps/www/contacts/[uid].tsx +109 -109
  142. package/apps/www/contacts/index.tsx +6 -0
  143. package/apps/www/index.tsx +2847 -2332
  144. package/apps/www/messages/[uid].tsx +135 -108
  145. package/apps/www/settings/auto-reply/index.tsx +133 -133
  146. package/apps/www/settings/encryption/index.tsx +1287 -1287
  147. package/apps/www/settings/filters/[uid].tsx +176 -176
  148. package/apps/www/settings/filters/index.tsx +102 -102
  149. package/apps/www/settings/filters/new/index.tsx +140 -140
  150. package/apps/www/settings/labels/index.tsx +204 -204
  151. package/apps/www/settings/privacy/index.tsx +492 -492
  152. package/apps/www/settings/profile/index.tsx +248 -0
  153. package/apps/www/settings/read-receipts/index.tsx +147 -147
  154. package/apps/www/settings/sharing/index.tsx +256 -256
  155. package/apps/www/settings/signatures/[uid].tsx +172 -172
  156. package/apps/www/settings/signatures/index.tsx +88 -88
  157. package/apps/www/settings/signatures/new/index.tsx +135 -135
  158. package/apps/www/tasks/index.tsx +649 -649
  159. package/dist/apps/admin/data-requests/index.js +1 -1
  160. package/dist/apps/admin/domains/[uid].js +4 -2
  161. package/dist/apps/admin/index.js +2 -1
  162. package/dist/apps/admin/mailboxes/[uid].js +12 -2
  163. package/dist/apps/shared/appearance/AppearanceForm.js +9 -1
  164. package/dist/apps/shared/calendar/bookingPlugin.d.ts +50 -0
  165. package/dist/apps/shared/calendar/bookingPlugin.js +57 -0
  166. package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +11 -0
  167. package/dist/apps/shared/calendar/calendarLiveUpdates.js +23 -0
  168. package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
  169. package/dist/apps/shared/components/admin/layout/AdminShell.js +7 -3
  170. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +35 -0
  171. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +115 -0
  172. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.d.ts +16 -0
  173. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +92 -0
  174. package/dist/apps/shared/components/admin/settings/BrandingForm.js +3 -3
  175. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +28 -4
  176. package/dist/apps/shared/components/admin/settings/PluginsManager.js +40 -6
  177. package/dist/apps/shared/components/calendar/AppointmentQuickForm.d.ts +47 -0
  178. package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +135 -0
  179. package/dist/apps/shared/components/calendar/DescriptionEditor.d.ts +26 -0
  180. package/dist/apps/shared/components/calendar/DescriptionEditor.js +192 -0
  181. package/dist/apps/shared/components/calendar/EventDescriptionView.d.ts +14 -0
  182. package/dist/apps/shared/components/calendar/EventDescriptionView.js +39 -0
  183. package/dist/apps/shared/components/calendar/EventDetails.d.ts +33 -0
  184. package/dist/apps/shared/components/calendar/EventDetails.js +137 -0
  185. package/dist/apps/shared/components/calendar/EventEditor.d.ts +59 -0
  186. package/dist/apps/shared/components/calendar/EventEditor.js +544 -0
  187. package/dist/apps/shared/components/calendar/EventExpandedForm.d.ts +14 -0
  188. package/dist/apps/shared/components/calendar/EventExpandedForm.js +44 -0
  189. package/dist/apps/shared/components/calendar/EventFormParts.d.ts +70 -0
  190. package/dist/apps/shared/components/calendar/EventFormParts.js +191 -0
  191. package/dist/apps/shared/components/calendar/EventModal.d.ts +26 -13
  192. package/dist/apps/shared/components/calendar/EventModal.js +57 -459
  193. package/dist/apps/shared/components/calendar/EventQuickForm.d.ts +18 -0
  194. package/dist/apps/shared/components/calendar/EventQuickForm.js +25 -0
  195. package/dist/apps/shared/components/calendar/EventShell.d.ts +64 -0
  196. package/dist/apps/shared/components/calendar/EventShell.js +134 -0
  197. package/dist/apps/shared/components/calendar/FindATime.d.ts +18 -0
  198. package/dist/apps/shared/components/calendar/FindATime.js +190 -0
  199. package/dist/apps/shared/components/calendar/GuestInput.d.ts +45 -0
  200. package/dist/apps/shared/components/calendar/GuestInput.js +30 -0
  201. package/dist/apps/shared/components/calendar/LazyDescriptionEditor.d.ts +8 -0
  202. package/dist/apps/shared/components/calendar/LazyDescriptionEditor.js +44 -0
  203. package/dist/apps/shared/components/calendar/MonthView.d.ts +5 -1
  204. package/dist/apps/shared/components/calendar/MonthView.js +11 -5
  205. package/dist/apps/shared/components/calendar/QuickCreateFaces.d.ts +30 -0
  206. package/dist/apps/shared/components/calendar/QuickCreateFaces.js +44 -0
  207. package/dist/apps/shared/components/calendar/QuickCreateTabs.d.ts +24 -0
  208. package/dist/apps/shared/components/calendar/QuickCreateTabs.js +46 -0
  209. package/dist/apps/shared/components/calendar/QuickFaceFrame.d.ts +25 -0
  210. package/dist/apps/shared/components/calendar/QuickFaceFrame.js +19 -0
  211. package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +4 -1
  212. package/dist/apps/shared/components/calendar/RecurrenceEditor.js +2 -2
  213. package/dist/apps/shared/components/calendar/RequestChangeForm.d.ts +36 -0
  214. package/dist/apps/shared/components/calendar/RequestChangeForm.js +127 -0
  215. package/dist/apps/shared/components/calendar/SplitDayView.d.ts +3 -2
  216. package/dist/apps/shared/components/calendar/SplitDayView.js +3 -2
  217. package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +40 -0
  218. package/dist/apps/shared/components/calendar/TaskQuickForm.js +101 -0
  219. package/dist/apps/shared/components/calendar/TimeGridView.d.ts +4 -2
  220. package/dist/apps/shared/components/calendar/TimeGridView.js +3 -2
  221. package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +28 -0
  222. package/dist/apps/shared/components/calendar/eventDialogFields.js +59 -0
  223. package/dist/apps/shared/components/calendar/eventForm.d.ts +98 -0
  224. package/dist/apps/shared/components/calendar/eventForm.js +1 -0
  225. package/dist/apps/shared/components/calendar/eventFormat.d.ts +80 -0
  226. package/dist/apps/shared/components/calendar/eventFormat.js +190 -0
  227. package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +30 -0
  228. package/dist/apps/shared/components/calendar/findTimeGrid.js +83 -0
  229. package/dist/apps/shared/components/calendar/layout/CalendarShell.js +3 -2
  230. package/dist/apps/shared/components/calendar/swipeNavigation.d.ts +9 -0
  231. package/dist/apps/shared/components/calendar/swipeNavigation.js +8 -0
  232. package/dist/apps/shared/components/contacts/ContactsSidebar.js +1 -1
  233. package/dist/apps/shared/components/contacts/ContactsToolbar.d.ts +3 -1
  234. package/dist/apps/shared/components/contacts/ContactsToolbar.js +4 -2
  235. package/dist/apps/shared/components/contacts/layout/ContactsShell.js +4 -3
  236. package/dist/apps/shared/components/layout/FloatingActionButton.d.ts +13 -0
  237. package/dist/apps/shared/components/layout/FloatingActionButton.js +9 -0
  238. package/dist/apps/shared/components/layout/UserMenu.d.ts +14 -9
  239. package/dist/apps/shared/components/layout/UserMenu.js +74 -26
  240. package/dist/apps/shared/components/mail/ConversationList.d.ts +12 -1
  241. package/dist/apps/shared/components/mail/ConversationList.js +21 -4
  242. package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +4 -1
  243. package/dist/apps/shared/components/mail/ConversationThreadPane.js +127 -22
  244. package/dist/apps/shared/components/mail/InviteCard.d.ts +20 -0
  245. package/dist/apps/shared/components/mail/InviteCard.js +150 -0
  246. package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +6 -1
  247. package/dist/apps/shared/components/mail/MailSelectionBar.js +3 -3
  248. package/dist/apps/shared/components/mail/MessageDetailPane.js +13 -2
  249. package/dist/apps/shared/components/mail/SwipeRow.d.ts +22 -0
  250. package/dist/apps/shared/components/mail/SwipeRow.js +71 -0
  251. package/dist/apps/shared/components/mail/compose/ComposeWindow.js +16 -7
  252. package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +21 -1
  253. package/dist/apps/shared/components/mail/compose/RecipientInput.js +18 -10
  254. package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +23 -0
  255. package/dist/apps/shared/components/mail/invite/InviteRowChip.js +46 -0
  256. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +20 -0
  257. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +141 -0
  258. package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +27 -0
  259. package/dist/apps/shared/components/mail/invite/InviteTimeline.js +120 -0
  260. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +17 -0
  261. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +45 -0
  262. package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +28 -0
  263. package/dist/apps/shared/components/mail/invite/inviteFormat.js +94 -0
  264. package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +28 -0
  265. package/dist/apps/shared/components/mail/invite/inviteStore.js +95 -0
  266. package/dist/apps/shared/components/mail/layout/FolderBadgeChip.d.ts +6 -0
  267. package/dist/apps/shared/components/mail/layout/FolderBadgeChip.js +9 -0
  268. package/dist/apps/shared/components/mail/layout/MailShell.d.ts +10 -0
  269. package/dist/apps/shared/components/mail/layout/MailShell.js +76 -46
  270. package/dist/apps/shared/components/mail/layout/SidebarSection.d.ts +23 -0
  271. package/dist/apps/shared/components/mail/layout/SidebarSection.js +16 -0
  272. package/dist/apps/shared/components/mail/reading/PendingMessageCard.d.ts +14 -0
  273. package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +16 -0
  274. package/dist/apps/shared/components/settings/layout/SettingsShell.js +7 -5
  275. package/dist/apps/shared/components/tasks/TasksSidebar.js +1 -1
  276. package/dist/apps/shared/components/tasks/layout/TasksShell.js +4 -3
  277. package/dist/apps/shared/gestures/useEnterSlide.d.ts +14 -0
  278. package/dist/apps/shared/gestures/useEnterSlide.js +47 -0
  279. package/dist/apps/shared/gestures/useSwipe.d.ts +45 -0
  280. package/dist/apps/shared/gestures/useSwipe.js +90 -0
  281. package/dist/apps/shared/gestures/useSwipeSlide.d.ts +40 -0
  282. package/dist/apps/shared/gestures/useSwipeSlide.js +95 -0
  283. package/dist/apps/shared/gestures/useWheelPaging.d.ts +32 -0
  284. package/dist/apps/shared/gestures/useWheelPaging.js +85 -0
  285. package/dist/apps/shared/mail/folderCounts.d.ts +10 -0
  286. package/dist/apps/shared/mail/folderCounts.js +12 -0
  287. package/dist/apps/shared/mail/newMailNotifications.d.ts +3 -8
  288. package/dist/apps/shared/mail/newMailNotifications.js +3 -12
  289. package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +80 -0
  290. package/dist/apps/shared/mail/outbox/outgoingReplies.js +131 -0
  291. package/dist/apps/shared/mail/outbox/sendJob.d.ts +5 -1
  292. package/dist/apps/shared/mail/outbox/sendJob.js +14 -1
  293. package/dist/apps/shared/mail/outbox/sendOutcomes.js +13 -4
  294. package/dist/apps/shared/mail/primaryMailbox.d.ts +29 -0
  295. package/dist/apps/shared/mail/primaryMailbox.js +61 -0
  296. package/dist/apps/shared/mail/useCollapsedSections.d.ts +32 -0
  297. package/dist/apps/shared/mail/useCollapsedSections.js +110 -0
  298. package/dist/apps/shared/mail/useMailConnection.js +3 -1
  299. package/dist/apps/shared/mail/useNewMailNotifications.js +3 -2
  300. package/dist/apps/shared/notifications/preferences.d.ts +13 -0
  301. package/dist/apps/shared/notifications/preferences.js +36 -0
  302. package/dist/apps/shared/notifications/store.d.ts +1 -0
  303. package/dist/apps/shared/notifications/store.js +7 -23
  304. package/dist/apps/shared/search/crossMailboxSearch.d.ts +72 -0
  305. package/dist/apps/shared/search/crossMailboxSearch.js +136 -0
  306. package/dist/apps/shared/styles/app.css +396 -386
  307. package/dist/apps/www/_routes.js +1 -0
  308. package/dist/apps/www/calendar/index.js +78 -7
  309. package/dist/apps/www/contacts/index.js +3 -1
  310. package/dist/apps/www/index.js +548 -210
  311. package/dist/apps/www/messages/[uid].js +13 -5
  312. package/dist/apps/www/settings/profile/index.d.ts +4 -0
  313. package/dist/apps/www/settings/profile/index.js +124 -0
  314. package/package.json +2 -2
@@ -0,0 +1,70 @@
1
+ import React, { ReactNode } from "react";
2
+ import { RecurrenceRule, WeekdayCode } from "@rapidmx/react-shared/calendar/calendarApi.js";
3
+ import { EventFormController } from "./eventForm.js";
4
+ export declare const INPUT_CLASS = "w-full text-sm py-2 px-3 border border-border rounded-md bg-surface text-text focus:outline-none focus:border-primary";
5
+ export declare const SELECT_CLASS = "text-sm py-2 px-2 border border-border rounded-md bg-surface text-text focus:outline-none focus:border-primary";
6
+ /** A form row: an icon in the left gutter and its content. */
7
+ export declare function IconRow({ icon, children }: {
8
+ icon: ReactNode;
9
+ children: ReactNode;
10
+ }): React.JSX.Element;
11
+ /** The location row: a text box that is plain text until it is used. */
12
+ export declare function LocationRow({ c }: {
13
+ c: EventFormController;
14
+ }): React.JSX.Element;
15
+ /** "Add video conferencing" and, once the event has a meeting, the button that joins it. */
16
+ export declare function VideoConferencingRow({ c }: {
17
+ c: EventFormController;
18
+ }): React.JSX.Element;
19
+ /**
20
+ * The guests field: compose's recipient field (`GuestInput`), which looks a name up among the contacts and the server's mailboxes and lists and
21
+ * turns what is picked, typed or pasted into chips - drawn in the field itself in the quick popover. In the full form the guests are rows with a
22
+ * role, the answer so far and a remove button instead (the field then draws only what is not an address), and rooms and equipment can be added.
23
+ */
24
+ export declare function GuestsField({ c, compact }: {
25
+ c: EventFormController;
26
+ compact: boolean;
27
+ }): React.JSX.Element;
28
+ /** The guests row of the quick popover. */
29
+ export declare function GuestsRow({ c }: {
30
+ c: EventFormController;
31
+ }): React.JSX.Element;
32
+ /** The reminder row: the one notification an event has - an amount, its unit and a way to remove it - or "Add notification". */
33
+ export declare function ReminderRow({ value, onChange }: {
34
+ value: string;
35
+ onChange: (minutes: string) => void;
36
+ }): React.JSX.Element;
37
+ /**
38
+ * "Does not repeat" and the plain repeats as a menu, with "Custom…" opening `RecurrenceEditor`'s full set (an interval, weekdays, an end).
39
+ * Choosing one of the plain repeats keeps the rule's skipped dates; the menu shows "Custom…" for any rule it has no plain entry for.
40
+ */
41
+ export declare function RecurrenceSelect({ value, onChange, allDay, startWeekday, }: {
42
+ value: RecurrenceRule | null;
43
+ onChange: (rule: RecurrenceRule | null) => void;
44
+ allDay: boolean;
45
+ startWeekday: WeekdayCode | undefined;
46
+ }): React.JSX.Element;
47
+ /** [start date] [start time] to [end time] [end date], then "All day", the "Time zone" link (and its menu) and how the event repeats. */
48
+ export declare function DateTimeControls({ c }: {
49
+ c: EventFormController;
50
+ }): React.JSX.Element;
51
+ /** The calendar this event is in: its colour and name, a choice between calendars (and mailboxes) when an event is being created. */
52
+ export declare function CalendarField({ c }: {
53
+ c: EventFormController;
54
+ }): React.JSX.Element;
55
+ /**
56
+ * The description row: the rich-text box (`DescriptionEditor`). In the full card it is always there; in the quick-create popover (`collapsible`) it is an
57
+ * "Add description" row that opens the same box in place, as Google Calendar does - and stays open once there is text in it.
58
+ */
59
+ export declare function DescriptionRow({ c, collapsible }: {
60
+ c: EventFormController;
61
+ collapsible: boolean;
62
+ }): React.JSX.Element;
63
+ /** Who may see the event's details, with what each choice means underneath. */
64
+ export declare function VisibilitySelect({ c }: {
65
+ c: EventFormController;
66
+ }): React.JSX.Element;
67
+ /** What guests may do with the event: ask for it to change, ask for guests to be added, see who else is invited. Only the organizer sets these. */
68
+ export declare function GuestPermissions({ c }: {
69
+ c: EventFormController;
70
+ }): React.JSX.Element;
@@ -0,0 +1,191 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ ///////////////////////////////////////////////////////////////////////////////
3
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
4
+ // SPDX-License-Identifier: MPL-2.0
5
+ ///////////////////////////////////////////////////////////////////////////////
6
+ import { useRef, useState } from "react";
7
+ import { HiOutlineBars3BottomLeft, HiOutlineBell, HiOutlineMapPin, HiOutlineUserGroup, HiOutlineVideoCamera, HiOutlineXMark } from "react-icons/hi2";
8
+ import Button from "@rapidmx/react-shared/components/buttons/Button.js";
9
+ import GuestInput from "./GuestInput.js";
10
+ import LazyDescriptionEditor from "./LazyDescriptionEditor.js";
11
+ import RecurrenceEditor from "./RecurrenceEditor.js";
12
+ import ResourcePicker from "./ResourcePicker.js";
13
+ import { hasDescriptionText } from "./eventDialogFields.js";
14
+ import { REMINDER_UNITS, RESPONSE_STATUS_LABEL, VISIBILITIES, VISIBILITY_HELP, VISIBILITY_LABEL, bestReminderUnit, } from "./eventFormat.js";
15
+ export const INPUT_CLASS = "w-full text-sm py-2 px-3 border border-border rounded-md bg-surface text-text focus:outline-none focus:border-primary";
16
+ export const SELECT_CLASS = "text-sm py-2 px-2 border border-border rounded-md bg-surface text-text focus:outline-none focus:border-primary";
17
+ /** A text field that reads as plain text until it is hovered or focused, as a row of the quick-create popover does. */
18
+ const QUIET_INPUT_CLASS = "w-full min-w-0 text-sm py-1.5 bg-transparent text-text border-0 border-b border-transparent hover:border-border focus:border-primary focus:outline-none placeholder:text-text-muted";
19
+ const ROW_ICON_CLASS = "shrink-0 text-text-muted mt-1.5";
20
+ const ATTENDEE_ROLES = ["required", "optional", "resource"];
21
+ /** A form row: an icon in the left gutter and its content. */
22
+ export function IconRow({ icon, children }) {
23
+ return (_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("span", { "aria-hidden": "true", className: ROW_ICON_CLASS, children: icon }), _jsx("div", { className: "flex-1 min-w-0", children: children })] }));
24
+ }
25
+ /** The location row: a text box that is plain text until it is used. */
26
+ export function LocationRow({ c }) {
27
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineMapPin, { size: 20 }), children: _jsx("input", { type: "text", "aria-label": "Location", placeholder: "Add location", className: QUIET_INPUT_CLASS, value: c.values.location, onChange: (e) => c.update({ location: e.target.value }) }) }));
28
+ }
29
+ /** "Add video conferencing" and, once the event has a meeting, the button that joins it. */
30
+ export function VideoConferencingRow({ c }) {
31
+ const { values } = c;
32
+ return (_jsxs(IconRow, { icon: _jsx(HiOutlineVideoCamera, { size: 20 }), children: [_jsxs("label", { className: "flex items-center gap-2 text-sm py-1.5", children: [_jsx("input", { type: "checkbox", checked: values.videoEnabled, onChange: (e) => c.update({ videoEnabled: e.target.checked }) }), "Add video conferencing"] }), values.videoEnabled && (_jsx("p", { className: "text-xs text-text-muted mb-1", children: "Changing attendees after enabling video conferencing won\u2019t update meeting invitees \u2014 turn this off and back on to reissue links to the current attendee list." })), c.videoError && (_jsx("p", { role: "alert", className: "text-xs text-danger mb-1", children: c.videoError })), c.videoMeetingUid && (_jsxs("div", { className: "flex items-center gap-3 mb-1", children: [_jsx(Button, { type: "button", variant: "secondary", className: "!w-auto", disabled: !c.joinUrl, onClick: () => window.open(c.joinUrl, "_blank", "noopener,noreferrer"), children: "Join video call" }), !c.joinUrl && (_jsx("span", { className: "text-xs text-text-muted", children: c.organizerJoinUrl === undefined ? "Loading the join link…" : "This meeting’s join link isn’t available." }))] }))] }));
33
+ }
34
+ /**
35
+ * The guests field: compose's recipient field (`GuestInput`), which looks a name up among the contacts and the server's mailboxes and lists and
36
+ * turns what is picked, typed or pasted into chips - drawn in the field itself in the quick popover. In the full form the guests are rows with a
37
+ * role, the answer so far and a remove button instead (the field then draws only what is not an address), and rooms and equipment can be added.
38
+ */
39
+ export function GuestsField({ c, compact }) {
40
+ const { values } = c;
41
+ const [pickerOpen, setPickerOpen] = useState(false);
42
+ const pickerAnchor = useRef(null);
43
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(GuestInput, { id: "event-guests", label: "Add guests", placeholder: "Add guests", variant: compact ? "quiet" : "box", listedElsewhere: !compact, guests: values.attendees, invalid: values.guestInvalid, draft: values.guestDraft, skipAddresses: [c.organizerAddress], mailboxUid: values.targetMailboxUid, onChange: (next) => c.update({ attendees: next.guests, guestInvalid: next.invalid, guestDraft: next.draft }) }), compact ? null : (_jsxs(_Fragment, { children: [values.attendees.length > 0 && (_jsx("ul", { className: "flex flex-col gap-2", children: values.attendees.map((attendee, i) => (_jsxs("li", { className: "flex items-center gap-2", children: [_jsx("span", { "aria-hidden": "true", className: "w-7 h-7 shrink-0 rounded-full bg-primary/15 text-primary-dark text-xs font-semibold flex items-center justify-center uppercase", children: (attendee.displayName || attendee.address).charAt(0) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "text-sm truncate", children: attendee.displayName || attendee.address }), _jsxs("div", { className: "text-xs text-text-muted truncate", children: [attendee.displayName ? `${attendee.address} · ` : "", RESPONSE_STATUS_LABEL[attendee.responseStatus]] })] }), _jsx("select", { className: SELECT_CLASS, value: attendee.role, onChange: (e) => c.updateAttendee(i, { role: e.target.value }), "aria-label": `Attendee role ${i + 1}`, children: ATTENDEE_ROLES.map((role) => (_jsx("option", { value: role, children: role }, role))) }), _jsx("button", { type: "button", onClick: () => c.removeAttendee(i), className: "w-7 h-7 flex items-center justify-center rounded-full text-text-muted hover:bg-surface-alt hover:text-text", "aria-label": `Remove attendee ${i + 1}`, children: _jsx(HiOutlineXMark, { size: 16, "aria-hidden": "true" }) })] }, i))) })), _jsx("button", { ref: pickerAnchor, type: "button", onClick: () => setPickerOpen(true), className: "self-start text-xs font-medium text-primary-dark hover:underline", children: "+ Add room/equipment" }), pickerOpen && (_jsx(ResourcePicker, { anchorRef: pickerAnchor, onClose: () => setPickerOpen(false), onSelect: (mailbox) => {
44
+ c.addResource(mailbox);
45
+ setPickerOpen(false);
46
+ }, excludeAddresses: c.guestAddresses }))] }))] }));
47
+ }
48
+ /** The guests row of the quick popover. */
49
+ export function GuestsRow({ c }) {
50
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineUserGroup, { size: 20 }), children: _jsx(GuestsField, { c: c, compact: true }) }));
51
+ }
52
+ /** The reminder row: the one notification an event has - an amount, its unit and a way to remove it - or "Add notification". */
53
+ export function ReminderRow({ value, onChange }) {
54
+ const [active, setActive] = useState(value.trim() !== "");
55
+ const [unit, setUnit] = useState(() => (value.trim() === "" ? "minutes" : bestReminderUnit(Number(value)).unit));
56
+ const factor = REMINDER_UNITS.find((u) => u.unit === unit).factor;
57
+ // What the amount box shows: the stored minutes in the chosen unit. A blank stays blank while the row is open.
58
+ const amount = value.trim() === "" ? "" : String(Math.round((Number(value) / factor) * 100) / 100);
59
+ function change(nextAmount, nextUnit) {
60
+ const nextFactor = REMINDER_UNITS.find((u) => u.unit === nextUnit).factor;
61
+ onChange(nextAmount.trim() === "" ? "" : String(Math.round(Number(nextAmount) * nextFactor)));
62
+ }
63
+ if (!active) {
64
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineBell, { size: 20 }), children: _jsx("button", { type: "button", className: "text-sm text-text-muted hover:text-text py-1.5", onClick: () => {
65
+ setActive(true);
66
+ setUnit("minutes");
67
+ onChange("30");
68
+ }, children: "Add notification" }) }));
69
+ }
70
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineBell, { size: 20 }), children: _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { children: "Notification" }), _jsx("input", { type: "number", min: 0, className: `${INPUT_CLASS} !w-20`, "aria-label": "Reminder (minutes before)", value: amount, onChange: (e) => change(e.target.value, unit) }), _jsx("select", { className: SELECT_CLASS, "aria-label": "Reminder unit", value: unit, onChange: (e) => {
71
+ const nextUnit = e.target.value;
72
+ setUnit(nextUnit);
73
+ change(amount, nextUnit);
74
+ }, children: REMINDER_UNITS.map((u) => (_jsx("option", { value: u.unit, children: u.unit }, u.unit))) }), _jsx("span", { className: "text-text-muted", children: "before" }), _jsx("button", { type: "button", "aria-label": "Remove notification", className: "ml-auto w-7 h-7 flex items-center justify-center rounded-full text-text-muted hover:bg-surface-alt hover:text-text", onClick: () => {
75
+ setActive(false);
76
+ onChange("");
77
+ }, children: _jsx(HiOutlineXMark, { size: 16, "aria-hidden": "true" }) })] }) }));
78
+ }
79
+ const WEEKDAYS_ONLY = ["MO", "TU", "WE", "TH", "FR"];
80
+ const WEEKDAY_NAME = {
81
+ MO: "Monday",
82
+ TU: "Tuesday",
83
+ WE: "Wednesday",
84
+ TH: "Thursday",
85
+ FR: "Friday",
86
+ SA: "Saturday",
87
+ SU: "Sunday",
88
+ };
89
+ function presetRule(key, startWeekday) {
90
+ switch (key) {
91
+ case "daily":
92
+ return { freq: "daily", interval: 1, exceptions: [] };
93
+ case "weekly":
94
+ return { freq: "weekly", interval: 1, byDay: [startWeekday ?? "MO"], exceptions: [] };
95
+ case "monthly":
96
+ return { freq: "monthly", interval: 1, exceptions: [] };
97
+ case "yearly":
98
+ return { freq: "yearly", interval: 1, exceptions: [] };
99
+ case "weekdays":
100
+ return { freq: "weekly", interval: 1, byDay: [...WEEKDAYS_ONLY], exceptions: [] };
101
+ }
102
+ }
103
+ /** Which menu entry a rule is: one of the plain repeats, or "custom" for anything with an interval, an end or other weekdays. */
104
+ function presetOf(rule, startWeekday) {
105
+ if (!rule) {
106
+ return "none";
107
+ }
108
+ if (rule.interval !== 1 || rule.count || rule.until || rule.byMonthDay?.length || rule.byMonth?.length) {
109
+ return "custom";
110
+ }
111
+ if (rule.freq === "weekly") {
112
+ const days = [...(rule.byDay ?? [])].sort().join(",");
113
+ if (days === [...WEEKDAYS_ONLY].sort().join(",")) {
114
+ return "weekdays";
115
+ }
116
+ return days === (startWeekday ?? "MO") ? "weekly" : "custom";
117
+ }
118
+ return rule.byDay?.length ? "custom" : rule.freq;
119
+ }
120
+ /**
121
+ * "Does not repeat" and the plain repeats as a menu, with "Custom…" opening `RecurrenceEditor`'s full set (an interval, weekdays, an end).
122
+ * Choosing one of the plain repeats keeps the rule's skipped dates; the menu shows "Custom…" for any rule it has no plain entry for.
123
+ */
124
+ export function RecurrenceSelect({ value, onChange, allDay, startWeekday, }) {
125
+ // Picking "Custom…" for a rule that is also a plain repeat still opens the editor.
126
+ const [customRequested, setCustomRequested] = useState(false);
127
+ const selected = customRequested && value ? "custom" : presetOf(value, startWeekday);
128
+ function choose(key) {
129
+ setCustomRequested(key === "custom");
130
+ if (key === "none") {
131
+ onChange(null);
132
+ }
133
+ else if (key === "custom") {
134
+ onChange(value ?? presetRule("weekly", startWeekday));
135
+ }
136
+ else {
137
+ onChange({ ...presetRule(key, startWeekday), exceptions: value?.exceptions ?? [] });
138
+ }
139
+ }
140
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("select", { id: "event-recurrence", "aria-label": "Recurrence", className: SELECT_CLASS, value: selected, onChange: (e) => choose(e.target.value), children: [_jsx("option", { value: "none", children: "Does not repeat" }), _jsx("option", { value: "daily", children: "Daily" }), _jsx("option", { value: "weekly", children: startWeekday ? `Weekly on ${WEEKDAY_NAME[startWeekday]}` : "Weekly" }), _jsx("option", { value: "monthly", children: "Monthly" }), _jsx("option", { value: "yearly", children: "Annually" }), _jsx("option", { value: "weekdays", children: "Every weekday (Monday to Friday)" }), _jsx("option", { value: "custom", children: "Custom\u2026" })] }), selected === "custom" && _jsx(RecurrenceEditor, { value: value, onChange: onChange, allDay: allDay, startWeekday: startWeekday, hideToggle: true })] }));
141
+ }
142
+ /** [start date] [start time] to [end time] [end date], then "All day", the "Time zone" link (and its menu) and how the event repeats. */
143
+ export function DateTimeControls({ c }) {
144
+ const { values } = c;
145
+ const [zoneOpen, setZoneOpen] = useState(false);
146
+ return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm", children: [_jsx("input", { type: "date", "aria-label": "Event start date", className: `${SELECT_CLASS} min-w-0`, value: values.start.slice(0, 10), onChange: (e) => c.setStart(`${e.target.value}${values.start.slice(10)}`) }), !values.allDay && (_jsx("input", { type: "time", "aria-label": "Event start time", className: `${SELECT_CLASS} min-w-0`, value: values.start.slice(11, 16), onChange: (e) => c.setStart(`${values.start.slice(0, 11)}${e.target.value}`) })), _jsx("span", { className: "text-text-muted", children: "to" }), !values.allDay && (_jsx("input", { type: "time", "aria-label": "Event end time", className: `${SELECT_CLASS} min-w-0`, value: values.end.slice(11, 16), onChange: (e) => c.setEnd(`${values.end.slice(0, 11)}${e.target.value}`) })), _jsx("input", { type: "date", "aria-label": "Event end date", className: `${SELECT_CLASS} min-w-0`, value: values.end.slice(0, 10), onChange: (e) => c.setEnd(`${e.target.value}${values.end.slice(10)}`) })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 text-sm", children: [_jsxs("label", { className: "flex items-center gap-2", children: [_jsx("input", { type: "checkbox", checked: values.allDay, onChange: (e) => c.onAllDayChange(e.target.checked) }), "All day"] }), _jsx("button", { type: "button", "aria-expanded": zoneOpen, className: "text-primary-dark hover:underline", onClick: () => setZoneOpen((open) => !open), children: "Time zone" }), !c.editingSingleOccurrence && (_jsx(RecurrenceSelect, { value: values.recurrenceRule, onChange: (rule) => c.update({ recurrenceRule: rule }), allDay: values.allDay, startWeekday: c.startWeekday }))] }), zoneOpen && (_jsx("select", { "aria-label": "Time zone", className: `${SELECT_CLASS} self-start max-w-full`, value: values.formZone, onChange: (e) => c.onTimeZoneChange(e.target.value), children: c.timeZones.map((zone) => (_jsx("option", { value: zone, children: zone }, zone))) }))] }));
147
+ }
148
+ /** The calendar this event is in: its colour and name, a choice between calendars (and mailboxes) when an event is being created. */
149
+ export function CalendarField({ c }) {
150
+ const { values } = c;
151
+ const mailboxChoices = !c.occurrence && c.mailboxOptions && c.mailboxOptions.length > 1 ? c.mailboxOptions : undefined;
152
+ const calendarChoices = !c.occurrence && c.calendarChoices && c.calendarChoices.length > 1 ? c.calendarChoices : undefined;
153
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [mailboxChoices && (_jsx("select", { "aria-label": "Mailbox", className: `${SELECT_CLASS} self-start max-w-full`, value: values.targetMailboxUid, onChange: (e) => c.onMailboxChange(e.target.value), children: mailboxChoices.map(({ mailbox }) => (_jsxs("option", { value: mailbox.uid, children: [mailbox.displayName, mailbox.ownerUserUid ? "" : " (shared)"] }, mailbox.uid))) })), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { "aria-hidden": "true", className: "w-3 h-3 rounded-full shrink-0", style: { backgroundColor: c.calendarColor } }), calendarChoices ? (_jsx("select", { "aria-label": "Calendar", className: `${SELECT_CLASS} min-w-0 max-w-full`, value: values.targetFolderUid, onChange: (e) => c.update({ targetFolderUid: e.target.value }), children: calendarChoices.map((cal) => (_jsx("option", { value: cal.uid, children: cal.name }, cal.uid))) })) : (_jsx("span", { className: "truncate", children: c.calendarName }))] })] }));
154
+ }
155
+ /**
156
+ * The description row: the rich-text box (`DescriptionEditor`). In the full card it is always there; in the quick-create popover (`collapsible`) it is an
157
+ * "Add description" row that opens the same box in place, as Google Calendar does - and stays open once there is text in it.
158
+ */
159
+ export function DescriptionRow({ c, collapsible }) {
160
+ const [opened, setOpened] = useState(false);
161
+ if (collapsible && !opened && !hasDescriptionText(c.values.descriptionHtml)) {
162
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineBars3BottomLeft, { size: 20 }), children: _jsx("button", { type: "button", className: "text-sm text-text-muted hover:text-text py-1.5", onClick: () => setOpened(true), children: "Add description" }) }));
163
+ }
164
+ return (_jsx(IconRow, { icon: _jsx(HiOutlineBars3BottomLeft, { size: 20 }), children: _jsx(LazyDescriptionEditor, { value: c.values.descriptionHtml, onChange: (html) => c.update({ descriptionHtml: html }), autoFocus: collapsible && opened }) }));
165
+ }
166
+ /** Who may see the event's details, with what each choice means underneath. */
167
+ export function VisibilitySelect({ c }) {
168
+ const { visibility } = c.values;
169
+ return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("select", { "aria-label": "Visibility", "aria-describedby": "event-visibility-help", className: `${SELECT_CLASS} !w-auto self-start`, value: visibility, onChange: (e) => c.update({ visibility: e.target.value }), children: VISIBILITIES.map((option) => (_jsx("option", { value: option, children: VISIBILITY_LABEL[option] }, option))) }), _jsx("p", { id: "event-visibility-help", className: "text-xs text-text-muted", children: VISIBILITY_HELP[visibility] })] }));
170
+ }
171
+ const GUEST_PERMISSIONS = [
172
+ {
173
+ key: "guestsCanModify",
174
+ label: "Modify event",
175
+ help: "Guests can ask you to change the title, location, description or time. What they ask for is sent to you and applied automatically when this is on.",
176
+ },
177
+ {
178
+ key: "guestsCanInviteOthers",
179
+ label: "Invite others",
180
+ help: "Guests can ask you to add more guests; those are added automatically when this is on.",
181
+ },
182
+ {
183
+ key: "guestsCanSeeGuestList",
184
+ label: "See guest list",
185
+ help: "When this is off, each guest is sent an invitation that names only themselves and you.",
186
+ },
187
+ ];
188
+ /** What guests may do with the event: ask for it to change, ask for guests to be added, see who else is invited. Only the organizer sets these. */
189
+ export function GuestPermissions({ c }) {
190
+ return (_jsxs("fieldset", { className: "flex flex-col gap-2 min-w-0", children: [_jsx("legend", { className: "text-sm font-semibold mb-1", children: "Guest permissions" }), GUEST_PERMISSIONS.map(({ key, label, help }) => (_jsxs("div", { children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", "aria-describedby": `event-${key}-help`, checked: c.values[key], onChange: (e) => c.update({ [key]: e.target.checked }) }), label] }), _jsx("p", { id: `event-${key}-help`, className: "text-xs text-text-muted pl-6", children: help })] }, key)))] }));
191
+ }
@@ -1,16 +1,9 @@
1
1
  import React from "react";
2
2
  import { Mailbox } from "@rapidmx/react-shared/mail/mailApi.js";
3
3
  import { CalendarOccurrence } from "@rapidmx/react-shared/calendar/recurrence.js";
4
- /**
5
- * The Location text this modal writes when it mints a video meeting for an event, and the one value it will
6
- * clear again when video conferencing is turned back off (see `applyVideoConferencing()`).
7
- *
8
- * Deliberately generic and identical for everyone: each attendee's own personal join link is substituted into
9
- * their own copy of the invitation server-side (`@rapidmx/restapi`'s `MeetingSchedulingJob`), so no link -
10
- * personal or otherwise - may be stored on the shared event itself, where every attendee would read the same
11
- * one.
12
- */
13
- export declare const VIDEO_LOCATION_PLACEHOLDER = "Video call \u2014 link in this invitation";
4
+ import { EventAnchor } from "./EventShell.js";
5
+ export { VIDEO_LOCATION_PLACEHOLDER } from "./EventEditor.js";
6
+ export type { EventAnchor } from "./EventShell.js";
14
7
  export interface EventModalProps {
15
8
  open: boolean;
16
9
  onClose: () => void;
@@ -36,6 +29,8 @@ export interface EventModalProps {
36
29
  name: string;
37
30
  }[];
38
31
  }[];
32
+ /** Each calendar's colour, keyed by folder uid: the dot next to the calendar's name. */
33
+ folderColors?: Record<string, string>;
39
34
  organizerAddress: string;
40
35
  /** The viewing mailbox's alias addresses - an event it organizes (or an invitation to it) may name any of
41
36
  * them instead of `organizerAddress`. Defaults to that mailbox's `aliasAddresses` from `mailboxOptions`. */
@@ -45,12 +40,30 @@ export interface EventModalProps {
45
40
  /** Prefilled start/end for create mode (e.g. the day/slot the user clicked). */
46
41
  initialStart?: Date;
47
42
  initialEnd?: Date;
43
+ /** Create mode: start as an all-day event on `initialStart`'s day (a day of the month view was clicked). */
44
+ initialAllDay?: boolean;
45
+ /** Create mode: what was clicked (a slot, a day, the New event button), which the quick-create popover opens beside. Without one it
46
+ * opens centered near the top of the window. */
47
+ anchor?: EventAnchor;
48
+ /** Where the booking plugin's Settings pages are (`/settings/booking-types`) when it is running: a new event then has an Appointment
49
+ * schedule tab, and its More options opens the plugin's own new-link page. Without it there are only the Event and Task tabs. */
50
+ bookingHref?: string;
48
51
  onSaved: () => void;
49
52
  onDeleted: () => void;
50
53
  }
51
54
  /**
52
- * Create/view/edit/delete for a single calendar event. Editing or deleting a recurring event's
53
- * occurrence offers a choice between "this event" and "the entire series" (see
55
+ * The calendar's event dialog, in three faces drawn through one frame (`EventShell`):
56
+ *
57
+ * - **A new event** opens as a quick-create popover (`EventQuickForm`, beside what was clicked; a bottom sheet on a phone). "More options"
58
+ * grows it into the full card (`EventExpandedForm`) with everything typed so far still in it.
59
+ * The popover has tabs (`QuickCreateTabs`): Event, Task, and - when the booking plugin is running (`bookingHref`) - Appointment schedule.
60
+ * The Task and Appointment faces are drawn by `QuickCreateFaces`, share the Event tab's title, mailbox and calendar, and only ever
61
+ * create a task or a booking type; the Event tab is the form it always was.
62
+ * - **An existing event** opens read-only (`EventDetails`): what the event says, the invited reader's Accept / Tentative / Decline,
63
+ * and Delete. The reader who organized it also gets Modify, which turns the same card into the full form; closing that form returns
64
+ * to the details, discarding the edits (a save closes everything, as it always did).
65
+ *
66
+ * Editing or deleting a recurring event's occurrence offers a choice between "this event" and "the entire series" (see
54
67
  * `calendarMutations.ts`) — Outlook's own convention for the same ambiguity.
55
68
  */
56
- export default function EventModal({ open, onClose, mailboxUid, folderUid, calendars, mailboxOptions, organizerAddress, organizerAliases, occurrence, initialStart, initialEnd, onSaved, onDeleted, }: EventModalProps): React.JSX.Element;
69
+ export default function EventModal({ open, onClose, mailboxUid, folderUid, calendars, mailboxOptions, folderColors, organizerAddress, organizerAliases, occurrence, initialStart, initialEnd, initialAllDay, anchor, bookingHref, onSaved, onDeleted, }: EventModalProps): React.JSX.Element | null;