windmill-components 1.503.1 → 1.503.4

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 (69) hide show
  1. package/package/components/AppWrapper.svelte +3 -0
  2. package/package/components/Dev.svelte +94 -4
  3. package/package/components/FlowBuilder.svelte +89 -7
  4. package/package/components/FlowPreviewContent.svelte +309 -278
  5. package/package/components/FlowPreviewContent.svelte.d.ts +33 -19
  6. package/package/components/FlowPreviewResult.svelte +74 -0
  7. package/package/components/FlowPreviewResult.svelte.d.ts +21 -0
  8. package/package/components/FlowStatusViewer.svelte +3 -1
  9. package/package/components/FlowStatusViewer.svelte.d.ts +2 -0
  10. package/package/components/FlowStatusViewerInner.svelte +15 -70
  11. package/package/components/FlowStatusWaitingForEvents.svelte +5 -2
  12. package/package/components/FlowStatusWaitingForEvents.svelte.d.ts +1 -0
  13. package/package/components/FlowWrapper.svelte +3 -0
  14. package/package/components/ModuleTest.svelte +26 -24
  15. package/package/components/ResourcePicker.svelte +11 -3
  16. package/package/components/ScriptWrapper.svelte +3 -0
  17. package/package/components/common/button/Button.svelte +2 -1
  18. package/package/components/common/button/Button.svelte.d.ts +2 -1
  19. package/package/components/flows/FlowEditor.svelte +23 -2
  20. package/package/components/flows/FlowEditor.svelte.d.ts +23 -3
  21. package/package/components/flows/content/FlowEditorPanel.svelte +4 -3
  22. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +12 -2
  23. package/package/components/flows/content/FlowInput.svelte +2 -2
  24. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -1
  25. package/package/components/flows/content/FlowResult.svelte +35 -0
  26. package/package/components/flows/content/FlowResult.svelte.d.ts +17 -0
  27. package/package/components/flows/header/FlowPreviewButtons.svelte +81 -46
  28. package/package/components/flows/map/FlowGraphPreviewButton.svelte +94 -0
  29. package/package/components/flows/map/FlowGraphPreviewButton.svelte.d.ts +17 -0
  30. package/package/components/flows/map/FlowModuleSchemaItem.svelte +296 -285
  31. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +6 -0
  32. package/package/components/flows/map/FlowModuleSchemaMap.svelte +20 -1
  33. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +20 -1
  34. package/package/components/flows/map/MapItem.svelte +25 -3
  35. package/package/components/flows/map/MapItem.svelte.d.ts +6 -1
  36. package/package/components/flows/map/VirtualItem.svelte +55 -3
  37. package/package/components/flows/map/VirtualItem.svelte.d.ts +13 -1
  38. package/package/components/flows/map/VirtualItemWrapper.svelte +33 -29
  39. package/package/components/flows/map/VirtualItemWrapper.svelte.d.ts +1 -0
  40. package/package/components/flows/propPicker/OutputPicker.svelte +17 -2
  41. package/package/components/flows/propPicker/OutputPicker.svelte.d.ts +4 -0
  42. package/package/components/flows/propPicker/OutputPickerInner.svelte +2 -2
  43. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -0
  44. package/package/components/flows/types.d.ts +3 -0
  45. package/package/components/flows/utils.d.ts +9 -0
  46. package/package/components/flows/utils.js +39 -0
  47. package/package/components/graph/FlowGraphV2.svelte +27 -4
  48. package/package/components/graph/FlowGraphV2.svelte.d.ts +18 -2
  49. package/package/components/graph/ViewportResizer.svelte +33 -1
  50. package/package/components/graph/ViewportResizer.svelte.d.ts +5 -1
  51. package/package/components/graph/graphBuilder.svelte.d.ts +26 -1
  52. package/package/components/graph/graphBuilder.svelte.js +13 -3
  53. package/package/components/graph/renderers/edges/BaseEdge.svelte +69 -2
  54. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +10 -0
  55. package/package/components/graph/renderers/nodes/InputNode.svelte +19 -1
  56. package/package/components/graph/renderers/nodes/ModuleNode.svelte +17 -2
  57. package/package/components/graph/renderers/nodes/ResultNode.svelte +9 -8
  58. package/package/components/modulesTest.svelte.d.ts +12 -0
  59. package/package/components/modulesTest.svelte.js +8 -0
  60. package/package/components/preview/FlowPreviewStatus.svelte +9 -4
  61. package/package/components/preview/FlowPreviewStatus.svelte.d.ts +6 -18
  62. package/package/components/schema/EditableSchemaSdkWrapper.svelte +3 -0
  63. package/package/components/workspaceSettings/AISettings.svelte +1 -0
  64. package/package/gen/schemas.gen.d.ts +0 -3
  65. package/package/gen/schemas.gen.js +0 -3
  66. package/package/gen/types.gen.d.ts +0 -1
  67. package/package/utils.js +2 -0
  68. package/package.json +1 -1
  69. package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +0 -26
@@ -1,5 +1,7 @@
1
- import type { Flow } from '../../../gen';
1
+ import type { Flow, Job } from '../../../gen';
2
2
  import { type Trigger } from '../../triggers/utils';
3
+ import type { Writable } from 'svelte/store';
4
+ import type { DurationStatus } from '../../graph';
3
5
  interface Props {
4
6
  noEditor?: boolean;
5
7
  enableAi?: boolean;
@@ -11,7 +13,15 @@ interface Props {
11
13
  onDeployTrigger?: (trigger: Trigger) => void;
12
14
  forceTestTab?: Record<string, boolean>;
13
15
  highlightArg?: Record<string, string | undefined>;
14
- onRunPreview?: () => void;
16
+ onTestFlow?: () => void;
17
+ job?: Job;
18
+ isOwner?: boolean;
19
+ localDurationStatuses?: Writable<Record<string, DurationStatus>>;
20
+ suspendStatus?: Writable<Record<string, {
21
+ job: Job;
22
+ nb: number;
23
+ }>>;
24
+ onOpenDetails?: () => void;
15
25
  }
16
26
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
17
27
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -21,7 +21,7 @@ import SideBarTab from '../../meltComponents/SideBarTab.svelte';
21
21
  import CaptureTable from '../../triggers/CaptureTable.svelte';
22
22
  import { isObjectTooBig } from '../../../utils';
23
23
  import { refreshStateStore } from '../../../svelte5Utils.svelte';
24
- let { noEditor, disabled, onRunPreview } = $props();
24
+ let { noEditor, disabled, onTestFlow } = $props();
25
25
  const { flowStore, previewArgs, pathStore, initialPathStore, fakeInitialPath, flowInputEditorState } = getContext('FlowEditorContext');
26
26
  let addPropertyV2 = $state(undefined);
27
27
  let previewSchema = $state(undefined);
@@ -159,7 +159,7 @@ function runPreview() {
159
159
  if (previewArguments) {
160
160
  previewArgs.val = structuredClone($state.snapshot(previewArguments));
161
161
  }
162
- onRunPreview?.();
162
+ onTestFlow?.();
163
163
  }
164
164
  function updatePreviewSchemaAndArgs(payload) {
165
165
  if (isObjectTooBig(payload)) {
@@ -1,7 +1,7 @@
1
1
  interface Props {
2
2
  noEditor: boolean;
3
3
  disabled: boolean;
4
- onRunPreview?: () => void;
4
+ onTestFlow?: () => void;
5
5
  }
6
6
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
7
7
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -0,0 +1,35 @@
1
+ <script lang="ts">import FlowPreviewResult from '../../FlowPreviewResult.svelte';
2
+ import { workspaceStore } from '../../../stores';
3
+ import FlowCard from '../common/FlowCard.svelte';
4
+ import Button from '../../common/button/Button.svelte';
5
+ let { job, isOwner, localDurationStatuses, suspendStatus, noEditor, onOpenDetails } = $props();
6
+ </script>
7
+
8
+ <FlowCard {noEditor} title="Flow result">
9
+ {#if job && isOwner !== undefined && localDurationStatuses && suspendStatus}
10
+ <div class="px-4 py-2">
11
+ <FlowPreviewResult
12
+ {job}
13
+ workspaceId={$workspaceStore}
14
+ {isOwner}
15
+ hideFlowResult={false}
16
+ hideDownloadLogs={false}
17
+ {localDurationStatuses}
18
+ innerModules={[]}
19
+ {suspendStatus}
20
+ {extra}
21
+ hideJobId
22
+ />
23
+ </div>
24
+ {:else}
25
+ <p class="p-4 text-secondary">The result of the flow will be the result of the last node.</p>
26
+ {/if}
27
+ </FlowCard>
28
+
29
+ {#snippet extra()}
30
+ <div class="flex justify-end">
31
+ <Button variant="border" color="light" size="xs" on:click={() => onOpenDetails?.()}
32
+ >Open details</Button
33
+ >
34
+ </div>
35
+ {/snippet}
@@ -0,0 +1,17 @@
1
+ import type { DurationStatus } from '../../graph';
2
+ import type { Job } from '../../../gen';
3
+ import type { Writable } from 'svelte/store';
4
+ interface Props {
5
+ job?: Job;
6
+ isOwner?: boolean;
7
+ localDurationStatuses?: Writable<Record<string, DurationStatus>>;
8
+ suspendStatus?: Writable<Record<string, {
9
+ job: Job;
10
+ nb: number;
11
+ }>>;
12
+ noEditor: boolean;
13
+ onOpenDetails?: () => void;
14
+ }
15
+ declare const FlowResult: import("svelte").Component<Props, {}, "">;
16
+ type FlowResult = ReturnType<typeof FlowResult>;
17
+ export default FlowResult;
@@ -4,12 +4,20 @@ import FlowPreviewContent from '../../FlowPreviewContent.svelte';
4
4
  import { createEventDispatcher, tick } from 'svelte';
5
5
  import { getContext } from 'svelte';
6
6
  import { Play } from 'lucide-svelte';
7
- import { writable } from 'svelte/store';
8
7
  import { aiChatManager } from '../../copilot/chat/AIChatManager.svelte';
9
- let { loading = false } = $props();
8
+ let { loading = false, onRunPreview, onJobDone } = $props();
10
9
  const { selectedId } = getContext('FlowEditorContext');
11
- let previewOpen = $state(false);
10
+ let flowPreviewContent = $state(undefined);
11
+ let preventEscape = $state(false);
12
+ let selectedJobStep = $state(undefined);
13
+ let selectedJobStepIsTopLevel = $state(undefined);
14
+ let selectedJobStepType = $state('single');
15
+ let branchOrIterationN = $state(0);
16
+ let scrollTop = $state(0);
12
17
  let previewMode = $state('whole');
18
+ let upToId = $state(undefined);
19
+ let previewOpen = $state(false);
20
+ let deferContent = $state(false);
13
21
  export async function openPreview(test = false) {
14
22
  if (!previewOpen) {
15
23
  previewOpen = true;
@@ -18,50 +26,75 @@ export async function openPreview(test = false) {
18
26
  if (!test)
19
27
  return;
20
28
  }
29
+ previewMode = 'whole';
21
30
  flowPreviewContent?.test();
22
31
  }
32
+ export async function runPreview() {
33
+ if (!previewOpen) {
34
+ deferContent = true;
35
+ await tick();
36
+ }
37
+ previewMode = 'whole';
38
+ flowPreviewContent?.refresh();
39
+ flowPreviewContent?.test();
40
+ }
41
+ export function cancelTest() {
42
+ flowPreviewContent?.cancelTest();
43
+ }
23
44
  const dispatch = createEventDispatcher();
24
- let flowPreviewContent = $state(undefined);
25
- let jobId = $state(undefined);
26
- let job = $state(undefined);
27
- let preventEscape = $state(false);
28
- let selectedJobStep = $state(undefined);
29
- let selectedJobStepIsTopLevel = $state(undefined);
30
- let selectedJobStepType = $state('single');
31
- let branchOrIterationN = $state(0);
32
- let scrollTop = $state(0);
33
45
  let rightColumnSelect = $state('timeline');
34
- let localModuleStates = $state(writable({}));
35
- let localDurationStatuses = $state(writable({}));
36
- let upToDisabled = $derived($selectedId == undefined ||
37
- [
38
- 'settings',
39
- 'settings-metadata',
40
- 'settings-schedule',
41
- 'settings-retries',
42
- 'settings-same-worker',
43
- 'settings-graph',
44
- 'settings-worker-group',
45
- 'settings-cache',
46
- 'settings-concurrency',
47
- 'settings-early-stop',
48
- 'settings-early-return',
49
- 'inputs',
50
- 'schedules',
51
- 'failure',
52
- 'preprocessor',
53
- 'constants',
54
- 'Result',
55
- 'Input',
56
- 'triggers'
57
- ].includes($selectedId) ||
58
- $selectedId?.includes('branch') ||
59
- aiChatManager.flowAiChatHelpers?.getModuleAction($selectedId) === 'removed');
60
- export function testUpTo() {
46
+ let upToDisabled = $derived.by(() => {
47
+ const upToSelected = upToId ?? $selectedId;
48
+ return (upToSelected == undefined ||
49
+ [
50
+ 'settings',
51
+ 'settings-metadata',
52
+ 'settings-schedule',
53
+ 'settings-retries',
54
+ 'settings-same-worker',
55
+ 'settings-graph',
56
+ 'settings-worker-group',
57
+ 'settings-cache',
58
+ 'settings-concurrency',
59
+ 'settings-early-stop',
60
+ 'settings-early-return',
61
+ 'inputs',
62
+ 'schedules',
63
+ 'failure',
64
+ 'preprocessor',
65
+ 'constants',
66
+ 'Result',
67
+ 'Input',
68
+ 'triggers'
69
+ ].includes(upToSelected) ||
70
+ upToSelected?.includes('branch') ||
71
+ aiChatManager.flowAiChatHelpers?.getModuleAction(upToSelected) === 'removed');
72
+ });
73
+ export async function testUpTo(id, openPreview = false) {
74
+ upToId = id;
61
75
  if (upToDisabled)
62
76
  return;
77
+ if (openPreview) {
78
+ previewOpen = true;
79
+ }
80
+ else if (!previewOpen) {
81
+ deferContent = true;
82
+ await tick();
83
+ }
63
84
  previewMode = 'upTo';
64
- previewOpen = true;
85
+ flowPreviewContent?.refresh();
86
+ if (!openPreview) {
87
+ flowPreviewContent?.test();
88
+ }
89
+ }
90
+ export function getPreviewMode() {
91
+ return previewMode;
92
+ }
93
+ export function getPreviewOpen() {
94
+ return previewOpen;
95
+ }
96
+ export function getFlowPreviewContent() {
97
+ return flowPreviewContent;
65
98
  }
66
99
  </script>
67
100
 
@@ -81,7 +114,7 @@ export function testUpTo() {
81
114
  ? [
82
115
  {
83
116
  label: 'Test up to ' + $selectedId,
84
- onClick: testUpTo
117
+ onClick: () => testUpTo($selectedId, true)
85
118
  }
86
119
  ]
87
120
  : undefined}
@@ -90,22 +123,20 @@ export function testUpTo() {
90
123
  </Button>
91
124
 
92
125
  {#if !loading}
93
- <Drawer bind:open={previewOpen} size="75%" {preventEscape}>
126
+ <Drawer bind:open={previewOpen} size="75%" {preventEscape} alwaysOpen={deferContent}>
94
127
  <FlowPreviewContent
95
128
  bind:this={flowPreviewContent}
96
- bind:localModuleStates
97
- bind:localDurationStatuses
98
129
  open={previewOpen}
99
130
  bind:scrollTop
100
131
  bind:previewMode
101
- bind:job
102
- bind:jobId
103
132
  bind:selectedJobStep
104
133
  bind:selectedJobStepIsTopLevel
105
134
  bind:selectedJobStepType
106
135
  bind:branchOrIterationN
107
136
  bind:rightColumnSelect
108
137
  on:close={() => {
138
+ // keep the data in the preview content
139
+ deferContent = true
109
140
  previewOpen = false
110
141
  }}
111
142
  on:openTriggers={(e) => {
@@ -113,6 +144,10 @@ export function testUpTo() {
113
144
  dispatch('openTriggers', e.detail)
114
145
  }}
115
146
  bind:preventEscape
147
+ {onRunPreview}
148
+ render={previewOpen}
149
+ {onJobDone}
150
+ {upToId}
116
151
  />
117
152
  </Drawer>
118
153
  {/if}
@@ -0,0 +1,94 @@
1
+ <script lang="ts">import { Button } from '../../common';
2
+ import { fade } from 'svelte/transition';
3
+ import { Loader2, Play, X } from 'lucide-svelte';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import Popover from '../../Popover.svelte';
6
+ let { isRunning, hover, selected, individualStepTests, job, showJobStatus, flowHasChanged, onTestFlow, onCancelTestFlow, onOpenPreview, onHideJobStatus } = $props();
7
+ const flowPreviewJob = $derived(showJobStatus ? job : undefined);
8
+ const wide = $derived(hover || selected || flowPreviewJob || individualStepTests);
9
+ </script>
10
+
11
+ {#if !isRunning}
12
+ <Button
13
+ size="sm"
14
+ color="dark"
15
+ btnClasses={twMerge(
16
+ 'relative p-1.5 h-[36px] transition-all duration-200',
17
+ wide ? 'w-[120px]' : 'w-[44.5px]'
18
+ )}
19
+ on:click={() => {
20
+ onTestFlow?.()
21
+ }}
22
+ >
23
+ {#if isRunning}
24
+ <Loader2 size={16} class="animate-spin" />
25
+ {:else}
26
+ <Play size={16} />
27
+ {/if}
28
+ {#if wide}
29
+ <span transition:fade={{ duration: 100 }} class="text-xs">Test flow</span>
30
+ {/if}
31
+ </Button>
32
+ {#if wide && (flowPreviewJob || individualStepTests)}
33
+ <div
34
+ class="flex flex-row items-center shadow-sm rounded-md mt-1"
35
+ in:fade={{ duration: 100, delay: 200 }}
36
+ style={`width: ${wide ? '120px' : '44.5px'}`}
37
+ >
38
+ <Popover class="grow min-w-0">
39
+ <button
40
+ class={twMerge(
41
+ 'text-xs rounded-md rounded-r-none px-1.5 h-[24px] w-full bg-surface flex flex-row items-center gap-2 justify-center transition-all duration-200 ',
42
+ 'hover:bg-surface-hover text-gray-400 hover:text-primary'
43
+ )}
44
+ onclick={onOpenPreview}
45
+ >
46
+ {#if flowPreviewJob && !flowHasChanged}
47
+ <div
48
+ class={twMerge(
49
+ 'rounded-full h-2 w-2',
50
+ 'success' in flowPreviewJob && flowPreviewJob.success
51
+ ? 'bg-green-400'
52
+ : 'bg-red-400'
53
+ )}
54
+ title={'success' in flowPreviewJob && flowPreviewJob.success ? 'Success' : 'Failed'}
55
+ >
56
+ </div>
57
+ {/if}
58
+ <span class={twMerge('text-xs truncate', flowHasChanged && 'text-orange-600')} dir="rtl">
59
+ {!individualStepTests && !flowHasChanged && flowPreviewJob
60
+ ? flowPreviewJob.id.slice(-5)
61
+ : '~'}
62
+ </span>
63
+ </button>
64
+ {#snippet text()}
65
+ {#if !individualStepTests && !flowHasChanged}
66
+ See run details
67
+ {:else}
68
+ Open preview
69
+ {/if}
70
+ {/snippet}
71
+ </Popover>
72
+ <button
73
+ class="h-[24px] px-1.5 bg-surface rounded-md rounded-l-none text-gray-400 hover:bg-red-500 hover:text-white"
74
+ title="Hide jobs status"
75
+ onclick={onHideJobStatus}
76
+ >
77
+ <X size={14} />
78
+ </button>
79
+ </div>
80
+ {/if}
81
+ {:else}
82
+ <Button
83
+ size="xs"
84
+ color="red"
85
+ variant="contained"
86
+ btnClasses="h-[34px] w-[120px] p-1.5"
87
+ on:click={async () => {
88
+ onCancelTestFlow?.()
89
+ }}
90
+ >
91
+ <Loader2 size={16} class="animate-spin" />
92
+ <span transition:fade={{ duration: 100 }} class="text-xs">Cancel</span>
93
+ </Button>
94
+ {/if}
@@ -0,0 +1,17 @@
1
+ import type { Job } from '../../../gen';
2
+ interface Props {
3
+ isRunning?: boolean;
4
+ hover?: boolean;
5
+ selected?: boolean;
6
+ individualStepTests?: boolean;
7
+ showJobStatus?: boolean;
8
+ job?: Job;
9
+ flowHasChanged?: boolean;
10
+ onTestFlow?: () => void;
11
+ onCancelTestFlow?: () => void;
12
+ onOpenPreview?: () => void;
13
+ onHideJobStatus?: () => void;
14
+ }
15
+ declare const FlowGraphPreviewButton: import("svelte").Component<Props, {}, "">;
16
+ type FlowGraphPreviewButton = ReturnType<typeof FlowGraphPreviewButton>;
17
+ export default FlowGraphPreviewButton;