@rapidmx/web-client 0.4.0 → 0.5.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/apps/admin/audit-log/index.tsx +35 -8
- package/apps/admin/data-requests/index.tsx +480 -485
- package/apps/admin/distribution-lists/[uid].tsx +19 -1
- package/apps/admin/escrow-scopes/[uid].tsx +348 -237
- package/apps/admin/escrow-scopes/new/index.tsx +8 -2
- package/apps/admin/index.tsx +19 -1
- package/apps/admin/ingest-queue/index.tsx +44 -5
- package/apps/admin/mailboxes/[uid].tsx +211 -184
- package/apps/admin/quarantine/index.tsx +46 -14
- package/apps/admin/transport-rules/[uid].tsx +30 -1
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +38 -2
- package/apps/admin/transport-rules/index.tsx +24 -6
- package/apps/admin/transport-rules/new/index.tsx +30 -1
- package/apps/escrow/_layout.tsx +2 -3
- package/apps/escrow/audit-log/index.tsx +196 -168
- package/apps/escrow/matters/[uid].tsx +621 -521
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +22 -1
- package/apps/shared/components/admin/layout/AdminShell.tsx +3 -1
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -0
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +3 -3
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +55 -11
- package/apps/shared/components/admin/settings/BrandingForm.tsx +15 -4
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +18 -7
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +10 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +6 -0
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +45 -12
- package/apps/shared/components/admin/settings/PluginsManager.tsx +1235 -595
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +174 -98
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +49 -13
- package/apps/shared/components/admin/setup/SetupWizard.tsx +150 -34
- package/apps/shared/components/admin/signOut.ts +79 -0
- package/apps/shared/components/admin/usePagedList.tsx +129 -0
- package/apps/shared/components/calendar/EventModal.tsx +717 -549
- package/apps/shared/components/calendar/MonthView.tsx +173 -139
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +222 -180
- package/apps/shared/components/calendar/SplitDayView.tsx +143 -137
- package/apps/shared/components/calendar/TimeGridView.tsx +244 -198
- package/apps/shared/components/calendar/allDay.ts +124 -0
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +1 -1
- package/apps/shared/components/contacts/ContactDetailPane.tsx +100 -21
- package/apps/shared/components/contacts/ContactForm.tsx +377 -348
- package/apps/shared/components/contacts/ContactsSidebar.tsx +6 -2
- package/apps/shared/components/contacts/KeyChangeReview.tsx +192 -0
- package/apps/shared/components/contacts/contactKeys.ts +78 -0
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +148 -134
- package/apps/shared/components/layout/AppShell.tsx +87 -15
- package/apps/shared/components/layout/BrandingChrome.tsx +48 -10
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +389 -298
- package/apps/shared/components/layout/MailboxProvisioning.tsx +19 -3
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +350 -0
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +257 -128
- package/apps/shared/components/mail/ConversationThreadPane.tsx +216 -181
- package/apps/shared/components/mail/MessageDetailPane.tsx +1318 -630
- package/apps/shared/components/mail/compose/ComposeContext.tsx +20 -15
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +854 -132
- package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -0
- package/apps/shared/components/mail/layout/MailShell.tsx +12 -2
- package/apps/shared/components/mail/pinnedSigners.ts +124 -0
- package/apps/shared/components/mail/verificationSeals.ts +125 -0
- package/apps/shared/components/mail/writableMailboxes.ts +101 -0
- package/apps/shared/components/rules/RuleBuilder.tsx +311 -276
- package/apps/shared/mail/listAllPages.ts +39 -0
- package/apps/shared/search/LocalIndexLifecycle.tsx +64 -55
- package/apps/shared/search/localIndexBuilder.ts +481 -179
- package/apps/shared/search/localIndexRpcClient.ts +228 -28
- package/apps/shared/search/localIndexSchema.ts +15 -6
- package/apps/shared/search/localIndexStorage.ts +98 -0
- package/apps/shared/search/localIndexVFS.ts +32 -1
- package/apps/shared/search/localIndexWorker.ts +648 -186
- package/apps/www/calendar/index.tsx +438 -417
- package/apps/www/contacts/[uid].tsx +21 -2
- package/apps/www/contacts/index.tsx +116 -12
- package/apps/www/index.tsx +1314 -1041
- package/apps/www/messages/[uid].tsx +18 -6
- package/apps/www/settings/auto-reply/index.tsx +134 -129
- package/apps/www/settings/booking-types/[uid].tsx +306 -300
- package/apps/www/settings/encryption/index.tsx +739 -216
- package/apps/www/settings/filters/[uid].tsx +171 -155
- package/apps/www/settings/filters/new/index.tsx +8 -1
- package/apps/www/settings/focused-inbox/index.tsx +150 -148
- package/apps/www/settings/privacy/index.tsx +494 -436
- package/apps/www/settings/read-receipts/index.tsx +148 -125
- package/apps/www/settings/sharing/index.tsx +17 -14
- package/apps/www/tasks/index.tsx +638 -579
- package/dist/apps/admin/audit-log/index.js +38 -8
- package/dist/apps/admin/data-requests/index.js +52 -72
- package/dist/apps/admin/distribution-lists/[uid].js +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].js +91 -12
- package/dist/apps/admin/escrow-scopes/new/index.js +8 -3
- package/dist/apps/admin/index.js +4 -1
- package/dist/apps/admin/ingest-queue/index.js +24 -6
- package/dist/apps/admin/mailboxes/[uid].js +20 -4
- package/dist/apps/admin/quarantine/index.js +20 -11
- package/dist/apps/admin/transport-rules/[uid].js +18 -2
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +19 -0
- package/dist/apps/admin/transport-rules/index.js +22 -6
- package/dist/apps/admin/transport-rules/new/index.js +18 -2
- package/dist/apps/escrow/_layout.js +3 -3
- package/dist/apps/escrow/audit-log/index.js +26 -1
- package/dist/apps/escrow/matters/[uid].js +77 -42
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +11 -2
- package/dist/apps/shared/components/admin/layout/AdminShell.js +3 -1
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +72 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +3 -3
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +22 -4
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +15 -4
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +13 -7
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +7 -2
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +6 -0
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +34 -12
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +390 -78
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +40 -11
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +29 -13
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +87 -21
- package/dist/apps/shared/components/admin/signOut.js +75 -0
- package/dist/apps/shared/components/admin/usePagedList.js +99 -0
- package/dist/apps/shared/components/calendar/EventModal.js +142 -21
- package/dist/apps/shared/components/calendar/MonthView.js +12 -5
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +40 -5
- package/dist/apps/shared/components/calendar/SplitDayView.js +10 -4
- package/dist/apps/shared/components/calendar/TimeGridView.js +23 -7
- package/dist/apps/shared/components/calendar/allDay.js +111 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +1 -1
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +43 -5
- package/dist/apps/shared/components/contacts/ContactForm.js +32 -10
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +2 -2
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +63 -0
- package/dist/apps/shared/components/contacts/contactKeys.js +64 -0
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +24 -5
- package/dist/apps/shared/components/layout/AppShell.js +83 -14
- package/dist/apps/shared/components/layout/BrandingChrome.js +45 -10
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +49 -12
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +10 -2
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +174 -0
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +73 -14
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +50 -12
- package/dist/apps/shared/components/mail/MessageDetailPane.js +441 -36
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +9 -6
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +699 -128
- package/dist/apps/shared/components/mail/compose/composeFlushRegistry.js +50 -0
- package/dist/apps/shared/components/mail/layout/MailShell.js +12 -3
- package/dist/apps/shared/components/mail/pinnedSigners.js +98 -0
- package/dist/apps/shared/components/mail/verificationSeals.js +112 -0
- package/dist/apps/shared/components/mail/writableMailboxes.js +87 -0
- package/dist/apps/shared/components/rules/RuleBuilder.js +34 -6
- package/dist/apps/shared/mail/listAllPages.js +25 -0
- package/dist/apps/shared/search/LocalIndexLifecycle.js +58 -54
- package/dist/apps/shared/search/localIndexBuilder.js +292 -37
- package/dist/apps/shared/search/localIndexRpcClient.js +188 -25
- package/dist/apps/shared/search/localIndexSchema.js +12 -6
- package/dist/apps/shared/search/localIndexStorage.js +86 -0
- package/dist/apps/shared/search/localIndexVFS.js +68 -40
- package/dist/apps/shared/search/localIndexWorker.js +519 -173
- package/dist/apps/www/calendar/index.js +28 -10
- package/dist/apps/www/contacts/[uid].js +13 -2
- package/dist/apps/www/contacts/index.js +80 -10
- package/dist/apps/www/index.js +339 -108
- package/dist/apps/www/messages/[uid].js +18 -6
- package/dist/apps/www/settings/auto-reply/index.js +9 -4
- package/dist/apps/www/settings/booking-types/[uid].js +17 -12
- package/dist/apps/www/settings/encryption/index.js +514 -97
- package/dist/apps/www/settings/filters/[uid].js +22 -7
- package/dist/apps/www/settings/filters/new/index.js +8 -2
- package/dist/apps/www/settings/focused-inbox/index.js +3 -1
- package/dist/apps/www/settings/privacy/index.js +57 -22
- package/dist/apps/www/settings/read-receipts/index.js +10 -3
- package/dist/apps/www/settings/sharing/index.js +7 -11
- package/dist/apps/www/tasks/index.js +50 -10
- package/package.json +2 -2
|
@@ -40,13 +40,25 @@ function MessageDetailContent({ uid }: { uid: string }) {
|
|
|
40
40
|
}, [uid]);
|
|
41
41
|
|
|
42
42
|
// See `apps/www/index.tsx`'s identical effect's own doc comment - a failure here just hides the
|
|
43
|
-
// Labels control rather than blocking the rest of the page.
|
|
44
|
-
//
|
|
43
|
+
// Labels control rather than blocking the rest of the page. Keyed on the message's own mailbox, not the
|
|
44
|
+
// shell's ambient one: this route is reached from aggregate/search rows too, where they can differ.
|
|
45
|
+
const messageMailboxUid = message?.mailboxUid;
|
|
45
46
|
useEffect(() => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
if (!messageMailboxUid) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
let cancelled = false;
|
|
51
|
+
listLabels(messageMailboxUid, { limit: 200 })
|
|
52
|
+
.then((result) => {
|
|
53
|
+
if (!cancelled) {
|
|
54
|
+
setLabels(result);
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
.catch(() => undefined);
|
|
58
|
+
return () => {
|
|
59
|
+
cancelled = true;
|
|
60
|
+
};
|
|
61
|
+
}, [messageMailboxUid]);
|
|
50
62
|
|
|
51
63
|
const attachments = useMessageAttachments(message);
|
|
52
64
|
useMarkMessageRead(message, setMessage);
|
|
@@ -1,129 +1,134 @@
|
|
|
1
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
-
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
-
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import React, { FormEvent, useState } from "react";
|
|
6
|
-
import { ApiRequestError } from "@rapidmx/react-shared/util/api.js";
|
|
7
|
-
import { toDatetimeLocal } from "@rapidmx/react-shared/util/dateInput.js";
|
|
8
|
-
import { updateMailbox } from "@rapidmx/react-shared/mail/mailApi.js";
|
|
9
|
-
import SettingsShell, { SettingsShellProps, useSettingsShell } from "../../../shared/components/settings/layout/SettingsShell.js";
|
|
10
|
-
import Alert from "@rapidmx/react-shared/components/feedback/Alert.js";
|
|
11
|
-
import Button from "@rapidmx/react-shared/components/buttons/Button.js";
|
|
12
|
-
|
|
13
|
-
const INPUT_CLASS =
|
|
14
|
-
"w-full text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
15
|
-
|
|
16
|
-
export type SettingsAutoReplyPageProps = Omit<SettingsShellProps, "active">;
|
|
17
|
-
|
|
18
|
-
export default function SettingsAutoReplyPage(props: SettingsAutoReplyPageProps) {
|
|
19
|
-
return (
|
|
20
|
-
<SettingsShell {...props} active="auto-reply">
|
|
21
|
-
<AutoReplyContent />
|
|
22
|
-
</SettingsShell>
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function AutoReplyContent() {
|
|
27
|
-
const { mailboxUid, mailboxes } = useSettingsShell();
|
|
28
|
-
// `SettingsShell` only ever renders its children once `mailboxes` has loaded and `mailboxUid` has
|
|
29
|
-
// resolved to one of them (a mailbox-less caller sees `MailboxProvisioning` instead) — this lookup
|
|
30
|
-
// can't miss, same established non-null pattern as `apps/www/contacts/index.tsx`'s `mailboxUid!`.
|
|
31
|
-
const mailbox = mailboxes.find((mb) => mb.uid === mailboxUid)!;
|
|
32
|
-
|
|
33
|
-
const [oofEnabled, setOofEnabled] = useState(mailbox.oofEnabled ?? false);
|
|
34
|
-
const [oofMessage, setOofMessage] = useState(mailbox.oofMessage ?? "");
|
|
35
|
-
const [oofStartTime, setOofStartTime] = useState(mailbox.oofStartTime ? toDatetimeLocal(mailbox.oofStartTime) : "");
|
|
36
|
-
const [oofEndTime, setOofEndTime] = useState(mailbox.oofEndTime ? toDatetimeLocal(mailbox.oofEndTime) : "");
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import React, { FormEvent, useState } from "react";
|
|
6
|
+
import { ApiRequestError } from "@rapidmx/react-shared/util/api.js";
|
|
7
|
+
import { toDatetimeLocal } from "@rapidmx/react-shared/util/dateInput.js";
|
|
8
|
+
import { updateMailbox } from "@rapidmx/react-shared/mail/mailApi.js";
|
|
9
|
+
import SettingsShell, { SettingsShellProps, useSettingsShell } from "../../../shared/components/settings/layout/SettingsShell.js";
|
|
10
|
+
import Alert from "@rapidmx/react-shared/components/feedback/Alert.js";
|
|
11
|
+
import Button from "@rapidmx/react-shared/components/buttons/Button.js";
|
|
12
|
+
|
|
13
|
+
const INPUT_CLASS =
|
|
14
|
+
"w-full text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
15
|
+
|
|
16
|
+
export type SettingsAutoReplyPageProps = Omit<SettingsShellProps, "active">;
|
|
17
|
+
|
|
18
|
+
export default function SettingsAutoReplyPage(props: SettingsAutoReplyPageProps) {
|
|
19
|
+
return (
|
|
20
|
+
<SettingsShell {...props} active="auto-reply">
|
|
21
|
+
<AutoReplyContent />
|
|
22
|
+
</SettingsShell>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function AutoReplyContent() {
|
|
27
|
+
const { mailboxUid, mailboxes } = useSettingsShell();
|
|
28
|
+
// `SettingsShell` only ever renders its children once `mailboxes` has loaded and `mailboxUid` has
|
|
29
|
+
// resolved to one of them (a mailbox-less caller sees `MailboxProvisioning` instead) — this lookup
|
|
30
|
+
// can't miss, same established non-null pattern as `apps/www/contacts/index.tsx`'s `mailboxUid!`.
|
|
31
|
+
const mailbox = mailboxes.find((mb) => mb.uid === mailboxUid)!;
|
|
32
|
+
|
|
33
|
+
const [oofEnabled, setOofEnabled] = useState(mailbox.oofEnabled ?? false);
|
|
34
|
+
const [oofMessage, setOofMessage] = useState(mailbox.oofMessage ?? "");
|
|
35
|
+
const [oofStartTime, setOofStartTime] = useState(mailbox.oofStartTime ? toDatetimeLocal(mailbox.oofStartTime) : "");
|
|
36
|
+
const [oofEndTime, setOofEndTime] = useState(mailbox.oofEndTime ? toDatetimeLocal(mailbox.oofEndTime) : "");
|
|
37
|
+
// `SettingsShell`'s `mailboxes` is fetched once - every save bumps the server's version, so a second
|
|
38
|
+
// save without a reload must send the version the previous save returned, not the stale original.
|
|
39
|
+
const [version, setVersion] = useState(mailbox.version);
|
|
40
|
+
const [error, setError] = useState<string | null>(null);
|
|
41
|
+
const [saving, setSaving] = useState(false);
|
|
42
|
+
const [saved, setSaved] = useState(false);
|
|
43
|
+
|
|
44
|
+
async function handleSubmit(e: FormEvent) {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
setError(null);
|
|
47
|
+
setSaved(false);
|
|
48
|
+
setSaving(true);
|
|
49
|
+
try {
|
|
50
|
+
const updated = await updateMailbox({
|
|
51
|
+
uid: mailbox.uid,
|
|
52
|
+
version,
|
|
53
|
+
oofEnabled,
|
|
54
|
+
oofMessage,
|
|
55
|
+
// `null` (not omitted) clears a previously saved window - an omitted field is left as-is.
|
|
56
|
+
oofStartTime: oofStartTime ? new Date(oofStartTime).toISOString() : null,
|
|
57
|
+
oofEndTime: oofEndTime ? new Date(oofEndTime).toISOString() : null,
|
|
58
|
+
});
|
|
59
|
+
setVersion(updated.version);
|
|
60
|
+
setSaved(true);
|
|
61
|
+
} catch (err) {
|
|
62
|
+
setError(err instanceof ApiRequestError ? err.message : "Could not save automatic reply settings.");
|
|
63
|
+
} finally {
|
|
64
|
+
setSaving(false);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<div className="flex-1 min-w-0 overflow-y-auto p-6">
|
|
70
|
+
<div className="max-w-xl">
|
|
71
|
+
<h1 className="text-lg font-bold tracking-tight mb-1">Automatic Replies</h1>
|
|
72
|
+
<p className="text-sm text-text-muted mb-4">
|
|
73
|
+
Send an automatic reply to anyone who emails {mailbox.displayName} while you’re away. A
|
|
74
|
+
calendar event with its own automatic reply enabled takes over for its own start/end window.
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
{error && <Alert>{error}</Alert>}
|
|
78
|
+
{saved && !error && <div className="mb-4 text-sm text-success font-medium">Saved.</div>}
|
|
79
|
+
|
|
80
|
+
<form onSubmit={handleSubmit} className="flex flex-col gap-4">
|
|
81
|
+
<label className="flex items-center gap-2 text-sm font-medium">
|
|
82
|
+
<input type="checkbox" checked={oofEnabled} onChange={(e) => setOofEnabled(e.target.checked)} />
|
|
83
|
+
Automatic replies are on
|
|
84
|
+
</label>
|
|
85
|
+
|
|
86
|
+
{oofEnabled && (
|
|
87
|
+
<>
|
|
88
|
+
<label className="flex flex-col gap-1.5 text-sm">
|
|
89
|
+
<span className="font-semibold">Message</span>
|
|
90
|
+
<textarea
|
|
91
|
+
aria-label="Automatic reply message"
|
|
92
|
+
className={INPUT_CLASS}
|
|
93
|
+
rows={5}
|
|
94
|
+
value={oofMessage}
|
|
95
|
+
onChange={(e) => setOofMessage(e.target.value)}
|
|
96
|
+
/>
|
|
97
|
+
</label>
|
|
98
|
+
|
|
99
|
+
<div className="grid grid-cols-2 gap-3">
|
|
100
|
+
<label className="flex flex-col gap-1.5 text-sm">
|
|
101
|
+
<span className="font-semibold">Start (optional)</span>
|
|
102
|
+
<input
|
|
103
|
+
type="datetime-local"
|
|
104
|
+
aria-label="Automatic reply start"
|
|
105
|
+
className={INPUT_CLASS}
|
|
106
|
+
value={oofStartTime}
|
|
107
|
+
onChange={(e) => setOofStartTime(e.target.value)}
|
|
108
|
+
/>
|
|
109
|
+
</label>
|
|
110
|
+
<label className="flex flex-col gap-1.5 text-sm">
|
|
111
|
+
<span className="font-semibold">End (optional)</span>
|
|
112
|
+
<input
|
|
113
|
+
type="datetime-local"
|
|
114
|
+
aria-label="Automatic reply end"
|
|
115
|
+
className={INPUT_CLASS}
|
|
116
|
+
value={oofEndTime}
|
|
117
|
+
onChange={(e) => setOofEndTime(e.target.value)}
|
|
118
|
+
/>
|
|
119
|
+
</label>
|
|
120
|
+
</div>
|
|
121
|
+
<p className="text-xs text-text-muted -mt-2">Leave both blank to stay on indefinitely until turned off.</p>
|
|
122
|
+
</>
|
|
123
|
+
)}
|
|
124
|
+
|
|
125
|
+
<div>
|
|
126
|
+
<Button type="submit" loading={saving} disabled={saving} className="!w-auto">
|
|
127
|
+
Save
|
|
128
|
+
</Button>
|
|
129
|
+
</div>
|
|
130
|
+
</form>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
);
|
|
134
|
+
}
|