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.
Files changed (264) hide show
  1. package/package/components/ArgInput.svelte +2 -0
  2. package/package/components/AutoscalingConfigEditor.svelte +18 -4
  3. package/package/components/CompareWorkspaces.svelte +206 -157
  4. package/package/components/DatatableSchemaDiff.svelte +2 -2
  5. package/package/components/Dev.svelte +401 -85
  6. package/package/components/EditableSchemaForm.svelte +4 -0
  7. package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
  8. package/package/components/FlowPreviewContent.svelte +32 -30
  9. package/package/components/FlowRestartButton.svelte +143 -61
  10. package/package/components/FlowRestartButton.svelte.d.ts +37 -0
  11. package/package/components/FlowStatusViewer.svelte +15 -1
  12. package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
  13. package/package/components/FlowStatusViewerInner.svelte +1 -2
  14. package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
  15. package/package/components/ForkConflictModal.svelte +57 -0
  16. package/package/components/ForkConflictModal.svelte.d.ts +3 -0
  17. package/package/components/GitRepoViewer.svelte +251 -97
  18. package/package/components/InputTransformSchemaForm.svelte +1 -1
  19. package/package/components/InstanceSettings.svelte +36 -16
  20. package/package/components/Login.svelte +113 -28
  21. package/package/components/Login.svelte.d.ts +1 -0
  22. package/package/components/Path.svelte +7 -1
  23. package/package/components/Path.svelte.d.ts +1 -1
  24. package/package/components/RunsPage.svelte +2 -1
  25. package/package/components/S3FilePickerInner.svelte +89 -89
  26. package/package/components/ScriptEditor.svelte +18 -5
  27. package/package/components/ShareModal.svelte.d.ts +1 -1
  28. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
  29. package/package/components/apps/components/helpers/executeRunnable.js +2 -1
  30. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
  31. package/package/components/apps/editor/appPolicy.js +2 -1
  32. package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
  33. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
  34. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
  35. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
  36. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
  37. package/package/components/apps/inputType.d.ts +1 -0
  38. package/package/components/apps/sharedTypes.d.ts +1 -0
  39. package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
  40. package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
  41. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
  42. package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
  43. package/package/components/copilot/chat/AIChatInput.svelte +56 -47
  44. package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
  45. package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
  46. package/package/components/copilot/chat/app/core.d.ts +12 -20
  47. package/package/components/copilot/chat/app/core.js +103 -160
  48. package/package/components/copilot/chat/app/core.test.js +234 -9
  49. package/package/components/copilot/chat/context.js +44 -0
  50. package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
  51. package/package/components/copilot/chat/flow/core.d.ts +2 -1
  52. package/package/components/copilot/chat/flow/core.js +48 -21
  53. package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
  54. package/package/components/copilot/chat/flow/helperUtils.js +33 -1
  55. package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
  56. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  57. package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
  58. package/package/components/copilot/chat/script/core.js +3 -0
  59. package/package/components/copilot/chat/shared.d.ts +6 -0
  60. package/package/components/copilot/chat/shared.js +22 -1
  61. package/package/components/copilot/chat/shared.test.d.ts +1 -0
  62. package/package/components/copilot/chat/shared.test.js +412 -0
  63. package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
  64. package/package/components/copilot/chat/workspaceTools.js +239 -0
  65. package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
  66. package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
  67. package/package/components/copilot/lib.js +3 -1
  68. package/package/components/copilot/lib.test.d.ts +1 -0
  69. package/package/components/copilot/lib.test.js +19 -0
  70. package/package/components/copilot/modelConfig.d.ts +3 -0
  71. package/package/components/copilot/modelConfig.js +10 -0
  72. package/package/components/flows/FlowProgressBar.svelte +5 -2
  73. package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
  74. package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
  75. package/package/components/flows/flowStateUtils.svelte.js +5 -1
  76. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  77. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
  78. package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
  79. package/package/components/graph/FlowGraphV2.svelte +7 -3
  80. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  81. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
  82. package/package/components/home/deploy_ui.js +1 -1
  83. package/package/components/icons/AzureIcon.svelte +12 -25
  84. package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
  85. package/package/components/instanceSettings.js +24 -0
  86. package/package/components/mcp/McpScopeSelector.svelte +119 -9
  87. package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
  88. package/package/components/offboarding-utils.js +2 -0
  89. package/package/components/progressBar/ProgressBar.svelte +9 -5
  90. package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
  91. package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
  92. package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
  93. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
  94. package/package/components/raw_apps/RawAppEditor.svelte +159 -102
  95. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
  96. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
  97. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
  98. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
  99. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
  100. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
  101. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
  102. package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
  103. package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
  104. package/package/components/raw_apps/dataTableRefUtils.js +34 -0
  105. package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
  106. package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
  107. package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
  108. package/package/components/raw_apps/rawAppPolicy.js +17 -2
  109. package/package/components/resources/resourceTypesFilter.d.ts +19 -0
  110. package/package/components/resources/resourceTypesFilter.js +21 -0
  111. package/package/components/restartFromStepPath.d.ts +39 -0
  112. package/package/components/restartFromStepPath.js +89 -0
  113. package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
  114. package/package/components/runs/JobDetailFieldConfig.js +57 -10
  115. package/package/components/runs/JobDetailHeader.svelte +24 -3
  116. package/package/components/runs/runsFilter.d.ts +1 -1
  117. package/package/components/schema/FlowPropertyEditor.svelte +30 -1
  118. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
  119. package/package/components/search/GlobalSearchModal.svelte +8 -1
  120. package/package/components/select/Select.svelte +1 -1
  121. package/package/components/settings/CreateToken.svelte +48 -77
  122. package/package/components/settings/EditTokenScopesModal.svelte +57 -0
  123. package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
  124. package/package/components/settings/ScopesPicker.svelte +43 -0
  125. package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
  126. package/package/components/settings/TokensTable.svelte +51 -15
  127. package/package/components/sidebar/OperatorMenu.svelte +6 -0
  128. package/package/components/sidebar/SidebarContent.svelte +11 -1
  129. package/package/components/triggers/AddTriggersButton.svelte +6 -0
  130. package/package/components/triggers/CaptureWrapper.svelte +19 -1
  131. package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
  132. package/package/components/triggers/TriggerModeToggle.svelte +36 -7
  133. package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
  134. package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
  135. package/package/components/triggers/TriggersEditor.svelte +5 -1
  136. package/package/components/triggers/TriggersWrapper.svelte +10 -0
  137. package/package/components/triggers/azure/AzureCapture.svelte +41 -0
  138. package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
  139. package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
  140. package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
  141. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
  142. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
  143. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
  144. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
  145. package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
  146. package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
  147. package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
  148. package/package/components/triggers/azure/utils.js +56 -0
  149. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
  150. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
  151. package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
  152. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
  153. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
  154. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
  155. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
  156. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
  157. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
  158. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  159. package/package/components/triggers/triggers.svelte.js +23 -1
  160. package/package/components/triggers/utils.js +20 -0
  161. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
  162. package/package/components/triggers.d.ts +1 -1
  163. package/package/components/useNestedRestartState.svelte.d.ts +56 -0
  164. package/package/components/useNestedRestartState.svelte.js +320 -0
  165. package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
  166. package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
  167. package/package/gen/core/OpenAPI.js +1 -1
  168. package/package/gen/schemas.gen.d.ts +294 -24
  169. package/package/gen/schemas.gen.js +297 -25
  170. package/package/gen/services.gen.d.ts +247 -4
  171. package/package/gen/services.gen.js +498 -7
  172. package/package/gen/types.gen.d.ts +990 -37
  173. package/package/hubPaths.json +2 -5
  174. package/package/infer.d.ts +1 -1
  175. package/package/infer.js +37 -51
  176. package/package/mcpEndpointTools.js +60 -4
  177. package/package/script_helpers.js +17 -0
  178. package/package/stores.d.ts +7 -0
  179. package/package/stores.js +6 -1
  180. package/package/system_prompts/index.d.ts +1 -0
  181. package/package/system_prompts/index.js +8 -0
  182. package/package/system_prompts/prompts.d.ts +16 -13
  183. package/package/system_prompts/prompts.js +653 -43
  184. package/package/templates/ci_test_bun.ts.template +8 -0
  185. package/package/templates/ci_test_python.py.template +8 -0
  186. package/package/utils/forkConflict.d.ts +26 -0
  187. package/package/utils/forkConflict.js +56 -0
  188. package/package/utils_deployable.d.ts +164 -121
  189. package/package/utils_deployable.js +61 -11
  190. package/package/utils_workspace_deploy.js +3 -1
  191. package/package.json +28 -4
  192. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  193. package/dist/sharedUtils/base.d.ts +0 -1
  194. package/dist/sharedUtils/cloud.d.ts +0 -1
  195. package/dist/sharedUtils/common.d.ts +0 -111
  196. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  197. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  198. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  199. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  200. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  201. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  202. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  203. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  204. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  205. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  206. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  207. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  208. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  209. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  210. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  211. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  212. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  213. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  214. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  215. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  216. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  217. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  218. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  219. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  220. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  221. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  222. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  223. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  224. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  225. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  226. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  227. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  228. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  229. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  230. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  231. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  232. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  233. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  234. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  235. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  236. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  237. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  238. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  239. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  240. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  241. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  242. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  243. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  244. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  245. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  246. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  247. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  248. package/dist/sharedUtils/gen/index.d.ts +0 -6
  249. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  250. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  251. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  252. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  253. package/dist/sharedUtils/hub.d.ts +0 -49
  254. package/dist/sharedUtils/jsr.json +0 -6
  255. package/dist/sharedUtils/lib.d.ts +0 -5
  256. package/dist/sharedUtils/lib.es.js +0 -1588
  257. package/dist/sharedUtils/package.json +0 -12
  258. package/dist/sharedUtils/schema.d.ts +0 -3
  259. package/dist/sharedUtils/stores.d.ts +0 -97
  260. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  261. package/dist/sharedUtils/toast.d.ts +0 -8
  262. package/dist/sharedUtils/utils.d.ts +0 -265
  263. package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
  264. /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
- return ['mqtt', 'sqs', 'websocket', 'postgres', 'kafka', 'nats', 'gcp'].includes(captureType);
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
- let innerTriggerMode = $derived(triggerMode);
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={triggerMode === 'enabled'}
51
- on:change={(e) => {
52
- onToggleMode(e.detail ? 'enabled' : 'disabled')
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
- triggerMode = 'suspended'
64
- onToggleMode?.('suspended')
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;