windmill-components 1.687.0 → 1.695.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/package/components/ArgInput.svelte +2 -0
- package/package/components/AutoscalingConfigEditor.svelte +18 -4
- package/package/components/CompareWorkspaces.svelte +206 -157
- package/package/components/DatatableSchemaDiff.svelte +2 -2
- package/package/components/Dev.svelte +401 -85
- package/package/components/EditableSchemaForm.svelte +4 -0
- package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
- package/package/components/FlowPreviewContent.svelte +32 -30
- package/package/components/FlowRestartButton.svelte +143 -61
- package/package/components/FlowRestartButton.svelte.d.ts +37 -0
- package/package/components/FlowStatusViewer.svelte +15 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
- package/package/components/FlowStatusViewerInner.svelte +1 -2
- package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
- package/package/components/ForkConflictModal.svelte +57 -0
- package/package/components/ForkConflictModal.svelte.d.ts +3 -0
- package/package/components/GitRepoViewer.svelte +251 -97
- package/package/components/InputTransformSchemaForm.svelte +1 -1
- package/package/components/InstanceSettings.svelte +36 -16
- package/package/components/Login.svelte +113 -28
- package/package/components/Login.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/RunsPage.svelte +2 -1
- package/package/components/S3FilePickerInner.svelte +89 -89
- package/package/components/ScriptEditor.svelte +18 -5
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
- package/package/components/apps/components/helpers/executeRunnable.js +2 -1
- package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
- package/package/components/apps/editor/appPolicy.js +2 -1
- package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
- package/package/components/apps/inputType.d.ts +1 -0
- package/package/components/apps/sharedTypes.d.ts +1 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
- package/package/components/copilot/chat/AIChatInput.svelte +56 -47
- package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
- package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
- package/package/components/copilot/chat/app/core.d.ts +12 -20
- package/package/components/copilot/chat/app/core.js +103 -160
- package/package/components/copilot/chat/app/core.test.js +234 -9
- package/package/components/copilot/chat/context.js +44 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
- package/package/components/copilot/chat/flow/core.d.ts +2 -1
- package/package/components/copilot/chat/flow/core.js +48 -21
- package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
- package/package/components/copilot/chat/flow/helperUtils.js +33 -1
- package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
- package/package/components/copilot/chat/flow/openFlow.json +1 -1
- package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
- package/package/components/copilot/chat/script/core.js +3 -0
- package/package/components/copilot/chat/shared.d.ts +6 -0
- package/package/components/copilot/chat/shared.js +22 -1
- package/package/components/copilot/chat/shared.test.d.ts +1 -0
- package/package/components/copilot/chat/shared.test.js +412 -0
- package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
- package/package/components/copilot/chat/workspaceTools.js +239 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
- package/package/components/copilot/lib.js +3 -1
- package/package/components/copilot/lib.test.d.ts +1 -0
- package/package/components/copilot/lib.test.js +19 -0
- package/package/components/copilot/modelConfig.d.ts +3 -0
- package/package/components/copilot/modelConfig.js +10 -0
- package/package/components/flows/FlowProgressBar.svelte +5 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
- package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
- package/package/components/flows/flowStateUtils.svelte.js +5 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
- package/package/components/graph/FlowGraphV2.svelte +7 -3
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
- package/package/components/home/deploy_ui.js +1 -1
- package/package/components/icons/AzureIcon.svelte +12 -25
- package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
- package/package/components/instanceSettings.js +24 -0
- package/package/components/mcp/McpScopeSelector.svelte +119 -9
- package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
- package/package/components/offboarding-utils.js +2 -0
- package/package/components/progressBar/ProgressBar.svelte +9 -5
- package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
- package/package/components/raw_apps/RawAppEditor.svelte +159 -102
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
- package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
- package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
- package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
- package/package/components/raw_apps/dataTableRefUtils.js +34 -0
- package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
- package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
- package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
- package/package/components/raw_apps/rawAppPolicy.js +17 -2
- package/package/components/resources/resourceTypesFilter.d.ts +19 -0
- package/package/components/resources/resourceTypesFilter.js +21 -0
- package/package/components/restartFromStepPath.d.ts +39 -0
- package/package/components/restartFromStepPath.js +89 -0
- package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
- package/package/components/runs/JobDetailFieldConfig.js +57 -10
- package/package/components/runs/JobDetailHeader.svelte +24 -3
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +30 -1
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/Select.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +48 -77
- package/package/components/settings/EditTokenScopesModal.svelte +57 -0
- package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
- package/package/components/settings/ScopesPicker.svelte +43 -0
- package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
- package/package/components/settings/TokensTable.svelte +51 -15
- package/package/components/sidebar/OperatorMenu.svelte +6 -0
- package/package/components/sidebar/SidebarContent.svelte +11 -1
- package/package/components/triggers/AddTriggersButton.svelte +6 -0
- package/package/components/triggers/CaptureWrapper.svelte +19 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerModeToggle.svelte +36 -7
- package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
- package/package/components/triggers/TriggersEditor.svelte +5 -1
- package/package/components/triggers/TriggersWrapper.svelte +10 -0
- package/package/components/triggers/azure/AzureCapture.svelte +41 -0
- package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
- package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
- package/package/components/triggers/azure/utils.js +56 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +23 -1
- package/package/components/triggers/utils.js +20 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
- package/package/components/triggers.d.ts +1 -1
- package/package/components/useNestedRestartState.svelte.d.ts +56 -0
- package/package/components/useNestedRestartState.svelte.js +320 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +294 -24
- package/package/gen/schemas.gen.js +297 -25
- package/package/gen/services.gen.d.ts +247 -4
- package/package/gen/services.gen.js +498 -7
- package/package/gen/types.gen.d.ts +990 -37
- package/package/hubPaths.json +2 -5
- package/package/infer.d.ts +1 -1
- package/package/infer.js +37 -51
- package/package/mcpEndpointTools.js +60 -4
- package/package/script_helpers.js +17 -0
- package/package/stores.d.ts +7 -0
- package/package/stores.js +6 -1
- package/package/system_prompts/index.d.ts +1 -0
- package/package/system_prompts/index.js +8 -0
- package/package/system_prompts/prompts.d.ts +16 -13
- package/package/system_prompts/prompts.js +653 -43
- package/package/templates/ci_test_bun.ts.template +8 -0
- package/package/templates/ci_test_python.py.template +8 -0
- package/package/utils/forkConflict.d.ts +26 -0
- package/package/utils/forkConflict.js +56 -0
- package/package/utils_deployable.d.ts +164 -121
- package/package/utils_deployable.js +61 -11
- package/package/utils_workspace_deploy.js +3 -1
- package/package.json +28 -4
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
- package/dist/sharedUtils/base.d.ts +0 -1
- package/dist/sharedUtils/cloud.d.ts +0 -1
- package/dist/sharedUtils/common.d.ts +0 -111
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
- package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
- package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
- package/dist/sharedUtils/components/apps/types.d.ts +0 -274
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
- package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
- package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
- package/dist/sharedUtils/components/common/index.d.ts +0 -24
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
- package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
- package/dist/sharedUtils/components/ducklake.d.ts +0 -1
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
- package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers.d.ts +0 -20
- package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
- package/dist/sharedUtils/gen/core/request.d.ts +0 -29
- package/dist/sharedUtils/gen/index.d.ts +0 -6
- package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
- package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
- package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
- package/dist/sharedUtils/history.svelte.d.ts +0 -9
- package/dist/sharedUtils/hub.d.ts +0 -49
- package/dist/sharedUtils/jsr.json +0 -6
- package/dist/sharedUtils/lib.d.ts +0 -5
- package/dist/sharedUtils/lib.es.js +0 -1588
- package/dist/sharedUtils/package.json +0 -12
- package/dist/sharedUtils/schema.d.ts +0 -3
- package/dist/sharedUtils/stores.d.ts +0 -97
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
- package/dist/sharedUtils/toast.d.ts +0 -8
- package/dist/sharedUtils/utils.d.ts +0 -265
- package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
- /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
|
@@ -72,6 +72,12 @@ const addTriggerItems = $derived([
|
|
|
72
72
|
icon: triggerIconMap.gcp,
|
|
73
73
|
extra: cloudHosted ? extra : undefined
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
displayName: 'Azure Event Grid',
|
|
77
|
+
action: () => onAddDraftTrigger?.('azure'),
|
|
78
|
+
icon: triggerIconMap.azure,
|
|
79
|
+
extra: cloudHosted ? extra : undefined
|
|
80
|
+
},
|
|
75
81
|
{
|
|
76
82
|
displayName: 'Email',
|
|
77
83
|
action: () => onAddDraftTrigger?.('email'),
|
|
@@ -12,6 +12,7 @@ import NatsCapture from './nats/NatsCapture.svelte';
|
|
|
12
12
|
import MqttCapture from './mqtt/MqttCapture.svelte';
|
|
13
13
|
import SqsCapture from './sqs/SqsCapture.svelte';
|
|
14
14
|
import GcpCapture from './gcp/GcpCapture.svelte';
|
|
15
|
+
import AzureCapture from './azure/AzureCapture.svelte';
|
|
15
16
|
import EmailCapture from './email/EmailCapture.svelte';
|
|
16
17
|
let { isFlow, path, hasPreprocessor, canHavePreprocessor, captureType = 'webhook', data = {}, connectionInfo = $bindable(undefined), args = {}, isValid = false, triggerDeployed = false } = $props();
|
|
17
18
|
let captureLoading = $state(false);
|
|
@@ -41,7 +42,10 @@ function isStreamingCapture() {
|
|
|
41
42
|
if (captureType === 'gcp' && args.delivery_type === 'push') {
|
|
42
43
|
return false;
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
+
if (captureType === 'azure' && args.azure_mode !== 'namespace_pull') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return ['mqtt', 'sqs', 'websocket', 'postgres', 'kafka', 'nats', 'gcp', 'azure'].includes(captureType);
|
|
45
49
|
}
|
|
46
50
|
async function getCaptureConfigs() {
|
|
47
51
|
const captureConfigsList = await CaptureService.getCaptureConfigs({
|
|
@@ -281,6 +285,20 @@ $effect(() => {
|
|
|
281
285
|
on:captureToggle={handleCapture}
|
|
282
286
|
on:testWithArgs
|
|
283
287
|
/>
|
|
288
|
+
{:else if captureType === 'azure'}
|
|
289
|
+
<AzureCapture
|
|
290
|
+
{isValid}
|
|
291
|
+
{captureInfo}
|
|
292
|
+
{hasPreprocessor}
|
|
293
|
+
{isFlow}
|
|
294
|
+
{captureLoading}
|
|
295
|
+
subscriptionName={args.subscription_name}
|
|
296
|
+
on:applyArgs
|
|
297
|
+
on:updateSchema
|
|
298
|
+
on:addPreprocessor
|
|
299
|
+
on:captureToggle={handleCapture}
|
|
300
|
+
on:testWithArgs
|
|
301
|
+
/>
|
|
284
302
|
{:else if captureType === 'email'}
|
|
285
303
|
<EmailCapture
|
|
286
304
|
local_part={args.local_part}
|
|
@@ -13,7 +13,7 @@ interface Props {
|
|
|
13
13
|
extra?: Snippet;
|
|
14
14
|
onDelete?: () => void;
|
|
15
15
|
onReset?: () => void;
|
|
16
|
-
onToggleMode: (mode: TriggerMode) => void
|
|
16
|
+
onToggleMode: (mode: TriggerMode) => void | boolean | Promise<void | boolean>;
|
|
17
17
|
onUpdate?: () => void;
|
|
18
18
|
cloudDisabled?: boolean;
|
|
19
19
|
trigger?: Trigger;
|
|
@@ -5,7 +5,18 @@ import DropdownV2 from '../DropdownV2.svelte';
|
|
|
5
5
|
import Toggle from '../Toggle.svelte';
|
|
6
6
|
import TriggerSuspendedJobsModal, {} from './TriggerSuspendedJobsModal.svelte';
|
|
7
7
|
let { triggerMode, onToggleMode, canWrite, hideToggleLabels = false, hideDropdown = false, suspendedJobsModal: passedSuspendedJobsModal, includeModalConfig } = $props();
|
|
8
|
-
|
|
8
|
+
// Local writable state mirroring `triggerMode`. Both inner controls bind
|
|
9
|
+
// to it: the suspended ToggleButtonGroup directly (it already needed a
|
|
10
|
+
// writable to revert to 'suspended' when there are queued jobs), and the
|
|
11
|
+
// regular Toggle via a function binding that maps 'enabled'/'disabled'
|
|
12
|
+
// to a boolean. Either control can write back here, and the $effect
|
|
13
|
+
// re-syncs us from the prop whenever the parent updates `triggerMode`.
|
|
14
|
+
// This lets the parent reset us in cases where the user click can't go
|
|
15
|
+
// through (e.g. cancelled fork-conflict modal).
|
|
16
|
+
let innerTriggerMode = $state(triggerMode);
|
|
17
|
+
$effect(() => {
|
|
18
|
+
innerTriggerMode = triggerMode;
|
|
19
|
+
});
|
|
9
20
|
let suspendedJobsModal = $derived(passedSuspendedJobsModal ?? null);
|
|
10
21
|
</script>
|
|
11
22
|
|
|
@@ -47,9 +58,18 @@ let suspendedJobsModal = $derived(passedSuspendedJobsModal ?? null);
|
|
|
47
58
|
<Toggle
|
|
48
59
|
disabled={!canWrite}
|
|
49
60
|
options={hideToggleLabels ? undefined : { right: 'enable', left: 'disable' }}
|
|
50
|
-
checked={
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
bind:checked={
|
|
62
|
+
() => innerTriggerMode === 'enabled', (v) => (innerTriggerMode = v ? 'enabled' : 'disabled')
|
|
63
|
+
}
|
|
64
|
+
on:change={async (e) => {
|
|
65
|
+
const result = await onToggleMode(e.detail ? 'enabled' : 'disabled')
|
|
66
|
+
if (result === false) {
|
|
67
|
+
// Cancelled: snap the toggle back to the prop. Needed for
|
|
68
|
+
// list-page rows where the parent doesn't optimistically
|
|
69
|
+
// flip `triggerMode` (so $effect won't re-run from a no-op
|
|
70
|
+
// prop change).
|
|
71
|
+
innerTriggerMode = triggerMode
|
|
72
|
+
}
|
|
53
73
|
}}
|
|
54
74
|
/>
|
|
55
75
|
{#if !hideDropdown}
|
|
@@ -59,9 +79,18 @@ let suspendedJobsModal = $derived(passedSuspendedJobsModal ?? null);
|
|
|
59
79
|
{
|
|
60
80
|
displayName: 'Suspend job execution',
|
|
61
81
|
icon: Pause,
|
|
62
|
-
action: () => {
|
|
63
|
-
|
|
64
|
-
|
|
82
|
+
action: async () => {
|
|
83
|
+
// Optimistically flip the local mirror, not the
|
|
84
|
+
// non-bindable `triggerMode` prop. The parent will
|
|
85
|
+
// echo the new mode back via $effect on success;
|
|
86
|
+
// on cancel (e.g. user dismisses the fork-conflict
|
|
87
|
+
// modal), reset to whatever the prop says — same
|
|
88
|
+
// shape as the Toggle's on:change handler.
|
|
89
|
+
innerTriggerMode = 'suspended'
|
|
90
|
+
const result = await onToggleMode?.('suspended')
|
|
91
|
+
if (result === false) {
|
|
92
|
+
innerTriggerMode = triggerMode
|
|
93
|
+
}
|
|
65
94
|
},
|
|
66
95
|
tooltip:
|
|
67
96
|
'When a trigger is in suspended mode, it will continue to accept payloads and queue jobs, but those jobs will not run automatically. You can review the list of suspended jobs, and resume or cancel them individually.'
|
|
@@ -2,7 +2,7 @@ import type { JobTriggerKind, TriggerMode } from '../../gen';
|
|
|
2
2
|
import TriggerSuspendedJobsModal, { type TriggerRunnableConfig } from './TriggerSuspendedJobsModal.svelte';
|
|
3
3
|
interface Props {
|
|
4
4
|
triggerMode: TriggerMode;
|
|
5
|
-
onToggleMode: (mode: TriggerMode) => void
|
|
5
|
+
onToggleMode: (mode: TriggerMode) => void | boolean | Promise<void | boolean>;
|
|
6
6
|
canWrite: boolean;
|
|
7
7
|
hideToggleLabels?: boolean;
|
|
8
8
|
hideDropdown?: boolean;
|
|
@@ -10,7 +10,7 @@ type Props = {
|
|
|
10
10
|
triggerPath: string;
|
|
11
11
|
triggerKind: JobTriggerKind;
|
|
12
12
|
hasChanged: boolean;
|
|
13
|
-
onToggleMode: (mode: TriggerMode) => void
|
|
13
|
+
onToggleMode: (mode: TriggerMode) => void | boolean | Promise<void | boolean>;
|
|
14
14
|
runnableConfig: TriggerRunnableConfig;
|
|
15
15
|
};
|
|
16
16
|
declare const TriggerSuspendedJobsModal: import("svelte").Component<Props, {
|
|
@@ -12,7 +12,7 @@ import Button from '../common/button/Button.svelte';
|
|
|
12
12
|
import TriggersWrapperV2 from './TriggersWrapper.svelte';
|
|
13
13
|
import { triggerTypeToCaptureKind, CLOUD_DISABLED_TRIGGER_TYPES } from './utils';
|
|
14
14
|
import { isCloudHosted } from '../../cloud';
|
|
15
|
-
import { ScheduleService, WebsocketTriggerService, PostgresTriggerService, KafkaTriggerService, NatsTriggerService, MqttTriggerService, HttpTriggerService, GcpTriggerService, SqsTriggerService, EmailTriggerService, NativeTriggerService } from '../../gen';
|
|
15
|
+
import { ScheduleService, WebsocketTriggerService, PostgresTriggerService, KafkaTriggerService, NatsTriggerService, MqttTriggerService, HttpTriggerService, GcpTriggerService, AzureTriggerService, SqsTriggerService, EmailTriggerService, NativeTriggerService } from '../../gen';
|
|
16
16
|
import { sendUserToast } from '../../toast';
|
|
17
17
|
import Alert from '../common/alert/Alert.svelte';
|
|
18
18
|
let { noEditor, newItem = false, currentPath, fakeInitialPath = '', runnableVersion = undefined, args = {}, initialPath, isFlow, canHavePreprocessor = false, hasPreprocessor = false, isDeployed = false, schema = undefined, noCapture = false, isEditor = true, onDeployTrigger } = $props();
|
|
@@ -47,6 +47,7 @@ async function deleteDeployedTrigger(triggerIndex) {
|
|
|
47
47
|
kafka: () => KafkaTriggerService.deleteKafkaTrigger,
|
|
48
48
|
nats: () => NatsTriggerService.deleteNatsTrigger,
|
|
49
49
|
gcp: () => GcpTriggerService.deleteGcpTrigger,
|
|
50
|
+
azure: () => AzureTriggerService.deleteAzureTrigger,
|
|
50
51
|
sqs: () => SqsTriggerService.deleteSqsTrigger,
|
|
51
52
|
mqtt: () => MqttTriggerService.deleteMqttTrigger,
|
|
52
53
|
http: () => HttpTriggerService.deleteHttpTrigger,
|
|
@@ -126,6 +127,9 @@ async function handleUpdate(trigger, path) {
|
|
|
126
127
|
else if (triggerType === 'gcp') {
|
|
127
128
|
await triggersState.fetchGcpTriggers(triggersCount, $workspaceStore, currentPath, isFlow, $userStore);
|
|
128
129
|
}
|
|
130
|
+
else if (triggerType === 'azure') {
|
|
131
|
+
await triggersState.fetchAzureTriggers(triggersCount, $workspaceStore, currentPath, isFlow, $userStore);
|
|
132
|
+
}
|
|
129
133
|
else if (triggerType === 'sqs') {
|
|
130
134
|
await triggersState.fetchSqsTriggers(triggersCount, $workspaceStore, currentPath, isFlow, $userStore);
|
|
131
135
|
}
|
|
@@ -9,6 +9,7 @@ import NatsTriggersPanel from './nats/NatsTriggersPanel.svelte';
|
|
|
9
9
|
import MqttTriggerPanel from './mqtt/MqttTriggersPanel.svelte';
|
|
10
10
|
import SqsTriggerPanel from './sqs/SqsTriggerPanel.svelte';
|
|
11
11
|
import GcpTriggerPanel from './gcp/GcpTriggerPanel.svelte';
|
|
12
|
+
import AzureTriggerPanel from './azure/AzureTriggerPanel.svelte';
|
|
12
13
|
import ScheduledPollPanel from './scheduled/ScheduledPollPanel.svelte';
|
|
13
14
|
import WebsocketTriggersPanel from './websocket/WebsocketTriggersPanel.svelte';
|
|
14
15
|
import { triggerIconMap } from './utils';
|
|
@@ -123,6 +124,15 @@ $effect(() => {
|
|
|
123
124
|
{customLabel}
|
|
124
125
|
{...props}
|
|
125
126
|
/>
|
|
127
|
+
{:else if selectedTrigger.type === 'azure'}
|
|
128
|
+
<AzureTriggerPanel
|
|
129
|
+
{isFlow}
|
|
130
|
+
path={initialPath || fakeInitialPath}
|
|
131
|
+
{selectedTrigger}
|
|
132
|
+
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
|
|
133
|
+
{customLabel}
|
|
134
|
+
{...props}
|
|
135
|
+
/>
|
|
126
136
|
{:else if selectedTrigger.type === 'email'}
|
|
127
137
|
<EmailTriggerPanel
|
|
128
138
|
{isFlow}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">import CaptureSection from '../CaptureSection.svelte';
|
|
2
|
+
import { Url } from '../../common';
|
|
3
|
+
import { fade } from 'svelte/transition';
|
|
4
|
+
let { captureInfo = undefined, isValid = undefined, hasPreprocessor = false, isFlow = false, captureLoading = false, subscriptionName = undefined } = $props();
|
|
5
|
+
// Mirror the backend suffix in set_azure_trigger_config: truncate to 39 then
|
|
6
|
+
// append "-wm-capture". Azure rule: [A-Za-z0-9-]{3,50}.
|
|
7
|
+
const captureSubscriptionName = $derived(subscriptionName
|
|
8
|
+
? `${subscriptionName.length > 39 ? subscriptionName.slice(0, 39) : subscriptionName}-wm-capture`
|
|
9
|
+
: undefined);
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
{#if captureInfo}
|
|
13
|
+
<CaptureSection
|
|
14
|
+
captureType="azure"
|
|
15
|
+
disabled={isValid === false}
|
|
16
|
+
{captureInfo}
|
|
17
|
+
on:captureToggle
|
|
18
|
+
on:applyArgs
|
|
19
|
+
on:updateSchema
|
|
20
|
+
on:addPreprocessor
|
|
21
|
+
on:testWithArgs
|
|
22
|
+
{hasPreprocessor}
|
|
23
|
+
{isFlow}
|
|
24
|
+
{captureLoading}
|
|
25
|
+
>
|
|
26
|
+
{#snippet description()}
|
|
27
|
+
{#if captureInfo.active}
|
|
28
|
+
<p in:fade={{ duration: 100, delay: 50 }} out:fade={{ duration: 50 }}>
|
|
29
|
+
Listening to Azure Event Grid events...
|
|
30
|
+
</p>
|
|
31
|
+
{:else}
|
|
32
|
+
<p in:fade={{ duration: 100, delay: 50 }} out:fade={{ duration: 50 }}>
|
|
33
|
+
Start capturing to listen to Azure Event Grid events.
|
|
34
|
+
</p>
|
|
35
|
+
{/if}
|
|
36
|
+
{/snippet}
|
|
37
|
+
{#if captureSubscriptionName}
|
|
38
|
+
<Url label="Test subscription name" url={captureSubscriptionName} />
|
|
39
|
+
{/if}
|
|
40
|
+
</CaptureSection>
|
|
41
|
+
{/if}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { CaptureInfo } from '../CaptureSection.svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
captureInfo?: CaptureInfo | undefined;
|
|
4
|
+
isValid?: boolean | undefined;
|
|
5
|
+
hasPreprocessor?: boolean;
|
|
6
|
+
isFlow?: boolean;
|
|
7
|
+
captureLoading?: boolean;
|
|
8
|
+
subscriptionName?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
11
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
12
|
+
$$bindings?: Bindings;
|
|
13
|
+
} & Exports;
|
|
14
|
+
(internal: unknown, props: Props & {
|
|
15
|
+
$$events?: Events;
|
|
16
|
+
$$slots?: Slots;
|
|
17
|
+
}): Exports & {
|
|
18
|
+
$set?: any;
|
|
19
|
+
$on?: any;
|
|
20
|
+
};
|
|
21
|
+
z_$$bindings?: Bindings;
|
|
22
|
+
}
|
|
23
|
+
declare const AzureCapture: $$__sveltets_2_IsomorphicComponent<Props, {
|
|
24
|
+
captureToggle: CustomEvent<{
|
|
25
|
+
disableOnly?: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
applyArgs: CustomEvent<{
|
|
28
|
+
kind: "main" | "preprocessor";
|
|
29
|
+
args: Record<string, any>;
|
|
30
|
+
}>;
|
|
31
|
+
updateSchema: CustomEvent<{
|
|
32
|
+
payloadData: Record<string, any>;
|
|
33
|
+
redirect: boolean;
|
|
34
|
+
args?: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
addPreprocessor: CustomEvent<{
|
|
37
|
+
args: Record<string, any>;
|
|
38
|
+
} | null>;
|
|
39
|
+
testWithArgs: CustomEvent<Record<string, any>>;
|
|
40
|
+
} & {
|
|
41
|
+
[evt: string]: CustomEvent<any>;
|
|
42
|
+
}, {}, {}, "">;
|
|
43
|
+
type AzureCapture = InstanceType<typeof AzureCapture>;
|
|
44
|
+
export default AzureCapture;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">import { tick } from 'svelte';
|
|
2
|
+
import AzureTriggerEditorInner from './AzureTriggerEditorInner.svelte';
|
|
3
|
+
let { onUpdate } = $props();
|
|
4
|
+
let open = $state(false);
|
|
5
|
+
export async function openEdit(ePath, isFlow) {
|
|
6
|
+
open = true;
|
|
7
|
+
await tick();
|
|
8
|
+
drawer?.openEdit(ePath, isFlow);
|
|
9
|
+
}
|
|
10
|
+
export async function openNew(is_flow, initial_script_path, defaultValues) {
|
|
11
|
+
open = true;
|
|
12
|
+
await tick();
|
|
13
|
+
drawer?.openNew(is_flow, initial_script_path, defaultValues);
|
|
14
|
+
}
|
|
15
|
+
let drawer = $state();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
{#if open}
|
|
19
|
+
<AzureTriggerEditorInner {onUpdate} bind:this={drawer} />
|
|
20
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
onUpdate?: (path?: string) => void;
|
|
3
|
+
};
|
|
4
|
+
declare const AzureTriggerEditor: import("svelte").Component<$$ComponentProps, {
|
|
5
|
+
openEdit: (ePath: string, isFlow: boolean) => Promise<void>;
|
|
6
|
+
openNew: (is_flow: boolean, initial_script_path?: string, defaultValues?: Record<string, any>) => Promise<void>;
|
|
7
|
+
}, "">;
|
|
8
|
+
type AzureTriggerEditor = ReturnType<typeof AzureTriggerEditor>;
|
|
9
|
+
export default AzureTriggerEditor;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
<script lang="ts">import Section from '../../Section.svelte';
|
|
2
|
+
import ResourcePicker from '../../ResourcePicker.svelte';
|
|
3
|
+
import Subsection from '../../Subsection.svelte';
|
|
4
|
+
import ToggleButtonGroup from '../../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
5
|
+
import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
|
|
6
|
+
import Select from '../../select/Select.svelte';
|
|
7
|
+
import { Alert, Button } from '../../common';
|
|
8
|
+
import TextInput from '../../text_input/TextInput.svelte';
|
|
9
|
+
import { AzureTriggerService } from '../../../gen';
|
|
10
|
+
import { emptyStringTrimmed } from '../../../utils';
|
|
11
|
+
import { workspaceStore } from '../../../stores';
|
|
12
|
+
import { RefreshCw } from 'lucide-svelte';
|
|
13
|
+
let { can_write = false, headless = false, isValid = $bindable(false), azure_resource_path = $bindable(), azure_mode = $bindable(), scope_resource_id = $bindable(), topic_name = $bindable(), subscription_name = $bindable(), event_type_filters = $bindable(), path = '' } = $props();
|
|
14
|
+
const edition = $derived(azure_mode === 'basic_push' ? 'basic' : 'namespace');
|
|
15
|
+
const delivery = $derived(azure_mode === 'namespace_pull' ? 'pull' : 'push');
|
|
16
|
+
function setEdition(next) {
|
|
17
|
+
if (next === 'basic') {
|
|
18
|
+
azure_mode = 'basic_push';
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
azure_mode = delivery === 'pull' ? 'namespace_pull' : 'namespace_push';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function setDelivery(next) {
|
|
25
|
+
azure_mode = next === 'pull' ? 'namespace_pull' : 'namespace_push';
|
|
26
|
+
}
|
|
27
|
+
$effect(() => {
|
|
28
|
+
if (azure_mode === 'basic_push' && topic_name !== undefined && topic_name !== '') {
|
|
29
|
+
topic_name = undefined;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
$effect(() => {
|
|
33
|
+
if (emptyStringTrimmed(subscription_name) && !emptyStringTrimmed(path) && $workspaceStore) {
|
|
34
|
+
const generated = `windmill-${$workspaceStore}-${path.replaceAll(/[^A-Za-z0-9-]/g, '-')}`;
|
|
35
|
+
subscription_name = generated.slice(0, 50);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const is_namespace = $derived(edition === 'namespace');
|
|
39
|
+
const has_sp = $derived(!emptyStringTrimmed(azure_resource_path));
|
|
40
|
+
const has_scope = $derived(!emptyStringTrimmed(scope_resource_id));
|
|
41
|
+
const has_topic = $derived(!is_namespace || !emptyStringTrimmed(topic_name));
|
|
42
|
+
const config_ready = $derived(has_sp && has_scope && has_topic);
|
|
43
|
+
const scopeLabel = $derived(is_namespace ? 'Namespace' : 'Topic');
|
|
44
|
+
const scopeTooltip = $derived(is_namespace
|
|
45
|
+
? 'Event Grid Namespace — loaded via the service principal. Refresh after creating one.'
|
|
46
|
+
: 'Basic Event Grid topic or system topic — loaded via the service principal.');
|
|
47
|
+
// ARM resource loading -----------------------------------------------
|
|
48
|
+
let scopeResources = $state([]);
|
|
49
|
+
let scopeLoading = $state(false);
|
|
50
|
+
let scopeError = $state(undefined);
|
|
51
|
+
async function loadScopeResources() {
|
|
52
|
+
if (!$workspaceStore || emptyStringTrimmed(azure_resource_path)) {
|
|
53
|
+
scopeResources = [];
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
scopeLoading = true;
|
|
57
|
+
scopeError = undefined;
|
|
58
|
+
try {
|
|
59
|
+
const result = is_namespace
|
|
60
|
+
? await AzureTriggerService.listAzureNamespaces({
|
|
61
|
+
workspace: $workspaceStore,
|
|
62
|
+
path: azure_resource_path
|
|
63
|
+
})
|
|
64
|
+
: await AzureTriggerService.listAzureBasicTopics({
|
|
65
|
+
workspace: $workspaceStore,
|
|
66
|
+
path: azure_resource_path
|
|
67
|
+
});
|
|
68
|
+
scopeResources = result;
|
|
69
|
+
// Clear selection if it no longer matches any entry in the new list
|
|
70
|
+
// (e.g. flipped edition, swapped SP).
|
|
71
|
+
if (scope_resource_id && !result.some((r) => r.id === scope_resource_id)) {
|
|
72
|
+
scope_resource_id = '';
|
|
73
|
+
topic_name = undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
scopeError = e?.body?.error?.message ?? e?.message ?? String(e);
|
|
78
|
+
scopeResources = [];
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
scopeLoading = false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
$effect(() => {
|
|
85
|
+
// Re-fetch when SP changes or edition flips.
|
|
86
|
+
void azure_resource_path;
|
|
87
|
+
void edition;
|
|
88
|
+
loadScopeResources();
|
|
89
|
+
});
|
|
90
|
+
const scopeItems = $derived(scopeResources.map((r) => ({
|
|
91
|
+
label: r.name + (r.type?.toLowerCase().includes('systemtopic') ? ' (system)' : ''),
|
|
92
|
+
value: r.id,
|
|
93
|
+
subtext: r.id
|
|
94
|
+
})));
|
|
95
|
+
let topics = $state([]);
|
|
96
|
+
let topicsLoading = $state(false);
|
|
97
|
+
let topicsError = $state(undefined);
|
|
98
|
+
async function loadTopics() {
|
|
99
|
+
if (!is_namespace ||
|
|
100
|
+
!$workspaceStore ||
|
|
101
|
+
emptyStringTrimmed(azure_resource_path) ||
|
|
102
|
+
emptyStringTrimmed(scope_resource_id)) {
|
|
103
|
+
topics = [];
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
topicsLoading = true;
|
|
107
|
+
topicsError = undefined;
|
|
108
|
+
try {
|
|
109
|
+
const result = await AzureTriggerService.listAzureNamespaceTopics({
|
|
110
|
+
workspace: $workspaceStore,
|
|
111
|
+
path: azure_resource_path,
|
|
112
|
+
requestBody: { scope_resource_id }
|
|
113
|
+
});
|
|
114
|
+
topics = result.map((t) => ({ name: t.name, id: t.id }));
|
|
115
|
+
if (topic_name && !topics.some((t) => t.name === topic_name)) {
|
|
116
|
+
topic_name = undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
topicsError = e?.body?.error?.message ?? e?.message ?? String(e);
|
|
121
|
+
topics = [];
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
topicsLoading = false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
$effect(() => {
|
|
128
|
+
void scope_resource_id;
|
|
129
|
+
void azure_resource_path;
|
|
130
|
+
void is_namespace;
|
|
131
|
+
loadTopics();
|
|
132
|
+
});
|
|
133
|
+
const topicItems = $derived(topics.map((t) => ({ label: t.name, value: t.name })));
|
|
134
|
+
const AZURE_SUB_NAME_RE = /^[A-Za-z0-9-]{3,50}$/;
|
|
135
|
+
const subscriptionNameError = $derived.by(() => {
|
|
136
|
+
if (emptyStringTrimmed(subscription_name))
|
|
137
|
+
return '';
|
|
138
|
+
return AZURE_SUB_NAME_RE.test(subscription_name)
|
|
139
|
+
? ''
|
|
140
|
+
: 'Must be 3–50 chars, letters/digits/hyphens only.';
|
|
141
|
+
});
|
|
142
|
+
$effect(() => {
|
|
143
|
+
const resource_ok = !emptyStringTrimmed(azure_resource_path);
|
|
144
|
+
const scope_ok = !emptyStringTrimmed(scope_resource_id);
|
|
145
|
+
const sub_ok = !emptyStringTrimmed(subscription_name) && subscriptionNameError === '';
|
|
146
|
+
const topic_ok = !is_namespace || !emptyStringTrimmed(topic_name);
|
|
147
|
+
isValid = resource_ok && scope_ok && sub_ok && topic_ok;
|
|
148
|
+
});
|
|
149
|
+
const filterText = $derived(event_type_filters?.join('\n') ?? '');
|
|
150
|
+
function setFilterText(value) {
|
|
151
|
+
const list = value
|
|
152
|
+
.split(/\n|,/)
|
|
153
|
+
.map((v) => v.trim())
|
|
154
|
+
.filter((v) => v.length > 0);
|
|
155
|
+
event_type_filters = list.length > 0 ? list : undefined;
|
|
156
|
+
}
|
|
157
|
+
</script>
|
|
158
|
+
|
|
159
|
+
<Section label="Azure Event Grid" {headless}>
|
|
160
|
+
<div class="flex flex-col gap-6">
|
|
161
|
+
<Subsection
|
|
162
|
+
label="Service Principal"
|
|
163
|
+
tooltip="Windmill resource of type `azure` (azureTenantId, azureClientId, azureClientSecret)."
|
|
164
|
+
>
|
|
165
|
+
<ResourcePicker bind:value={azure_resource_path} resourceType="azure" disabled={!can_write} />
|
|
166
|
+
</Subsection>
|
|
167
|
+
|
|
168
|
+
{#if has_sp}
|
|
169
|
+
<Subsection
|
|
170
|
+
label="Event Grid edition"
|
|
171
|
+
tooltip="Namespace is the newer product (2024 GA) with push + pull delivery and CloudEvents 1.0. Basic is the legacy service — use it for Azure system topics (Storage / Key Vault events etc.)."
|
|
172
|
+
>
|
|
173
|
+
<ToggleButtonGroup
|
|
174
|
+
selected={edition}
|
|
175
|
+
onSelected={(v) => setEdition(v as Edition)}
|
|
176
|
+
disabled={!can_write}
|
|
177
|
+
>
|
|
178
|
+
{#snippet children({ item })}
|
|
179
|
+
<ToggleButton value="namespace" label="Namespace" {item} />
|
|
180
|
+
<ToggleButton value="basic" label="Basic" {item} />
|
|
181
|
+
{/snippet}
|
|
182
|
+
</ToggleButtonGroup>
|
|
183
|
+
</Subsection>
|
|
184
|
+
|
|
185
|
+
{#if is_namespace}
|
|
186
|
+
<Subsection
|
|
187
|
+
label="Delivery mode"
|
|
188
|
+
tooltip="Push: Azure POSTs events to this Windmill instance (requires a public URL). Pull: Windmill polls Azure, better for retries and not requiring inbound exposure."
|
|
189
|
+
>
|
|
190
|
+
<ToggleButtonGroup
|
|
191
|
+
selected={delivery}
|
|
192
|
+
onSelected={(v) => setDelivery(v as Delivery)}
|
|
193
|
+
disabled={!can_write}
|
|
194
|
+
>
|
|
195
|
+
{#snippet children({ item })}
|
|
196
|
+
<ToggleButton value="pull" label="Pull" {item} />
|
|
197
|
+
<ToggleButton value="push" label="Push" {item} />
|
|
198
|
+
{/snippet}
|
|
199
|
+
</ToggleButtonGroup>
|
|
200
|
+
</Subsection>
|
|
201
|
+
{/if}
|
|
202
|
+
|
|
203
|
+
<Subsection label={scopeLabel} tooltip={scopeTooltip}>
|
|
204
|
+
<div class="flex items-center gap-2">
|
|
205
|
+
<div class="flex-1">
|
|
206
|
+
<Select
|
|
207
|
+
bind:value={scope_resource_id}
|
|
208
|
+
items={scopeItems}
|
|
209
|
+
placeholder={scopeLoading ? 'Loading…' : `Select ${scopeLabel.toLowerCase()}`}
|
|
210
|
+
disabled={!can_write || scopeLoading}
|
|
211
|
+
clearable
|
|
212
|
+
/>
|
|
213
|
+
</div>
|
|
214
|
+
<Button
|
|
215
|
+
variant="subtle"
|
|
216
|
+
startIcon={{ icon: RefreshCw }}
|
|
217
|
+
iconOnly
|
|
218
|
+
disabled={!can_write || scopeLoading}
|
|
219
|
+
onclick={loadScopeResources}
|
|
220
|
+
/>
|
|
221
|
+
</div>
|
|
222
|
+
{#if scopeError}
|
|
223
|
+
<p class="text-xs text-red-600 mt-1">{scopeError}</p>
|
|
224
|
+
{:else if !scopeLoading && scopeResources.length === 0}
|
|
225
|
+
<p class="text-xs text-tertiary mt-1">
|
|
226
|
+
No {scopeLabel.toLowerCase()} found. Create one in Azure and click refresh.
|
|
227
|
+
</p>
|
|
228
|
+
{/if}
|
|
229
|
+
</Subsection>
|
|
230
|
+
{/if}
|
|
231
|
+
|
|
232
|
+
{#if has_sp && is_namespace && has_scope}
|
|
233
|
+
<Subsection label="Topic" tooltip="Topic inside the selected Namespace.">
|
|
234
|
+
<div class="flex items-center gap-2">
|
|
235
|
+
<div class="flex-1">
|
|
236
|
+
<Select
|
|
237
|
+
bind:value={topic_name}
|
|
238
|
+
items={topicItems}
|
|
239
|
+
placeholder={topicsLoading ? 'Loading…' : 'Select topic'}
|
|
240
|
+
disabled={!can_write || topicsLoading}
|
|
241
|
+
clearable
|
|
242
|
+
/>
|
|
243
|
+
</div>
|
|
244
|
+
<Button
|
|
245
|
+
variant="subtle"
|
|
246
|
+
startIcon={{ icon: RefreshCw }}
|
|
247
|
+
iconOnly
|
|
248
|
+
disabled={!can_write || topicsLoading}
|
|
249
|
+
onclick={loadTopics}
|
|
250
|
+
/>
|
|
251
|
+
</div>
|
|
252
|
+
{#if topicsError}
|
|
253
|
+
<p class="text-xs text-red-600 mt-1">{topicsError}</p>
|
|
254
|
+
{/if}
|
|
255
|
+
</Subsection>
|
|
256
|
+
{/if}
|
|
257
|
+
|
|
258
|
+
{#if config_ready}
|
|
259
|
+
<Subsection
|
|
260
|
+
label="Subscription name"
|
|
261
|
+
tooltip="Auto-generated from the trigger path. Windmill creates this subscription on Azure (or overwrites it) on save."
|
|
262
|
+
>
|
|
263
|
+
<TextInput
|
|
264
|
+
bind:value={subscription_name}
|
|
265
|
+
inputProps={{
|
|
266
|
+
placeholder: 'leave empty to auto-generate',
|
|
267
|
+
disabled: !can_write
|
|
268
|
+
}}
|
|
269
|
+
error={subscriptionNameError}
|
|
270
|
+
/>
|
|
271
|
+
{#if subscriptionNameError}
|
|
272
|
+
<p class="text-xs text-red-600 mt-1">{subscriptionNameError}</p>
|
|
273
|
+
{/if}
|
|
274
|
+
<div class="mt-2">
|
|
275
|
+
<Alert title="Saving overwrites this subscription on Azure" type="warning" size="xs">
|
|
276
|
+
If a subscription with this name already exists with an incompatible delivery mode
|
|
277
|
+
(Push↔Pull) or endpoint type, Windmill will delete and recreate it — any in-flight
|
|
278
|
+
events in its queue will be dropped.
|
|
279
|
+
</Alert>
|
|
280
|
+
</div>
|
|
281
|
+
</Subsection>
|
|
282
|
+
|
|
283
|
+
<Subsection
|
|
284
|
+
label="Event type filters"
|
|
285
|
+
tooltip="Optional. One per line (or comma-separated). Forwarded as includedEventTypes."
|
|
286
|
+
>
|
|
287
|
+
<TextInput
|
|
288
|
+
value={filterText}
|
|
289
|
+
underlyingInputEl="textarea"
|
|
290
|
+
class="font-mono"
|
|
291
|
+
inputProps={{
|
|
292
|
+
placeholder: 'Microsoft.Storage.BlobCreated',
|
|
293
|
+
disabled: !can_write,
|
|
294
|
+
rows: 3,
|
|
295
|
+
oninput: (e) => setFilterText(e.currentTarget.value)
|
|
296
|
+
}}
|
|
297
|
+
/>
|
|
298
|
+
</Subsection>
|
|
299
|
+
{/if}
|
|
300
|
+
</div>
|
|
301
|
+
</Section>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AzureMode } from '../../../gen';
|
|
2
|
+
interface Props {
|
|
3
|
+
can_write?: boolean;
|
|
4
|
+
headless?: boolean;
|
|
5
|
+
isValid?: boolean;
|
|
6
|
+
azure_resource_path: string;
|
|
7
|
+
azure_mode: AzureMode;
|
|
8
|
+
scope_resource_id: string;
|
|
9
|
+
topic_name?: string;
|
|
10
|
+
subscription_name: string;
|
|
11
|
+
event_type_filters?: string[];
|
|
12
|
+
path?: string;
|
|
13
|
+
}
|
|
14
|
+
declare const AzureTriggerEditorConfigSection: import("svelte").Component<Props, {}, "azure_mode" | "scope_resource_id" | "subscription_name" | "azure_resource_path" | "topic_name" | "event_type_filters" | "isValid">;
|
|
15
|
+
type AzureTriggerEditorConfigSection = ReturnType<typeof AzureTriggerEditorConfigSection>;
|
|
16
|
+
export default AzureTriggerEditorConfigSection;
|