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
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<script lang="ts">import SchemaForm from './SchemaForm.svelte';
|
|
2
|
-
import
|
|
2
|
+
import JobLoader from './JobLoader.svelte';
|
|
3
3
|
import { Button } from './common';
|
|
4
4
|
import { WindmillIcon } from './icons';
|
|
5
5
|
import LogPanel from './scriptEditor/LogPanel.svelte';
|
|
6
6
|
import { JobService, OpenAPI, WorkspaceService } from '../gen';
|
|
7
7
|
import { inferArgs } from '../infer';
|
|
8
8
|
import { setCopilotInfo, userStore, workspaceStore } from '../stores';
|
|
9
|
-
import { emptySchema, sendUserToast } from '../utils';
|
|
9
|
+
import { emptySchema, readFieldsRecursively, sendUserToast } from '../utils';
|
|
10
10
|
import { Pane, Splitpanes } from 'svelte-splitpanes';
|
|
11
11
|
import { onDestroy, onMount, setContext, untrack } from 'svelte';
|
|
12
12
|
import DarkModeToggle from './sidebar/DarkModeToggle.svelte';
|
|
@@ -66,7 +66,7 @@ function initializeMode() {
|
|
|
66
66
|
modeInitialized = true;
|
|
67
67
|
darkModeToggle?.toggle();
|
|
68
68
|
}
|
|
69
|
-
let
|
|
69
|
+
let jobLoader = $state();
|
|
70
70
|
let socket = undefined;
|
|
71
71
|
// Test args input
|
|
72
72
|
let args = $state({});
|
|
@@ -78,7 +78,8 @@ let pastPreviews = $state([]);
|
|
|
78
78
|
let validCode = $state(true);
|
|
79
79
|
// Flow preview
|
|
80
80
|
let flowPreviewButtons = $state();
|
|
81
|
-
const
|
|
81
|
+
const flowPreviewContent = $derived(flowPreviewButtons?.getFlowPreviewContent());
|
|
82
|
+
const job = $derived(flowPreviewContent?.getJob());
|
|
82
83
|
let showJobStatus = $state(false);
|
|
83
84
|
let testModuleId = $state(undefined);
|
|
84
85
|
let currentScript = $state(undefined);
|
|
@@ -113,7 +114,11 @@ const el = (event) => {
|
|
|
113
114
|
}
|
|
114
115
|
else if (event.data.type == 'testPreviewBundle') {
|
|
115
116
|
if (event.data.id == lastCommandId && currentScript) {
|
|
116
|
-
|
|
117
|
+
jobLoader?.runPreview(currentScript.path, event.data.file, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined, undefined, {
|
|
118
|
+
done(x) {
|
|
119
|
+
loadPastTests();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
117
122
|
}
|
|
118
123
|
else {
|
|
119
124
|
sendUserToast(`Bundle received ${lastCommandId} was obsolete, ignoring`, true);
|
|
@@ -164,7 +169,7 @@ onMount(() => {
|
|
|
164
169
|
window.parent?.postMessage({ type: 'refresh' }, '*');
|
|
165
170
|
});
|
|
166
171
|
async function testBundle(file, isTar) {
|
|
167
|
-
|
|
172
|
+
jobLoader?.abstractRun(async () => {
|
|
168
173
|
try {
|
|
169
174
|
const form = new FormData();
|
|
170
175
|
form.append('preview', JSON.stringify({
|
|
@@ -205,6 +210,10 @@ async function testBundle(file, isTar) {
|
|
|
205
210
|
sendUserToast(`Failed to send bundle ${e}`, true);
|
|
206
211
|
throw Error(e);
|
|
207
212
|
}
|
|
213
|
+
}, {
|
|
214
|
+
done(x) {
|
|
215
|
+
loadPastTests();
|
|
216
|
+
}
|
|
208
217
|
});
|
|
209
218
|
loadingCodebaseButton = false;
|
|
210
219
|
}
|
|
@@ -273,7 +282,7 @@ function runTest() {
|
|
|
273
282
|
}
|
|
274
283
|
else {
|
|
275
284
|
//@ts-ignore
|
|
276
|
-
|
|
285
|
+
jobLoader.runPreview(currentScript.path, currentScript.content, currentScript.language, args, currentScript.tag, useLock ? currentScript.lock : undefined);
|
|
277
286
|
}
|
|
278
287
|
}
|
|
279
288
|
}
|
|
@@ -419,8 +428,8 @@ function updateFlow(flow) {
|
|
|
419
428
|
return;
|
|
420
429
|
}
|
|
421
430
|
if (!deepEqual(flow, lastSent)) {
|
|
422
|
-
lastSent =
|
|
423
|
-
window?.parent.postMessage({ type: 'flow', flow, uriPath: lastUriPath }, '*');
|
|
431
|
+
lastSent = $state.snapshot(flow);
|
|
432
|
+
window?.parent.postMessage({ type: 'flow', flow: lastSent, uriPath: lastUriPath }, '*');
|
|
424
433
|
}
|
|
425
434
|
}
|
|
426
435
|
let reload = $state(0);
|
|
@@ -429,7 +438,7 @@ async function inferModuleArgs(selectedIdStore) {
|
|
|
429
438
|
return;
|
|
430
439
|
}
|
|
431
440
|
//@ts-ignore
|
|
432
|
-
dfs(flowStore.value.modules, async (mod) => {
|
|
441
|
+
dfs(flowStore.val.value.modules, async (mod) => {
|
|
433
442
|
if (mod.id == selectedIdStore) {
|
|
434
443
|
if (mod.value.type == 'rawscript' ||
|
|
435
444
|
mod.value.type === 'script' ||
|
|
@@ -481,14 +490,15 @@ $effect(() => {
|
|
|
481
490
|
untrack(() => initializeMode());
|
|
482
491
|
});
|
|
483
492
|
$effect(() => {
|
|
493
|
+
readFieldsRecursively(flowStore.val);
|
|
484
494
|
flowStore.val && untrack(() => updateFlow(flowStore.val));
|
|
485
495
|
});
|
|
486
496
|
$effect(() => {
|
|
487
497
|
$selectedIdStore && untrack(() => inferModuleArgs($selectedIdStore));
|
|
488
498
|
});
|
|
489
|
-
const localModuleStates = $derived(
|
|
490
|
-
const localDurationStatuses = $derived(
|
|
491
|
-
const suspendStatus = $derived(
|
|
499
|
+
const localModuleStates = $derived(flowPreviewContent?.getLocalModuleStates() ?? writable({}));
|
|
500
|
+
const localDurationStatuses = $derived(flowPreviewContent?.getLocalDurationStatuses() ?? writable({}));
|
|
501
|
+
const suspendStatus = $derived(flowPreviewContent?.getSuspendStatus() ?? writable({}));
|
|
492
502
|
// Create a derived store that only shows the module states when showModuleStatus is true
|
|
493
503
|
// this store can also be updated
|
|
494
504
|
let derivedModuleStates = writable({});
|
|
@@ -533,16 +543,12 @@ function resetModulesStates() {
|
|
|
533
543
|
showJobStatus = false;
|
|
534
544
|
}
|
|
535
545
|
const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($derivedModuleStates).length > 0);
|
|
546
|
+
const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
536
547
|
</script>
|
|
537
548
|
|
|
538
549
|
<svelte:window onkeydown={onKeyDown} />
|
|
539
550
|
|
|
540
|
-
<
|
|
541
|
-
on:done={loadPastTests}
|
|
542
|
-
bind:this={testJobLoader}
|
|
543
|
-
bind:isLoading={testIsLoading}
|
|
544
|
-
bind:job={testJob}
|
|
545
|
-
/>
|
|
551
|
+
<JobLoader noCode={true} bind:this={jobLoader} bind:isLoading={testIsLoading} bind:job={testJob} />
|
|
546
552
|
|
|
547
553
|
<main class="h-screen w-full">
|
|
548
554
|
{#if mode == 'script'}
|
|
@@ -603,7 +609,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
|
|
|
603
609
|
{/if}
|
|
604
610
|
<div class="flex justify-center pt-1">
|
|
605
611
|
{#if testIsLoading}
|
|
606
|
-
<Button on:click={
|
|
612
|
+
<Button on:click={jobLoader?.cancelJob} btnClasses="w-full" color="red" size="xs">
|
|
607
613
|
<WindmillIcon
|
|
608
614
|
white={true}
|
|
609
615
|
class="mr-2 text-white"
|
|
@@ -692,10 +698,10 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
|
|
|
692
698
|
disableStaticInputs
|
|
693
699
|
localModuleStates={derivedModuleStates}
|
|
694
700
|
onTestUpTo={flowPreviewButtons?.testUpTo}
|
|
695
|
-
isOwner={
|
|
701
|
+
isOwner={flowPreviewContent?.getIsOwner?.()}
|
|
696
702
|
onTestFlow={flowPreviewButtons?.runPreview}
|
|
697
|
-
isRunning={
|
|
698
|
-
onCancelTestFlow={
|
|
703
|
+
isRunning={flowPreviewContent?.getIsRunning?.()}
|
|
704
|
+
onCancelTestFlow={flowPreviewContent?.cancelTest}
|
|
699
705
|
onOpenPreview={flowPreviewButtons?.openPreview}
|
|
700
706
|
onHideJobStatus={resetModulesStates}
|
|
701
707
|
{individualStepTests}
|
|
@@ -704,6 +710,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
|
|
|
704
710
|
onDelete={(id) => {
|
|
705
711
|
delete $derivedModuleStates[id]
|
|
706
712
|
}}
|
|
713
|
+
{flowHasChanged}
|
|
707
714
|
/>
|
|
708
715
|
{:else}
|
|
709
716
|
<div class="text-red-400 mt-20">Missing flow modules</div>
|
|
@@ -725,7 +732,7 @@ const individualStepTests = $derived(!(showJobStatus && job) && Object.keys($der
|
|
|
725
732
|
}}
|
|
726
733
|
onTestFlow={flowPreviewButtons?.runPreview}
|
|
727
734
|
{job}
|
|
728
|
-
isOwner={
|
|
735
|
+
isOwner={flowPreviewContent?.getIsOwner()}
|
|
729
736
|
{localDurationStatuses}
|
|
730
737
|
{suspendStatus}
|
|
731
738
|
onOpenDetails={flowPreviewButtons?.openPreview}
|
|
@@ -24,6 +24,7 @@ import Tooltip from './Tooltip.svelte';
|
|
|
24
24
|
import HighlightTheme from './HighlightTheme.svelte';
|
|
25
25
|
import { getContext, hasContext, createEventDispatcher, onDestroy } from 'svelte';
|
|
26
26
|
import { toJsonStr } from '../utils';
|
|
27
|
+
import { userStore } from '../stores';
|
|
27
28
|
const IMG_MAX_SIZE = 10000000;
|
|
28
29
|
const TABLE_MAX_SIZE = 5000000;
|
|
29
30
|
const DISPLAY_MAX_SIZE = 100000;
|
|
@@ -183,6 +184,28 @@ function inferResultKind(result) {
|
|
|
183
184
|
else if (isTableCol(result, keys)) {
|
|
184
185
|
return 'table-col';
|
|
185
186
|
}
|
|
187
|
+
else if (keys.length < 1000 && keys.includes('wm_renderer')) {
|
|
188
|
+
const renderer = result['wm_renderer'];
|
|
189
|
+
if (typeof renderer === 'string') {
|
|
190
|
+
if ([
|
|
191
|
+
'json',
|
|
192
|
+
'html',
|
|
193
|
+
'png',
|
|
194
|
+
'file',
|
|
195
|
+
'jpeg',
|
|
196
|
+
'gif',
|
|
197
|
+
'svg',
|
|
198
|
+
'filename',
|
|
199
|
+
's3object',
|
|
200
|
+
'plain',
|
|
201
|
+
'markdown',
|
|
202
|
+
'map',
|
|
203
|
+
'pdf'
|
|
204
|
+
].includes(renderer)) {
|
|
205
|
+
return renderer;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
186
209
|
}
|
|
187
210
|
}
|
|
188
211
|
catch (err) { }
|
|
@@ -624,34 +647,38 @@ $effect(() => {
|
|
|
624
647
|
language={json}
|
|
625
648
|
code={toJsonStr(result).replace(/\\n/g, '\n')}
|
|
626
649
|
/>
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
><
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
650
|
+
{#if $userStore}
|
|
651
|
+
<button
|
|
652
|
+
class="text-secondary underline text-2xs whitespace-nowrap"
|
|
653
|
+
onclick={() => {
|
|
654
|
+
s3FileViewer?.open?.(result)
|
|
655
|
+
}}
|
|
656
|
+
><span class="flex items-center gap-1"
|
|
657
|
+
><PanelRightOpen size={12} />object store explorer<Tooltip
|
|
658
|
+
>Require admin privilege or "S3 resource details and content can be accessed
|
|
659
|
+
by all users of this workspace" of S3 Storage to be set in the workspace
|
|
660
|
+
settings</Tooltip
|
|
661
|
+
></span
|
|
662
|
+
>
|
|
663
|
+
</button>
|
|
664
|
+
{/if}
|
|
640
665
|
{:else if !result?.disable_download}
|
|
641
666
|
<FileDownload {workspaceId} s3object={result} {appPath} />
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
><
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
667
|
+
{#if $userStore}
|
|
668
|
+
<button
|
|
669
|
+
class="text-secondary underline text-2xs whitespace-nowrap"
|
|
670
|
+
onclick={() => {
|
|
671
|
+
s3FileViewer?.open?.(result)
|
|
672
|
+
}}
|
|
673
|
+
><span class="flex items-center gap-1"
|
|
674
|
+
><PanelRightOpen size={12} />object store explorer<Tooltip
|
|
675
|
+
>Require admin privilege or "S3 resource details and content can be accessed
|
|
676
|
+
by all users of this workspace" of S3 Storage to be set in the workspace
|
|
677
|
+
settings</Tooltip
|
|
678
|
+
></span
|
|
679
|
+
>
|
|
680
|
+
</button>
|
|
681
|
+
{/if}
|
|
655
682
|
{/if}
|
|
656
683
|
</div>
|
|
657
684
|
{#if typeof result?.s3 === 'string'}
|
|
@@ -40,6 +40,6 @@ declare const DisplayResult: $$__sveltets_2_IsomorphicComponent<Props, {
|
|
|
40
40
|
}, {}, {
|
|
41
41
|
openDrawer: () => void;
|
|
42
42
|
getToolbarLocation: () => "external" | "self" | undefined;
|
|
43
|
-
}, "
|
|
43
|
+
}, "drawerOpen" | "forceJson">;
|
|
44
44
|
type DisplayResult = InstanceType<typeof DisplayResult>;
|
|
45
45
|
export default DisplayResult;
|
|
@@ -16,7 +16,7 @@ function validSelectObject(x) {
|
|
|
16
16
|
|
|
17
17
|
<script lang="ts">import { usePromise } from '../svelte5Utils.svelte';
|
|
18
18
|
import { deepEqual } from 'fast-equals';
|
|
19
|
-
import
|
|
19
|
+
import JobLoader from './JobLoader.svelte';
|
|
20
20
|
import Select from './select/Select.svelte';
|
|
21
21
|
import Tooltip from './Tooltip.svelte';
|
|
22
22
|
import { Loader2 } from 'lucide-svelte';
|
|
@@ -54,7 +54,7 @@ async function getItemsFromOptions() {
|
|
|
54
54
|
error: (err) => reject(err)
|
|
55
55
|
};
|
|
56
56
|
helperScript?.type == 'inline'
|
|
57
|
-
? resultJobLoader?.runPreview(helperScript?.path ?? 'NO_PATH', helperScript.code, helperScript.lang, { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, undefined, cb)
|
|
57
|
+
? resultJobLoader?.runPreview(helperScript?.path ?? 'NO_PATH', helperScript.code, helperScript.lang, { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, undefined, undefined, undefined, cb)
|
|
58
58
|
: resultJobLoader?.runScriptByHash(helperScript?.hash ?? 'NO_HASH', { ...args, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, cb);
|
|
59
59
|
});
|
|
60
60
|
}
|
|
@@ -71,7 +71,7 @@ let open = $state(false);
|
|
|
71
71
|
</script>
|
|
72
72
|
|
|
73
73
|
{#if helperScript}
|
|
74
|
-
<
|
|
74
|
+
<JobLoader bind:this={resultJobLoader} />
|
|
75
75
|
|
|
76
76
|
<div class="w-full flex-col flex">
|
|
77
77
|
<Select
|
|
@@ -1074,11 +1074,14 @@ async function loadMonaco() {
|
|
|
1074
1074
|
});
|
|
1075
1075
|
editor?.onDidFocusEditorText(() => {
|
|
1076
1076
|
dispatch('focus');
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1077
|
+
// for escape we use onkeydown instead of addCommand because addCommand on escape specifically prevents default behavior (like autocomplete cancellation)
|
|
1078
|
+
editor?.onKeyDown((e) => {
|
|
1079
|
+
if (e.keyCode === KeyCode.Escape) {
|
|
1080
|
+
if (showInlineAIChat) {
|
|
1081
|
+
closeAIInlineWidget();
|
|
1082
|
+
}
|
|
1083
|
+
aiChatEditorHandler?.rejectAll();
|
|
1080
1084
|
}
|
|
1081
|
-
aiChatEditorHandler?.rejectAll();
|
|
1082
1085
|
});
|
|
1083
1086
|
editor?.addCommand(KeyMod.CtrlCmd | KeyCode.DownArrow, function () {
|
|
1084
1087
|
if (aiChatManager.pendingNewCode) {
|
|
@@ -500,10 +500,10 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
|
|
|
500
500
|
let t = { postgresql: 'postgres', mysql: 'mysql', bigquery: 'bigquery' }[resType]
|
|
501
501
|
if (!t) {
|
|
502
502
|
sendUserToast(`Resource type ${resType} is not supported in DuckDB`, true)
|
|
503
|
-
editor.insertAtCursor(`'
|
|
503
|
+
editor.insertAtCursor(`'res://${path}'`)
|
|
504
504
|
return
|
|
505
505
|
} else {
|
|
506
|
-
editor.insertAtCursor(`ATTACH '
|
|
506
|
+
editor.insertAtCursor(`ATTACH 'res://${path}' AS db (TYPE ${t});`)
|
|
507
507
|
}
|
|
508
508
|
}
|
|
509
509
|
|
|
@@ -18,24 +18,15 @@ const slackSuccessHandler = hubPaths.slackSuccessHandler;
|
|
|
18
18
|
const teamsRecoveryHandler = hubPaths.teamsRecoveryHandler;
|
|
19
19
|
const teamsHandlerScriptPath = hubPaths.teamsErrorHandler;
|
|
20
20
|
const teamsSuccessHandler = hubPaths.teamsSuccessHandler;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export let customHandlerKind = 'script';
|
|
31
|
-
let customHandlerSchema;
|
|
32
|
-
let slackHandlerSchema;
|
|
33
|
-
let isFetching = false;
|
|
34
|
-
let teams_channels = [];
|
|
35
|
-
let teams_team_name = undefined;
|
|
36
|
-
let workspaceConnectedToSlack = undefined;
|
|
37
|
-
let workspaceConnectedToTeams = undefined;
|
|
38
|
-
let connectionTestJob;
|
|
21
|
+
let { errorOrRecovery, isEditable, toggleText = 'Enable', showScriptHelpText = false, handlerSelected = $bindable(), handlerPath = $bindable(), handlerExtraArgs = $bindable(), customScriptTemplate, customHandlerKind = $bindable('script'), customTabTooltip } = $props();
|
|
22
|
+
let customHandlerSchema = $state();
|
|
23
|
+
let slackHandlerSchema = $state();
|
|
24
|
+
let isFetching = $state(false);
|
|
25
|
+
let teams_channels = $state([]);
|
|
26
|
+
let teams_team_name = $state(undefined);
|
|
27
|
+
let workspaceConnectedToSlack = $state(undefined);
|
|
28
|
+
let workspaceConnectedToTeams = $state(undefined);
|
|
29
|
+
let connectionTestJob = $state();
|
|
39
30
|
async function loadSlackResources() {
|
|
40
31
|
const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore });
|
|
41
32
|
if (!emptyString(settings.slack_name) && !emptyString(settings.slack_team_id)) {
|
|
@@ -146,7 +137,7 @@ async function loadHandlerScriptArgs(p, defaultArgs = []) {
|
|
|
146
137
|
}
|
|
147
138
|
}
|
|
148
139
|
function isSlackHandler(scriptPath) {
|
|
149
|
-
if (scriptPath
|
|
140
|
+
if (!scriptPath) {
|
|
150
141
|
return false;
|
|
151
142
|
}
|
|
152
143
|
if (errorOrRecovery == 'error') {
|
|
@@ -161,7 +152,7 @@ function isSlackHandler(scriptPath) {
|
|
|
161
152
|
}
|
|
162
153
|
}
|
|
163
154
|
function isTeamsHandler(scriptPath) {
|
|
164
|
-
if (scriptPath
|
|
155
|
+
if (!scriptPath) {
|
|
165
156
|
return false;
|
|
166
157
|
}
|
|
167
158
|
if (errorOrRecovery == 'error') {
|
|
@@ -175,67 +166,82 @@ function isTeamsHandler(scriptPath) {
|
|
|
175
166
|
return scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-success-handler-teams');
|
|
176
167
|
}
|
|
177
168
|
}
|
|
178
|
-
|
|
169
|
+
$effect(() => {
|
|
179
170
|
if ($workspaceStore) {
|
|
180
171
|
loadSlackResources();
|
|
181
172
|
loadTeamsResources();
|
|
182
173
|
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
|
|
174
|
+
});
|
|
175
|
+
$effect(() => {
|
|
176
|
+
if (handlerSelected === 'slack' && isSlackHandler(handlerPath)) {
|
|
177
|
+
handlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token';
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
handlerExtraArgs['slack'] = undefined;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
let lastHandlerSelected = $state(undefined);
|
|
184
|
+
let channelCache = $state({
|
|
186
185
|
slack: undefined,
|
|
187
186
|
teams: undefined
|
|
188
|
-
};
|
|
189
|
-
|
|
187
|
+
});
|
|
188
|
+
$effect(() => {
|
|
190
189
|
if (lastHandlerSelected !== handlerSelected && lastHandlerSelected !== undefined) {
|
|
191
190
|
if (lastHandlerSelected === 'teams' || lastHandlerSelected === 'slack') {
|
|
192
191
|
channelCache[lastHandlerSelected] = handlerExtraArgs['channel'];
|
|
193
192
|
}
|
|
194
193
|
if (handlerSelected === 'custom') {
|
|
195
194
|
handlerExtraArgs['channel'] = '';
|
|
195
|
+
handlerPath = undefined;
|
|
196
196
|
}
|
|
197
197
|
else {
|
|
198
198
|
handlerExtraArgs['channel'] = channelCache[handlerSelected] ?? '';
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
lastHandlerSelected = handlerSelected;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
202
|
+
});
|
|
203
|
+
$effect(() => {
|
|
204
|
+
handlerPath &&
|
|
205
|
+
!isSlackHandler(handlerPath) &&
|
|
206
|
+
!isTeamsHandler(handlerPath) &&
|
|
207
|
+
loadHandlerScriptArgs(handlerPath, [
|
|
208
|
+
'path',
|
|
209
|
+
'workspace_id',
|
|
210
|
+
'job_id',
|
|
211
|
+
'is_flow',
|
|
212
|
+
'schedule_path',
|
|
213
|
+
'error',
|
|
214
|
+
'error_started_at',
|
|
215
|
+
'failed_times',
|
|
216
|
+
'started_at',
|
|
217
|
+
'success_times',
|
|
218
|
+
'success_result',
|
|
219
|
+
'success_started_at',
|
|
220
|
+
'email',
|
|
221
|
+
'trigger_path'
|
|
222
|
+
]).then((schema) => (customHandlerSchema = schema));
|
|
223
|
+
});
|
|
224
|
+
$effect(() => {
|
|
225
|
+
handlerPath &&
|
|
226
|
+
isSlackHandler(handlerPath) &&
|
|
227
|
+
loadHandlerScriptArgs(handlerPath, [
|
|
228
|
+
'path',
|
|
229
|
+
'workspace_id',
|
|
230
|
+
'job_id',
|
|
231
|
+
'is_flow',
|
|
232
|
+
'schedule_path',
|
|
233
|
+
'error',
|
|
234
|
+
'error_started_at',
|
|
235
|
+
'failed_times',
|
|
236
|
+
'started_at',
|
|
237
|
+
'success_times',
|
|
238
|
+
'success_result',
|
|
239
|
+
'success_started_at',
|
|
240
|
+
'email',
|
|
241
|
+
'trigger_path',
|
|
242
|
+
'slack'
|
|
243
|
+
]).then((schema) => (slackHandlerSchema = schema));
|
|
244
|
+
});
|
|
239
245
|
</script>
|
|
240
246
|
|
|
241
247
|
<div>
|
|
@@ -244,7 +250,7 @@ $: handlerPath &&
|
|
|
244
250
|
<Tab value="teams" disabled={!isEditable}>Teams</Tab>
|
|
245
251
|
<Tab value="custom" disabled={!isEditable}>
|
|
246
252
|
Custom
|
|
247
|
-
|
|
253
|
+
{@render customTabTooltip?.()}
|
|
248
254
|
</Tab>
|
|
249
255
|
</Tabs>
|
|
250
256
|
</div>
|
|
@@ -253,15 +259,15 @@ $: handlerPath &&
|
|
|
253
259
|
<div class="flex flex-row mb-2">
|
|
254
260
|
<ScriptPicker
|
|
255
261
|
disabled={!isEditable || !$enterpriseLicense}
|
|
256
|
-
initialPath={customInitialScriptPath}
|
|
257
262
|
kinds={['script', 'failure']}
|
|
258
263
|
allowFlow={true}
|
|
259
264
|
bind:scriptPath={handlerPath}
|
|
260
265
|
bind:itemKind={customHandlerKind}
|
|
261
266
|
allowRefresh={isEditable}
|
|
267
|
+
clearable
|
|
262
268
|
/>
|
|
263
269
|
|
|
264
|
-
{#if handlerPath
|
|
270
|
+
{#if !handlerPath}
|
|
265
271
|
<Button
|
|
266
272
|
btnClasses="ml-4 mt-2"
|
|
267
273
|
color="dark"
|
|
@@ -427,7 +433,7 @@ $: handlerPath &&
|
|
|
427
433
|
/>
|
|
428
434
|
<div class="flex-shrink-0">
|
|
429
435
|
<button
|
|
430
|
-
|
|
436
|
+
onclick={loadTeamsResources}
|
|
431
437
|
class="flex items-center gap-1 p-1.5 rounded hover:bg-surface-hover focus:bg-surface-hover"
|
|
432
438
|
>
|
|
433
439
|
<RefreshCcw size={16} class={isFetching ? 'animate-spin' : ''} />
|
|
@@ -1,31 +1,15 @@
|
|
|
1
|
-
interface
|
|
2
|
-
|
|
3
|
-
$$bindings?: Bindings;
|
|
4
|
-
} & Exports;
|
|
5
|
-
(internal: unknown, props: Props & {
|
|
6
|
-
$$events?: Events;
|
|
7
|
-
$$slots?: Slots;
|
|
8
|
-
}): Exports & {
|
|
9
|
-
$set?: any;
|
|
10
|
-
$on?: any;
|
|
11
|
-
};
|
|
12
|
-
z_$$bindings?: Bindings;
|
|
13
|
-
}
|
|
14
|
-
declare const ErrorOrRecoveryHandler: $$__sveltets_2_IsomorphicComponent<{
|
|
15
|
-
errorOrRecovery: "error" | "recovery" | "success";
|
|
1
|
+
interface Props {
|
|
2
|
+
errorOrRecovery: 'error' | 'recovery' | 'success';
|
|
16
3
|
isEditable: boolean;
|
|
17
4
|
toggleText?: string;
|
|
18
5
|
showScriptHelpText?: boolean;
|
|
19
|
-
handlerSelected:
|
|
6
|
+
handlerSelected: 'custom' | 'slack' | 'teams';
|
|
20
7
|
handlerPath: string | undefined;
|
|
21
8
|
handlerExtraArgs: Record<string, any>;
|
|
22
|
-
customInitialScriptPath: string | undefined;
|
|
23
9
|
customScriptTemplate: string;
|
|
24
|
-
customHandlerKind?:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
}, {}, string>;
|
|
30
|
-
type ErrorOrRecoveryHandler = InstanceType<typeof ErrorOrRecoveryHandler>;
|
|
10
|
+
customHandlerKind?: 'flow' | 'script';
|
|
11
|
+
customTabTooltip?: import('svelte').Snippet;
|
|
12
|
+
}
|
|
13
|
+
declare const ErrorOrRecoveryHandler: import("svelte").Component<Props, {}, "handlerSelected" | "handlerPath" | "handlerExtraArgs" | "customHandlerKind">;
|
|
14
|
+
type ErrorOrRecoveryHandler = ReturnType<typeof ErrorOrRecoveryHandler>;
|
|
31
15
|
export default ErrorOrRecoveryHandler;
|
|
@@ -37,6 +37,7 @@ import { TestSteps } from './flows/testSteps.svelte';
|
|
|
37
37
|
import { aiChatManager } from './copilot/chat/AIChatManager.svelte';
|
|
38
38
|
import { setStepHistoryLoaderContext, StepHistoryLoader } from './stepHistoryLoader.svelte';
|
|
39
39
|
import { ModulesTestStates } from './modulesTest.svelte';
|
|
40
|
+
import FlowAssetsHandler, { initFlowGraphAssetsCtx } from './flows/FlowAssetsHandler.svelte';
|
|
40
41
|
let { initialPath = $bindable(''), pathStoreInit = undefined, newFlow, selectedId, initialArgs = {}, loading = false, flowStore, flowStateStore, savedFlow = $bindable(undefined), diffDrawer = undefined, customUi = {}, disableAi = false, disabledFlowInputs = false, savedPrimarySchedule = undefined, version = undefined, setSavedraftCb = undefined, draftTriggersFromUrl = undefined, selectedTriggerIndexFromUrl = undefined, children, loadedFromHistoryFromUrl, noInitial = false, onSaveInitial, onSaveDraft, onDeploy, onDeployError, onDetails, onSaveDraftError, onSaveDraftOnlyAtNewPath, onHistoryRestore } = $props();
|
|
41
42
|
let initialPathStore = writable(initialPath);
|
|
42
43
|
// used for new flows for captures
|
|
@@ -475,6 +476,7 @@ setContext('FlowEditorContext', {
|
|
|
475
476
|
modulesTestStates,
|
|
476
477
|
outputPickerOpenFns
|
|
477
478
|
});
|
|
479
|
+
setContext('FlowGraphAssetContext', initFlowGraphAssetsCtx({ getModules: () => flowStore.val.value.modules }));
|
|
478
480
|
// Add triggers context store
|
|
479
481
|
const triggersState = $state(new Triggers([
|
|
480
482
|
{ type: 'webhook', path: '', isDraft: false },
|
|
@@ -784,9 +786,9 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
|
784
786
|
redoProps={{ disabled: $history.index === $history.history.length - 1 }}
|
|
785
787
|
on:undo={() => {
|
|
786
788
|
const currentModules = flowStore.val?.value?.modules
|
|
787
|
-
console.log('undo before', flowStore.val, JSON.stringify(flowStore.val, null, 2))
|
|
789
|
+
// console.log('undo before', flowStore.val, JSON.stringify(flowStore.val, null, 2))
|
|
788
790
|
flowStore.val = undo(history, flowStore.val)
|
|
789
|
-
console.log('undo after', flowStore.val, JSON.stringify(flowStore.val, null, 2))
|
|
791
|
+
// console.log('undo after', flowStore.val, JSON.stringify(flowStore.val, null, 2))
|
|
790
792
|
|
|
791
793
|
const newModules = flowStore.val?.value?.modules
|
|
792
794
|
const restoredModules = newModules?.filter(
|
|
@@ -1030,3 +1032,10 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
|
1030
1032
|
renderCount += 1
|
|
1031
1033
|
}}
|
|
1032
1034
|
/>
|
|
1035
|
+
|
|
1036
|
+
<FlowAssetsHandler
|
|
1037
|
+
modules={flowStore.val.value.modules}
|
|
1038
|
+
enableParser
|
|
1039
|
+
enableDbExplore
|
|
1040
|
+
enablePathScriptAndFlowAssets
|
|
1041
|
+
/>
|