@rapidmx/web-client 0.4.0 → 0.6.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 +88 -0
- 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 +28 -9
- 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 +194 -192
- 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/contacts/layout/ContactsShell.tsx +199 -197
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +148 -134
- package/apps/shared/components/layout/AppShell.tsx +123 -33
- 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 +420 -408
- 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/components/settings/layout/SettingsShell.tsx +23 -9
- package/apps/shared/components/tasks/layout/TasksShell.tsx +201 -199
- package/apps/shared/mail/listAllPages.ts +39 -0
- package/apps/shared/plugins/pluginNav.ts +73 -0
- package/apps/shared/search/LocalIndexLifecycle.tsx +64 -55
- package/apps/shared/search/localIndexBuilder.ts +481 -179
- package/apps/shared/search/localIndexRpcClient.ts +231 -29
- 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/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/_404.d.ts +2 -0
- package/dist/apps/admin/_500.d.ts +2 -0
- package/dist/apps/admin/_layout.d.ts +8 -0
- package/dist/apps/admin/audit-log/index.d.ts +11 -0
- package/dist/apps/admin/audit-log/index.js +38 -8
- package/dist/apps/admin/branding/index.d.ts +3 -0
- package/dist/apps/admin/data-requests/index.d.ts +3 -0
- package/dist/apps/admin/data-requests/index.js +52 -72
- package/dist/apps/admin/distribution-lists/[uid].d.ts +7 -0
- package/dist/apps/admin/distribution-lists/[uid].js +1 -1
- package/dist/apps/admin/distribution-lists/index.d.ts +3 -0
- package/dist/apps/admin/distribution-lists/new/index.d.ts +3 -0
- package/dist/apps/admin/domains/[uid].d.ts +7 -0
- package/dist/apps/admin/domains/index.d.ts +3 -0
- package/dist/apps/admin/domains/new/index.d.ts +3 -0
- package/dist/apps/admin/encryption-policy/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +21 -0
- package/dist/apps/admin/escrow-scopes/[uid].js +91 -12
- package/dist/apps/admin/escrow-scopes/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/new/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/new/index.js +8 -3
- package/dist/apps/admin/index.d.ts +3 -0
- package/dist/apps/admin/index.js +4 -1
- package/dist/apps/admin/ingest-queue/index.d.ts +4 -0
- package/dist/apps/admin/ingest-queue/index.js +24 -6
- package/dist/apps/admin/mailbox-policy/index.d.ts +3 -0
- package/dist/apps/admin/mailboxes/[uid].d.ts +7 -0
- package/dist/apps/admin/mailboxes/[uid].js +20 -4
- package/dist/apps/admin/mailboxes/new/index.d.ts +3 -0
- package/dist/apps/admin/plugins/index.d.ts +3 -0
- package/dist/apps/admin/quarantine/index.d.ts +6 -0
- package/dist/apps/admin/quarantine/index.js +20 -11
- package/dist/apps/admin/retention-policy/index.d.ts +3 -0
- package/dist/apps/admin/setup/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/[uid].d.ts +7 -0
- package/dist/apps/admin/transport-rules/[uid].js +18 -2
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +21 -0
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +19 -0
- package/dist/apps/admin/transport-rules/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/index.js +22 -6
- package/dist/apps/admin/transport-rules/new/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/new/index.js +18 -2
- package/dist/apps/escrow/_layout.d.ts +10 -0
- package/dist/apps/escrow/_layout.js +3 -3
- package/dist/apps/escrow/audit-log/index.d.ts +9 -0
- package/dist/apps/escrow/audit-log/index.js +26 -1
- package/dist/apps/escrow/index.d.ts +3 -0
- package/dist/apps/escrow/matters/[uid].d.ts +7 -0
- package/dist/apps/escrow/matters/[uid].js +77 -42
- package/dist/apps/escrow/matters/new/index.d.ts +3 -0
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +17 -0
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.d.ts +32 -0
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +11 -2
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +32 -0
- package/dist/apps/shared/components/admin/layout/AdminShell.js +15 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +12 -0
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +72 -0
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +6 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +19 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +3 -3
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.d.ts +12 -0
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +22 -4
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +15 -4
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +12 -0
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +13 -7
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +12 -0
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +7 -2
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +19 -0
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +6 -0
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +10 -0
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +34 -12
- package/dist/apps/shared/components/admin/settings/PluginsManager.d.ts +4 -0
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +390 -78
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +40 -11
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.d.ts +14 -0
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +29 -13
- package/dist/apps/shared/components/admin/setup/SetupWizard.d.ts +36 -0
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +87 -21
- package/dist/apps/shared/components/admin/signOut.d.ts +23 -0
- package/dist/apps/shared/components/admin/signOut.js +75 -0
- package/dist/apps/shared/components/admin/usePagedList.d.ts +39 -0
- package/dist/apps/shared/components/admin/usePagedList.js +99 -0
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +26 -0
- package/dist/apps/shared/components/calendar/EventModal.d.ts +46 -0
- package/dist/apps/shared/components/calendar/EventModal.js +142 -21
- package/dist/apps/shared/components/calendar/MonthView.d.ts +15 -0
- package/dist/apps/shared/components/calendar/MonthView.js +12 -5
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +20 -0
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +40 -5
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +19 -0
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +28 -0
- package/dist/apps/shared/components/calendar/SplitDayView.js +10 -4
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +17 -0
- package/dist/apps/shared/components/calendar/TimeGridView.js +23 -7
- package/dist/apps/shared/components/calendar/allDay.d.ts +51 -0
- package/dist/apps/shared/components/calendar/allDay.js +111 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +40 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +3 -3
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +23 -0
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +43 -5
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +20 -0
- package/dist/apps/shared/components/contacts/ContactForm.js +32 -10
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +40 -0
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +2 -2
- package/dist/apps/shared/components/contacts/ContactsToolbar.d.ts +25 -0
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +40 -0
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +63 -0
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +29 -0
- package/dist/apps/shared/components/contacts/contactKeys.js +64 -0
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +21 -0
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +2 -2
- package/dist/apps/shared/components/escrow/layout/EscrowShell.d.ts +25 -0
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +24 -5
- package/dist/apps/shared/components/forms/StringListField.d.ts +22 -0
- package/dist/apps/shared/components/layout/AppShell.d.ts +49 -0
- package/dist/apps/shared/components/layout/AppShell.js +97 -26
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +18 -0
- package/dist/apps/shared/components/layout/BrandingChrome.js +45 -10
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +51 -0
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +49 -12
- package/dist/apps/shared/components/layout/MailboxProvisioning.d.ts +13 -0
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +10 -2
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +66 -0
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +174 -0
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +45 -0
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +73 -14
- package/dist/apps/shared/components/layout/UserMenu.d.ts +23 -0
- package/dist/apps/shared/components/mail/ConversationList.d.ts +11 -0
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +23 -0
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +50 -12
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +93 -0
- package/dist/apps/shared/components/mail/MessageDetailPane.js +441 -36
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +58 -0
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +9 -6
- package/dist/apps/shared/components/mail/compose/ComposeToolbar.d.ts +15 -0
- package/dist/apps/shared/components/mail/compose/ComposeWindow.d.ts +37 -0
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +699 -128
- package/dist/apps/shared/components/mail/compose/EmojiPicker.d.ts +14 -0
- package/dist/apps/shared/components/mail/compose/GifPicker.d.ts +13 -0
- package/dist/apps/shared/components/mail/compose/RichTextEditor.d.ts +34 -0
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.d.ts +16 -0
- package/dist/apps/shared/components/mail/compose/composeFlushRegistry.d.ts +27 -0
- package/dist/apps/shared/components/mail/compose/composeFlushRegistry.js +50 -0
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +57 -0
- package/dist/apps/shared/components/mail/layout/MailShell.js +13 -4
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +33 -0
- package/dist/apps/shared/components/mail/pinnedSigners.js +98 -0
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +22 -0
- package/dist/apps/shared/components/mail/verificationSeals.js +112 -0
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +15 -0
- package/dist/apps/shared/components/mail/writableMailboxes.js +87 -0
- package/dist/apps/shared/components/rules/RuleBuilder.d.ts +70 -0
- package/dist/apps/shared/components/rules/RuleBuilder.js +34 -6
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +41 -0
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +19 -9
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +41 -0
- package/dist/apps/shared/components/tasks/TasksToolbar.d.ts +14 -0
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +24 -0
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +2 -2
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -0
- package/dist/apps/shared/mail/listAllPages.d.ts +17 -0
- package/dist/apps/shared/mail/listAllPages.js +25 -0
- package/dist/apps/shared/plugins/pluginNav.d.ts +39 -0
- package/dist/apps/shared/plugins/pluginNav.js +33 -0
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +13 -0
- package/dist/apps/shared/search/LocalIndexLifecycle.js +58 -54
- package/dist/apps/shared/search/localIndexBlockCipher.d.ts +36 -0
- package/dist/apps/shared/search/localIndexBuilder.d.ts +85 -0
- package/dist/apps/shared/search/localIndexBuilder.js +292 -37
- package/dist/apps/shared/search/localIndexKey.d.ts +4 -0
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +71 -0
- package/dist/apps/shared/search/localIndexRpcClient.js +191 -26
- package/dist/apps/shared/search/localIndexSchema.d.ts +111 -0
- package/dist/apps/shared/search/localIndexSchema.js +12 -6
- package/dist/apps/shared/search/localIndexSizePreference.d.ts +27 -0
- package/dist/apps/shared/search/localIndexStorage.d.ts +28 -0
- package/dist/apps/shared/search/localIndexStorage.js +86 -0
- package/dist/apps/shared/search/localIndexVFS.d.ts +101 -0
- package/dist/apps/shared/search/localIndexVFS.js +68 -40
- package/dist/apps/shared/search/localIndexWorker.d.ts +145 -0
- package/dist/apps/shared/search/localIndexWorker.js +519 -173
- package/dist/apps/shared/search/searchTier2.d.ts +30 -0
- package/dist/apps/www/_404.d.ts +2 -0
- package/dist/apps/www/_500.d.ts +2 -0
- package/dist/apps/www/_layout.d.ts +14 -0
- package/dist/apps/www/calendar/index.d.ts +3 -0
- package/dist/apps/www/calendar/index.js +28 -10
- package/dist/apps/www/contacts/[uid].d.ts +13 -0
- package/dist/apps/www/contacts/[uid].js +13 -2
- package/dist/apps/www/contacts/index.d.ts +3 -0
- package/dist/apps/www/contacts/index.js +80 -10
- package/dist/apps/www/index.d.ts +3 -0
- package/dist/apps/www/index.js +339 -108
- package/dist/apps/www/messages/[uid].d.ts +11 -0
- package/dist/apps/www/messages/[uid].js +18 -6
- package/dist/apps/www/settings/auto-reply/index.d.ts +4 -0
- package/dist/apps/www/settings/auto-reply/index.js +9 -4
- package/dist/apps/www/settings/encryption/index.d.ts +7 -0
- package/dist/apps/www/settings/encryption/index.js +514 -97
- package/dist/apps/www/settings/filters/[uid].d.ts +8 -0
- package/dist/apps/www/settings/filters/[uid].js +22 -7
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +11 -0
- package/dist/apps/www/settings/filters/index.d.ts +4 -0
- package/dist/apps/www/settings/filters/new/index.d.ts +4 -0
- package/dist/apps/www/settings/filters/new/index.js +8 -2
- package/dist/apps/www/settings/focused-inbox/index.d.ts +4 -0
- package/dist/apps/www/settings/focused-inbox/index.js +3 -1
- package/dist/apps/www/settings/labels/index.d.ts +4 -0
- package/dist/apps/www/settings/privacy/index.d.ts +4 -0
- package/dist/apps/www/settings/privacy/index.js +57 -22
- package/dist/apps/www/settings/read-receipts/index.d.ts +4 -0
- package/dist/apps/www/settings/read-receipts/index.js +10 -3
- package/dist/apps/www/settings/sharing/index.d.ts +4 -0
- package/dist/apps/www/settings/sharing/index.js +7 -11
- package/dist/apps/www/settings/signatures/[uid].d.ts +8 -0
- package/dist/apps/www/settings/signatures/index.d.ts +4 -0
- package/dist/apps/www/settings/signatures/new/index.d.ts +4 -0
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +10 -0
- package/dist/apps/www/tasks/index.d.ts +3 -0
- package/dist/apps/www/tasks/index.js +50 -10
- package/package.json +3 -3
- package/apps/shared/components/booking/AvailabilityEditor.tsx +0 -118
- package/apps/www/settings/booking-types/[uid].tsx +0 -300
- package/apps/www/settings/booking-types/index.tsx +0 -98
- package/apps/www/settings/booking-types/new/index.tsx +0 -212
- package/dist/apps/shared/components/booking/AvailabilityEditor.js +0 -45
- package/dist/apps/www/settings/booking-types/[uid].js +0 -129
- package/dist/apps/www/settings/booking-types/index.js +0 -29
- package/dist/apps/www/settings/booking-types/new/index.js +0 -86
|
@@ -1,276 +1,311 @@
|
|
|
1
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
-
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
-
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import React, { ReactNode, useState } from "react";
|
|
6
|
-
import Button from "@rapidmx/react-shared/components/buttons/Button.js";
|
|
7
|
-
|
|
8
|
-
const INPUT_CLASS =
|
|
9
|
-
"flex-1 text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
10
|
-
|
|
11
|
-
/** One condition field this scope's `Conditions` shape supports — `"list"` renders an add/remove chip
|
|
12
|
-
* editor for a `string[]` field, `"boolean"` a plain checkbox, `"select"` a fixed-choice dropdown for a
|
|
13
|
-
* field with a small closed set of string values (e.g. `MailFilterConditions.importance`). */
|
|
14
|
-
export interface ConditionFieldDef {
|
|
15
|
-
key: string;
|
|
16
|
-
label: string;
|
|
17
|
-
kind: "list" | "boolean" | "select";
|
|
18
|
-
placeholder?: string;
|
|
19
|
-
/** Required when `kind` is `"select"` — the fixed set of values this field may hold, plus an
|
|
20
|
-
* implicit "Any" option that clears the field entirely. */
|
|
21
|
-
options?: { value: string; label: string }[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** One action type this scope's `Action` union supports — the per-scope registry the shared condition
|
|
25
|
-
* editor/chrome below is deliberately kept out of (transport-rule and mail-filter actions are
|
|
26
|
-
* different enough vocabularies that one component special-casing both would be worse than this). */
|
|
27
|
-
export interface ActionTypeDef<A> {
|
|
28
|
-
value: string;
|
|
29
|
-
label: string;
|
|
30
|
-
/** Builds a fresh default action of this type when picked from "Add action". */
|
|
31
|
-
createDefault: () => A;
|
|
32
|
-
/** Renders this action's own type-specific fields (e.g. header name/value). `null` for an action
|
|
33
|
-
* type with nothing further to configure. */
|
|
34
|
-
render: (action: A, onChange: (next: A) => void) => ReactNode;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface RuleBuilderValue<C extends object, A extends { type: string }> {
|
|
38
|
-
enabled: boolean;
|
|
39
|
-
sequence: number;
|
|
40
|
-
stopProcessingRules: boolean;
|
|
41
|
-
conditions: C;
|
|
42
|
-
actions: A[];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface RuleBuilderProps<C extends object, A extends { type: string }> {
|
|
46
|
-
value: RuleBuilderValue<C, A>;
|
|
47
|
-
onChange: (next: RuleBuilderValue<C, A>) => void;
|
|
48
|
-
conditionFields: ConditionFieldDef[];
|
|
49
|
-
actionTypes: ActionTypeDef<A>[];
|
|
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
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import React, { ReactNode, useState } from "react";
|
|
6
|
+
import Button from "@rapidmx/react-shared/components/buttons/Button.js";
|
|
7
|
+
|
|
8
|
+
const INPUT_CLASS =
|
|
9
|
+
"flex-1 text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
10
|
+
|
|
11
|
+
/** One condition field this scope's `Conditions` shape supports — `"list"` renders an add/remove chip
|
|
12
|
+
* editor for a `string[]` field, `"boolean"` a plain checkbox, `"select"` a fixed-choice dropdown for a
|
|
13
|
+
* field with a small closed set of string values (e.g. `MailFilterConditions.importance`). */
|
|
14
|
+
export interface ConditionFieldDef {
|
|
15
|
+
key: string;
|
|
16
|
+
label: string;
|
|
17
|
+
kind: "list" | "boolean" | "select";
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
/** Required when `kind` is `"select"` — the fixed set of values this field may hold, plus an
|
|
20
|
+
* implicit "Any" option that clears the field entirely. */
|
|
21
|
+
options?: { value: string; label: string }[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** One action type this scope's `Action` union supports — the per-scope registry the shared condition
|
|
25
|
+
* editor/chrome below is deliberately kept out of (transport-rule and mail-filter actions are
|
|
26
|
+
* different enough vocabularies that one component special-casing both would be worse than this). */
|
|
27
|
+
export interface ActionTypeDef<A> {
|
|
28
|
+
value: string;
|
|
29
|
+
label: string;
|
|
30
|
+
/** Builds a fresh default action of this type when picked from "Add action". */
|
|
31
|
+
createDefault: () => A;
|
|
32
|
+
/** Renders this action's own type-specific fields (e.g. header name/value). `null` for an action
|
|
33
|
+
* type with nothing further to configure. */
|
|
34
|
+
render: (action: A, onChange: (next: A) => void) => ReactNode;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface RuleBuilderValue<C extends object, A extends { type: string }> {
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
sequence: number;
|
|
40
|
+
stopProcessingRules: boolean;
|
|
41
|
+
conditions: C;
|
|
42
|
+
actions: A[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface RuleBuilderProps<C extends object, A extends { type: string }> {
|
|
46
|
+
value: RuleBuilderValue<C, A>;
|
|
47
|
+
onChange: (next: RuleBuilderValue<C, A>) => void;
|
|
48
|
+
conditionFields: ConditionFieldDef[];
|
|
49
|
+
actionTypes: ActionTypeDef<A>[];
|
|
50
|
+
/** Set by the page once the user has tried to save a rule `hasConditions()` rejects - turns the
|
|
51
|
+
* "add at least one condition" hint into an error. */
|
|
52
|
+
showValidation?: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Whether `conditions` holds at least one real condition: a list with a non-blank entry, a ticked
|
|
57
|
+
* boolean, or a chosen select value. A rule with none would match *every* message, so the pages that save
|
|
58
|
+
* a `RuleBuilder` value (mail filters, transport rules) must refuse to save unless this returns `true`.
|
|
59
|
+
*/
|
|
60
|
+
export function hasConditions(conditions: object): boolean {
|
|
61
|
+
return Object.values(conditions as Record<string, unknown>).some((v) => {
|
|
62
|
+
if (Array.isArray(v)) return v.some((entry) => typeof entry !== "string" || entry.trim() !== "");
|
|
63
|
+
if (typeof v === "string") return v.trim() !== "";
|
|
64
|
+
return v !== undefined && v !== null && v !== false;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Shared condition-row editor and enabled/sequence/stop-processing chrome for a rule that matches
|
|
70
|
+
* conditions and runs actions in order — `TransportRule` (admin, org-wide) and `MailFilterRule`
|
|
71
|
+
* (mailbox-scoped) both have this same `{enabled, sequence, stopProcessingRules, conditions, actions}`
|
|
72
|
+
* shape. Conditions are driven by a declarative `conditionFields` list so both scopes share this one
|
|
73
|
+
* editor despite their `Conditions` types not being identical — `MailFilterConditions.importance`
|
|
74
|
+
* (`MailFilterRule`'s one condition field `TransportRuleConditions` has no equivalent of) is what forced
|
|
75
|
+
* this list beyond `"list"`/`"boolean"` to add a third `"select"` kind for a small fixed-choice field,
|
|
76
|
+
* confirming the shared editor still generalizes rather than needing a fork; actions are driven by a
|
|
77
|
+
* small per-scope `actionTypes` registry instead, since the two action vocabularies (reject/quarantine/
|
|
78
|
+
* add-header/add-recipient vs. move/copy/delete/mark-read/forward) are different enough that one
|
|
79
|
+
* component special-casing both would be worse than this split.
|
|
80
|
+
*/
|
|
81
|
+
export default function RuleBuilder<C extends object, A extends { type: string }>({
|
|
82
|
+
value,
|
|
83
|
+
onChange,
|
|
84
|
+
conditionFields,
|
|
85
|
+
actionTypes,
|
|
86
|
+
showValidation = false,
|
|
87
|
+
}: RuleBuilderProps<C, A>) {
|
|
88
|
+
const [draftText, setDraftText] = useState<Record<string, string>>({});
|
|
89
|
+
const [newActionType, setNewActionType] = useState(actionTypes[0]?.value ?? "");
|
|
90
|
+
const conditions = value.conditions as Record<string, unknown>;
|
|
91
|
+
|
|
92
|
+
function patch(next: Partial<RuleBuilderValue<C, A>>) {
|
|
93
|
+
onChange({ ...value, ...next });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function addListEntry(key: string) {
|
|
97
|
+
const text = (draftText[key] ?? "").trim();
|
|
98
|
+
if (!text) return;
|
|
99
|
+
const existing = (conditions[key] as string[] | undefined) ?? [];
|
|
100
|
+
if (existing.includes(text)) return;
|
|
101
|
+
patch({ conditions: { ...conditions, [key]: [...existing, text] } as C });
|
|
102
|
+
setDraftText({ ...draftText, [key]: "" });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Only invoked from a chip's own "Remove" button, which only renders while `conditions[key]` holds
|
|
106
|
+
// that entry. Removing the last entry deletes the key rather than leaving an empty list behind.
|
|
107
|
+
function removeListEntry(key: string, entry: string) {
|
|
108
|
+
const remaining = (conditions[key] as string[]).filter((e) => e !== entry);
|
|
109
|
+
const next = { ...conditions };
|
|
110
|
+
if (remaining.length > 0) {
|
|
111
|
+
next[key] = remaining;
|
|
112
|
+
} else {
|
|
113
|
+
delete next[key];
|
|
114
|
+
}
|
|
115
|
+
patch({ conditions: next as C });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function toggleBoolean(key: string) {
|
|
119
|
+
// Unticking stores `undefined` (no condition), not `false`.
|
|
120
|
+
patch({ conditions: { ...conditions, [key]: conditions[key] ? undefined : true } as C });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function setSelect(key: string, value: string) {
|
|
124
|
+
patch({ conditions: { ...conditions, [key]: value || undefined } as C });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function addAction() {
|
|
128
|
+
const def = actionTypes.find((t) => t.value === newActionType);
|
|
129
|
+
if (!def) return;
|
|
130
|
+
patch({ actions: [...value.actions, def.createDefault()] });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function updateAction(index: number, next: A) {
|
|
134
|
+
patch({ actions: value.actions.map((a, i) => (i === index ? next : a)) });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function removeAction(index: number) {
|
|
138
|
+
patch({ actions: value.actions.filter((_, i) => i !== index) });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<div className="flex flex-col gap-5">
|
|
143
|
+
<div className="bg-surface border border-border rounded-md p-6">
|
|
144
|
+
<h2 className="text-base font-bold uppercase tracking-wide mb-4">Conditions</h2>
|
|
145
|
+
{!hasConditions(value.conditions) && (
|
|
146
|
+
<p role={showValidation ? "alert" : undefined} className={`text-sm mb-4 ${showValidation ? "text-danger" : "text-text-muted"}`}>
|
|
147
|
+
Add at least one condition. A rule without conditions would apply to every message.
|
|
148
|
+
</p>
|
|
149
|
+
)}
|
|
150
|
+
<div className="flex flex-col gap-4">
|
|
151
|
+
{conditionFields.map((field) => {
|
|
152
|
+
if (field.kind === "boolean") {
|
|
153
|
+
return (
|
|
154
|
+
<label key={field.key} className="flex items-center gap-2 text-sm">
|
|
155
|
+
<input
|
|
156
|
+
type="checkbox"
|
|
157
|
+
checked={!!conditions[field.key]}
|
|
158
|
+
onChange={() => toggleBoolean(field.key)}
|
|
159
|
+
/>
|
|
160
|
+
{field.label}
|
|
161
|
+
</label>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
if (field.kind === "select") {
|
|
165
|
+
return (
|
|
166
|
+
<div key={field.key}>
|
|
167
|
+
<label className="text-sm font-semibold mb-1.5 block" htmlFor={`condition-${field.key}`}>
|
|
168
|
+
{field.label}
|
|
169
|
+
</label>
|
|
170
|
+
<select
|
|
171
|
+
id={`condition-${field.key}`}
|
|
172
|
+
className={INPUT_CLASS}
|
|
173
|
+
value={(conditions[field.key] as string | undefined) ?? ""}
|
|
174
|
+
onChange={(e) => setSelect(field.key, e.target.value)}
|
|
175
|
+
>
|
|
176
|
+
<option value="">Any</option>
|
|
177
|
+
{(field.options ?? []).map((opt) => (
|
|
178
|
+
<option key={opt.value} value={opt.value}>
|
|
179
|
+
{opt.label}
|
|
180
|
+
</option>
|
|
181
|
+
))}
|
|
182
|
+
</select>
|
|
183
|
+
</div>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
return (
|
|
187
|
+
<div key={field.key}>
|
|
188
|
+
<div className="text-sm font-semibold mb-1.5">{field.label}</div>
|
|
189
|
+
<div className="flex flex-wrap gap-2 mb-2">
|
|
190
|
+
{((conditions[field.key] as string[] | undefined) ?? []).map((entry) => (
|
|
191
|
+
<span
|
|
192
|
+
key={entry}
|
|
193
|
+
className="inline-flex items-center gap-1.5 text-xs py-1 px-2.5 rounded-pill bg-surface-alt"
|
|
194
|
+
>
|
|
195
|
+
{entry}
|
|
196
|
+
<button
|
|
197
|
+
type="button"
|
|
198
|
+
aria-label={`Remove ${entry}`}
|
|
199
|
+
onClick={() => removeListEntry(field.key, entry)}
|
|
200
|
+
className="text-text-muted hover:text-danger"
|
|
201
|
+
>
|
|
202
|
+
×
|
|
203
|
+
</button>
|
|
204
|
+
</span>
|
|
205
|
+
))}
|
|
206
|
+
</div>
|
|
207
|
+
<div className="flex gap-2">
|
|
208
|
+
<input
|
|
209
|
+
type="text"
|
|
210
|
+
aria-label={field.label}
|
|
211
|
+
className={INPUT_CLASS}
|
|
212
|
+
placeholder={field.placeholder ?? "Add a value"}
|
|
213
|
+
value={draftText[field.key] ?? ""}
|
|
214
|
+
onChange={(e) => setDraftText({ ...draftText, [field.key]: e.target.value })}
|
|
215
|
+
// Text typed but never added (no Add/Enter) is committed when the field
|
|
216
|
+
// loses focus - e.g. to the page's Save button - so it's never silently
|
|
217
|
+
// dropped from the saved rule.
|
|
218
|
+
onBlur={() => addListEntry(field.key)}
|
|
219
|
+
onKeyDown={(e) => {
|
|
220
|
+
if (e.key === "Enter") {
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
addListEntry(field.key);
|
|
223
|
+
}
|
|
224
|
+
}}
|
|
225
|
+
/>
|
|
226
|
+
<Button
|
|
227
|
+
type="button"
|
|
228
|
+
variant="secondary"
|
|
229
|
+
className="!w-auto"
|
|
230
|
+
onClick={() => addListEntry(field.key)}
|
|
231
|
+
>
|
|
232
|
+
Add
|
|
233
|
+
</Button>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
);
|
|
237
|
+
})}
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
|
|
241
|
+
<div className="bg-surface border border-border rounded-md p-6">
|
|
242
|
+
<h2 className="text-base font-bold uppercase tracking-wide mb-4">Actions</h2>
|
|
243
|
+
<div className="flex flex-col gap-3 mb-4">
|
|
244
|
+
{value.actions.length === 0 && <p className="text-sm text-text-muted">No actions yet.</p>}
|
|
245
|
+
{value.actions.map((action, index) => {
|
|
246
|
+
const def = actionTypes.find((t) => t.value === action.type);
|
|
247
|
+
return (
|
|
248
|
+
<div key={index} className="border border-border rounded-sm p-3">
|
|
249
|
+
<div className="flex items-center justify-between mb-2">
|
|
250
|
+
<span className="text-sm font-semibold">{def?.label ?? action.type}</span>
|
|
251
|
+
<button
|
|
252
|
+
type="button"
|
|
253
|
+
onClick={() => removeAction(index)}
|
|
254
|
+
className="text-sm text-danger hover:underline"
|
|
255
|
+
>
|
|
256
|
+
Remove
|
|
257
|
+
</button>
|
|
258
|
+
</div>
|
|
259
|
+
{def?.render(action, (next) => updateAction(index, next))}
|
|
260
|
+
</div>
|
|
261
|
+
);
|
|
262
|
+
})}
|
|
263
|
+
</div>
|
|
264
|
+
<div className="flex gap-2">
|
|
265
|
+
<select
|
|
266
|
+
aria-label="New action type"
|
|
267
|
+
className={INPUT_CLASS}
|
|
268
|
+
value={newActionType}
|
|
269
|
+
onChange={(e) => setNewActionType(e.target.value)}
|
|
270
|
+
>
|
|
271
|
+
{actionTypes.map((t) => (
|
|
272
|
+
<option key={t.value} value={t.value}>
|
|
273
|
+
{t.label}
|
|
274
|
+
</option>
|
|
275
|
+
))}
|
|
276
|
+
</select>
|
|
277
|
+
<Button type="button" variant="secondary" className="!w-auto" onClick={addAction}>
|
|
278
|
+
Add action
|
|
279
|
+
</Button>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
<div className="bg-surface border border-border rounded-md p-6">
|
|
284
|
+
<h2 className="text-base font-bold uppercase tracking-wide mb-4">Settings</h2>
|
|
285
|
+
<div className="flex flex-col gap-3">
|
|
286
|
+
<label className="flex items-center gap-2 text-sm">
|
|
287
|
+
<input type="checkbox" checked={value.enabled} onChange={(e) => patch({ enabled: e.target.checked })} />
|
|
288
|
+
Enabled
|
|
289
|
+
</label>
|
|
290
|
+
<label className="flex items-center gap-2 text-sm">
|
|
291
|
+
<input
|
|
292
|
+
type="checkbox"
|
|
293
|
+
checked={value.stopProcessingRules}
|
|
294
|
+
onChange={(e) => patch({ stopProcessingRules: e.target.checked })}
|
|
295
|
+
/>
|
|
296
|
+
Stop processing more rules once this one matches
|
|
297
|
+
</label>
|
|
298
|
+
<label className="flex items-center gap-2 text-sm">
|
|
299
|
+
Sequence (evaluation order, ascending)
|
|
300
|
+
<input
|
|
301
|
+
type="number"
|
|
302
|
+
className="w-20 text-sm py-1.5 px-2 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary"
|
|
303
|
+
value={value.sequence}
|
|
304
|
+
onChange={(e) => patch({ sequence: Number(e.target.value) })}
|
|
305
|
+
/>
|
|
306
|
+
</label>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
);
|
|
311
|
+
}
|