windmill-components 1.504.6 → 1.510.1

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 (196) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +161 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +7 -4
  10. package/package/components/EditorBar.svelte +2 -2
  11. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  12. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  13. package/package/components/FlowBuilder.svelte +11 -2
  14. package/package/components/FlowJobResult.svelte +12 -17
  15. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  16. package/package/components/FlowPreviewContent.svelte +13 -10
  17. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  18. package/package/components/FlowPreviewResult.svelte +14 -6
  19. package/package/components/FlowStatusViewer.svelte +11 -24
  20. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  21. package/package/components/FlowStatusViewerInner.svelte +110 -131
  22. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  23. package/package/components/GitDiffPreview.svelte +55 -0
  24. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  25. package/package/components/HistoricInputs.svelte +2 -2
  26. package/package/components/InitGitRepoPopover.svelte +410 -0
  27. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  28. package/package/components/InstanceSetting.svelte +21 -9
  29. package/package/components/InstanceSettings.svelte +16 -3
  30. package/package/components/JobLoader.svelte +567 -0
  31. package/package/components/JobLoader.svelte.d.ts +53 -0
  32. package/package/components/JobLogs.svelte +6 -4
  33. package/package/components/JobLogs.svelte.d.ts +5 -18
  34. package/package/components/LightweightResourcePicker.svelte +18 -39
  35. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  36. package/package/components/LogViewer.svelte +35 -41
  37. package/package/components/LogViewer.svelte.d.ts +6 -20
  38. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  39. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  40. package/package/components/ModuleTest.svelte +16 -11
  41. package/package/components/PullGitRepoPopover.svelte +355 -0
  42. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  43. package/package/components/S3FilePicker.svelte +5 -3
  44. package/package/components/SavedInputs.svelte +2 -2
  45. package/package/components/ScriptBuilder.svelte +4 -3
  46. package/package/components/ScriptEditor.svelte +34 -31
  47. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  48. package/package/components/ServiceLogsInner.svelte +2 -1
  49. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  50. package/package/components/UserSettings.svelte +1 -1
  51. package/package/components/WorkerTagSelect.svelte +32 -3
  52. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  53. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  54. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  55. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  56. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  57. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  58. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  59. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  60. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  61. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  62. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  63. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  64. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  65. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  66. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  67. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  68. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  69. package/package/components/apps/editor/component/components.d.ts +12 -0
  70. package/package/components/apps/editor/component/components.js +19 -7
  71. package/package/components/assets/AssetButtons.svelte +38 -0
  72. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  73. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  74. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  75. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  76. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  77. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  78. package/package/components/assets/README_DEV.md +0 -0
  79. package/package/components/assets/lib.d.ts +9 -1
  80. package/package/components/assets/lib.js +48 -7
  81. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  82. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  83. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  84. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  85. package/package/components/common/table/ScriptRow.svelte +3 -1
  86. package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
  87. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  88. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  89. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  90. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  91. package/package/components/copilot/chat/flow/core.js +2 -38
  92. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  93. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  94. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  95. package/package/components/copilot/chat/navigator/core.js +2 -1
  96. package/package/components/copilot/chat/script/core.d.ts +11 -2
  97. package/package/components/copilot/chat/script/core.js +135 -1
  98. package/package/components/copilot/chat/shared.d.ts +10 -0
  99. package/package/components/copilot/chat/shared.js +56 -0
  100. package/package/components/copilot/lib.d.ts +1 -0
  101. package/package/components/copilot/lib.js +27 -9
  102. package/package/components/custom_ui.d.ts +1 -0
  103. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  104. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
  106. package/package/components/flows/flowStore.d.ts +1 -1
  107. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  108. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  109. package/package/components/flows/scheduleUtils.js +1 -1
  110. package/package/components/flows/types.d.ts +2 -1
  111. package/package/components/graph/FlowGraphV2.svelte +8 -104
  112. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  113. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  114. package/package/components/graph/graphBuilder.svelte.js +35 -9
  115. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  117. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  118. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  119. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  120. package/package/components/graph/util.js +1 -1
  121. package/package/components/home/ItemsList.svelte +2 -0
  122. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  123. package/package/components/jobs/JobPreview.svelte +10 -6
  124. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  125. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  126. package/package/components/runs/JobPreview.svelte +26 -16
  127. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  128. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  129. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  130. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  131. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  132. package/package/components/script_builder.d.ts +2 -2
  133. package/package/components/settings/CreateToken.svelte +76 -41
  134. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  135. package/package/components/settings/ScopeSelector.svelte +613 -0
  136. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  137. package/package/components/settings/TokenDisplay.svelte +103 -0
  138. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  139. package/package/components/settings/TokensTable.svelte +70 -349
  140. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  141. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  142. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  143. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  144. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  145. package/package/components/triggers/TriggersEditor.svelte +45 -3
  146. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  147. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
  148. package/package/components/triggers/gcp/utils.js +9 -1
  149. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
  150. package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
  151. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  152. package/package/components/triggers/http/utils.js +9 -3
  153. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
  154. package/package/components/triggers/kafka/utils.js +9 -1
  155. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  156. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  157. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
  158. package/package/components/triggers/mqtt/utils.js +9 -1
  159. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
  160. package/package/components/triggers/nats/utils.js +9 -1
  161. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  162. package/package/components/triggers/postgres/utils.js +9 -1
  163. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
  164. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
  165. package/package/components/triggers/sqs/utils.js +9 -1
  166. package/package/components/triggers/utils.js +12 -0
  167. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
  168. package/package/components/triggers/websocket/utils.js +11 -1
  169. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  170. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  171. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  173. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  174. package/package/gen/core/OpenAPI.js +1 -1
  175. package/package/gen/schemas.gen.d.ts +305 -23
  176. package/package/gen/schemas.gen.js +305 -23
  177. package/package/gen/services.gen.d.ts +33 -1
  178. package/package/gen/services.gen.js +66 -2
  179. package/package/gen/types.gen.d.ts +216 -11
  180. package/package/history.svelte.js +0 -2
  181. package/package/hub.d.ts +1 -0
  182. package/package/hubPaths.json +5 -2
  183. package/package/infer.js +16 -10
  184. package/package/svelte5Utils.svelte.d.ts +1 -0
  185. package/package/svelte5Utils.svelte.js +25 -18
  186. package/package/toast.js +10 -0
  187. package/package/utils.d.ts +3 -2
  188. package/package/utils.js +20 -5
  189. package/package.json +11 -11
  190. package/package/components/ResultJobLoader.svelte +0 -219
  191. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  192. package/package/components/TestJobLoader.svelte +0 -274
  193. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  194. package/package/components/icons/AssetVarIcon.svelte +0 -31
  195. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  196. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -7,18 +7,12 @@ import ResourcePicker from '../../ResourcePicker.svelte';
7
7
  import Button from '../../common/button/Button.svelte';
8
8
  import { fade } from 'svelte/transition';
9
9
  import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
10
- import Toggle from '../../Toggle.svelte';
11
10
  import { emptyStringTrimmed } from '../../../utils';
12
- import { DEFAULT_V3_CONFIG, DEFAULT_V5_CONFIG } from './constant';
13
11
  import TestTriggerConnection from '../TestTriggerConnection.svelte';
14
12
  import Tooltip from '../../Tooltip.svelte';
15
13
  import ToggleButtonGroup from '../../common/toggleButton-v2/ToggleButtonGroup.svelte';
16
14
  import TestingBadge from '../testingBadge.svelte';
17
- let { can_write = false, headless = false, mqtt_resource_path = $bindable(''), subscribe_topics = $bindable([]), v3_config = $bindable(DEFAULT_V3_CONFIG), v5_config = $bindable(DEFAULT_V5_CONFIG), client_version = $bindable('v5'), isValid = $bindable(false), client_id = $bindable(''), showTestingBadge = false } = $props();
18
- const activateV5Options = $state({
19
- topic_alias: Boolean(v5_config.topic_alias),
20
- session_expiry_interval: Boolean(v5_config.session_expiry_interval)
21
- });
15
+ let { can_write = false, mqtt_resource_path = $bindable(''), subscribe_topics = $bindable([]), client_version = $bindable('v5'), isValid = $bindable(false), client_id = $bindable(''), showTestingBadge = false } = $props();
22
16
  const isValidSubscribeTopics = (subscribe_topics) => {
23
17
  if (subscribe_topics.length === 0 ||
24
18
  subscribe_topics.find((subscribe_topic) => emptyStringTrimmed(subscribe_topic.topic))) {
@@ -31,14 +25,14 @@ run(() => {
31
25
  });
32
26
  </script>
33
27
 
34
- <div>
35
- <Section label="MQTT" {headless}>
28
+ <div class="flex flex-col gap-12">
29
+ <Section label="MQTT">
36
30
  {#snippet header()}
37
31
  {#if showTestingBadge}
38
32
  <TestingBadge />
39
33
  {/if}
40
34
  {/snippet}
41
- <div class="flex flex-col w-full gap-4">
35
+ <div class="flex flex-col w-full gap-12">
42
36
  <Subsection label="Connection setup">
43
37
  <ResourcePicker resourceType="mqtt" disabled={!can_write} bind:value={mqtt_resource_path} />
44
38
  {#if !emptyStringTrimmed(mqtt_resource_path)}
@@ -162,128 +156,6 @@ run(() => {
162
156
  </div>
163
157
  </div>
164
158
  </Subsection>
165
-
166
- <Subsection label="Advanced" collapsable={true}>
167
- <div class="flex p-2 flex-col gap-2 mt-3">
168
- <ToggleButtonGroup bind:selected={client_version}>
169
- {#snippet children({ item })}
170
- <ToggleButton value="v5" label="Version 5" {item} />
171
- <ToggleButton value="v3" label="Version 3" {item} />
172
- {/snippet}
173
- </ToggleButtonGroup>
174
-
175
- <input
176
- type="text"
177
- bind:value={client_id}
178
- disabled={!can_write}
179
- placeholder="Client id"
180
- autocomplete="off"
181
- />
182
-
183
- {#if client_version === 'v5'}
184
- <Toggle
185
- textClass="font-normal text-sm"
186
- color="nord"
187
- size="xs"
188
- checked={v5_config.clean_start}
189
- on:change={() => {
190
- v5_config.clean_start = !v5_config.clean_start
191
- }}
192
- options={{
193
- right: 'Clean start',
194
- rightTooltip:
195
- 'Start a new session without any stored messages or subscriptions if enabled. Otherwise, resume the previous session with stored subscriptions and undelivered messages. The default setting is 0.',
196
- rightDocumentationLink:
197
- 'https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901039'
198
- }}
199
- class="py-1"
200
- />
201
-
202
- <div class="flex flex-col gap-2">
203
- <Toggle
204
- textClass="font-normal text-sm"
205
- color="nord"
206
- size="xs"
207
- checked={activateV5Options.session_expiry_interval}
208
- on:change={() => {
209
- activateV5Options.session_expiry_interval =
210
- !activateV5Options.session_expiry_interval
211
- if (!activateV5Options.session_expiry_interval) {
212
- v5_config.session_expiry_interval = undefined
213
- }
214
- }}
215
- options={{
216
- right: 'Session expiry interval',
217
- rightTooltip:
218
- 'Defines the time in seconds that the broker will retain the session after disconnection. If set to 0, the session ends immediately. If set to 4,294,967,295, the session will be retained indefinitely. Otherwise, subscriptions and undelivered messages are stored until the interval expires.',
219
- rightDocumentationLink: ''
220
- }}
221
- class="py-1"
222
- />
223
-
224
- {#if activateV5Options.session_expiry_interval}
225
- <input
226
- type="number"
227
- bind:value={v5_config.session_expiry_interval}
228
- disabled={!can_write}
229
- placeholder="Session expiry interval"
230
- autocomplete="off"
231
- />
232
- {/if}
233
- </div>
234
-
235
- <div class="flex flex-col gap-2">
236
- <Toggle
237
- textClass="font-normal text-sm"
238
- color="nord"
239
- size="xs"
240
- checked={activateV5Options.topic_alias}
241
- on:change={() => {
242
- activateV5Options.topic_alias = !activateV5Options.topic_alias
243
- if (!activateV5Options.topic_alias) {
244
- v5_config.topic_alias = undefined
245
- }
246
- }}
247
- options={{
248
- right: 'Topic alias maximum',
249
- rightTooltip:
250
- 'Defines the maximum topic alias value the client will accept from the broker. A value of 0 indicates that topic aliases are not supported. The default value is 65536, which is the maximum allowed topic alias.',
251
- rightDocumentationLink:
252
- 'https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901051'
253
- }}
254
- class="py-1"
255
- />
256
-
257
- {#if activateV5Options.topic_alias}
258
- <input
259
- type="number"
260
- bind:value={v5_config.topic_alias}
261
- disabled={!can_write}
262
- placeholder="Topic alias"
263
- autocomplete="off"
264
- />
265
- {/if}
266
- </div>
267
- {:else if client_version === 'v3'}
268
- <Toggle
269
- textClass="font-normal text-sm"
270
- color="nord"
271
- size="xs"
272
- checked={v3_config.clean_session}
273
- on:change={() => {
274
- v3_config.clean_session = !v3_config.clean_session
275
- }}
276
- options={{
277
- right: 'Clean session',
278
- rightTooltip:
279
- 'Starts a new session without any stored messages or subscriptions if enabled. Otherwise, it resumes the previous session with stored subscriptions and undelivered messages. The default value is 0',
280
- rightDocumentationLink: ''
281
- }}
282
- class="py-1"
283
- />
284
- {/if}
285
- </div>
286
- </Subsection>
287
159
  </div>
288
160
  </Section>
289
161
  </div>
@@ -1,16 +1,13 @@
1
- import type { MqttClientVersion, MqttV3Config, MqttV5Config, MqttSubscribeTopic } from '../../../gen';
1
+ import type { MqttClientVersion, MqttSubscribeTopic } from '../../../gen';
2
2
  interface Props {
3
3
  can_write?: boolean;
4
- headless?: boolean;
5
4
  mqtt_resource_path?: string;
6
5
  subscribe_topics?: MqttSubscribeTopic[];
7
- v3_config?: MqttV3Config;
8
- v5_config?: MqttV5Config;
9
6
  client_version?: MqttClientVersion;
10
7
  isValid?: boolean;
11
8
  client_id?: string;
12
9
  showTestingBadge?: boolean;
13
10
  }
14
- declare const MqttEditorConfigSection: import("svelte").Component<Props, {}, "subscribe_topics" | "mqtt_resource_path" | "client_id" | "client_version" | "v3_config" | "v5_config" | "isValid">;
11
+ declare const MqttEditorConfigSection: import("svelte").Component<Props, {}, "subscribe_topics" | "mqtt_resource_path" | "client_id" | "client_version" | "isValid">;
15
12
  type MqttEditorConfigSection = ReturnType<typeof MqttEditorConfigSection>;
16
13
  export default MqttEditorConfigSection;
@@ -13,7 +13,14 @@ import { MqttTriggerService } from '../../../gen';
13
13
  import MqttEditorConfigSection from './MqttEditorConfigSection.svelte';
14
14
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
15
15
  import { saveMqttTriggerFromCfg } from './utils';
16
- import { handleConfigChange } from '../utils';
16
+ import { getHandlerType, handleConfigChange } from '../utils';
17
+ import Tabs from '../../common/tabs/Tabs.svelte';
18
+ import Tab from '../../common/tabs/Tab.svelte';
19
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
20
+ import Toggle from '../../Toggle.svelte';
21
+ import ToggleButtonGroup from '../../common/toggleButton-v2/ToggleButtonGroup.svelte';
22
+ import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
23
+ import { DEFAULT_V3_CONFIG, DEFAULT_V5_CONFIG } from './constant';
17
24
  let { useDrawer = true, description = undefined, hideTarget = false, hideTooltips = false, isEditor = false, allowDraft = false, trigger = undefined, customLabel = undefined, isDeployed = false, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined, cloudDisabled = false } = $props();
18
25
  let mqtt_resource_path = $state('');
19
26
  let drawer = $state(undefined);
@@ -32,16 +39,25 @@ let can_write = $state(true);
32
39
  let drawerLoading = $state(true);
33
40
  let showLoading = $state(false);
34
41
  let subscribe_topics = $state([]);
35
- let v3_config = $state({});
36
- let v5_config = $state({});
42
+ let v3_config = $state(DEFAULT_V3_CONFIG);
43
+ let v5_config = $state(DEFAULT_V5_CONFIG);
37
44
  let client_version = $state();
38
45
  let client_id = $state('');
39
46
  let isValid = $state(false);
40
47
  let initialConfig = {};
41
48
  let deploymentLoading = $state(false);
49
+ let errorHandlerSelected = $state('slack');
50
+ let error_handler_path = $state();
51
+ let error_handler_args = $state({});
52
+ let retry = $state();
53
+ let optionTabSelected = $state('connection_options');
42
54
  const mqttConfig = $derived.by(getSaveCfg);
43
55
  const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
44
56
  const saveDisabled = $derived(pathError != '' || emptyString(script_path) || !can_write || !isValid);
57
+ const activateV5Options = $state({
58
+ topic_alias_maximum: Boolean(DEFAULT_V5_CONFIG.topic_alias_maximum),
59
+ session_expiry_interval: Boolean(DEFAULT_V5_CONFIG.session_expiry_interval)
60
+ });
45
61
  $effect(() => {
46
62
  is_flow = itemKind === 'flow';
47
63
  });
@@ -91,6 +107,14 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
91
107
  client_version = defaultValues?.client_version ?? 'v5';
92
108
  client_id = defaultValues?.client_id ?? '';
93
109
  enabled = defaultValues?.enabled ?? false;
110
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
111
+ error_handler_args = defaultValues?.error_handler_args ?? {};
112
+ retry = defaultValues?.retry ?? undefined;
113
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
114
+ v3_config = defaultValues?.v3_config ?? DEFAULT_V3_CONFIG;
115
+ v5_config = defaultValues?.v5_config ?? DEFAULT_V5_CONFIG;
116
+ activateV5Options.topic_alias_maximum = Boolean(defaultValues?.v5_config?.topic_alias_maximum);
117
+ activateV5Options.session_expiry_interval = Boolean(defaultValues?.v5_config?.session_expiry_interval);
94
118
  }
95
119
  finally {
96
120
  clearTimeout(loadingTimeout);
@@ -108,10 +132,16 @@ async function loadTriggerConfig(cfg) {
108
132
  path = cfg?.path;
109
133
  enabled = cfg?.enabled;
110
134
  client_version = cfg?.client_version;
111
- v3_config = cfg?.v3_config;
112
- v5_config = cfg?.v5_config;
135
+ v3_config = cfg?.v3_config ?? DEFAULT_V3_CONFIG;
136
+ v5_config = cfg?.v5_config ?? DEFAULT_V5_CONFIG;
113
137
  client_id = cfg?.client_id ?? '';
114
138
  can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore);
139
+ error_handler_path = cfg?.error_handler_path;
140
+ error_handler_args = cfg?.error_handler_args ?? {};
141
+ retry = cfg?.retry;
142
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
143
+ activateV5Options.topic_alias_maximum = Boolean(v5_config.topic_alias_maximum);
144
+ activateV5Options.session_expiry_interval = Boolean(v5_config.session_expiry_interval);
115
145
  }
116
146
  catch (error) {
117
147
  sendUserToast(`Could not load mqtt trigger config: ${error.body}`, true);
@@ -146,7 +176,10 @@ function getSaveCfg() {
146
176
  path,
147
177
  script_path,
148
178
  enabled,
149
- is_flow
179
+ is_flow,
180
+ error_handler_path,
181
+ error_handler_args,
182
+ retry
150
183
  };
151
184
  }
152
185
  function getCaptureConfig() {
@@ -317,13 +350,149 @@ $effect(() => {
317
350
  bind:subscribe_topics
318
351
  {can_write}
319
352
  bind:client_version
320
- bind:v3_config
321
- bind:v5_config
322
353
  bind:isValid
323
354
  bind:client_id
324
- headless={true}
325
355
  showTestingBadge={isEditor}
326
356
  />
357
+
358
+ <Section label="Advanced" collapsable>
359
+ <div class="flex flex-col gap-4">
360
+ <div class="min-h-96">
361
+ <Tabs bind:selected={optionTabSelected}>
362
+ <Tab value="connection_options">Connection Options</Tab>
363
+ <Tab value="error_handler">Error Handler</Tab>
364
+ <Tab value="retries">Retries</Tab>
365
+ </Tabs>
366
+ <div class="mt-4">
367
+ {#if optionTabSelected === 'connection_options'}
368
+ <div class="flex p-2 flex-col gap-2 mt-3">
369
+ <ToggleButtonGroup bind:selected={client_version}>
370
+ {#snippet children({ item })}
371
+ <ToggleButton value="v5" label="Version 5" {item} />
372
+ <ToggleButton value="v3" label="Version 3" {item} />
373
+ {/snippet}
374
+ </ToggleButtonGroup>
375
+
376
+ <input
377
+ type="text"
378
+ bind:value={client_id}
379
+ disabled={!can_write}
380
+ placeholder="Client id"
381
+ autocomplete="off"
382
+ />
383
+
384
+ {#if client_version === 'v5'}
385
+ <Toggle
386
+ textClass="font-normal text-sm"
387
+ color="nord"
388
+ size="xs"
389
+ bind:checked={v5_config.clean_start}
390
+ options={{
391
+ right: 'Clean start',
392
+ rightTooltip:
393
+ 'Start a new session without any stored messages or subscriptions if enabled. Otherwise, resume the previous session with stored subscriptions and undelivered messages. The default setting is 0.',
394
+ rightDocumentationLink:
395
+ 'https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901039'
396
+ }}
397
+ class="py-1"
398
+ />
399
+
400
+ <div class="flex flex-col gap-2">
401
+ <Toggle
402
+ textClass="font-normal text-sm"
403
+ color="nord"
404
+ size="xs"
405
+ bind:checked={activateV5Options.session_expiry_interval}
406
+ on:change={(ev) => {
407
+ if (!ev.detail) {
408
+ v5_config.session_expiry_interval = undefined
409
+ }
410
+ }}
411
+ options={{
412
+ right: 'Session expiry interval',
413
+ rightTooltip:
414
+ 'Defines the time in seconds that the broker will retain the session after disconnection. If set to 0, the session ends immediately. If set to 4,294,967,295, the session will be retained indefinitely. Otherwise, subscriptions and undelivered messages are stored until the interval expires.',
415
+ rightDocumentationLink: ''
416
+ }}
417
+ class="py-1"
418
+ />
419
+
420
+ {#if activateV5Options.session_expiry_interval}
421
+ <input
422
+ type="number"
423
+ bind:value={v5_config.session_expiry_interval}
424
+ disabled={!can_write}
425
+ placeholder="Session expiry interval"
426
+ autocomplete="off"
427
+ />
428
+ {/if}
429
+ </div>
430
+
431
+ <div class="flex flex-col gap-2">
432
+ <Toggle
433
+ textClass="font-normal text-sm"
434
+ color="nord"
435
+ size="xs"
436
+ bind:checked={activateV5Options.topic_alias_maximum}
437
+ on:change={(ev) => {
438
+ if (!ev.detail) {
439
+ v5_config.topic_alias_maximum = undefined
440
+ }
441
+ }}
442
+ options={{
443
+ right: 'Topic alias maximum',
444
+ rightTooltip:
445
+ 'Defines the maximum topic alias value the client will accept from the broker. A value of 0 indicates that topic aliases are not supported. The default value is 65536, which is the maximum allowed topic alias.',
446
+ rightDocumentationLink:
447
+ 'https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901051'
448
+ }}
449
+ class="py-1"
450
+ />
451
+
452
+ {#if activateV5Options.topic_alias_maximum}
453
+ <input
454
+ type="number"
455
+ bind:value={v5_config.topic_alias_maximum}
456
+ disabled={!can_write}
457
+ placeholder="Topic alias"
458
+ autocomplete="off"
459
+ />
460
+ {/if}
461
+ </div>
462
+ {:else if client_version === 'v3'}
463
+ <Toggle
464
+ textClass="font-normal text-sm"
465
+ color="nord"
466
+ size="xs"
467
+ checked={v3_config.clean_session}
468
+ on:change={() => {
469
+ v3_config.clean_session = !v3_config.clean_session
470
+ }}
471
+ options={{
472
+ right: 'Clean session',
473
+ rightTooltip:
474
+ 'Starts a new session without any stored messages or subscriptions if enabled. Otherwise, it resumes the previous session with stored subscriptions and undelivered messages. The default value is 0',
475
+ rightDocumentationLink: ''
476
+ }}
477
+ class="py-1"
478
+ />
479
+ {/if}
480
+ </div>
481
+ {:else}
482
+ <TriggerRetriesAndErrorHandler
483
+ {optionTabSelected}
484
+ {itemKind}
485
+ {can_write}
486
+ bind:errorHandlerSelected
487
+ bind:error_handler_path
488
+ bind:error_handler_args
489
+ bind:retry
490
+ />
491
+ {/if}
492
+ </div>
493
+ </div>
494
+ </div>
495
+ </Section>
327
496
  </div>
328
497
  {/if}
329
498
  {/snippet}
@@ -2,6 +2,13 @@ import { MqttTriggerService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { get } from 'svelte/store';
4
4
  export async function saveMqttTriggerFromCfg(initialPath, cfg, edit, workspace, usedTriggerKinds) {
5
+ const errorHandlerAndRetries = !cfg.is_flow
6
+ ? {
7
+ error_handler_path: cfg.error_handler_path,
8
+ error_handler_args: cfg.error_handler_path ? cfg.error_handler_args : undefined,
9
+ retry: cfg.retry
10
+ }
11
+ : {};
5
12
  const requestBody = {
6
13
  client_id: cfg.client_id,
7
14
  client_version: cfg.client_version,
@@ -12,7 +19,8 @@ export async function saveMqttTriggerFromCfg(initialPath, cfg, edit, workspace,
12
19
  path: cfg.path,
13
20
  script_path: cfg.script_path,
14
21
  enabled: cfg.enabled,
15
- is_flow: cfg.is_flow
22
+ is_flow: cfg.is_flow,
23
+ ...errorHandlerAndRetries
16
24
  };
17
25
  try {
18
26
  if (edit) {
@@ -14,7 +14,10 @@ import NatsTriggersConfigSection from './NatsTriggersConfigSection.svelte';
14
14
  import { untrack } from 'svelte';
15
15
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
16
16
  import { saveNatsTriggerFromCfg } from './utils';
17
- import { handleConfigChange } from '../utils';
17
+ import { getHandlerType, handleConfigChange } from '../utils';
18
+ import Tabs from '../../common/tabs/Tabs.svelte';
19
+ import Tab from '../../common/tabs/Tab.svelte';
20
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
18
21
  let { useDrawer = true, description = undefined, hideTarget = false, hideTooltips = false, isEditor = false, allowDraft = false, trigger = undefined, isDeployed = false, cloudDisabled = false, customLabel = undefined, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined } = $props();
19
22
  let drawer = $state(undefined);
20
23
  let is_flow = $state(false);
@@ -40,6 +43,11 @@ let consumerName = $state('');
40
43
  let initialConfig = undefined;
41
44
  let deploymentLoading = $state(false);
42
45
  let isValid = $state(false);
46
+ let optionTabSelected = $state('error_handler');
47
+ let errorHandlerSelected = $state('slack');
48
+ let error_handler_path = $state();
49
+ let error_handler_args = $state({});
50
+ let retry = $state();
43
51
  const saveDisabled = $derived(pathError != '' || emptyString(script_path) || !can_write || !isValid);
44
52
  const natsConfig = $derived.by(getSaveCfg);
45
53
  const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
@@ -94,6 +102,10 @@ export async function openNew(nis_flow, fixedScriptPath_, nDefaultValues) {
94
102
  dirtyPath = false;
95
103
  defaultValues = nDefaultValues;
96
104
  enabled = nDefaultValues?.enabled ?? false;
105
+ error_handler_path = nDefaultValues?.error_handler_path ?? undefined;
106
+ error_handler_args = nDefaultValues?.error_handler_args ?? {};
107
+ retry = nDefaultValues?.retry ?? undefined;
108
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
97
109
  }
98
110
  finally {
99
111
  clearTimeout(loadingTimeout);
@@ -113,6 +125,10 @@ async function loadTriggerConfig(cfg) {
113
125
  useJetstream = cfg?.use_jetstream || false;
114
126
  enabled = cfg?.enabled;
115
127
  can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore);
128
+ error_handler_path = cfg?.error_handler_path;
129
+ error_handler_args = cfg?.error_handler_args ?? {};
130
+ retry = cfg?.retry;
131
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
116
132
  }
117
133
  async function loadTrigger(defaultConfig) {
118
134
  if (defaultConfig) {
@@ -137,7 +153,10 @@ function getSaveCfg() {
137
153
  stream_name: streamName,
138
154
  consumer_name: consumerName,
139
155
  subjects,
140
- use_jetstream: useJetstream
156
+ use_jetstream: useJetstream,
157
+ error_handler_path,
158
+ error_handler_args,
159
+ retry
141
160
  };
142
161
  }
143
162
  async function updateTrigger() {
@@ -317,6 +336,28 @@ $effect(() => {
317
336
  {can_write}
318
337
  showTestingBadge={isEditor}
319
338
  />
339
+
340
+ <Section label="Advanced" collapsable>
341
+ <div class="flex flex-col gap-4">
342
+ <div class="min-h-96">
343
+ <Tabs bind:selected={optionTabSelected}>
344
+ <Tab value="error_handler">Error Handler</Tab>
345
+ <Tab value="retries">Retries</Tab>
346
+ </Tabs>
347
+ <div class="mt-4">
348
+ <TriggerRetriesAndErrorHandler
349
+ {optionTabSelected}
350
+ {itemKind}
351
+ {can_write}
352
+ bind:errorHandlerSelected
353
+ bind:error_handler_path
354
+ bind:error_handler_args
355
+ bind:retry
356
+ />
357
+ </div>
358
+ </div>
359
+ </div>
360
+ </Section>
320
361
  </div>
321
362
  {/if}
322
363
  {/snippet}
@@ -2,6 +2,13 @@ import { NatsTriggerService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { get } from 'svelte/store';
4
4
  export async function saveNatsTriggerFromCfg(initialPath, cfg, edit, workspace, usedTriggerKinds) {
5
+ const errorHandlerAndRetries = !cfg.is_flow
6
+ ? {
7
+ error_handler_path: cfg.error_handler_path,
8
+ error_handler_args: cfg.error_handler_path ? cfg.error_handler_args : undefined,
9
+ retry: cfg.retry
10
+ }
11
+ : {};
5
12
  const requestBody = {
6
13
  path: cfg.path,
7
14
  script_path: cfg.script_path,
@@ -10,7 +17,8 @@ export async function saveNatsTriggerFromCfg(initialPath, cfg, edit, workspace,
10
17
  stream_name: cfg.stream_name,
11
18
  consumer_name: cfg.consumer_name,
12
19
  subjects: cfg.subjects,
13
- use_jetstream: cfg.use_jetstream
20
+ use_jetstream: cfg.use_jetstream,
21
+ ...errorHandlerAndRetries
14
22
  };
15
23
  try {
16
24
  if (edit) {
@@ -26,7 +26,8 @@ import { base } from '../../../base';
26
26
  import { untrack } from 'svelte';
27
27
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
28
28
  import TestingBadge from '../testingBadge.svelte';
29
- import { handleConfigChange } from '../utils';
29
+ import { getHandlerType, handleConfigChange } from '../utils';
30
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
30
31
  import { fade } from 'svelte/transition';
31
32
  import MultiSelect from '../../select/MultiSelect.svelte';
32
33
  import { safeSelectItems } from '../../select/utils.svelte';
@@ -66,6 +67,11 @@ let deploymentLoading = $state(false);
66
67
  let creatingSlot = $state(false);
67
68
  let creatingPublication = $state(false);
68
69
  let pg14 = $derived(postgresVersion.startsWith('14'));
70
+ let optionTabSelected = $state('error_handler');
71
+ let errorHandlerSelected = $state('slack');
72
+ let error_handler_path = $state();
73
+ let error_handler_args = $state({});
74
+ let retry = $state();
69
75
  const errorMessage = $derived.by(() => {
70
76
  if (relations && relations.length > 0) {
71
77
  return invalidRelations(relations, {
@@ -200,6 +206,10 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues, newDraf
200
206
  table_to_track: []
201
207
  }
202
208
  ];
209
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
210
+ error_handler_args = defaultValues?.error_handler_args ?? {};
211
+ retry = defaultValues?.retry ?? undefined;
212
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
203
213
  }
204
214
  finally {
205
215
  clearTimeout(loadingTimeout);
@@ -221,7 +231,10 @@ function getSaveCfg() {
221
231
  transaction_to_track: transaction_to_track,
222
232
  table_to_track: relations
223
233
  }
224
- : undefined
234
+ : undefined,
235
+ error_handler_path,
236
+ error_handler_args,
237
+ retry
225
238
  };
226
239
  return cfg;
227
240
  }
@@ -237,6 +250,10 @@ async function loadTriggerConfig(cfg) {
237
250
  can_write = canWrite(path, cfg?.extra_perms, $userStore);
238
251
  transaction_to_track = [...cfg?.publication?.transaction_to_track];
239
252
  relations = cfg?.publication?.table_to_track ?? [];
253
+ error_handler_path = cfg?.error_handler_path;
254
+ error_handler_args = cfg?.error_handler_args ?? {};
255
+ retry = cfg?.retry;
256
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
240
257
  }
241
258
  async function loadTrigger(defaultConfig) {
242
259
  if (defaultConfig) {
@@ -705,6 +722,28 @@ $effect(() => {
705
722
  {/if}
706
723
  </div>
707
724
  </Section>
725
+
726
+ <Section label="Advanced" collapsable>
727
+ <div class="flex flex-col gap-4">
728
+ <div class="min-h-96">
729
+ <Tabs bind:selected={optionTabSelected}>
730
+ <Tab value="error_handler">Error Handler</Tab>
731
+ <Tab value="retries">Retries</Tab>
732
+ </Tabs>
733
+ <div class="mt-4">
734
+ <TriggerRetriesAndErrorHandler
735
+ {optionTabSelected}
736
+ {itemKind}
737
+ {can_write}
738
+ bind:errorHandlerSelected
739
+ bind:error_handler_path
740
+ bind:error_handler_args
741
+ bind:retry
742
+ />
743
+ </div>
744
+ </div>
745
+ </div>
746
+ </Section>
708
747
  </div>
709
748
  {/if}
710
749
  {/snippet}
@@ -81,6 +81,13 @@ export function invalidRelations(relations, options) {
81
81
  }
82
82
  export async function savePostgresTriggerFromCfg(initialPath, config, edit, workspace, usedTriggerKinds) {
83
83
  try {
84
+ const errorHandlerAndRetries = !config.is_flow
85
+ ? {
86
+ error_handler_path: config.error_handler_path,
87
+ error_handler_args: config.error_handler_path ? config.error_handler_args : undefined,
88
+ retry: config.retry
89
+ }
90
+ : {};
84
91
  const requestBody = {
85
92
  path: config.path,
86
93
  script_path: config.script_path,
@@ -89,7 +96,8 @@ export async function savePostgresTriggerFromCfg(initialPath, config, edit, work
89
96
  replication_slot_name: config.replication_slot_name,
90
97
  publication_name: config.publication_name,
91
98
  publication: config.publication,
92
- enabled: config.enabled
99
+ enabled: config.enabled,
100
+ ...errorHandlerAndRetries
93
101
  };
94
102
  if (edit) {
95
103
  await PostgresTriggerService.updatePostgresTrigger({