windmill-components 1.537.1 → 1.542.5
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/package/components/AIProviderPicker.svelte +181 -0
- package/package/components/AIProviderPicker.svelte.d.ts +15 -0
- package/package/components/ArgInfo.svelte +2 -2
- package/package/components/ArgInput.svelte +35 -9
- package/package/components/ArgInput.svelte.d.ts +3 -3
- package/package/components/AssignableTagsInner.svelte +89 -3
- package/package/components/ConcurrentJobsChart.svelte +36 -48
- package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
- package/package/components/CustomPopover.svelte.d.ts +1 -1
- package/package/components/DropdownSelect.svelte +26 -0
- package/package/components/DropdownSelect.svelte.d.ts +11 -0
- package/package/components/DropdownV2Inner.svelte +1 -1
- package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
- package/package/components/DynamicInput.svelte.d.ts +11 -0
- package/package/components/EditableSchemaForm.svelte +119 -95
- package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
- package/package/components/Editor.svelte +86 -93
- package/package/components/Editor.svelte.d.ts +4 -3
- package/package/components/EditorBar.svelte +2 -5
- package/package/components/EditorSettings.svelte +11 -9
- package/package/components/FlowBuilder.svelte +3 -3
- package/package/components/FlowLogRow.svelte +64 -0
- package/package/components/FlowLogRow.svelte.d.ts +15 -0
- package/package/components/FlowLogViewer.svelte +406 -373
- package/package/components/FlowLogViewer.svelte.d.ts +5 -1
- package/package/components/FlowLogViewerWrapper.svelte +44 -1
- package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewerInner.svelte +34 -3
- package/package/components/FolderPicker.svelte +1 -1
- package/package/components/InputTransformForm.svelte +20 -10
- package/package/components/JobArgs.svelte +1 -1
- package/package/components/JobLoader.svelte.d.ts +1 -1
- package/package/components/JobStatus.svelte +2 -0
- package/package/components/LogSnippetViewer.svelte +3 -3
- package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
- package/package/components/LogViewer.svelte +87 -71
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/PrefixedInput.svelte +120 -0
- package/package/components/PrefixedInput.svelte.d.ts +8 -0
- package/package/components/QueuePosition.svelte +81 -0
- package/package/components/QueuePosition.svelte.d.ts +8 -0
- package/package/components/ResourceNarrowing.svelte +13 -0
- package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
- package/package/components/ResourceTypePicker.svelte +49 -74
- package/package/components/RunChart.svelte +74 -89
- package/package/components/RunChart.svelte.d.ts +10 -22
- package/package/components/S3FilePicker.svelte +1 -1
- package/package/components/SchemaForm.svelte.d.ts +2 -2
- package/package/components/ScriptBuilder.svelte +2 -1
- package/package/components/ScriptEditor.svelte +4 -3
- package/package/components/ScriptEditor.svelte.d.ts +2 -1
- package/package/components/ServiceLogsInner.svelte +1 -1
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/SimpleEditor.svelte +4 -67
- package/package/components/StringTypeNarrowing.svelte +5 -10
- package/package/components/TemplateEditor.svelte +2 -16
- package/package/components/TimeAgo.svelte +1 -1
- package/package/components/TimeAgo.svelte.d.ts +1 -0
- package/package/components/Toggle.svelte +2 -1
- package/package/components/Toggle.svelte.d.ts +2 -1
- package/package/components/WorkerRepl.svelte +1 -1
- package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
- package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
- package/package/components/apps/components/display/table/utils.js +36 -5
- package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
- package/package/components/apps/editor/AppEditor.svelte +4 -3
- package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
- package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
- package/package/components/apps/editor/SettingsPanel.svelte +2 -2
- package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
- package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
- package/package/components/assets/JobAssetsViewer.svelte +28 -24
- package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
- package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
- package/package/components/common/OnChange.svelte.d.ts +11 -4
- package/package/components/common/badge/Badge.svelte +9 -2
- package/package/components/common/badge/Badge.svelte.d.ts +2 -1
- package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
- package/package/components/common/drawer/Disposable.svelte +9 -11
- package/package/components/common/drawer/Drawer.svelte +3 -4
- package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
- package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
- package/package/components/common/modal/Modal.svelte.d.ts +1 -1
- package/package/components/common/tabs/TabContent.svelte +2 -7
- package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
- package/package/components/copilot/MetadataGen.svelte +1 -1
- package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
- package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
- package/package/components/copilot/chat/anthropic.d.ts +15 -0
- package/package/components/copilot/chat/anthropic.js +208 -0
- package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
- package/package/components/copilot/chat/api/apiTools.js +10 -7
- package/package/components/copilot/chat/api/core.d.ts +1 -1
- package/package/components/copilot/chat/api/core.js +7 -2
- package/package/components/copilot/chat/ask/core.d.ts +1 -1
- package/package/components/copilot/chat/ask/core.js +7 -2
- package/package/components/copilot/chat/flow/core.d.ts +1 -1
- package/package/components/copilot/chat/flow/core.js +14 -4
- package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +7 -2
- package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
- package/package/components/copilot/chat/script/core.d.ts +5 -4
- package/package/components/copilot/chat/script/core.js +131 -19
- package/package/components/copilot/chat/shared.d.ts +7 -7
- package/package/components/copilot/lib.d.ts +29 -8
- package/package/components/copilot/lib.js +199 -24
- package/package/components/custom_ui.d.ts +1 -0
- package/package/components/flows/content/FlowInput.svelte +5 -5
- package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
- package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
- package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
- package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
- package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowRetries.svelte +108 -3
- package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
- package/package/components/flows/flowInfers.js +8 -35
- package/package/components/flows/flowStore.d.ts +45 -1
- package/package/components/flows/flowStore.js +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
- package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
- package/package/components/flows/map/InsertModuleButton.svelte +1 -0
- package/package/components/flows/map/InsertModuleInner.svelte +12 -15
- package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/git_sync/DetectionFlow.svelte +15 -17
- package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
- package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
- package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
- package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
- package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
- package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
- package/package/components/home/ItemsList.svelte +17 -13
- package/package/components/home/TreeView.svelte +21 -27
- package/package/components/home/TreeView.svelte.d.ts +2 -29
- package/package/components/home/TreeViewRoot.svelte +11 -23
- package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
- package/package/components/icons/GitIcon.svelte +10 -2
- package/package/components/icons/GitIcon.svelte.d.ts +1 -0
- package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
- package/package/components/meltComponents/Popover.svelte +23 -3
- package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
- package/package/components/monacoLanguagesOptions.d.ts +3 -0
- package/package/components/monacoLanguagesOptions.js +109 -0
- package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
- package/package/components/propertyPicker/PropPicker.svelte +1 -1
- package/package/components/propertyPicker/utils.js +14 -7
- package/package/components/runs/JobRunsPreview.svelte +212 -177
- package/package/components/runs/JobsLoader.svelte +2 -2
- package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
- package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
- package/package/components/runs/RunBadges.svelte +100 -0
- package/package/components/runs/RunBadges.svelte.d.ts +12 -0
- package/package/components/runs/RunLabels.svelte +86 -0
- package/package/components/runs/RunLabels.svelte.d.ts +10 -0
- package/package/components/runs/RunOption.svelte +20 -0
- package/package/components/runs/RunOption.svelte.d.ts +10 -0
- package/package/components/runs/RunRow.svelte +239 -151
- package/package/components/runs/RunRow.svelte.d.ts +12 -9
- package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
- package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
- package/package/components/runs/RunsFilter.svelte +369 -243
- package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
- package/package/components/runs/RunsQueue.svelte +96 -25
- package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
- package/package/components/runs/RunsTable.svelte +62 -71
- package/package/components/runs/RunsTable.svelte.d.ts +2 -1
- package/package/components/runs/runs-grid.css +95 -0
- package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
- package/package/components/schema/FlowPropertyEditor.svelte +197 -206
- package/package/components/schema/PropertyEditor.svelte +33 -35
- package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/DraggableTags.svelte.d.ts +17 -7
- package/package/components/select/MultiSelect.svelte.d.ts +21 -11
- package/package/components/select/Select.svelte +2 -1
- package/package/components/select/Select.svelte.d.ts +25 -13
- package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
- package/package/components/settings/TokenDisplay.svelte +1 -1
- package/package/components/sidebar/OperatorMenu.svelte +5 -0
- package/package/components/sidebar/SidebarContent.svelte +48 -2
- package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
- package/package/components/toast.js +6 -3
- package/package/components/triggers/AddTriggersButton.svelte +7 -6
- package/package/components/triggers/CaptureWrapper.svelte +19 -3
- package/package/components/triggers/TriggerLabel.svelte +8 -0
- package/package/components/triggers/TriggerTokens.svelte +1 -1
- package/package/components/triggers/TriggersEditor.svelte +9 -5
- package/package/components/triggers/TriggersTable.svelte +2 -2
- package/package/components/triggers/TriggersWrapper.svelte +16 -5
- package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
- package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
- package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
- package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
- package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
- package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
- package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
- package/package/components/triggers/email/EmailCapture.svelte +39 -0
- package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
- package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
- package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
- package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
- package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
- package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
- package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
- package/package/components/triggers/email/utils.d.ts +4 -0
- package/package/components/triggers/email/utils.js +52 -0
- package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
- package/package/components/triggers/http/utils.js +1 -1
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +24 -2
- package/package/components/triggers/utils.js +19 -5
- package/package/components/triggers.d.ts +1 -1
- package/package/components/triggers.js +2 -0
- package/package/components/wizards/AgGridWizard.svelte +85 -80
- package/package/components/workspaceSettings/AISettings.svelte +74 -22
- package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
- package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
- package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
- package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
- package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +142 -3
- package/package/gen/schemas.gen.js +144 -3
- package/package/gen/services.gen.d.ts +129 -1
- package/package/gen/services.gen.js +267 -1
- package/package/gen/types.gen.d.ts +434 -8
- package/package/hubPaths.json +4 -2
- package/package/infer.js +1 -1
- package/package/keyboardChain.d.ts +5 -0
- package/package/keyboardChain.js +40 -0
- package/package/services/JobManager.js +2 -2
- package/package/stores.d.ts +3 -1
- package/package/stores.js +8 -5
- package/package/utils/workspaceHierarchy.d.ts +27 -0
- package/package/utils/workspaceHierarchy.js +101 -0
- package/package/utils.d.ts +6 -3
- package/package/utils.js +30 -15
- package/package/workspace_settings.js +2 -3
- package/package.json +9 -11
- package/package/components/DynSelect.svelte.d.ts +0 -11
- package/package/components/ObjectTypeNarrowing.svelte +0 -18
- package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
- package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
- package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
- package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
- package/package/components/details/EmailTriggerPanel.svelte +0 -76
- package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
<script lang="ts">import { Button } from '../../common';
|
|
2
|
+
import Drawer from '../../common/drawer/Drawer.svelte';
|
|
3
|
+
import DrawerContent from '../../common/drawer/DrawerContent.svelte';
|
|
4
|
+
import Path from '../../Path.svelte';
|
|
5
|
+
import Required from '../../Required.svelte';
|
|
6
|
+
import ScriptPicker from '../../ScriptPicker.svelte';
|
|
7
|
+
import { EmailTriggerService } from '../../../gen';
|
|
8
|
+
import { usedTriggerKinds, userStore, workspaceStore } from '../../../stores';
|
|
9
|
+
import { canWrite, emptyString, sendUserToast } from '../../../utils';
|
|
10
|
+
import Section from '../../Section.svelte';
|
|
11
|
+
import { Loader2 } from 'lucide-svelte';
|
|
12
|
+
import Label from '../../Label.svelte';
|
|
13
|
+
import EmailTriggerEditorConfigSection from './EmailTriggerEditorConfigSection.svelte';
|
|
14
|
+
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
|
|
15
|
+
import { getHandlerType, handleConfigChange } from '../utils';
|
|
16
|
+
import { untrack } from 'svelte';
|
|
17
|
+
import Tabs from '../../common/tabs/Tabs.svelte';
|
|
18
|
+
import Tab from '../../common/tabs/Tab.svelte';
|
|
19
|
+
import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
|
|
20
|
+
import { saveEmailTriggerFromCfg } from './utils';
|
|
21
|
+
let { useDrawer = true, hideTarget = false, description = undefined, isEditor = false, customLabel = undefined, allowDraft = false, isDeployed = false, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined, trigger = undefined, customSaveBehavior = undefined } = $props();
|
|
22
|
+
// Form data state
|
|
23
|
+
let initialPath = $state('');
|
|
24
|
+
let edit = $state(true);
|
|
25
|
+
let itemKind = $state('script');
|
|
26
|
+
let is_flow = $state(false);
|
|
27
|
+
let script_path = $state('');
|
|
28
|
+
let initialScriptPath = $state('');
|
|
29
|
+
let fixedScriptPath = $state('');
|
|
30
|
+
let path = $state('');
|
|
31
|
+
let pathError = $state('');
|
|
32
|
+
let isValid = $state(false);
|
|
33
|
+
let dirtyLocalPart = $state(false);
|
|
34
|
+
let dirtyPath = $state(false);
|
|
35
|
+
let local_part = $state('');
|
|
36
|
+
let workspaced_local_part = $state(false);
|
|
37
|
+
let drawerLoading = $state(true);
|
|
38
|
+
let showLoader = $state(false);
|
|
39
|
+
let can_write = $state(true);
|
|
40
|
+
let extraPerms = $state(undefined);
|
|
41
|
+
let error_handler_path = $state();
|
|
42
|
+
let error_handler_args = $state({});
|
|
43
|
+
let retry = $state();
|
|
44
|
+
// Component references
|
|
45
|
+
let drawer = $state(undefined);
|
|
46
|
+
let initialConfig = undefined;
|
|
47
|
+
let deploymentLoading = $state(false);
|
|
48
|
+
let optionTabSelected = $state('error_handler');
|
|
49
|
+
let errorHandlerSelected = $state('slack');
|
|
50
|
+
const isAdmin = $derived($userStore?.is_admin || $userStore?.is_super_admin);
|
|
51
|
+
const routeConfig = $derived.by(getEmailTriggerConfig);
|
|
52
|
+
const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
|
|
53
|
+
const saveDisabled = $derived(drawerLoading || !can_write || pathError != '' || !isValid || emptyString(script_path));
|
|
54
|
+
$effect(() => {
|
|
55
|
+
is_flow = itemKind === 'flow';
|
|
56
|
+
});
|
|
57
|
+
export async function openEdit(ePath, isFlow, defaultConfig) {
|
|
58
|
+
drawerLoading = true;
|
|
59
|
+
let loader = setTimeout(() => {
|
|
60
|
+
showLoader = true;
|
|
61
|
+
}, 100); // if loading takes less than 100ms, we don't show the loader
|
|
62
|
+
try {
|
|
63
|
+
drawer?.openDrawer();
|
|
64
|
+
initialPath = ePath;
|
|
65
|
+
path = ePath;
|
|
66
|
+
itemKind = isFlow ? 'flow' : 'script';
|
|
67
|
+
edit = true;
|
|
68
|
+
dirtyPath = false;
|
|
69
|
+
dirtyLocalPart = false;
|
|
70
|
+
await loadTrigger(defaultConfig);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
sendUserToast(`Could not load email trigger: ${err}`, true);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
if (!defaultConfig) {
|
|
77
|
+
// If the email trigger is loaded from the backend, we to set the initial config
|
|
78
|
+
initialConfig = structuredClone($state.snapshot(getEmailTriggerConfig()));
|
|
79
|
+
}
|
|
80
|
+
clearTimeout(loader);
|
|
81
|
+
drawerLoading = false;
|
|
82
|
+
showLoader = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
|
|
86
|
+
drawerLoading = true;
|
|
87
|
+
let loader = setTimeout(() => {
|
|
88
|
+
showLoader = true;
|
|
89
|
+
}, 100); // if loading takes less than 100ms, we don't show the loader
|
|
90
|
+
try {
|
|
91
|
+
drawer?.openDrawer();
|
|
92
|
+
is_flow = defaultValues?.is_flow ?? nis_flow;
|
|
93
|
+
edit = false;
|
|
94
|
+
itemKind = nis_flow ? 'flow' : 'script';
|
|
95
|
+
local_part = defaultValues?.local_part ?? '';
|
|
96
|
+
dirtyLocalPart = false;
|
|
97
|
+
initialScriptPath = '';
|
|
98
|
+
fixedScriptPath = fixedScriptPath_ ?? '';
|
|
99
|
+
script_path = fixedScriptPath;
|
|
100
|
+
path = defaultValues?.path ?? '';
|
|
101
|
+
initialPath = '';
|
|
102
|
+
dirtyPath = false;
|
|
103
|
+
workspaced_local_part = defaultValues?.workspaced_local_part ?? false;
|
|
104
|
+
error_handler_path = defaultValues?.error_handler_path ?? undefined;
|
|
105
|
+
error_handler_args = defaultValues?.error_handler_args ?? {};
|
|
106
|
+
retry = defaultValues?.retry ?? undefined;
|
|
107
|
+
errorHandlerSelected = getHandlerType(error_handler_path ?? '');
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
clearTimeout(loader);
|
|
111
|
+
drawerLoading = false;
|
|
112
|
+
showLoader = false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function loadTriggerConfig(cfg) {
|
|
116
|
+
script_path = cfg?.script_path ?? '';
|
|
117
|
+
initialScriptPath = cfg?.script_path ?? '';
|
|
118
|
+
is_flow = cfg?.is_flow ?? false;
|
|
119
|
+
path = cfg?.path ?? '';
|
|
120
|
+
local_part = cfg?.local_part ?? '';
|
|
121
|
+
workspaced_local_part = cfg?.workspaced_local_part ?? false;
|
|
122
|
+
extraPerms = cfg?.extra_perms ?? undefined;
|
|
123
|
+
can_write = canWrite(path, cfg?.extra_perms ?? {}, $userStore);
|
|
124
|
+
error_handler_path = cfg?.error_handler_path;
|
|
125
|
+
error_handler_args = cfg?.error_handler_args ?? {};
|
|
126
|
+
retry = cfg?.retry;
|
|
127
|
+
errorHandlerSelected = getHandlerType(error_handler_path ?? '');
|
|
128
|
+
}
|
|
129
|
+
async function loadTrigger(defaultConfig) {
|
|
130
|
+
if (defaultConfig) {
|
|
131
|
+
loadTriggerConfig(defaultConfig);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const s = await EmailTriggerService.getEmailTrigger({
|
|
136
|
+
workspace: $workspaceStore,
|
|
137
|
+
path: initialPath
|
|
138
|
+
});
|
|
139
|
+
loadTriggerConfig(s);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function triggerScript() {
|
|
143
|
+
if (customSaveBehavior) {
|
|
144
|
+
customSaveBehavior(routeConfig);
|
|
145
|
+
drawer?.closeDrawer();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
deploymentLoading = true;
|
|
149
|
+
const saveCfg = routeConfig;
|
|
150
|
+
const isSaved = await saveEmailTriggerFromCfg(initialPath, saveCfg, edit, $workspaceStore, !!$userStore?.is_admin || !!$userStore?.is_super_admin, usedTriggerKinds);
|
|
151
|
+
if (isSaved) {
|
|
152
|
+
onUpdate(saveCfg.path);
|
|
153
|
+
drawer?.closeDrawer();
|
|
154
|
+
}
|
|
155
|
+
deploymentLoading = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function getEmailTriggerConfig() {
|
|
159
|
+
const nCfg = {
|
|
160
|
+
script_path,
|
|
161
|
+
is_flow,
|
|
162
|
+
path,
|
|
163
|
+
local_part,
|
|
164
|
+
workspaced_local_part,
|
|
165
|
+
extra_perms: extraPerms,
|
|
166
|
+
error_handler_path,
|
|
167
|
+
error_handler_args,
|
|
168
|
+
retry
|
|
169
|
+
};
|
|
170
|
+
return nCfg;
|
|
171
|
+
}
|
|
172
|
+
// Update config for captures
|
|
173
|
+
function getCaptureConfig() {
|
|
174
|
+
const newCaptureConfig = {
|
|
175
|
+
local_part: routeConfig.local_part,
|
|
176
|
+
path: routeConfig.path
|
|
177
|
+
};
|
|
178
|
+
//
|
|
179
|
+
return newCaptureConfig;
|
|
180
|
+
}
|
|
181
|
+
$effect(() => {
|
|
182
|
+
const args = [captureConfig, isValid];
|
|
183
|
+
untrack(() => onCaptureConfigChange?.(...args));
|
|
184
|
+
});
|
|
185
|
+
$effect(() => {
|
|
186
|
+
if (!drawerLoading) {
|
|
187
|
+
handleConfigChange(routeConfig, initialConfig, saveDisabled, edit, onConfigChange);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
</script>
|
|
191
|
+
|
|
192
|
+
{#snippet config()}
|
|
193
|
+
{#if drawerLoading}
|
|
194
|
+
{#if showLoader}
|
|
195
|
+
<Loader2 class="animate-spin" />
|
|
196
|
+
{/if}
|
|
197
|
+
{:else}
|
|
198
|
+
<div class="flex flex-col gap-12">
|
|
199
|
+
<Section label="Metadata">
|
|
200
|
+
<div class="flex flex-col gap-2">
|
|
201
|
+
<Label label="Path">
|
|
202
|
+
<Path
|
|
203
|
+
bind:dirty={dirtyPath}
|
|
204
|
+
bind:error={pathError}
|
|
205
|
+
bind:path
|
|
206
|
+
{initialPath}
|
|
207
|
+
checkInitialPathExistence={!edit}
|
|
208
|
+
namePlaceholder="email_trigger"
|
|
209
|
+
kind="email_trigger"
|
|
210
|
+
hideUser
|
|
211
|
+
disableEditing={!can_write}
|
|
212
|
+
/>
|
|
213
|
+
</Label>
|
|
214
|
+
</div>
|
|
215
|
+
</Section>
|
|
216
|
+
|
|
217
|
+
{#if !hideTarget}
|
|
218
|
+
<Section label="Target">
|
|
219
|
+
<p class="text-xs mt-3 mb-1 text-tertiary">
|
|
220
|
+
Pick a script or flow to be triggered<Required required={true} />
|
|
221
|
+
</p>
|
|
222
|
+
<div class="flex flex-col gap-2">
|
|
223
|
+
<div class="flex flex-row mb-2">
|
|
224
|
+
<ScriptPicker
|
|
225
|
+
disabled={fixedScriptPath != '' || !can_write}
|
|
226
|
+
initialPath={fixedScriptPath || initialScriptPath}
|
|
227
|
+
kinds={['script']}
|
|
228
|
+
allowFlow={true}
|
|
229
|
+
bind:itemKind
|
|
230
|
+
bind:scriptPath={script_path}
|
|
231
|
+
allowRefresh={can_write}
|
|
232
|
+
allowEdit={!$userStore?.operator}
|
|
233
|
+
clearable
|
|
234
|
+
/>
|
|
235
|
+
|
|
236
|
+
{#if emptyString(script_path)}
|
|
237
|
+
<Button
|
|
238
|
+
btnClasses="ml-4 mt-2"
|
|
239
|
+
color="dark"
|
|
240
|
+
size="xs"
|
|
241
|
+
href={itemKind === 'flow' ? '/flows/add?hub=72' : '/scripts/add?hub=hub%2F19813'}
|
|
242
|
+
target="_blank">Create from template</Button
|
|
243
|
+
>
|
|
244
|
+
{/if}
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</Section>
|
|
248
|
+
{/if}
|
|
249
|
+
|
|
250
|
+
<EmailTriggerEditorConfigSection
|
|
251
|
+
initialTriggerPath={initialPath}
|
|
252
|
+
bind:local_part
|
|
253
|
+
bind:isValid
|
|
254
|
+
bind:workspaced_local_part
|
|
255
|
+
bind:dirtyLocalPart
|
|
256
|
+
{can_write}
|
|
257
|
+
showTestingBadge={isEditor}
|
|
258
|
+
isDraftOnly={trigger ? trigger.isDraft : false}
|
|
259
|
+
/>
|
|
260
|
+
|
|
261
|
+
<Section label="Advanced" collapsable>
|
|
262
|
+
<div class="flex flex-col gap-4">
|
|
263
|
+
<div class="min-h-96">
|
|
264
|
+
<Tabs bind:selected={optionTabSelected}>
|
|
265
|
+
<Tab value="error_handler">Error Handler</Tab>
|
|
266
|
+
<Tab value="retries">Retries</Tab>
|
|
267
|
+
</Tabs>
|
|
268
|
+
<div class="mt-4">
|
|
269
|
+
<TriggerRetriesAndErrorHandler
|
|
270
|
+
{optionTabSelected}
|
|
271
|
+
{itemKind}
|
|
272
|
+
{can_write}
|
|
273
|
+
bind:errorHandlerSelected
|
|
274
|
+
bind:error_handler_path
|
|
275
|
+
bind:error_handler_args
|
|
276
|
+
bind:retry
|
|
277
|
+
/>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
</Section>
|
|
282
|
+
</div>
|
|
283
|
+
{/if}
|
|
284
|
+
{/snippet}
|
|
285
|
+
|
|
286
|
+
{#snippet saveButton()}
|
|
287
|
+
{#if !drawerLoading}
|
|
288
|
+
<TriggerEditorToolbar
|
|
289
|
+
{trigger}
|
|
290
|
+
permissions={drawerLoading || !can_write ? 'none' : can_write && isAdmin ? 'create' : 'write'}
|
|
291
|
+
{saveDisabled}
|
|
292
|
+
enabled={undefined}
|
|
293
|
+
{allowDraft}
|
|
294
|
+
{edit}
|
|
295
|
+
isLoading={deploymentLoading}
|
|
296
|
+
onUpdate={triggerScript}
|
|
297
|
+
{onReset}
|
|
298
|
+
{onDelete}
|
|
299
|
+
{isDeployed}
|
|
300
|
+
/>
|
|
301
|
+
{/if}
|
|
302
|
+
{/snippet}
|
|
303
|
+
|
|
304
|
+
{#if useDrawer}
|
|
305
|
+
<Drawer size="700px" bind:this={drawer}>
|
|
306
|
+
<DrawerContent
|
|
307
|
+
title={edit
|
|
308
|
+
? can_write
|
|
309
|
+
? `Edit email trigger ${initialPath}`
|
|
310
|
+
: `Email trigger ${initialPath}`
|
|
311
|
+
: 'New email trigger'}
|
|
312
|
+
on:close={() => drawer?.closeDrawer()}
|
|
313
|
+
>
|
|
314
|
+
{#snippet actions()}
|
|
315
|
+
{@render saveButton()}
|
|
316
|
+
{/snippet}
|
|
317
|
+
{@render config()}
|
|
318
|
+
</DrawerContent>
|
|
319
|
+
</Drawer>
|
|
320
|
+
{:else}
|
|
321
|
+
<Section label={!customLabel ? 'Email trigger' : ''} headerClass="grow min-w-0 h-[30px]">
|
|
322
|
+
{#snippet header()}
|
|
323
|
+
{#if customLabel}
|
|
324
|
+
{@render customLabel()}
|
|
325
|
+
{/if}
|
|
326
|
+
{/snippet}
|
|
327
|
+
{#snippet action()}
|
|
328
|
+
{@render saveButton()}
|
|
329
|
+
{/snippet}
|
|
330
|
+
{#if description}
|
|
331
|
+
{@render description()}
|
|
332
|
+
{/if}
|
|
333
|
+
{@render config()}
|
|
334
|
+
</Section>
|
|
335
|
+
{/if}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type EmailTrigger, type NewEmailTrigger } from '../../../gen';
|
|
2
|
+
declare const EmailTriggerEditorInner: import("svelte").Component<{
|
|
3
|
+
useDrawer?: boolean;
|
|
4
|
+
hideTarget?: boolean;
|
|
5
|
+
description?: any;
|
|
6
|
+
isEditor?: boolean;
|
|
7
|
+
customLabel?: any;
|
|
8
|
+
allowDraft?: boolean;
|
|
9
|
+
isDeployed?: boolean;
|
|
10
|
+
onConfigChange?: any;
|
|
11
|
+
onCaptureConfigChange?: any;
|
|
12
|
+
onUpdate?: any;
|
|
13
|
+
onDelete?: any;
|
|
14
|
+
onReset?: any;
|
|
15
|
+
trigger?: any;
|
|
16
|
+
customSaveBehavior?: any;
|
|
17
|
+
}, {
|
|
18
|
+
openEdit: (ePath: string, isFlow: boolean, defaultConfig?: Partial<NewEmailTrigger>) => Promise<void>;
|
|
19
|
+
openNew: (nis_flow: boolean, fixedScriptPath_?: string, defaultValues?: Partial<EmailTrigger>) => Promise<void>;
|
|
20
|
+
}, "">;
|
|
21
|
+
type EmailTriggerEditorInner = ReturnType<typeof EmailTriggerEditorInner>;
|
|
22
|
+
export default EmailTriggerEditorInner;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">import EmailTriggerEditorInner from './EmailTriggerEditorInner.svelte';
|
|
2
|
+
import Description from '../../Description.svelte';
|
|
3
|
+
import { enterpriseLicense, userStore } from '../../../stores';
|
|
4
|
+
import { Alert } from '../../common';
|
|
5
|
+
import { onMount } from 'svelte';
|
|
6
|
+
import { getEmailDomain } from './utils';
|
|
7
|
+
let emailTriggerEditor = $state(null);
|
|
8
|
+
let { selectedTrigger, isFlow, path, defaultValues = undefined, isEditor = false, customLabel, onEmailDomain, ...restProps } = $props();
|
|
9
|
+
async function openEmailTriggerEditor(isFlow, isDraft) {
|
|
10
|
+
if (isDraft) {
|
|
11
|
+
emailTriggerEditor?.openNew(isFlow, path, defaultValues);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
emailTriggerEditor?.openEdit(selectedTrigger.path ?? '', isFlow, defaultValues);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
onMount(() => {
|
|
18
|
+
if (emailTriggerEditor) {
|
|
19
|
+
openEmailTriggerEditor(isFlow, selectedTrigger.isDraft ?? false);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
let emailDomain = $state(null);
|
|
23
|
+
getEmailDomain().then((domain) => {
|
|
24
|
+
emailDomain = domain;
|
|
25
|
+
});
|
|
26
|
+
$effect(() => {
|
|
27
|
+
if (emailDomain) {
|
|
28
|
+
onEmailDomain(emailDomain);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<EmailTriggerEditorInner
|
|
34
|
+
useDrawer={false}
|
|
35
|
+
bind:this={emailTriggerEditor}
|
|
36
|
+
hideTarget
|
|
37
|
+
{isEditor}
|
|
38
|
+
{customLabel}
|
|
39
|
+
trigger={selectedTrigger}
|
|
40
|
+
allowDraft
|
|
41
|
+
{...restProps}
|
|
42
|
+
>
|
|
43
|
+
{#snippet description()}
|
|
44
|
+
<div class="flex flex-col gap-2 pb-4">
|
|
45
|
+
<Description link="https://www.windmill.dev/docs/advanced/email_triggers">
|
|
46
|
+
Email triggers execute scripts and flows when emails are sent to specific addresses. Each
|
|
47
|
+
trigger can be configured with a specific local part.
|
|
48
|
+
</Description>
|
|
49
|
+
|
|
50
|
+
{#if !$userStore?.is_admin && !$userStore?.is_super_admin && selectedTrigger.isDraft}
|
|
51
|
+
<Alert title="Only workspace admins can create email triggers" type="info" size="xs" />
|
|
52
|
+
{/if}
|
|
53
|
+
|
|
54
|
+
{#if !$enterpriseLicense}
|
|
55
|
+
<Alert title="Community Edition limitations" type="warning" size="xs">
|
|
56
|
+
Email triggers on Windmill Community Edition are limited to 100 emails per day.
|
|
57
|
+
</Alert>
|
|
58
|
+
{/if}
|
|
59
|
+
</div>
|
|
60
|
+
{/snippet}
|
|
61
|
+
</EmailTriggerEditorInner>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import type { Trigger } from '../utils';
|
|
3
|
+
interface Props {
|
|
4
|
+
selectedTrigger: Trigger;
|
|
5
|
+
isFlow: boolean;
|
|
6
|
+
path: string;
|
|
7
|
+
defaultValues?: Record<string, any>;
|
|
8
|
+
isEditor?: boolean;
|
|
9
|
+
customLabel: Snippet;
|
|
10
|
+
onEmailDomain: (domain: string) => void;
|
|
11
|
+
}
|
|
12
|
+
declare const EmailTriggerPanel: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type EmailTriggerPanel = ReturnType<typeof EmailTriggerPanel>;
|
|
14
|
+
export default EmailTriggerPanel;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Writable } from 'svelte/store';
|
|
2
|
+
export declare function getEmailAddress(local_part: string | undefined, workspaced_local_part: boolean, workspace_id: string, emailDomain: string): string;
|
|
3
|
+
export declare function saveEmailTriggerFromCfg(initialPath: string, routeCfg: Record<string, any>, edit: boolean, workspace: string, isAdmin: boolean, usedTriggerKinds: Writable<string[]>): Promise<boolean>;
|
|
4
|
+
export declare function getEmailDomain(): Promise<string>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { isCloudHosted } from '../../../cloud';
|
|
2
|
+
import { EmailTriggerService, SettingService } from '../../../gen';
|
|
3
|
+
import { sendUserToast } from '../../../toast';
|
|
4
|
+
import { get } from 'svelte/store';
|
|
5
|
+
export function getEmailAddress(local_part, workspaced_local_part, workspace_id, emailDomain) {
|
|
6
|
+
return `${isCloudHosted() || workspaced_local_part ? workspace_id + '-' : ''}${local_part ?? ''}@${emailDomain}`;
|
|
7
|
+
}
|
|
8
|
+
export async function saveEmailTriggerFromCfg(initialPath, routeCfg, edit, workspace, isAdmin, usedTriggerKinds) {
|
|
9
|
+
const requestBody = {
|
|
10
|
+
path: routeCfg.path,
|
|
11
|
+
script_path: routeCfg.script_path,
|
|
12
|
+
local_part: routeCfg.local_part,
|
|
13
|
+
is_flow: routeCfg.is_flow,
|
|
14
|
+
workspaced_local_part: routeCfg.workspaced_local_part,
|
|
15
|
+
error_handler_path: routeCfg.error_handler_path,
|
|
16
|
+
error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
|
|
17
|
+
retry: routeCfg.retry
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
if (edit) {
|
|
21
|
+
await EmailTriggerService.updateEmailTrigger({
|
|
22
|
+
workspace: workspace,
|
|
23
|
+
path: initialPath,
|
|
24
|
+
requestBody: {
|
|
25
|
+
...requestBody,
|
|
26
|
+
local_part: isAdmin || !edit ? routeCfg.local_part : undefined
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
sendUserToast(`Route ${routeCfg.path} updated`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
await EmailTriggerService.createEmailTrigger({
|
|
33
|
+
workspace: workspace,
|
|
34
|
+
requestBody: requestBody
|
|
35
|
+
});
|
|
36
|
+
sendUserToast(`Route ${routeCfg.path} created`);
|
|
37
|
+
}
|
|
38
|
+
if (!get(usedTriggerKinds).includes('email')) {
|
|
39
|
+
usedTriggerKinds.update((t) => [...t, 'email']);
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
sendUserToast(error.body || error.message, true);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function getEmailDomain() {
|
|
49
|
+
return ((await SettingService.getGlobal({
|
|
50
|
+
key: 'email_domain'
|
|
51
|
+
})) ?? 'mail.test.com');
|
|
52
|
+
}
|
|
@@ -126,7 +126,7 @@ let userCanEditConfig = $derived(userIsAdmin || isDraftOnly); // User can edit c
|
|
|
126
126
|
<Toggle
|
|
127
127
|
size="sm"
|
|
128
128
|
checked={workspaced_route}
|
|
129
|
-
disabled={!can_write}
|
|
129
|
+
disabled={!can_write || !userCanEditConfig}
|
|
130
130
|
on:change={() => {
|
|
131
131
|
workspaced_route = !workspaced_route
|
|
132
132
|
dirtyRoutePath = true
|
|
@@ -37,7 +37,7 @@ export async function saveHttpRouteFromCfg(initialPath, routeCfg, edit, workspac
|
|
|
37
37
|
summary: routeCfg.summary,
|
|
38
38
|
error_handler_path: routeCfg.error_handler_path,
|
|
39
39
|
error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
|
|
40
|
-
retry: routeCfg.retry
|
|
40
|
+
retry: routeCfg.retry
|
|
41
41
|
};
|
|
42
42
|
try {
|
|
43
43
|
if (edit) {
|
|
@@ -27,5 +27,6 @@ export declare class Triggers {
|
|
|
27
27
|
fetchSqsTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
|
|
28
28
|
fetchGcpTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
|
|
29
29
|
fetchHttpTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
|
|
30
|
+
fetchEmailTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
|
|
30
31
|
fetchTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, primarySchedule?: ScheduleTrigger | undefined | false, user?: UserExt | undefined): Promise<void>;
|
|
31
32
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, SqsTriggerService, WebsocketTriggerService, HttpTriggerService, GcpTriggerService } from '../../gen';
|
|
1
|
+
import { KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, SqsTriggerService, WebsocketTriggerService, HttpTriggerService, GcpTriggerService, EmailTriggerService } from '../../gen';
|
|
2
2
|
import { getLightConfig, sortTriggers, updateTriggersCount } from './utils';
|
|
3
3
|
import { canWrite, formatCron, generateRandomString } from '../../utils';
|
|
4
4
|
export class Triggers {
|
|
@@ -316,6 +316,27 @@ export class Triggers {
|
|
|
316
316
|
console.error('Failed to fetch HTTP triggers:', error);
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
|
+
async fetchEmailTriggers(triggersCountStore, workspaceId, path, isFlow, user = undefined) {
|
|
320
|
+
if (!workspaceId)
|
|
321
|
+
return;
|
|
322
|
+
try {
|
|
323
|
+
const emailTriggers = await EmailTriggerService.listEmailTriggers({
|
|
324
|
+
workspace: workspaceId,
|
|
325
|
+
path,
|
|
326
|
+
isFlow
|
|
327
|
+
});
|
|
328
|
+
const emailCount = this.updateTriggers(emailTriggers, 'email', user);
|
|
329
|
+
triggersCountStore.update((triggersCount) => {
|
|
330
|
+
return {
|
|
331
|
+
...(triggersCount ?? {}),
|
|
332
|
+
email_count: emailCount
|
|
333
|
+
};
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.error('Failed to fetch email triggers:', error);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
319
340
|
async fetchTriggers(triggersCountStore, workspaceId, path, isFlow, primarySchedule = undefined, user = undefined) {
|
|
320
341
|
if (!workspaceId)
|
|
321
342
|
return;
|
|
@@ -329,7 +350,8 @@ export class Triggers {
|
|
|
329
350
|
this.fetchNatsTriggers(triggersCountStore, workspaceId, path, isFlow, user),
|
|
330
351
|
this.fetchMqttTriggers(triggersCountStore, workspaceId, path, isFlow, user),
|
|
331
352
|
this.fetchSqsTriggers(triggersCountStore, workspaceId, path, isFlow, user),
|
|
332
|
-
this.fetchGcpTriggers(triggersCountStore, workspaceId, path, isFlow, user)
|
|
353
|
+
this.fetchGcpTriggers(triggersCountStore, workspaceId, path, isFlow, user),
|
|
354
|
+
this.fetchEmailTriggers(triggersCountStore, workspaceId, path, isFlow, user)
|
|
333
355
|
]);
|
|
334
356
|
}
|
|
335
357
|
}
|
|
@@ -16,6 +16,7 @@ import { saveNatsTriggerFromCfg } from './nats/utils';
|
|
|
16
16
|
import { saveMqttTriggerFromCfg } from './mqtt/utils';
|
|
17
17
|
import { saveGcpTriggerFromCfg } from './gcp/utils';
|
|
18
18
|
import { emptyString } from '../../utils';
|
|
19
|
+
import { saveEmailTriggerFromCfg } from './email/utils';
|
|
19
20
|
export const CLOUD_DISABLED_TRIGGER_TYPES = [
|
|
20
21
|
'nats',
|
|
21
22
|
'kafka',
|
|
@@ -29,6 +30,7 @@ export const CLOUD_DISABLED_TRIGGER_TYPES = [
|
|
|
29
30
|
export const triggerIconMap = {
|
|
30
31
|
webhook: Webhook,
|
|
31
32
|
email: Mail,
|
|
33
|
+
default_email: Mail,
|
|
32
34
|
schedule: Calendar,
|
|
33
35
|
http: Route,
|
|
34
36
|
websocket: Unplug,
|
|
@@ -52,6 +54,7 @@ export function triggerTypeToCaptureKind(triggerType) {
|
|
|
52
54
|
const capturableTriggerTypes = [
|
|
53
55
|
'webhook',
|
|
54
56
|
'email',
|
|
57
|
+
'default_email',
|
|
55
58
|
'http',
|
|
56
59
|
'websocket',
|
|
57
60
|
'postgres',
|
|
@@ -71,7 +74,7 @@ export function updateTriggersCount(triggersCountStore, type, action, primaryCfg
|
|
|
71
74
|
// Map trigger types to their corresponding count property names
|
|
72
75
|
const countPropertyMap = {
|
|
73
76
|
webhook: undefined,
|
|
74
|
-
|
|
77
|
+
default_email: undefined,
|
|
75
78
|
schedule: 'schedule_count',
|
|
76
79
|
http: 'http_routes_count',
|
|
77
80
|
websocket: 'websocket_count',
|
|
@@ -81,6 +84,7 @@ export function updateTriggersCount(triggersCountStore, type, action, primaryCfg
|
|
|
81
84
|
mqtt: 'mqtt_count',
|
|
82
85
|
sqs: 'sqs_count',
|
|
83
86
|
gcp: 'gcp_count',
|
|
87
|
+
email: 'email_count',
|
|
84
88
|
poll: undefined,
|
|
85
89
|
cli: undefined
|
|
86
90
|
};
|
|
@@ -126,6 +130,8 @@ export function triggerKindToTriggerType(kind) {
|
|
|
126
130
|
return 'webhook';
|
|
127
131
|
case 'emails':
|
|
128
132
|
return 'email';
|
|
133
|
+
case 'default_emails':
|
|
134
|
+
return 'default_email';
|
|
129
135
|
case 'schedules':
|
|
130
136
|
return 'schedule';
|
|
131
137
|
case 'routes':
|
|
@@ -164,7 +170,7 @@ export async function deployTriggers(triggersToDeploy, workspaceId, isAdmin, use
|
|
|
164
170
|
// Map of trigger types to their save functions
|
|
165
171
|
const triggerSaveFunctions = {
|
|
166
172
|
webhook: undefined,
|
|
167
|
-
|
|
173
|
+
default_email: undefined,
|
|
168
174
|
schedule: (trigger) => {
|
|
169
175
|
if (trigger.isPrimary && initialPath) {
|
|
170
176
|
trigger.draftConfig = {
|
|
@@ -183,6 +189,7 @@ export async function deployTriggers(triggersToDeploy, workspaceId, isAdmin, use
|
|
|
183
189
|
mqtt: (trigger) => saveMqttTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
|
|
184
190
|
sqs: (trigger) => saveSqsTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
|
|
185
191
|
gcp: (trigger) => saveGcpTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
|
|
192
|
+
email: (trigger) => saveEmailTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, isAdmin, usedTriggerKinds),
|
|
186
193
|
poll: undefined,
|
|
187
194
|
cli: undefined
|
|
188
195
|
};
|
|
@@ -262,6 +269,9 @@ export function getLightConfig(triggerType, trigger) {
|
|
|
262
269
|
else if (triggerType === 'gcp') {
|
|
263
270
|
return { gcp_resource_path: trigger.gcp_resource_path, topic: trigger.topic };
|
|
264
271
|
}
|
|
272
|
+
else if (triggerType === 'email') {
|
|
273
|
+
return { local_part: trigger.local_part };
|
|
274
|
+
}
|
|
265
275
|
else {
|
|
266
276
|
return undefined;
|
|
267
277
|
}
|
|
@@ -272,7 +282,7 @@ export function getTriggerLabel(trigger) {
|
|
|
272
282
|
if (type === 'webhook') {
|
|
273
283
|
return 'Webhook';
|
|
274
284
|
}
|
|
275
|
-
else if (type === '
|
|
285
|
+
else if (type === 'default_email') {
|
|
276
286
|
return 'Email';
|
|
277
287
|
}
|
|
278
288
|
else if (type === 'cli') {
|
|
@@ -303,6 +313,9 @@ export function getTriggerLabel(trigger) {
|
|
|
303
313
|
else if (type === 'websocket' && config?.url) {
|
|
304
314
|
return `${config?.url}`;
|
|
305
315
|
}
|
|
316
|
+
else if (type === 'email' && config?.local_part) {
|
|
317
|
+
return `${config?.local_part}`;
|
|
318
|
+
}
|
|
306
319
|
else if (isDraft && draftConfig?.path) {
|
|
307
320
|
return `${draftConfig?.path}`;
|
|
308
321
|
}
|
|
@@ -317,7 +330,7 @@ export function sortTriggers(triggers) {
|
|
|
317
330
|
const triggerTypeOrder = [
|
|
318
331
|
'webhook',
|
|
319
332
|
'cli',
|
|
320
|
-
'
|
|
333
|
+
'default_email',
|
|
321
334
|
'poll',
|
|
322
335
|
'schedule',
|
|
323
336
|
'http',
|
|
@@ -327,7 +340,8 @@ export function sortTriggers(triggers) {
|
|
|
327
340
|
'nats',
|
|
328
341
|
'mqtt',
|
|
329
342
|
'sqs',
|
|
330
|
-
'gcp'
|
|
343
|
+
'gcp',
|
|
344
|
+
'email'
|
|
331
345
|
];
|
|
332
346
|
return triggers.sort((a, b) => {
|
|
333
347
|
// Draft triggers always come last
|
|
@@ -16,5 +16,5 @@ export type TriggerContext = {
|
|
|
16
16
|
triggersState: Triggers;
|
|
17
17
|
};
|
|
18
18
|
export declare function setScheduledPollSchedule(triggersState: Triggers, triggersCount: Writable<TriggersCount | undefined>): void;
|
|
19
|
-
export type TriggerKind = 'webhooks' | 'emails' | 'schedules' | 'cli' | 'routes' | 'websockets' | 'scheduledPoll' | 'kafka' | 'nats' | 'postgres' | 'mqtt' | 'sqs' | 'gcp';
|
|
19
|
+
export type TriggerKind = 'webhooks' | 'emails' | 'default_emails' | 'schedules' | 'cli' | 'routes' | 'websockets' | 'scheduledPoll' | 'kafka' | 'nats' | 'postgres' | 'mqtt' | 'sqs' | 'gcp';
|
|
20
20
|
export declare function captureTriggerKindToTriggerKind(kind: CaptureTriggerKind): TriggerKind;
|