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.
- package/package/ata/index.js +1 -1
- package/package/components/AppConnectInner.svelte +161 -29
- package/package/components/ArgInput.svelte +33 -103
- package/package/components/AuthSettings.svelte +45 -1
- package/package/components/Dev.svelte +31 -24
- package/package/components/DisplayResult.svelte +53 -26
- package/package/components/DisplayResult.svelte.d.ts +1 -1
- package/package/components/DynSelect.svelte +3 -3
- package/package/components/Editor.svelte +7 -4
- package/package/components/EditorBar.svelte +2 -2
- package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
- package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
- package/package/components/FlowBuilder.svelte +11 -2
- package/package/components/FlowJobResult.svelte +12 -17
- package/package/components/FlowJobResult.svelte.d.ts +5 -18
- package/package/components/FlowPreviewContent.svelte +13 -10
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowPreviewResult.svelte +14 -6
- package/package/components/FlowStatusViewer.svelte +11 -24
- package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
- package/package/components/FlowStatusViewerInner.svelte +110 -131
- package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
- package/package/components/GitDiffPreview.svelte +55 -0
- package/package/components/GitDiffPreview.svelte.d.ts +13 -0
- package/package/components/HistoricInputs.svelte +2 -2
- package/package/components/InitGitRepoPopover.svelte +410 -0
- package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
- package/package/components/InstanceSetting.svelte +21 -9
- package/package/components/InstanceSettings.svelte +16 -3
- package/package/components/JobLoader.svelte +567 -0
- package/package/components/JobLoader.svelte.d.ts +53 -0
- package/package/components/JobLogs.svelte +6 -4
- package/package/components/JobLogs.svelte.d.ts +5 -18
- package/package/components/LightweightResourcePicker.svelte +18 -39
- package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
- package/package/components/LogViewer.svelte +35 -41
- package/package/components/LogViewer.svelte.d.ts +6 -20
- package/package/components/ModulePreviewResultViewer.svelte +3 -1
- package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
- package/package/components/ModuleTest.svelte +16 -11
- package/package/components/PullGitRepoPopover.svelte +355 -0
- package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
- package/package/components/S3FilePicker.svelte +5 -3
- package/package/components/SavedInputs.svelte +2 -2
- package/package/components/ScriptBuilder.svelte +4 -3
- package/package/components/ScriptEditor.svelte +34 -31
- package/package/components/ScriptEditor.svelte.d.ts +3 -3
- package/package/components/ServiceLogsInner.svelte +2 -1
- package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
- package/package/components/UserSettings.svelte +1 -1
- package/package/components/WorkerTagSelect.svelte +32 -3
- package/package/components/apps/components/buttons/AppButton.svelte +7 -1
- package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
- package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
- package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
- package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
- package/package/components/apps/components/display/AppMenu.svelte +5 -0
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
- package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
- package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
- package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
- package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
- package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
- package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
- package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
- package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
- package/package/components/apps/editor/component/components.d.ts +12 -0
- package/package/components/apps/editor/component/components.js +19 -7
- package/package/components/assets/AssetButtons.svelte +38 -0
- package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
- package/package/components/assets/AssetsDropdownButton.svelte +60 -72
- package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
- package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
- package/package/components/assets/JobAssetsViewer.svelte +79 -0
- package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
- package/package/components/assets/README_DEV.md +0 -0
- package/package/components/assets/lib.d.ts +9 -1
- package/package/components/assets/lib.js +48 -7
- package/package/components/common/fileUpload/FileUpload.svelte +126 -84
- package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
- package/package/components/common/table/ScriptRow.svelte +3 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
- package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
- package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
- package/package/components/copilot/chat/flow/core.d.ts +1 -1
- package/package/components/copilot/chat/flow/core.js +2 -38
- package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
- package/package/components/copilot/chat/navigator/apiTools.js +95 -15
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +2 -1
- package/package/components/copilot/chat/script/core.d.ts +11 -2
- package/package/components/copilot/chat/script/core.js +135 -1
- package/package/components/copilot/chat/shared.d.ts +10 -0
- package/package/components/copilot/chat/shared.js +56 -0
- package/package/components/copilot/lib.d.ts +1 -0
- package/package/components/copilot/lib.js +27 -9
- package/package/components/custom_ui.d.ts +1 -0
- package/package/components/flows/FlowAssetsHandler.svelte +133 -0
- package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
- package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
- package/package/components/flows/flowStore.d.ts +1 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
- package/package/components/flows/scheduleUtils.js +1 -1
- package/package/components/flows/types.d.ts +2 -1
- package/package/components/graph/FlowGraphV2.svelte +8 -104
- package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
- package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
- package/package/components/graph/graphBuilder.svelte.js +35 -9
- package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
- package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
- package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
- package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
- package/package/components/graph/util.js +1 -1
- package/package/components/home/ItemsList.svelte +2 -0
- package/package/components/icons/AssetGenericIcon.svelte +0 -3
- package/package/components/jobs/JobPreview.svelte +10 -6
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
- package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
- package/package/components/runs/JobPreview.svelte +26 -16
- package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
- package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
- package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
- package/package/components/scriptEditor/LogPanel.svelte +3 -2
- package/package/components/script_builder.d.ts +2 -2
- package/package/components/settings/CreateToken.svelte +76 -41
- package/package/components/settings/CreateToken.svelte.d.ts +1 -1
- package/package/components/settings/ScopeSelector.svelte +613 -0
- package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
- package/package/components/settings/TokenDisplay.svelte +103 -0
- package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
- package/package/components/settings/TokensTable.svelte +70 -349
- package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
- package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
- package/package/components/triggers/TriggersEditor.svelte +45 -3
- package/package/components/triggers/TriggersWrapper.svelte +2 -2
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/gcp/utils.js +9 -1
- package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
- package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
- package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
- package/package/components/triggers/http/utils.js +9 -3
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/kafka/utils.js +9 -1
- package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
- package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
- package/package/components/triggers/mqtt/utils.js +9 -1
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/nats/utils.js +9 -1
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
- package/package/components/triggers/postgres/utils.js +9 -1
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/sqs/utils.js +9 -1
- package/package/components/triggers/utils.js +12 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/websocket/utils.js +11 -1
- package/package/components/workspaceSettings/AISettings.svelte +0 -2
- package/package/components/workspaceSettings/FilterList.svelte +56 -0
- package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +305 -23
- package/package/gen/schemas.gen.js +305 -23
- package/package/gen/services.gen.d.ts +33 -1
- package/package/gen/services.gen.js +66 -2
- package/package/gen/types.gen.d.ts +216 -11
- package/package/history.svelte.js +0 -2
- package/package/hub.d.ts +1 -0
- package/package/hubPaths.json +5 -2
- package/package/infer.js +16 -10
- package/package/svelte5Utils.svelte.d.ts +1 -0
- package/package/svelte5Utils.svelte.js +25 -18
- package/package/toast.js +10 -0
- package/package/utils.d.ts +3 -2
- package/package/utils.js +20 -5
- package/package.json +11 -11
- package/package/components/ResultJobLoader.svelte +0 -219
- package/package/components/ResultJobLoader.svelte.d.ts +0 -52
- package/package/components/TestJobLoader.svelte +0 -274
- package/package/components/TestJobLoader.svelte.d.ts +0 -43
- package/package/components/icons/AssetVarIcon.svelte +0 -31
- package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
- /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,
|
|
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"
|
|
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-
|
|
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,
|
|
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" | "
|
|
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({
|