@rapidmx/web-client 0.20.0 → 0.22.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.
- package/README.md +415 -381
- package/apps/admin/_layout.tsx +2 -2
- package/apps/admin/audit-log/index.tsx +4 -4
- package/apps/admin/branding/index.tsx +39 -39
- package/apps/admin/data-requests/index.tsx +482 -482
- package/apps/admin/distribution-lists/[uid].tsx +3 -3
- package/apps/admin/distribution-lists/index.tsx +4 -4
- package/apps/admin/distribution-lists/new/index.tsx +5 -5
- package/apps/admin/domains/[uid].tsx +166 -166
- package/apps/admin/domains/index.tsx +4 -4
- package/apps/admin/domains/new/index.tsx +5 -5
- package/apps/admin/encryption-policy/index.tsx +1 -1
- package/apps/admin/escrow-scopes/[uid].tsx +350 -350
- package/apps/admin/escrow-scopes/index.tsx +4 -4
- package/apps/admin/escrow-scopes/new/index.tsx +5 -5
- package/apps/admin/index.tsx +129 -129
- package/apps/admin/ingest-queue/index.tsx +4 -4
- package/apps/admin/mailbox-policy/index.tsx +1 -1
- package/apps/admin/mailboxes/[uid].tsx +271 -271
- package/apps/admin/mailboxes/new/index.tsx +30 -30
- package/apps/admin/plugins/index.tsx +15 -15
- package/apps/admin/quarantine/index.tsx +5 -5
- package/apps/admin/retention-policy/index.tsx +39 -39
- package/apps/admin/signing-certificates/index.tsx +343 -343
- package/apps/admin/transport-rules/[uid].tsx +5 -5
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
- package/apps/admin/transport-rules/index.tsx +4 -4
- package/apps/admin/transport-rules/new/index.tsx +5 -5
- package/apps/escrow/_layout.tsx +1 -1
- package/apps/escrow/audit-log/index.tsx +196 -196
- package/apps/escrow/index.tsx +4 -4
- package/apps/escrow/matters/[uid].tsx +621 -621
- package/apps/escrow/matters/new/index.tsx +6 -6
- package/apps/shared/appearance/AppearanceForm.tsx +3 -3
- package/apps/shared/appearance/AppearanceHead.tsx +1 -1
- package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
- package/apps/shared/appearance/appearanceCache.ts +1 -1
- package/apps/shared/appearance/appearanceContext.ts +1 -1
- package/apps/shared/appearance/theme.ts +1 -1
- package/apps/shared/auth/adminAccess.ts +99 -99
- package/apps/shared/calendar/bookingPlugin.ts +1 -1
- package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
- package/apps/shared/calendar/calendarReminders.ts +1 -1
- package/apps/shared/calendar/useCalendarReminders.ts +1 -1
- package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
- package/apps/shared/components/admin/diagnostics/format.ts +1 -1
- package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
- package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
- package/apps/shared/components/admin/elevation.ts +1 -1
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
- package/apps/shared/components/admin/layout/AdminShell.tsx +384 -384
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +238 -238
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +154 -152
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +194 -194
- package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
- package/apps/shared/components/admin/settings/BrandingForm.tsx +423 -423
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +119 -119
- package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +198 -198
- package/apps/shared/components/admin/settings/PluginsManager.tsx +2093 -2093
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +182 -182
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +288 -288
- package/apps/shared/components/admin/setup/SetupWizard.tsx +450 -446
- package/apps/shared/components/admin/signOut.ts +1 -1
- package/apps/shared/components/admin/usePagedList.tsx +129 -129
- package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
- package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
- package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
- package/apps/shared/components/calendar/EventDetails.tsx +16 -14
- package/apps/shared/components/calendar/EventEditor.tsx +54 -39
- package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
- package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
- package/apps/shared/components/calendar/EventModal.tsx +206 -206
- package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/EventShell.tsx +1 -1
- package/apps/shared/components/calendar/FindATime.tsx +6 -4
- package/apps/shared/components/calendar/GuestInput.tsx +2 -2
- package/apps/shared/components/calendar/MonthView.tsx +185 -185
- package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
- package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +227 -227
- package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
- package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
- package/apps/shared/components/calendar/SplitDayView.tsx +144 -144
- package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
- package/apps/shared/components/calendar/TimeGridView.tsx +246 -246
- package/apps/shared/components/calendar/allDay.ts +124 -124
- package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
- package/apps/shared/components/calendar/eventForm.ts +3 -3
- package/apps/shared/components/calendar/eventFormat.ts +3 -3
- package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
- package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
- package/apps/shared/components/contacts/ContactForm.tsx +393 -383
- package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
- package/apps/shared/components/contacts/ContactsToolbar.tsx +103 -103
- package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
- package/apps/shared/components/contacts/contactKeys.ts +3 -3
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +155 -155
- package/apps/shared/components/forms/StringListField.tsx +1 -1
- package/apps/shared/components/layout/AppShell.tsx +465 -461
- package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +398 -398
- package/apps/shared/components/layout/MailboxProvisioning.tsx +170 -168
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
- package/apps/shared/components/layout/ResponsiveToolbar.tsx +315 -315
- package/apps/shared/components/layout/ThemeSwitch.tsx +84 -84
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
- package/apps/shared/components/layout/UserMenu.tsx +441 -439
- package/apps/shared/components/mail/ConversationList.tsx +334 -332
- package/apps/shared/components/mail/ConversationThreadPane.tsx +624 -613
- package/apps/shared/components/mail/InviteCard.tsx +11 -9
- package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
- package/apps/shared/components/mail/MailAddress.tsx +1 -1
- package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
- package/apps/shared/components/mail/MailSelectionBar.tsx +240 -240
- package/apps/shared/components/mail/MenuButton.tsx +404 -404
- package/apps/shared/components/mail/MessageDetailPane.tsx +1759 -1757
- package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
- package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
- package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
- package/apps/shared/components/mail/compose/ComposeContext.tsx +323 -312
- package/apps/shared/components/mail/compose/ComposeToolbar.tsx +422 -422
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +1709 -1681
- package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
- package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
- package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
- package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
- package/apps/shared/components/mail/compose/RichTextEditor.tsx +147 -147
- package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
- package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -60
- package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
- package/apps/shared/components/mail/compose/quotedBody.ts +161 -161
- package/apps/shared/components/mail/compose/recipients.ts +1 -1
- package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
- package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
- package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
- package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
- package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
- package/apps/shared/components/mail/labelMenu.tsx +9 -7
- package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
- package/apps/shared/components/mail/listPreferences.ts +2 -2
- package/apps/shared/components/mail/pinnedSigners.ts +45 -19
- package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
- package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
- package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
- package/apps/shared/components/mail/reading/MessageMoreMenu.tsx +258 -258
- package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +79 -79
- package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
- package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
- package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
- package/apps/shared/components/mail/reading/messageExport.ts +59 -59
- package/apps/shared/components/mail/reading/printMessage.ts +99 -99
- package/apps/shared/components/mail/reading/useMessageActions.ts +450 -443
- package/apps/shared/components/mail/unreadStyle.tsx +1 -1
- package/apps/shared/components/mail/verificationSeals.ts +129 -125
- package/apps/shared/components/mail/writableMailboxes.ts +14 -7
- package/apps/shared/components/rules/RuleBuilder.tsx +311 -311
- package/apps/shared/components/settings/SigningCertificateCard.tsx +344 -344
- package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
- package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
- package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
- package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
- package/apps/shared/keyboard/GlobalShortcuts.tsx +51 -51
- package/apps/shared/keyboard/ShortcutProvider.tsx +62 -62
- package/apps/shared/keyboard/ShortcutsDialog.tsx +84 -84
- package/apps/shared/keyboard/dispatch.ts +124 -124
- package/apps/shared/keyboard/format.ts +89 -89
- package/apps/shared/keyboard/keymap.ts +114 -114
- package/apps/shared/keyboard/registry.ts +65 -65
- package/apps/shared/keyboard/targets.ts +79 -79
- package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
- package/apps/shared/mail/folderCounts.ts +8 -4
- package/apps/shared/mail/folderOfType.ts +51 -49
- package/apps/shared/mail/folderTree.ts +143 -143
- package/apps/shared/mail/listAllPages.ts +39 -39
- package/apps/shared/mail/listSnapshots.ts +2 -2
- package/apps/shared/mail/messageReadState.ts +6 -5
- package/apps/shared/mail/newMailNotifications.ts +171 -171
- package/apps/shared/mail/outbox/composeBridge.ts +2 -2
- package/apps/shared/mail/outbox/outboxState.ts +1 -1
- package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
- package/apps/shared/mail/outbox/sendDecision.ts +2 -2
- package/apps/shared/mail/outbox/sendJob.ts +450 -445
- package/apps/shared/mail/outbox/sendOutcomes.ts +160 -155
- package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
- package/apps/shared/mail/permanentDelete.ts +8 -7
- package/apps/shared/mail/primaryMailbox.ts +1 -1
- package/apps/shared/mail/reportNotices.ts +66 -66
- package/apps/shared/mail/senderBlocking.ts +157 -141
- package/apps/shared/mail/useMailConnection.ts +207 -205
- package/apps/shared/mail/useMailLiveUpdates.ts +277 -277
- package/apps/shared/mail/useMailboxUpdateAccess.ts +84 -60
- package/apps/shared/mail/useMarkMessageRead.ts +54 -47
- package/apps/shared/mail/useNewMailNotifications.ts +178 -178
- package/apps/shared/mail/usePermanentDelete.tsx +5 -3
- package/apps/shared/navigation/pageTitle.ts +1 -1
- package/apps/shared/notifications/NotificationCenter.tsx +1 -1
- package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
- package/apps/shared/notifications/apiErrors.ts +2 -2
- package/apps/shared/notifications/pushStatus.ts +1 -1
- package/apps/shared/notifications/store.ts +560 -560
- package/apps/shared/notifications/systemErrors.ts +1 -1
- package/apps/shared/search/LocalIndexLifecycle.tsx +120 -114
- package/apps/shared/search/crossMailboxSearch.ts +3 -3
- package/apps/shared/search/localIndexBuilder.ts +493 -481
- package/apps/shared/search/localIndexKey.ts +1 -1
- package/apps/shared/search/localIndexRpcClient.ts +150 -30
- package/apps/shared/search/localIndexTransport.ts +84 -0
- package/apps/shared/search/localIndexWorker.ts +1 -1
- package/apps/shared/search/searchTier2.ts +3 -3
- package/apps/shared/signing/enrollmentStorage.ts +33 -33
- package/apps/shared/signing/enrollmentTracker.ts +385 -385
- package/apps/shared/signing/enrollmentView.ts +251 -251
- package/apps/shared/signing/signingInfo.ts +1 -1
- package/apps/shared/signing/useNow.ts +19 -19
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +92 -90
- package/apps/shared/styles/app.css +387 -396
- package/apps/www/_layout.tsx +2 -2
- package/apps/www/calendar/index.tsx +583 -581
- package/apps/www/contacts/[uid].tsx +114 -112
- package/apps/www/contacts/index.tsx +19 -17
- package/apps/www/index.tsx +3021 -3012
- package/apps/www/messages/[uid].tsx +141 -139
- package/apps/www/settings/auto-reply/index.tsx +138 -136
- package/apps/www/settings/blocked-senders/index.tsx +305 -303
- package/apps/www/settings/encryption/index.tsx +1296 -1290
- package/apps/www/settings/filters/[uid].tsx +184 -179
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
- package/apps/www/settings/filters/index.tsx +105 -105
- package/apps/www/settings/filters/new/index.tsx +167 -165
- package/apps/www/settings/labels/index.tsx +209 -207
- package/apps/www/settings/privacy/index.tsx +499 -495
- package/apps/www/settings/profile/index.tsx +256 -251
- package/apps/www/settings/read-receipts/index.tsx +155 -150
- package/apps/www/settings/sharing/index.tsx +259 -259
- package/apps/www/settings/signatures/[uid].tsx +175 -175
- package/apps/www/settings/signatures/index.tsx +91 -91
- package/apps/www/settings/signatures/new/index.tsx +138 -138
- package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
- package/apps/www/tasks/index.tsx +659 -654
- package/dist/apps/admin/_layout.d.ts +1 -1
- package/dist/apps/admin/_layout.js +1 -1
- package/dist/apps/admin/audit-log/index.d.ts +1 -1
- package/dist/apps/admin/audit-log/index.js +4 -4
- package/dist/apps/admin/branding/index.js +3 -3
- package/dist/apps/admin/data-requests/index.js +8 -8
- package/dist/apps/admin/distribution-lists/[uid].js +3 -3
- package/dist/apps/admin/distribution-lists/index.js +4 -4
- package/dist/apps/admin/distribution-lists/new/index.js +5 -5
- package/dist/apps/admin/domains/[uid].js +6 -6
- package/dist/apps/admin/domains/index.js +4 -4
- package/dist/apps/admin/domains/new/index.js +5 -5
- package/dist/apps/admin/encryption-policy/index.js +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
- package/dist/apps/admin/escrow-scopes/index.js +4 -4
- package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
- package/dist/apps/admin/index.js +6 -6
- package/dist/apps/admin/ingest-queue/index.js +4 -4
- package/dist/apps/admin/mailbox-policy/index.js +1 -1
- package/dist/apps/admin/mailboxes/[uid].js +5 -5
- package/dist/apps/admin/quarantine/index.js +5 -5
- package/dist/apps/admin/retention-policy/index.js +3 -3
- package/dist/apps/admin/signing-certificates/index.js +5 -5
- package/dist/apps/admin/transport-rules/[uid].js +5 -5
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
- package/dist/apps/admin/transport-rules/index.js +4 -4
- package/dist/apps/admin/transport-rules/new/index.js +5 -5
- package/dist/apps/escrow/_layout.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.js +4 -4
- package/dist/apps/escrow/index.js +4 -4
- package/dist/apps/escrow/matters/[uid].js +10 -10
- package/dist/apps/escrow/matters/new/index.js +6 -6
- package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
- package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
- package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
- package/dist/apps/shared/appearance/appearanceCache.js +1 -1
- package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
- package/dist/apps/shared/appearance/theme.d.ts +1 -1
- package/dist/apps/shared/auth/adminAccess.js +1 -1
- package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
- package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
- package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
- package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
- package/dist/apps/shared/components/admin/elevation.js +1 -1
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
- package/dist/apps/shared/components/admin/layout/AdminShell.js +8 -8
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
- package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +8 -8
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
- package/dist/apps/shared/components/admin/signOut.js +1 -1
- package/dist/apps/shared/components/admin/usePagedList.js +2 -2
- package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
- package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
- package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
- package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
- package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
- package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
- package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
- package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
- package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
- package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventModal.js +3 -3
- package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/EventShell.js +1 -1
- package/dist/apps/shared/components/calendar/FindATime.js +6 -4
- package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
- package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/MonthView.js +1 -1
- package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
- package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
- package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
- package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
- package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
- package/dist/apps/shared/components/calendar/allDay.js +1 -1
- package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
- package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
- package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
- package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
- package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
- package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
- package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
- package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +7 -7
- package/dist/apps/shared/components/forms/StringListField.js +1 -1
- package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
- package/dist/apps/shared/components/layout/AppShell.js +14 -10
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
- package/dist/apps/shared/components/layout/UserMenu.js +6 -4
- package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
- package/dist/apps/shared/components/mail/ConversationList.js +6 -4
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
- package/dist/apps/shared/components/mail/InviteCard.js +10 -8
- package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
- package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
- package/dist/apps/shared/components/mail/MailAddress.js +1 -1
- package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MenuButton.js +1 -1
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
- package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
- package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
- package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
- package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
- package/dist/apps/shared/components/mail/compose/ComposeWindow.d.ts +7 -1
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +54 -31
- package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
- package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
- package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
- package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
- package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
- package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
- package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
- package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
- package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
- package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
- package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
- package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
- package/dist/apps/shared/components/mail/labelMenu.js +9 -7
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
- package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
- package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
- package/dist/apps/shared/components/mail/listPreferences.js +1 -1
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
- package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
- package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
- package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
- package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
- package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
- package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/printMessage.js +11 -11
- package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
- package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
- package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
- package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
- package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
- package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
- package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
- package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
- package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
- package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
- package/dist/apps/shared/mail/folderCounts.js +6 -4
- package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
- package/dist/apps/shared/mail/folderOfType.js +4 -4
- package/dist/apps/shared/mail/folderTree.d.ts +1 -1
- package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
- package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
- package/dist/apps/shared/mail/messageReadState.js +5 -5
- package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/newMailNotifications.js +1 -1
- package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
- package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
- package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
- package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
- package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
- package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
- package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
- package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
- package/dist/apps/shared/mail/permanentDelete.js +8 -8
- package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
- package/dist/apps/shared/mail/primaryMailbox.js +1 -1
- package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
- package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
- package/dist/apps/shared/mail/senderBlocking.js +19 -16
- package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
- package/dist/apps/shared/mail/useMailConnection.js +12 -10
- package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
- package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
- package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
- package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
- package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
- package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
- package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
- package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
- package/dist/apps/shared/notifications/apiErrors.js +2 -2
- package/dist/apps/shared/notifications/pushStatus.js +1 -1
- package/dist/apps/shared/notifications/systemErrors.js +1 -1
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
- package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
- package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
- package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
- package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
- package/dist/apps/shared/search/localIndexBuilder.js +15 -12
- package/dist/apps/shared/search/localIndexKey.js +1 -1
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
- package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
- package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
- package/dist/apps/shared/search/localIndexTransport.js +1 -0
- package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
- package/dist/apps/shared/search/searchTier2.d.ts +3 -3
- package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
- package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
- package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.js +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
- package/dist/apps/shared/styles/app.css +387 -396
- package/dist/apps/www/_layout.d.ts +1 -1
- package/dist/apps/www/_layout.js +1 -1
- package/dist/apps/www/calendar/index.d.ts +1 -1
- package/dist/apps/www/calendar/index.js +20 -18
- package/dist/apps/www/contacts/[uid].d.ts +1 -1
- package/dist/apps/www/contacts/[uid].js +8 -6
- package/dist/apps/www/contacts/index.d.ts +1 -1
- package/dist/apps/www/contacts/index.js +19 -17
- package/dist/apps/www/index.d.ts +1 -1
- package/dist/apps/www/index.js +54 -50
- package/dist/apps/www/messages/[uid].d.ts +1 -1
- package/dist/apps/www/messages/[uid].js +11 -9
- package/dist/apps/www/settings/appearance/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.js +6 -4
- package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
- package/dist/apps/www/settings/blocked-senders/index.js +6 -4
- package/dist/apps/www/settings/encryption/index.d.ts +1 -1
- package/dist/apps/www/settings/encryption/index.js +31 -29
- package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
- package/dist/apps/www/settings/filters/[uid].js +11 -9
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
- package/dist/apps/www/settings/filters/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/index.js +4 -4
- package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/new/index.js +10 -8
- package/dist/apps/www/settings/labels/index.d.ts +1 -1
- package/dist/apps/www/settings/labels/index.js +12 -10
- package/dist/apps/www/settings/privacy/index.d.ts +1 -1
- package/dist/apps/www/settings/privacy/index.js +18 -14
- package/dist/apps/www/settings/profile/index.d.ts +1 -1
- package/dist/apps/www/settings/profile/index.js +7 -5
- package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
- package/dist/apps/www/settings/read-receipts/index.js +5 -3
- package/dist/apps/www/settings/sharing/index.d.ts +1 -1
- package/dist/apps/www/settings/sharing/index.js +6 -6
- package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
- package/dist/apps/www/settings/signatures/[uid].js +5 -5
- package/dist/apps/www/settings/signatures/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/index.js +4 -4
- package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/new/index.js +4 -4
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
- package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
- package/dist/apps/www/tasks/index.d.ts +1 -1
- package/dist/apps/www/tasks/index.js +17 -15
- package/dist/lib/admin/auditLogApi.d.ts +32 -0
- package/dist/lib/admin/auditLogApi.js +27 -0
- package/dist/lib/admin/distributionListsApi.d.ts +47 -0
- package/dist/lib/admin/distributionListsApi.js +34 -0
- package/dist/lib/admin/domainsApi.d.ts +75 -0
- package/dist/lib/admin/domainsApi.js +44 -0
- package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
- package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
- package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
- package/dist/lib/admin/escrowAuditLogApi.js +31 -0
- package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
- package/dist/lib/admin/escrowScopesApi.js +50 -0
- package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
- package/dist/lib/admin/leftoverMailboxApi.js +67 -0
- package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
- package/dist/lib/admin/mailboxPolicyApi.js +21 -0
- package/dist/lib/admin/matterExportApi.d.ts +40 -0
- package/dist/lib/admin/matterExportApi.js +39 -0
- package/dist/lib/admin/matterSearchApi.d.ts +20 -0
- package/dist/lib/admin/matterSearchApi.js +27 -0
- package/dist/lib/admin/mattersApi.d.ts +56 -0
- package/dist/lib/admin/mattersApi.js +40 -0
- package/dist/lib/admin/pluginsApi.d.ts +265 -0
- package/dist/lib/admin/pluginsApi.js +102 -0
- package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
- package/dist/lib/admin/retentionPolicyApi.js +29 -0
- package/dist/lib/admin/setupApi.d.ts +23 -0
- package/dist/lib/admin/setupApi.js +26 -0
- package/dist/lib/admin/transportRulesApi.d.ts +66 -0
- package/dist/lib/admin/transportRulesApi.js +43 -0
- package/dist/lib/appearance/preferencesApi.d.ts +128 -0
- package/dist/lib/appearance/preferencesApi.js +257 -0
- package/dist/lib/auth/profileApi.d.ts +33 -0
- package/dist/lib/auth/profileApi.js +52 -0
- package/dist/lib/auth/session.d.ts +70 -0
- package/dist/lib/auth/session.js +210 -0
- package/dist/lib/branding/brandingApi.d.ts +47 -0
- package/dist/lib/branding/brandingApi.js +61 -0
- package/dist/lib/branding/useBranding.d.ts +23 -0
- package/dist/lib/branding/useBranding.js +65 -0
- package/dist/lib/calendar/calendarApi.d.ts +230 -0
- package/dist/lib/calendar/calendarApi.js +106 -0
- package/dist/lib/calendar/calendarColors.d.ts +18 -0
- package/dist/lib/calendar/calendarColors.js +39 -0
- package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
- package/dist/lib/calendar/calendarDragIds.js +92 -0
- package/dist/lib/calendar/calendarMutations.d.ts +68 -0
- package/dist/lib/calendar/calendarMutations.js +190 -0
- package/dist/lib/calendar/eventDescription.d.ts +43 -0
- package/dist/lib/calendar/eventDescription.js +195 -0
- package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
- package/dist/lib/calendar/freeBusyApi.js +119 -0
- package/dist/lib/calendar/inviteApi.d.ts +121 -0
- package/dist/lib/calendar/inviteApi.js +54 -0
- package/dist/lib/calendar/recurrence.d.ts +60 -0
- package/dist/lib/calendar/recurrence.js +225 -0
- package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
- package/dist/lib/components/avatar/ContactAvatar.js +26 -0
- package/dist/lib/components/buttons/Button.d.ts +9 -0
- package/dist/lib/components/buttons/Button.js +14 -0
- package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
- package/dist/lib/components/buttons/CopyButton.js +14 -0
- package/dist/lib/components/feedback/Alert.d.ts +4 -0
- package/dist/lib/components/feedback/Alert.js +4 -0
- package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
- package/dist/lib/components/feedback/Skeleton.js +14 -0
- package/dist/lib/components/forms/FormField.d.ts +8 -0
- package/dist/lib/components/forms/FormField.js +5 -0
- package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
- package/dist/lib/components/navigation/BottomTabBar.js +32 -0
- package/dist/lib/components/overlays/Drawer.d.ts +20 -0
- package/dist/lib/components/overlays/Drawer.js +27 -0
- package/dist/lib/components/overlays/Modal.d.ts +17 -0
- package/dist/lib/components/overlays/Modal.js +25 -0
- package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
- package/dist/lib/components/overlays/PopoverPortal.js +53 -0
- package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
- package/dist/lib/components/overlays/overlayStack.js +143 -0
- package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
- package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
- package/dist/lib/contacts/contactsApi.d.ts +174 -0
- package/dist/lib/contacts/contactsApi.js +139 -0
- package/dist/lib/contacts/vcard.d.ts +23 -0
- package/dist/lib/contacts/vcard.js +179 -0
- package/dist/lib/crypto/composeSecurity.d.ts +67 -0
- package/dist/lib/crypto/composeSecurity.js +93 -0
- package/dist/lib/crypto/encoding.d.ts +9 -0
- package/dist/lib/crypto/encoding.js +32 -0
- package/dist/lib/crypto/escrowKeys.d.ts +25 -0
- package/dist/lib/crypto/escrowKeys.js +59 -0
- package/dist/lib/crypto/idleTimeout.d.ts +16 -0
- package/dist/lib/crypto/idleTimeout.js +47 -0
- package/dist/lib/crypto/keySession.d.ts +159 -0
- package/dist/lib/crypto/keySession.js +367 -0
- package/dist/lib/crypto/keys.d.ts +50 -0
- package/dist/lib/crypto/keys.js +89 -0
- package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
- package/dist/lib/crypto/keyvaultApi.js +350 -0
- package/dist/lib/crypto/masterKey.d.ts +59 -0
- package/dist/lib/crypto/masterKey.js +104 -0
- package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
- package/dist/lib/crypto/masterKeyWraps.js +228 -0
- package/dist/lib/crypto/messageSecurity.d.ts +248 -0
- package/dist/lib/crypto/messageSecurity.js +367 -0
- package/dist/lib/crypto/mime.d.ts +143 -0
- package/dist/lib/crypto/mime.js +504 -0
- package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
- package/dist/lib/crypto/passkeyUnlock.js +79 -0
- package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
- package/dist/lib/crypto/passwordUnlock.js +73 -0
- package/dist/lib/crypto/recoveryCode.d.ts +28 -0
- package/dist/lib/crypto/recoveryCode.js +86 -0
- package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
- package/dist/lib/crypto/signingProviderApi.js +60 -0
- package/dist/lib/crypto/smime.d.ts +128 -0
- package/dist/lib/crypto/smime.js +402 -0
- package/dist/lib/crypto/smimeMessage.d.ts +132 -0
- package/dist/lib/crypto/smimeMessage.js +341 -0
- package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
- package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
- package/dist/lib/crypto/verificationSeal.d.ts +56 -0
- package/dist/lib/crypto/verificationSeal.js +220 -0
- package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
- package/dist/lib/mail/compose/composeQuoting.js +204 -0
- package/dist/lib/mail/compose/emojiData.d.ts +9 -0
- package/dist/lib/mail/compose/emojiData.js +18 -0
- package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
- package/dist/lib/mail/compose/giphyApi.js +20 -0
- package/dist/lib/mail/conversationsApi.d.ts +80 -0
- package/dist/lib/mail/conversationsApi.js +44 -0
- package/dist/lib/mail/dataExportApi.d.ts +50 -0
- package/dist/lib/mail/dataExportApi.js +40 -0
- package/dist/lib/mail/directoryApi.d.ts +49 -0
- package/dist/lib/mail/directoryApi.js +101 -0
- package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
- package/dist/lib/mail/erasureRequestApi.js +43 -0
- package/dist/lib/mail/flaggedMessages.d.ts +22 -0
- package/dist/lib/mail/flaggedMessages.js +73 -0
- package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
- package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
- package/dist/lib/mail/labelsApi.d.ts +47 -0
- package/dist/lib/mail/labelsApi.js +38 -0
- package/dist/lib/mail/mailAddress.d.ts +27 -0
- package/dist/lib/mail/mailAddress.js +54 -0
- package/dist/lib/mail/mailApi.d.ts +850 -0
- package/dist/lib/mail/mailApi.js +602 -0
- package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
- package/dist/lib/mail/mailDetailHooks.js +53 -0
- package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
- package/dist/lib/mail/mailFilterRulesApi.js +45 -0
- package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
- package/dist/lib/mail/mailSignaturesApi.js +42 -0
- package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
- package/dist/lib/mail/mailboxAccessApi.js +56 -0
- package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
- package/dist/lib/mail/mailboxImportApi.js +51 -0
- package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
- package/dist/lib/mail/messageBodySanitizer.js +118 -0
- package/dist/lib/mail/pushClient.d.ts +106 -0
- package/dist/lib/mail/pushClient.js +317 -0
- package/dist/lib/mail/sendEvents.d.ts +33 -0
- package/dist/lib/mail/sendEvents.js +44 -0
- package/dist/lib/mail/sendFailure.d.ts +16 -0
- package/dist/lib/mail/sendFailure.js +86 -0
- package/dist/lib/mail/senderListsApi.d.ts +69 -0
- package/dist/lib/mail/senderListsApi.js +126 -0
- package/dist/lib/search/queryGrammar.d.ts +51 -0
- package/dist/lib/search/queryGrammar.js +111 -0
- package/dist/lib/search/searchApi.d.ts +100 -0
- package/dist/lib/search/searchApi.js +107 -0
- package/dist/lib/search/searchScoring.d.ts +34 -0
- package/dist/lib/search/searchScoring.js +44 -0
- package/dist/lib/search/searchTier3.d.ts +64 -0
- package/dist/lib/search/searchTier3.js +335 -0
- package/dist/lib/tasks/tasksApi.d.ts +85 -0
- package/dist/lib/tasks/tasksApi.js +55 -0
- package/dist/lib/util/api.d.ts +160 -0
- package/dist/lib/util/api.js +251 -0
- package/dist/lib/util/apiClientContext.d.ts +7 -0
- package/dist/lib/util/apiClientContext.js +32 -0
- package/dist/lib/util/apiQuery.d.ts +32 -0
- package/dist/lib/util/apiQuery.js +42 -0
- package/dist/lib/util/clipboard.d.ts +7 -0
- package/dist/lib/util/clipboard.js +56 -0
- package/dist/lib/util/dateInput.d.ts +6 -0
- package/dist/lib/util/dateInput.js +14 -0
- package/dist/lib/util/timeZone.d.ts +12 -0
- package/dist/lib/util/timeZone.js +32 -0
- package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
- package/dist/lib/util/useCopyToClipboard.js +34 -0
- package/dist/lib/util/useIsMobile.d.ts +10 -0
- package/dist/lib/util/useIsMobile.js +29 -0
- package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
- package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
- package/lib/admin/auditLogApi.ts +48 -0
- package/lib/admin/distributionListsApi.ts +77 -0
- package/lib/admin/domainsApi.ts +113 -0
- package/lib/admin/escrowAccessRequestsApi.ts +110 -0
- package/lib/admin/escrowAuditLogApi.ts +101 -0
- package/lib/admin/escrowScopesApi.ts +112 -0
- package/lib/admin/leftoverMailboxApi.ts +120 -0
- package/lib/admin/mailboxPolicyApi.ts +38 -0
- package/lib/admin/matterExportApi.ts +62 -0
- package/lib/admin/matterSearchApi.ts +35 -0
- package/lib/admin/mattersApi.ts +86 -0
- package/lib/admin/pluginsApi.ts +339 -0
- package/lib/admin/retentionPolicyApi.ts +46 -0
- package/lib/admin/setupApi.ts +40 -0
- package/lib/admin/transportRulesApi.ts +106 -0
- package/lib/appearance/preferencesApi.ts +335 -0
- package/lib/auth/profileApi.ts +77 -0
- package/lib/auth/session.ts +238 -0
- package/lib/branding/brandingApi.ts +97 -0
- package/lib/branding/useBranding.ts +81 -0
- package/lib/calendar/calendarApi.ts +309 -0
- package/lib/calendar/calendarColors.ts +45 -0
- package/lib/calendar/calendarDragIds.ts +112 -0
- package/lib/calendar/calendarMutations.ts +236 -0
- package/lib/calendar/eventDescription.ts +211 -0
- package/lib/calendar/freeBusyApi.ts +197 -0
- package/lib/calendar/inviteApi.ts +154 -0
- package/lib/calendar/recurrence.ts +285 -0
- package/lib/components/avatar/ContactAvatar.tsx +47 -0
- package/lib/components/buttons/Button.tsx +40 -0
- package/lib/components/buttons/CopyButton.tsx +45 -0
- package/lib/components/feedback/Alert.tsx +13 -0
- package/lib/components/feedback/Skeleton.tsx +38 -0
- package/lib/components/forms/FormField.tsx +23 -0
- package/lib/components/navigation/BottomTabBar.tsx +66 -0
- package/lib/components/overlays/Drawer.tsx +72 -0
- package/lib/components/overlays/Modal.tsx +64 -0
- package/lib/components/overlays/PopoverPortal.tsx +74 -0
- package/lib/components/overlays/overlayStack.ts +165 -0
- package/lib/components/pickers/MiniDatePicker.tsx +90 -0
- package/lib/contacts/contactsApi.ts +289 -0
- package/lib/contacts/vcard.ts +197 -0
- package/lib/crypto/composeSecurity.ts +140 -0
- package/lib/crypto/encoding.ts +36 -0
- package/lib/crypto/escrowKeys.ts +74 -0
- package/lib/crypto/idleTimeout.ts +49 -0
- package/lib/crypto/keySession.ts +483 -0
- package/lib/crypto/keys.ts +105 -0
- package/lib/crypto/keyvaultApi.ts +674 -0
- package/lib/crypto/masterKey.ts +134 -0
- package/lib/crypto/masterKeyWraps.ts +269 -0
- package/lib/crypto/messageSecurity.ts +600 -0
- package/lib/crypto/mime.ts +568 -0
- package/lib/crypto/passkeyUnlock.ts +103 -0
- package/lib/crypto/passwordUnlock.ts +98 -0
- package/lib/crypto/recoveryCode.ts +93 -0
- package/lib/crypto/signingProviderApi.ts +135 -0
- package/lib/crypto/smime.ts +459 -0
- package/lib/crypto/smimeMessage.ts +491 -0
- package/lib/crypto/useIdleKeyTimeout.ts +176 -0
- package/lib/crypto/verificationSeal.ts +288 -0
- package/lib/mail/compose/composeQuoting.ts +243 -0
- package/lib/mail/compose/emojiData.ts +34 -0
- package/lib/mail/compose/giphyApi.ts +31 -0
- package/lib/mail/conversationsApi.ts +123 -0
- package/lib/mail/dataExportApi.ts +73 -0
- package/lib/mail/directoryApi.ts +161 -0
- package/lib/mail/erasureRequestApi.ts +71 -0
- package/lib/mail/flaggedMessages.ts +80 -0
- package/lib/mail/focusedInboxOverridesApi.ts +64 -0
- package/lib/mail/labelsApi.ts +71 -0
- package/lib/mail/mailAddress.ts +76 -0
- package/lib/mail/mailApi.ts +1286 -0
- package/lib/mail/mailDetailHooks.ts +57 -0
- package/lib/mail/mailFilterRulesApi.ts +116 -0
- package/lib/mail/mailSignaturesApi.ts +84 -0
- package/lib/mail/mailboxAccessApi.ts +106 -0
- package/lib/mail/mailboxImportApi.ts +87 -0
- package/lib/mail/messageBodySanitizer.ts +129 -0
- package/lib/mail/pushClient.ts +375 -0
- package/lib/mail/sendEvents.ts +72 -0
- package/lib/mail/sendFailure.ts +98 -0
- package/lib/mail/senderListsApi.ts +161 -0
- package/lib/search/queryGrammar.ts +179 -0
- package/lib/search/searchApi.ts +199 -0
- package/lib/search/searchScoring.ts +46 -0
- package/lib/search/searchTier3.ts +406 -0
- package/lib/tasks/tasksApi.ts +128 -0
- package/lib/util/api.ts +318 -0
- package/lib/util/apiClientContext.ts +35 -0
- package/lib/util/apiQuery.ts +61 -0
- package/lib/util/clipboard.ts +55 -0
- package/lib/util/dateInput.ts +15 -0
- package/lib/util/timeZone.ts +33 -0
- package/lib/util/useCopyToClipboard.ts +48 -0
- package/lib/util/useIsMobile.ts +34 -0
- package/lib/videoconf/videoMeetingsApi.ts +144 -0
- package/package.json +10 -4
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrapper over `@rapidmx/restapi`'s conversation endpoints (`BaseMessageRoute.conversations()` and
|
|
3
|
+
* `conversationMessages()`) — the parent rows of a nested, Outlook-style conversation list, and the child rows
|
|
4
|
+
* one expands into. Conversations are RFC 5322 References/In-Reply-To threads (`Message.conversationId`),
|
|
5
|
+
* computed fresh on every call — a `ConversationSummary` is never itself persisted.
|
|
6
|
+
*/
|
|
7
|
+
import { ApiClient } from "../util/api.js";
|
|
8
|
+
import { Message, MessageListFilter, Recipient } from "./mailApi.js";
|
|
9
|
+
export interface ConversationSummary {
|
|
10
|
+
conversationId: string;
|
|
11
|
+
/** The most recent message's subject line. */
|
|
12
|
+
subject: string;
|
|
13
|
+
/** Every message in this conversation, oldest to newest. */
|
|
14
|
+
messageUids: string[];
|
|
15
|
+
/** Every folder (deduped) this conversation has a message in — a conversation can span folders,
|
|
16
|
+
* e.g. an Inbox message and the Sent Items copy of its reply. */
|
|
17
|
+
folderUids: string[];
|
|
18
|
+
messageCount: number;
|
|
19
|
+
unreadCount: number;
|
|
20
|
+
/** The most recent message's `receivedDate` — what the list is sorted by (newest first). */
|
|
21
|
+
latestDate: string;
|
|
22
|
+
/** Every distinct participant (deduped by address) across every message in the conversation. */
|
|
23
|
+
participants: Recipient[];
|
|
24
|
+
hasAttachments: boolean;
|
|
25
|
+
/** `true` if any message in the conversation is flagged. */
|
|
26
|
+
flagged: boolean;
|
|
27
|
+
/** The most recent message's `uid` — what a collapsed conversation row stands for, so it can be opened
|
|
28
|
+
* without expanding the conversation first. */
|
|
29
|
+
latestMessageUid: string;
|
|
30
|
+
/** The most recent message's sender. */
|
|
31
|
+
latestFrom: Recipient;
|
|
32
|
+
/** The most recent message's `bodyPreview` — the snippet a collapsed row shows. */
|
|
33
|
+
latestPreview: string;
|
|
34
|
+
/** The most recent message's folder. */
|
|
35
|
+
latestFolderUid: string;
|
|
36
|
+
/** The iTIP `METHOD` of the calendar file the most recent message carries (`Message.meetingMethod`) - `"REQUEST"`, `"REPLY"`,
|
|
37
|
+
* `"CANCEL"`, `"PUBLISH"`, `"COUNTER"` or `""`. Absent, or `null` from the server's SQL, when it carries none. Lets a collapsed row mark a
|
|
38
|
+
* meeting request without opening the conversation. */
|
|
39
|
+
latestMeetingMethod?: string | null;
|
|
40
|
+
/** What the reader answered that meeting request with (`Message.meetingResponse`). Absent, or `null`, when unanswered. */
|
|
41
|
+
latestMeetingResponse?: "accepted" | "tentative" | "declined" | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* How many of a mailbox's *messages* the server reads, newest first, to build these groups — restapi's
|
|
45
|
+
* `mail:conversations:scan_limit` default, and also the cap and default for `limit` below. A conversation whose
|
|
46
|
+
* older messages fall outside that window reports only the part inside it.
|
|
47
|
+
*/
|
|
48
|
+
export declare const CONVERSATION_SCAN_LIMIT = 500;
|
|
49
|
+
export interface ConversationListParams {
|
|
50
|
+
/** Restricts both the scan and the grouping to one folder — a per-folder conversation view. Without it a
|
|
51
|
+
* conversation spans every folder in the mailbox. */
|
|
52
|
+
folderUid?: string;
|
|
53
|
+
/** The same named filters `listMessages()` takes, applied to the *messages* before they are grouped: so
|
|
54
|
+
* `unread` yields each conversation's unread messages, and only the conversations that have any. */
|
|
55
|
+
filter?: MessageListFilter;
|
|
56
|
+
/** The label filter `listMessages()` takes (`Label.uid`s; a message matching ANY of them), applied at the
|
|
57
|
+
* same point as `filter` and ANDed with it — so a conversation appears if any of its messages carries any
|
|
58
|
+
* of these labels, and reports only those messages. At most `MAX_MESSAGE_LABEL_FILTER` of them. */
|
|
59
|
+
labelUids?: string[];
|
|
60
|
+
/** Zero-based. */
|
|
61
|
+
page?: number;
|
|
62
|
+
/** Capped at `CONVERSATION_SCAN_LIMIT`, which is also the default. */
|
|
63
|
+
limit?: number;
|
|
64
|
+
}
|
|
65
|
+
/** Lists a mailbox's conversations, newest activity first. Computed mailbox-wide unless `folderUid` narrows
|
|
66
|
+
* them — folder scope is a filter here, not part of the endpoint. */
|
|
67
|
+
export declare function listConversations(mailboxUid: string, params?: ConversationListParams, client?: ApiClient): Promise<ConversationSummary[]>;
|
|
68
|
+
/** Paging for `listConversationMessages()`. The server defaults `limit` to 100 and caps it at 500. */
|
|
69
|
+
export interface ConversationMessagesParams {
|
|
70
|
+
page?: number;
|
|
71
|
+
limit?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* One conversation's messages, oldest first, across every folder in the mailbox — the expanded children of a
|
|
75
|
+
* conversation row, in one request rather than one per `messageUids` entry.
|
|
76
|
+
*
|
|
77
|
+
* `conversationId` is the summary's own `conversationId`, which for a message belonging to no thread is that
|
|
78
|
+
* message's `uid`; the server resolves either.
|
|
79
|
+
*/
|
|
80
|
+
export declare function listConversationMessages(mailboxUid: string, conversationId: string, params?: ConversationMessagesParams, client?: ApiClient): Promise<Message[]>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrapper over `@rapidmx/restapi`'s conversation endpoints (`BaseMessageRoute.conversations()` and
|
|
7
|
+
* `conversationMessages()`) — the parent rows of a nested, Outlook-style conversation list, and the child rows
|
|
8
|
+
* one expands into. Conversations are RFC 5322 References/In-Reply-To threads (`Message.conversationId`),
|
|
9
|
+
* computed fresh on every call — a `ConversationSummary` is never itself persisted.
|
|
10
|
+
*/
|
|
11
|
+
import { withClient } from "../util/api.js";
|
|
12
|
+
/**
|
|
13
|
+
* How many of a mailbox's *messages* the server reads, newest first, to build these groups — restapi's
|
|
14
|
+
* `mail:conversations:scan_limit` default, and also the cap and default for `limit` below. A conversation whose
|
|
15
|
+
* older messages fall outside that window reports only the part inside it.
|
|
16
|
+
*/
|
|
17
|
+
export const CONVERSATION_SCAN_LIMIT = 500;
|
|
18
|
+
/** `?mailboxUid=` plus whichever optional params were actually set, each URL-encoded. */
|
|
19
|
+
function conversationQuery(mailboxUid, params) {
|
|
20
|
+
const query = new URLSearchParams({ mailboxUid });
|
|
21
|
+
for (const [key, value] of Object.entries(params)) {
|
|
22
|
+
if (value !== undefined && value !== "") {
|
|
23
|
+
query.set(key, String(value));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return query.toString();
|
|
27
|
+
}
|
|
28
|
+
/** Lists a mailbox's conversations, newest activity first. Computed mailbox-wide unless `folderUid` narrows
|
|
29
|
+
* them — folder scope is a filter here, not part of the endpoint. */
|
|
30
|
+
export function listConversations(mailboxUid, params = {}, client) {
|
|
31
|
+
const { labelUids, ...rest } = params;
|
|
32
|
+
// One comma-separated value, as `messageListQuery()` sends it; an empty selection sends no parameter.
|
|
33
|
+
return withClient(client, `/mail/messages/conversations?${conversationQuery(mailboxUid, { ...rest, labelUids: labelUids?.length ? labelUids.join(",") : undefined })}`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* One conversation's messages, oldest first, across every folder in the mailbox — the expanded children of a
|
|
37
|
+
* conversation row, in one request rather than one per `messageUids` entry.
|
|
38
|
+
*
|
|
39
|
+
* `conversationId` is the summary's own `conversationId`, which for a message belonging to no thread is that
|
|
40
|
+
* message's `uid`; the server resolves either.
|
|
41
|
+
*/
|
|
42
|
+
export function listConversationMessages(mailboxUid, conversationId, params = {}, client) {
|
|
43
|
+
return withClient(client, `/mail/messages/conversations/${encodeURIComponent(conversationId)}?${conversationQuery(mailboxUid, { ...params })}`);
|
|
44
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrappers over `@rapidmx/restapi`'s GDPR data-portability export (`BaseDataExportRoute`, mounted
|
|
3
|
+
* at `mail/data-export-requests`). `create()` is both self-service (a mailbox owner exports their own
|
|
4
|
+
* mail) and admin-mediated (a trusted caller may supply an explicit `mailboxUid`) — an ordinary caller's
|
|
5
|
+
* own mailbox is always used regardless of what they send, only a trusted caller's supplied `mailboxUid`
|
|
6
|
+
* is honored. Export runs asynchronously (restapi's own `DataExportJob`, not this client) — `create()`
|
|
7
|
+
* only stages a `pending` request; poll `getExportRequest()`/`listExportRequests()` for `status` to
|
|
8
|
+
* become `"ready"` (or `"failed"`) before offering the download.
|
|
9
|
+
*/
|
|
10
|
+
import { ApiClient } from "../util/api.js";
|
|
11
|
+
import { RequestListParams } from "../util/apiQuery.js";
|
|
12
|
+
export type { RequestListParams };
|
|
13
|
+
export type DataExportFormat = "json" | "mbox";
|
|
14
|
+
/** `processing` while a worker is building the export (restapi's `DataExportJob` claims `pending` requests). */
|
|
15
|
+
export type DataExportStatus = "pending" | "processing" | "ready" | "failed";
|
|
16
|
+
export interface DataExportRequest {
|
|
17
|
+
uid: string;
|
|
18
|
+
version: number;
|
|
19
|
+
dateCreated: string;
|
|
20
|
+
dateModified: string;
|
|
21
|
+
mailboxUid: string;
|
|
22
|
+
requestedByUserUid: string;
|
|
23
|
+
format: DataExportFormat;
|
|
24
|
+
status: DataExportStatus;
|
|
25
|
+
blobKey?: string;
|
|
26
|
+
errorMessage?: string;
|
|
27
|
+
/** How many times the server job has claimed this request into `"processing"` (a stalled claim is reclaimed
|
|
28
|
+
* back to `"pending"` until the job's max attempts, then marked `"failed"`). */
|
|
29
|
+
processingAttempts?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface CreateDataExportRequestInput {
|
|
32
|
+
format: DataExportFormat;
|
|
33
|
+
/** Only honored when the caller is a trusted admin — an ordinary caller's own mailbox is always
|
|
34
|
+
* used, regardless of what (if anything) is supplied here. */
|
|
35
|
+
mailboxUid?: string;
|
|
36
|
+
}
|
|
37
|
+
/** `client`, given by every function below that isn't a plain URL builder, is an explicit `ApiClient` from
|
|
38
|
+
* `createApiClient()` (e.g. one account of a multi-account app) to call instead of the default global
|
|
39
|
+
* `apiFetch()` - see `withClient()`'s own doc comment in `util/api.ts`. Omitted (the default), every
|
|
40
|
+
* function here behaves exactly as before. */
|
|
41
|
+
export declare function createExportRequest(input: CreateDataExportRequestInput, client?: ApiClient): Promise<DataExportRequest>;
|
|
42
|
+
/** A trusted caller sees every request; anyone else sees only their own (`requestedByUserUid`). Newest
|
|
43
|
+
* first; `params` pages through them (`limit` capped at 500 server-side). */
|
|
44
|
+
export declare function listExportRequests(params?: RequestListParams, client?: ApiClient): Promise<DataExportRequest[]>;
|
|
45
|
+
export declare function getExportRequest(uid: string, client?: ApiClient): Promise<DataExportRequest>;
|
|
46
|
+
/** A plain URL, not a fetch wrapper — the server streams the export's raw bytes back with its own
|
|
47
|
+
* `content-disposition: attachment` header, so a caller renders this directly as `<a href={...}>`
|
|
48
|
+
* (the browser's own native download, no JS fetch/blob needed) — same pattern `mailApi.ts`'s
|
|
49
|
+
* `attachmentContentUrl()` already establishes. 404s until `status === "ready"`. */
|
|
50
|
+
export declare function exportRequestDownloadUrl(uid: string): string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrappers over `@rapidmx/restapi`'s GDPR data-portability export (`BaseDataExportRoute`, mounted
|
|
7
|
+
* at `mail/data-export-requests`). `create()` is both self-service (a mailbox owner exports their own
|
|
8
|
+
* mail) and admin-mediated (a trusted caller may supply an explicit `mailboxUid`) — an ordinary caller's
|
|
9
|
+
* own mailbox is always used regardless of what they send, only a trusted caller's supplied `mailboxUid`
|
|
10
|
+
* is honored. Export runs asynchronously (restapi's own `DataExportJob`, not this client) — `create()`
|
|
11
|
+
* only stages a `pending` request; poll `getExportRequest()`/`listExportRequests()` for `status` to
|
|
12
|
+
* become `"ready"` (or `"failed"`) before offering the download.
|
|
13
|
+
*/
|
|
14
|
+
import { apiUrl, withClient } from "../util/api.js";
|
|
15
|
+
import { buildRequestListQuery } from "../util/apiQuery.js";
|
|
16
|
+
/** `client`, given by every function below that isn't a plain URL builder, is an explicit `ApiClient` from
|
|
17
|
+
* `createApiClient()` (e.g. one account of a multi-account app) to call instead of the default global
|
|
18
|
+
* `apiFetch()` - see `withClient()`'s own doc comment in `util/api.ts`. Omitted (the default), every
|
|
19
|
+
* function here behaves exactly as before. */
|
|
20
|
+
export function createExportRequest(input, client) {
|
|
21
|
+
return withClient(client, `/mail/data-export-requests`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
body: JSON.stringify(input),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** A trusted caller sees every request; anyone else sees only their own (`requestedByUserUid`). Newest
|
|
27
|
+
* first; `params` pages through them (`limit` capped at 500 server-side). */
|
|
28
|
+
export function listExportRequests(params = {}, client) {
|
|
29
|
+
return withClient(client, `/mail/data-export-requests${buildRequestListQuery(params)}`);
|
|
30
|
+
}
|
|
31
|
+
export function getExportRequest(uid, client) {
|
|
32
|
+
return withClient(client, `/mail/data-export-requests/${encodeURIComponent(uid)}`);
|
|
33
|
+
}
|
|
34
|
+
/** A plain URL, not a fetch wrapper — the server streams the export's raw bytes back with its own
|
|
35
|
+
* `content-disposition: attachment` header, so a caller renders this directly as `<a href={...}>`
|
|
36
|
+
* (the browser's own native download, no JS fetch/blob needed) — same pattern `mailApi.ts`'s
|
|
37
|
+
* `attachmentContentUrl()` already establishes. 404s until `status === "ready"`. */
|
|
38
|
+
export function exportRequestDownloadUrl(uid) {
|
|
39
|
+
return apiUrl(`/mail/data-export-requests/${encodeURIComponent(uid)}/download`);
|
|
40
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrappers over `@rapidmx/restapi`'s `BaseDirectoryRoute` - recipient suggestions for compose. `GET
|
|
3
|
+
* /mail/directory` searches the server's mailboxes (people, shared mailboxes, rooms and equipment) and distribution
|
|
4
|
+
* lists; `GET /mail/directory/contacts` searches the caller's own contacts. Both match every word of the query against
|
|
5
|
+
* the start of a name word or of an address, and return only a display name, an address and a kind.
|
|
6
|
+
*/
|
|
7
|
+
import { ApiClient } from "../util/api.js";
|
|
8
|
+
/** What a suggestion names. `"contact"` comes from the caller's contacts, everything else from the server directory. */
|
|
9
|
+
export type RecipientSuggestionKind = "user" | "shared" | "room" | "equipment" | "list" | "contact";
|
|
10
|
+
export interface RecipientSuggestion {
|
|
11
|
+
displayName: string;
|
|
12
|
+
address: string;
|
|
13
|
+
kind: RecipientSuggestionKind;
|
|
14
|
+
}
|
|
15
|
+
/** The shortest trimmed query the server searches for - shorter ones resolve to `[]` without a request. */
|
|
16
|
+
export declare const RECIPIENT_SUGGESTION_MIN_QUERY_LENGTH = 2;
|
|
17
|
+
/** The longest query the server accepts; longer ones are cut to this length. */
|
|
18
|
+
export declare const RECIPIENT_SUGGESTION_MAX_QUERY_LENGTH = 100;
|
|
19
|
+
/** The server's own default and cap for `limit`. */
|
|
20
|
+
export declare const RECIPIENT_SUGGESTION_DEFAULT_LIMIT = 8;
|
|
21
|
+
export declare const RECIPIENT_SUGGESTION_MAX_LIMIT = 20;
|
|
22
|
+
export interface RecipientSuggestionOptions {
|
|
23
|
+
/** At most this many entries (the server caps it at `RECIPIENT_SUGGESTION_MAX_LIMIT`). */
|
|
24
|
+
limit?: number;
|
|
25
|
+
/** Aborts the request, rejecting with the fetch's `AbortError`. */
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}
|
|
28
|
+
export interface ContactSuggestionOptions extends RecipientSuggestionOptions {
|
|
29
|
+
/** Also search this mailbox's contacts (e.g. the shared mailbox being composed from) when the caller may read it.
|
|
30
|
+
* The caller's own mailboxes are always searched. */
|
|
31
|
+
mailboxUid?: string;
|
|
32
|
+
}
|
|
33
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
34
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
35
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
36
|
+
/** Searches the server directory. Rejects with a 403 `ApiRequestError` for a caller without a mailbox on the server,
|
|
37
|
+
* and a 429 one when the caller searches too often. */
|
|
38
|
+
export declare function searchDirectory(query: string, options?: RecipientSuggestionOptions, client?: ApiClient): Promise<RecipientSuggestion[]>;
|
|
39
|
+
/** Searches the caller's contacts (every address of a contact whose name matches, or the addresses that match). */
|
|
40
|
+
export declare function searchContactSuggestions(query: string, options?: ContactSuggestionOptions, client?: ApiClient): Promise<RecipientSuggestion[]>;
|
|
41
|
+
/** Contacts first, then directory entries, without repeating an address (compared case-insensitively; the first
|
|
42
|
+
* occurrence wins), at most `limit`. */
|
|
43
|
+
export declare function mergeRecipientSuggestions(contacts: RecipientSuggestion[], directory: RecipientSuggestion[], limit?: number): RecipientSuggestion[];
|
|
44
|
+
/**
|
|
45
|
+
* Contacts and directory suggestions for `query`, merged by `mergeRecipientSuggestions()`. Either source failing (a 403
|
|
46
|
+
* directory for a caller with no mailbox here, a 429, a network error) still returns the other's entries; only when
|
|
47
|
+
* both fail does this reject, with the contacts error. An aborted `signal` always rejects with the `AbortError`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function fetchRecipientSuggestions(query: string, options?: ContactSuggestionOptions, client?: ApiClient): Promise<RecipientSuggestion[]>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrappers over `@rapidmx/restapi`'s `BaseDirectoryRoute` - recipient suggestions for compose. `GET
|
|
7
|
+
* /mail/directory` searches the server's mailboxes (people, shared mailboxes, rooms and equipment) and distribution
|
|
8
|
+
* lists; `GET /mail/directory/contacts` searches the caller's own contacts. Both match every word of the query against
|
|
9
|
+
* the start of a name word or of an address, and return only a display name, an address and a kind.
|
|
10
|
+
*/
|
|
11
|
+
import { ApiRequestError, withClient } from "../util/api.js";
|
|
12
|
+
/** The shortest trimmed query the server searches for - shorter ones resolve to `[]` without a request. */
|
|
13
|
+
export const RECIPIENT_SUGGESTION_MIN_QUERY_LENGTH = 2;
|
|
14
|
+
/** The longest query the server accepts; longer ones are cut to this length. */
|
|
15
|
+
export const RECIPIENT_SUGGESTION_MAX_QUERY_LENGTH = 100;
|
|
16
|
+
/** The server's own default and cap for `limit`. */
|
|
17
|
+
export const RECIPIENT_SUGGESTION_DEFAULT_LIMIT = 8;
|
|
18
|
+
export const RECIPIENT_SUGGESTION_MAX_LIMIT = 20;
|
|
19
|
+
/** The trimmed query to send, or `undefined` when it's too short to search. */
|
|
20
|
+
function normalizeQuery(query) {
|
|
21
|
+
const trimmed = query.trim().slice(0, RECIPIENT_SUGGESTION_MAX_QUERY_LENGTH).trim();
|
|
22
|
+
return trimmed.length >= RECIPIENT_SUGGESTION_MIN_QUERY_LENGTH ? trimmed : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Keeps only well-formed entries of a response. */
|
|
25
|
+
function wellFormed(body) {
|
|
26
|
+
return Array.isArray(body)
|
|
27
|
+
? body
|
|
28
|
+
.filter((entry) => entry && typeof entry.address === "string" && entry.address.length > 0)
|
|
29
|
+
.map((entry) => ({
|
|
30
|
+
displayName: typeof entry.displayName === "string" ? entry.displayName : "",
|
|
31
|
+
address: entry.address,
|
|
32
|
+
kind: entry.kind,
|
|
33
|
+
}))
|
|
34
|
+
: [];
|
|
35
|
+
}
|
|
36
|
+
async function fetchSuggestions(path, query, params, signal, client) {
|
|
37
|
+
const q = normalizeQuery(query);
|
|
38
|
+
if (q === undefined) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const search = new URLSearchParams({ q });
|
|
42
|
+
for (const [key, value] of Object.entries(params)) {
|
|
43
|
+
if (value !== undefined) {
|
|
44
|
+
search.set(key, value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return wellFormed(await withClient(client, `${path}?${search.toString()}`, signal ? { signal } : {}));
|
|
48
|
+
}
|
|
49
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
50
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
51
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
52
|
+
/** Searches the server directory. Rejects with a 403 `ApiRequestError` for a caller without a mailbox on the server,
|
|
53
|
+
* and a 429 one when the caller searches too often. */
|
|
54
|
+
export function searchDirectory(query, options = {}, client) {
|
|
55
|
+
return fetchSuggestions("/mail/directory", query, { limit: options.limit?.toString() }, options.signal, client);
|
|
56
|
+
}
|
|
57
|
+
/** Searches the caller's contacts (every address of a contact whose name matches, or the addresses that match). */
|
|
58
|
+
export function searchContactSuggestions(query, options = {}, client) {
|
|
59
|
+
return fetchSuggestions("/mail/directory/contacts", query, { limit: options.limit?.toString(), mailboxUid: options.mailboxUid }, options.signal, client);
|
|
60
|
+
}
|
|
61
|
+
/** Contacts first, then directory entries, without repeating an address (compared case-insensitively; the first
|
|
62
|
+
* occurrence wins), at most `limit`. */
|
|
63
|
+
export function mergeRecipientSuggestions(contacts, directory, limit = RECIPIENT_SUGGESTION_DEFAULT_LIMIT) {
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
const result = [];
|
|
66
|
+
for (const entry of [...contacts, ...directory]) {
|
|
67
|
+
const key = entry.address.trim().toLowerCase();
|
|
68
|
+
if (result.length >= limit) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (!seen.has(key)) {
|
|
72
|
+
seen.add(key);
|
|
73
|
+
result.push(entry);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
function isAbort(error) {
|
|
79
|
+
return error?.name === "AbortError";
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Contacts and directory suggestions for `query`, merged by `mergeRecipientSuggestions()`. Either source failing (a 403
|
|
83
|
+
* directory for a caller with no mailbox here, a 429, a network error) still returns the other's entries; only when
|
|
84
|
+
* both fail does this reject, with the contacts error. An aborted `signal` always rejects with the `AbortError`.
|
|
85
|
+
*/
|
|
86
|
+
export async function fetchRecipientSuggestions(query, options = {}, client) {
|
|
87
|
+
const limit = options.limit ?? RECIPIENT_SUGGESTION_DEFAULT_LIMIT;
|
|
88
|
+
const [contacts, directory] = await Promise.allSettled([
|
|
89
|
+
searchContactSuggestions(query, { ...options, limit }, client),
|
|
90
|
+
searchDirectory(query, { limit, signal: options.signal }, client),
|
|
91
|
+
]);
|
|
92
|
+
for (const outcome of [contacts, directory]) {
|
|
93
|
+
if (outcome.status === "rejected" && isAbort(outcome.reason)) {
|
|
94
|
+
throw outcome.reason;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (contacts.status === "rejected" && directory.status === "rejected") {
|
|
98
|
+
throw contacts.reason instanceof Error ? contacts.reason : new ApiRequestError("Suggestions couldn't be loaded.", 0);
|
|
99
|
+
}
|
|
100
|
+
return mergeRecipientSuggestions(contacts.status === "fulfilled" ? contacts.value : [], directory.status === "fulfilled" ? directory.value : [], limit);
|
|
101
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrappers over `@rapidmx/restapi`'s GDPR Article 17 ("right to erasure") request
|
|
3
|
+
* (`BaseDataSubjectErasureRequestRoute`, mounted at `mail/erasure-requests`). Unlike
|
|
4
|
+
* `dataExportApi.ts`/`mailboxImportApi.ts`, `create()` is self-service only — there is no
|
|
5
|
+
* admin-on-behalf-of path, and no `mailboxUid` parameter to override; it is always the caller's own
|
|
6
|
+
* mailbox. `approve()`/`deny()` are trusted-admin-only server-side. The actual destructive cascade is
|
|
7
|
+
* asynchronous (restapi's own `ErasureExecutionJob`, not this client) and irreversible once it runs — an
|
|
8
|
+
* approved request 409s during approval, and is retried indefinitely (never failed) by the job itself,
|
|
9
|
+
* while the target mailbox is a custodian on an active legal hold.
|
|
10
|
+
*/
|
|
11
|
+
import { ApiClient } from "../util/api.js";
|
|
12
|
+
import { RequestListParams } from "../util/apiQuery.js";
|
|
13
|
+
export type { RequestListParams };
|
|
14
|
+
export type DataSubjectErasureStatus = "pending" | "approved" | "in_progress" | "denied" | "completed";
|
|
15
|
+
export interface DataSubjectErasureRequest {
|
|
16
|
+
uid: string;
|
|
17
|
+
version: number;
|
|
18
|
+
dateCreated: string;
|
|
19
|
+
dateModified: string;
|
|
20
|
+
mailboxUid: string;
|
|
21
|
+
requestedByUserUid: string;
|
|
22
|
+
status: DataSubjectErasureStatus;
|
|
23
|
+
reviewedByUserUid?: string;
|
|
24
|
+
/** Only ever set by `denyErasureRequest()` — never required or meaningful for an approval. */
|
|
25
|
+
reason?: string;
|
|
26
|
+
/** Set once `status === "completed"` — a single aggregate count, not a per-row manifest. */
|
|
27
|
+
purgedCount?: number;
|
|
28
|
+
/** Set when an administrator filed this request for the data a deleted mailbox left behind (see `admin/leftoverMailboxApi.ts`) - it
|
|
29
|
+
* was approved when filed, and never removes a mailbox. */
|
|
30
|
+
leftoverOnly?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
33
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
34
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
35
|
+
/** Always the caller's own mailbox — 409s if a `pending` request for it already exists. */
|
|
36
|
+
export declare function createErasureRequest(client?: ApiClient): Promise<DataSubjectErasureRequest>;
|
|
37
|
+
/** A trusted caller sees every request; anyone else sees only their own (`requestedByUserUid`). Newest
|
|
38
|
+
* first; `params` pages through them (`limit` capped at 500 server-side). */
|
|
39
|
+
export declare function listErasureRequests(params?: RequestListParams, client?: ApiClient): Promise<DataSubjectErasureRequest[]>;
|
|
40
|
+
export declare function getErasureRequest(uid: string, client?: ApiClient): Promise<DataSubjectErasureRequest>;
|
|
41
|
+
/** 409s if the mailbox is a custodian on an active legal hold, naming the blocking Matter uid(s) in the
|
|
42
|
+
* error message — surface this as-is, the same "server's own message wins" convention used everywhere
|
|
43
|
+
* else in this codebase for a destructive-action error. */
|
|
44
|
+
export declare function approveErasureRequest(uid: string, client?: ApiClient): Promise<DataSubjectErasureRequest>;
|
|
45
|
+
export declare function denyErasureRequest(uid: string, reason: string, client?: ApiClient): Promise<DataSubjectErasureRequest>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrappers over `@rapidmx/restapi`'s GDPR Article 17 ("right to erasure") request
|
|
7
|
+
* (`BaseDataSubjectErasureRequestRoute`, mounted at `mail/erasure-requests`). Unlike
|
|
8
|
+
* `dataExportApi.ts`/`mailboxImportApi.ts`, `create()` is self-service only — there is no
|
|
9
|
+
* admin-on-behalf-of path, and no `mailboxUid` parameter to override; it is always the caller's own
|
|
10
|
+
* mailbox. `approve()`/`deny()` are trusted-admin-only server-side. The actual destructive cascade is
|
|
11
|
+
* asynchronous (restapi's own `ErasureExecutionJob`, not this client) and irreversible once it runs — an
|
|
12
|
+
* approved request 409s during approval, and is retried indefinitely (never failed) by the job itself,
|
|
13
|
+
* while the target mailbox is a custodian on an active legal hold.
|
|
14
|
+
*/
|
|
15
|
+
import { withClient } from "../util/api.js";
|
|
16
|
+
import { buildRequestListQuery } from "../util/apiQuery.js";
|
|
17
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
18
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
19
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
20
|
+
/** Always the caller's own mailbox — 409s if a `pending` request for it already exists. */
|
|
21
|
+
export function createErasureRequest(client) {
|
|
22
|
+
return withClient(client, `/mail/erasure-requests`, { method: "POST" });
|
|
23
|
+
}
|
|
24
|
+
/** A trusted caller sees every request; anyone else sees only their own (`requestedByUserUid`). Newest
|
|
25
|
+
* first; `params` pages through them (`limit` capped at 500 server-side). */
|
|
26
|
+
export function listErasureRequests(params = {}, client) {
|
|
27
|
+
return withClient(client, `/mail/erasure-requests${buildRequestListQuery(params)}`);
|
|
28
|
+
}
|
|
29
|
+
export function getErasureRequest(uid, client) {
|
|
30
|
+
return withClient(client, `/mail/erasure-requests/${encodeURIComponent(uid)}`);
|
|
31
|
+
}
|
|
32
|
+
/** 409s if the mailbox is a custodian on an active legal hold, naming the blocking Matter uid(s) in the
|
|
33
|
+
* error message — surface this as-is, the same "server's own message wins" convention used everywhere
|
|
34
|
+
* else in this codebase for a destructive-action error. */
|
|
35
|
+
export function approveErasureRequest(uid, client) {
|
|
36
|
+
return withClient(client, `/mail/erasure-requests/${encodeURIComponent(uid)}/approve`, { method: "POST" });
|
|
37
|
+
}
|
|
38
|
+
export function denyErasureRequest(uid, reason, client) {
|
|
39
|
+
return withClient(client, `/mail/erasure-requests/${encodeURIComponent(uid)}/deny`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
body: JSON.stringify({ reason }),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backs Tasks' "Flagged email" smart-list (an Outlook To-Do concept: flagged *Messages*, not Tasks,
|
|
3
|
+
* surfaced into the Tasks app).
|
|
4
|
+
*
|
|
5
|
+
* The server now does the filtering: `listMessages({ filter: "flagged" })` is an indexed database predicate on
|
|
6
|
+
* the denormalized `Message.flagged` mirror (`flags` itself is one JSON column, which is why this used to read
|
|
7
|
+
* every message in the mailbox and filter in the browser). What is still client-side is the fan-out: a message
|
|
8
|
+
* list is folder-scoped, and "every flagged message in this mailbox" spans every mail folder, so this still
|
|
9
|
+
* makes one paged call per folder and merges the results. The client-side `flags.flagged` check below is kept
|
|
10
|
+
* as a cheap guard for a row written before the mirror existed, not as the filter.
|
|
11
|
+
*/
|
|
12
|
+
import { Message } from "./mailApi.js";
|
|
13
|
+
import { ApiClient } from "../util/api.js";
|
|
14
|
+
/** Hard cap on pages read per folder (50,000 messages) - guards against paging forever should a server
|
|
15
|
+
* ignore `page` and keep returning full pages. */
|
|
16
|
+
export declare const FLAGGED_MAX_PAGES_PER_FOLDER = 100;
|
|
17
|
+
/** How many folders are paged through at once, bounding the request burst on a mailbox with many folders. */
|
|
18
|
+
export declare const FLAGGED_FOLDER_CONCURRENCY = 4;
|
|
19
|
+
/** Lists every flagged message across all of a mailbox's mail folders (not just Inbox), newest first, each
|
|
20
|
+
* message at most once. `client`, when given, is threaded through to every underlying `listFolders()`/
|
|
21
|
+
* `listMessages()` call (see `useApiClient()`'s own doc comment) - omitted, this behaves exactly as before. */
|
|
22
|
+
export declare function listFlaggedMessages(mailboxUid: string, client?: ApiClient): Promise<Message[]>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Backs Tasks' "Flagged email" smart-list (an Outlook To-Do concept: flagged *Messages*, not Tasks,
|
|
7
|
+
* surfaced into the Tasks app).
|
|
8
|
+
*
|
|
9
|
+
* The server now does the filtering: `listMessages({ filter: "flagged" })` is an indexed database predicate on
|
|
10
|
+
* the denormalized `Message.flagged` mirror (`flags` itself is one JSON column, which is why this used to read
|
|
11
|
+
* every message in the mailbox and filter in the browser). What is still client-side is the fan-out: a message
|
|
12
|
+
* list is folder-scoped, and "every flagged message in this mailbox" spans every mail folder, so this still
|
|
13
|
+
* makes one paged call per folder and merges the results. The client-side `flags.flagged` check below is kept
|
|
14
|
+
* as a cheap guard for a row written before the mirror existed, not as the filter.
|
|
15
|
+
*/
|
|
16
|
+
import { listFolders, listMessages } from "./mailApi.js";
|
|
17
|
+
/** Folder types that actually hold `Message` records — mirrors `MailShell.tsx`'s own `MAIL_FOLDER_TYPES`
|
|
18
|
+
* allowlist (kept as a separate local copy rather than a shared export, since the two call sites have no
|
|
19
|
+
* other coupling and this list is small/stable). */
|
|
20
|
+
const MAIL_FOLDER_TYPES = new Set(["inbox", "drafts", "outbox", "sent_items", "junk", "deleted_items", "archive", "user"]);
|
|
21
|
+
/** The server's own per-request `limit` cap - a page shorter than this is the folder's last one. */
|
|
22
|
+
const PAGE_SIZE = 500;
|
|
23
|
+
/** Hard cap on pages read per folder (50,000 messages) - guards against paging forever should a server
|
|
24
|
+
* ignore `page` and keep returning full pages. */
|
|
25
|
+
export const FLAGGED_MAX_PAGES_PER_FOLDER = 100;
|
|
26
|
+
/** How many folders are paged through at once, bounding the request burst on a mailbox with many folders. */
|
|
27
|
+
export const FLAGGED_FOLDER_CONCURRENCY = 4;
|
|
28
|
+
/** Every flagged message in one folder, paging through `listMessages()` until a short page. Only flagged
|
|
29
|
+
* messages are kept (a large folder's unflagged pages are dropped as they arrive). Stops early at
|
|
30
|
+
* `FLAGGED_MAX_PAGES_PER_FOLDER`, or when a full page brings no message not already seen (a server
|
|
31
|
+
* ignoring `page` and returning the same page again). */
|
|
32
|
+
async function listFlaggedInFolder(folderUid, seen, client) {
|
|
33
|
+
const flagged = [];
|
|
34
|
+
const seenInFolder = new Set();
|
|
35
|
+
for (let page = 0; page < FLAGGED_MAX_PAGES_PER_FOLDER; page += 1) {
|
|
36
|
+
const batch = await listMessages(folderUid, { limit: PAGE_SIZE, page, filter: "flagged" }, client);
|
|
37
|
+
let fresh = 0;
|
|
38
|
+
for (const message of batch) {
|
|
39
|
+
if (seenInFolder.has(message.uid)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
seenInFolder.add(message.uid);
|
|
43
|
+
fresh += 1;
|
|
44
|
+
// Deduplicated across folders too: a message moved mid-listing can appear in two folders' pages.
|
|
45
|
+
if (message.flags.flagged && !seen.has(message.uid)) {
|
|
46
|
+
seen.add(message.uid);
|
|
47
|
+
flagged.push(message);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (batch.length < PAGE_SIZE || fresh === 0) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return flagged;
|
|
55
|
+
}
|
|
56
|
+
/** Lists every flagged message across all of a mailbox's mail folders (not just Inbox), newest first, each
|
|
57
|
+
* message at most once. `client`, when given, is threaded through to every underlying `listFolders()`/
|
|
58
|
+
* `listMessages()` call (see `useApiClient()`'s own doc comment) - omitted, this behaves exactly as before. */
|
|
59
|
+
export async function listFlaggedMessages(mailboxUid, client) {
|
|
60
|
+
const folders = await listFolders(mailboxUid, client);
|
|
61
|
+
const mailFolders = folders.filter((f) => MAIL_FOLDER_TYPES.has(f.type));
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
const perFolder = [];
|
|
64
|
+
let next = 0;
|
|
65
|
+
async function worker() {
|
|
66
|
+
while (next < mailFolders.length) {
|
|
67
|
+
const index = next++;
|
|
68
|
+
perFolder[index] = await listFlaggedInFolder(mailFolders[index].uid, seen, client);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
await Promise.all(Array.from({ length: Math.min(FLAGGED_FOLDER_CONCURRENCY, mailFolders.length) }, () => worker()));
|
|
72
|
+
return perFolder.flat().sort((a, b) => new Date(b.receivedDate).getTime() - new Date(a.receivedDate).getTime());
|
|
73
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed wrappers over `@rapidmx/restapi`'s `FocusedInboxOverride` CRUD route (`BaseScopedChildRoute`,
|
|
3
|
+
* `scopeProperty: "mailboxUid"`) — the standing "always classify mail from this sender as Focused/Other"
|
|
4
|
+
* rules `BaseMessageRoute.classify()` (see `classifyMessage()` in `mailApi.ts`) upserts when a caller sets
|
|
5
|
+
* `applyToSender: true`. This file lets a Settings page list/remove those rules directly, and add one by
|
|
6
|
+
* hand without first receiving a matching message.
|
|
7
|
+
*/
|
|
8
|
+
import { ApiClient } from "../util/api.js";
|
|
9
|
+
import { ListParams } from "../util/apiQuery.js";
|
|
10
|
+
import { MessageClassification } from "./mailApi.js";
|
|
11
|
+
export type { ListParams };
|
|
12
|
+
export interface FocusedInboxOverride {
|
|
13
|
+
uid: string;
|
|
14
|
+
version: number;
|
|
15
|
+
dateCreated: string;
|
|
16
|
+
dateModified: string;
|
|
17
|
+
mailboxUid: string;
|
|
18
|
+
senderAddress: string;
|
|
19
|
+
classifyAs: MessageClassification;
|
|
20
|
+
}
|
|
21
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
22
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
23
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
24
|
+
export declare function listFocusedInboxOverrides(mailboxUid: string, params?: ListParams, client?: ApiClient): Promise<FocusedInboxOverride[]>;
|
|
25
|
+
export interface CreateFocusedInboxOverrideInput {
|
|
26
|
+
mailboxUid: string;
|
|
27
|
+
senderAddress: string;
|
|
28
|
+
classifyAs: MessageClassification;
|
|
29
|
+
}
|
|
30
|
+
export declare function createFocusedInboxOverride(input: CreateFocusedInboxOverrideInput, client?: ApiClient): Promise<FocusedInboxOverride>;
|
|
31
|
+
export interface UpdateFocusedInboxOverrideInput {
|
|
32
|
+
uid: string;
|
|
33
|
+
version: number;
|
|
34
|
+
classifyAs: MessageClassification;
|
|
35
|
+
}
|
|
36
|
+
export declare function updateFocusedInboxOverride(input: UpdateFocusedInboxOverrideInput, client?: ApiClient): Promise<FocusedInboxOverride>;
|
|
37
|
+
export declare function deleteFocusedInboxOverride(uid: string, version: number, client?: ApiClient): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* Typed wrappers over `@rapidmx/restapi`'s `FocusedInboxOverride` CRUD route (`BaseScopedChildRoute`,
|
|
7
|
+
* `scopeProperty: "mailboxUid"`) — the standing "always classify mail from this sender as Focused/Other"
|
|
8
|
+
* rules `BaseMessageRoute.classify()` (see `classifyMessage()` in `mailApi.ts`) upserts when a caller sets
|
|
9
|
+
* `applyToSender: true`. This file lets a Settings page list/remove those rules directly, and add one by
|
|
10
|
+
* hand without first receiving a matching message.
|
|
11
|
+
*/
|
|
12
|
+
import { withClient } from "../util/api.js";
|
|
13
|
+
import { buildQuery } from "../util/apiQuery.js";
|
|
14
|
+
/** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
|
|
15
|
+
* account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
|
|
16
|
+
* own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
|
|
17
|
+
export function listFocusedInboxOverrides(mailboxUid, params = {}, client) {
|
|
18
|
+
return withClient(client, `/mail/focused-inbox-overrides?${buildQuery(params, { mailboxUid })}`);
|
|
19
|
+
}
|
|
20
|
+
export function createFocusedInboxOverride(input, client) {
|
|
21
|
+
return withClient(client, "/mail/focused-inbox-overrides", {
|
|
22
|
+
method: "POST",
|
|
23
|
+
body: JSON.stringify(input),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function updateFocusedInboxOverride(input, client) {
|
|
27
|
+
return withClient(client, `/mail/focused-inbox-overrides/${encodeURIComponent(input.uid)}`, {
|
|
28
|
+
method: "PUT",
|
|
29
|
+
body: JSON.stringify(input),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function deleteFocusedInboxOverride(uid, version, client) {
|
|
33
|
+
return withClient(client, `/mail/focused-inbox-overrides/${encodeURIComponent(uid)}?version=${version}`, { method: "DELETE" });
|
|
34
|
+
}
|