windmill-components 1.35.1 → 1.35.43

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 (201) hide show
  1. package/components/ArgInput.svelte +21 -21
  2. package/components/ArgInput.svelte.d.ts +3 -3
  3. package/components/DisplayResult.svelte +73 -67
  4. package/components/Editor.svelte +184 -246
  5. package/components/Editor.svelte.d.ts +4 -4
  6. package/components/EditorBar.svelte +58 -45
  7. package/components/EditorBar.svelte.d.ts +2 -1
  8. package/components/FlowBuilder.svelte +113 -121
  9. package/components/FlowJobResult.svelte +4 -5
  10. package/components/FlowModulesViewer.svelte +89 -7
  11. package/components/FlowModulesViewer.svelte.d.ts +1 -0
  12. package/components/FlowPreviewContent.svelte +56 -15
  13. package/components/FlowPreviewContent.svelte.d.ts +1 -1
  14. package/components/FlowStatusViewer.svelte +42 -24
  15. package/components/FlowStatusViewer.svelte.d.ts +0 -1
  16. package/components/FlowViewer.svelte +7 -3
  17. package/components/HighlightCode.svelte +21 -0
  18. package/components/HighlightCode.svelte.d.ts +17 -0
  19. package/components/IconedPath.svelte +9 -7
  20. package/components/IconedResourceType.svelte +1 -1
  21. package/components/InputTransformForm.svelte +88 -107
  22. package/components/InputTransformForm.svelte.d.ts +0 -1
  23. package/components/ItemPicker.svelte +2 -2
  24. package/components/LogViewer.svelte +23 -0
  25. package/components/LogViewer.svelte.d.ts +19 -0
  26. package/components/ModulePreview.svelte +108 -0
  27. package/components/ModulePreview.svelte.d.ts +24 -0
  28. package/components/RunForm.svelte +29 -18
  29. package/components/RunForm.svelte.d.ts +6 -2
  30. package/components/SchemaEditor.svelte +5 -3
  31. package/components/SchemaForm.svelte +0 -2
  32. package/components/SchemaForm.svelte.d.ts +0 -1
  33. package/components/ScriptBuilder.svelte +77 -66
  34. package/components/ScriptBuilder.svelte.d.ts +2 -4
  35. package/components/ScriptEditor.svelte +69 -142
  36. package/components/ScriptEditor.svelte.d.ts +0 -5
  37. package/components/ScriptPicker.svelte +3 -3
  38. package/components/ScriptPicker.svelte.d.ts +2 -1
  39. package/components/SharedBadge.svelte +5 -13
  40. package/components/SimpleEditor.svelte +147 -0
  41. package/components/SimpleEditor.svelte.d.ts +35 -0
  42. package/components/TestJobLoader.svelte +98 -0
  43. package/components/TestJobLoader.svelte.d.ts +26 -0
  44. package/components/Tooltip.svelte +2 -1
  45. package/components/common/actionRow/ActionRow.svelte +26 -0
  46. package/components/common/actionRow/ActionRow.svelte.d.ts +21 -0
  47. package/components/common/alert/Alert.svelte +53 -0
  48. package/components/common/alert/Alert.svelte.d.ts +20 -0
  49. package/components/common/alert/model.d.ts +1 -0
  50. package/components/common/alert/model.js +1 -0
  51. package/components/common/badge/Badge.svelte +82 -0
  52. package/components/common/badge/Badge.svelte.d.ts +28 -0
  53. package/components/common/badge/model.d.ts +8 -0
  54. package/components/common/badge/model.js +1 -0
  55. package/components/common/button/Button.svelte +107 -0
  56. package/components/common/button/Button.svelte.d.ts +37 -0
  57. package/components/common/button/model.d.ts +6 -0
  58. package/components/common/button/model.js +1 -0
  59. package/components/common/confirmationModal/ConfirmationModal.svelte +55 -0
  60. package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +23 -0
  61. package/components/common/drawer/Drawer.svelte +3 -0
  62. package/components/common/drawer/Drawer.svelte.d.ts +2 -0
  63. package/components/common/index.d.ts +14 -0
  64. package/components/common/index.js +14 -0
  65. package/components/common/tabs/TabContent.svelte +3 -2
  66. package/components/common/tabs/TabContent.svelte.d.ts +1 -0
  67. package/components/common/tabs/Tabs.svelte +8 -1
  68. package/components/common/tabs/Tabs.svelte.d.ts +2 -0
  69. package/components/common/toggleButton/ToggleButton.svelte +20 -0
  70. package/components/common/toggleButton/ToggleButton.svelte.d.ts +19 -0
  71. package/components/common/toggleButton/ToggleButtonGroup.svelte +33 -0
  72. package/components/common/toggleButton/ToggleButtonGroup.svelte.d.ts +24 -0
  73. package/components/flows/FlowEditor.svelte +30 -0
  74. package/components/{FlowEditor.svelte.d.ts → flows/FlowEditor.svelte.d.ts} +1 -8
  75. package/components/flows/common/FlowCard.svelte +9 -0
  76. package/components/flows/common/FlowCard.svelte.d.ts +21 -0
  77. package/components/flows/common/FlowCardHeader.svelte +39 -0
  78. package/components/flows/common/FlowCardHeader.svelte.d.ts +20 -0
  79. package/components/flows/content/CopyFirstStepSchema.svelte +13 -0
  80. package/components/flows/{CopyFirstStepSchema.svelte.d.ts → content/CopyFirstStepSchema.svelte.d.ts} +0 -0
  81. package/components/flows/{DynamicInputHelpBox.svelte → content/DynamicInputHelpBox.svelte} +0 -0
  82. package/components/flows/{DynamicInputHelpBox.svelte.d.ts → content/DynamicInputHelpBox.svelte.d.ts} +0 -0
  83. package/components/flows/content/FlowEditorPanel.svelte +26 -0
  84. package/components/flows/content/FlowEditorPanel.svelte.d.ts +14 -0
  85. package/components/flows/content/FlowFailureModule.svelte +17 -0
  86. package/components/flows/content/FlowFailureModule.svelte.d.ts +14 -0
  87. package/components/flows/content/FlowInput.svelte +22 -0
  88. package/components/flows/{FlowInput.svelte.d.ts → content/FlowInput.svelte.d.ts} +0 -0
  89. package/components/flows/{FlowInputs.svelte → content/FlowInputs.svelte} +24 -13
  90. package/components/flows/{FlowInputs.svelte.d.ts → content/FlowInputs.svelte.d.ts} +0 -0
  91. package/components/flows/content/FlowLoop.svelte +38 -0
  92. package/components/flows/content/FlowLoop.svelte.d.ts +14 -0
  93. package/components/flows/content/FlowModule.svelte +190 -0
  94. package/components/flows/content/FlowModule.svelte.d.ts +29 -0
  95. package/components/flows/content/FlowModuleAdvancedSettings.svelte +64 -0
  96. package/components/flows/content/FlowModuleAdvancedSettings.svelte.d.ts +17 -0
  97. package/components/flows/content/FlowModuleHeader.svelte +68 -0
  98. package/components/flows/{FlowModuleHeader.svelte.d.ts → content/FlowModuleHeader.svelte.d.ts} +2 -3
  99. package/components/flows/content/FlowModuleScript.svelte +21 -0
  100. package/components/flows/content/FlowModuleScript.svelte.d.ts +17 -0
  101. package/components/flows/content/FlowModuleWrapper.svelte +47 -0
  102. package/components/flows/content/FlowModuleWrapper.svelte.d.ts +14 -0
  103. package/components/flows/content/FlowRetries.svelte +80 -0
  104. package/components/flows/content/FlowRetries.svelte.d.ts +14 -0
  105. package/components/flows/content/FlowSchedules.svelte +18 -0
  106. package/components/flows/content/FlowSchedules.svelte.d.ts +14 -0
  107. package/components/flows/content/FlowSettings.svelte +51 -0
  108. package/components/flows/{FlowSettings.svelte.d.ts → content/FlowSettings.svelte.d.ts} +1 -6
  109. package/components/flows/content/RemoveStepConfirmationModal.svelte +32 -0
  110. package/components/flows/content/RemoveStepConfirmationModal.svelte.d.ts +19 -0
  111. package/components/flows/flowState.d.ts +8 -7
  112. package/components/flows/flowState.js +25 -46
  113. package/components/flows/flowStateUtils.d.ts +15 -13
  114. package/components/flows/flowStateUtils.js +80 -72
  115. package/components/flows/flowStore.js +7 -4
  116. package/components/flows/header/FlowEditorHeader.svelte +23 -0
  117. package/components/flows/header/FlowEditorHeader.svelte.d.ts +14 -0
  118. package/components/flows/header/FlowImportExportMenu.svelte +56 -0
  119. package/components/flows/header/FlowImportExportMenu.svelte.d.ts +14 -0
  120. package/components/flows/header/FlowPreviewButtons.svelte +49 -0
  121. package/components/flows/header/FlowPreviewButtons.svelte.d.ts +14 -0
  122. package/components/flows/header/FlowStatus.svelte +36 -0
  123. package/components/flows/header/FlowStatus.svelte.d.ts +14 -0
  124. package/components/flows/map/FlowErrorHandlerItem.svelte +54 -0
  125. package/components/flows/map/FlowErrorHandlerItem.svelte.d.ts +14 -0
  126. package/components/flows/map/FlowModuleSchemaItem.svelte +58 -0
  127. package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +27 -0
  128. package/components/flows/map/FlowModuleSchemaMap.svelte +161 -0
  129. package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +20 -0
  130. package/components/flows/pickers/PickHubScript.svelte +4 -3
  131. package/components/flows/pickers/PickHubScript.svelte.d.ts +2 -1
  132. package/components/flows/pickers/PickScript.svelte +4 -12
  133. package/components/flows/pickers/PickScript.svelte.d.ts +1 -1
  134. package/components/flows/propPicker/PropPickerWrapper.svelte +42 -0
  135. package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +31 -0
  136. package/components/flows/scheduleUtils.d.ts +0 -1
  137. package/components/flows/scheduleUtils.js +0 -1
  138. package/components/flows/types.d.ts +9 -0
  139. package/components/flows/types.js +1 -0
  140. package/components/flows/utils.d.ts +1 -1
  141. package/components/flows/utils.js +8 -11
  142. package/components/icons/HatIcon.svelte +19 -0
  143. package/components/icons/HatIcon.svelte.d.ts +16 -0
  144. package/components/landing/FlowGettingStarted.svelte +22 -68
  145. package/components/landing/FlowLandingBox.svelte +1 -1
  146. package/components/landing/RessourceGettingStarted.svelte +7 -37
  147. package/components/landing/ScriptBox.svelte +33 -60
  148. package/components/landing/ScriptGettingStarted.svelte +23 -69
  149. package/components/propertyPicker/ObjectViewer.svelte +16 -7
  150. package/components/propertyPicker/PropPicker.svelte +38 -12
  151. package/components/propertyPicker/WarningMessage.svelte +2 -15
  152. package/components/script_editor/LogPanel.svelte +108 -119
  153. package/components/script_editor/LogPanel.svelte.d.ts +2 -0
  154. package/components/sidebar/SidebarContent.svelte +2 -2
  155. package/editorUtils.d.ts +25 -0
  156. package/editorUtils.js +43 -0
  157. package/gen/models/CompletedJob.d.ts +2 -1
  158. package/gen/models/CompletedJob.js +1 -0
  159. package/gen/models/FlowModule.d.ts +1 -0
  160. package/gen/models/FlowStatus.d.ts +3 -0
  161. package/gen/models/FlowStatusModule.d.ts +1 -1
  162. package/gen/models/FlowValue.d.ts +11 -0
  163. package/gen/models/Preview.d.ts +2 -1
  164. package/gen/models/Preview.js +1 -0
  165. package/gen/models/QueuedJob.d.ts +2 -1
  166. package/gen/models/QueuedJob.js +1 -0
  167. package/gen/models/RawScript.d.ts +2 -1
  168. package/gen/models/RawScript.js +1 -0
  169. package/gen/models/Script.d.ts +9 -2
  170. package/gen/models/Script.js +8 -0
  171. package/gen/services/JobService.d.ts +40 -0
  172. package/gen/services/JobService.js +70 -0
  173. package/gen/services/ScriptService.d.ts +14 -3
  174. package/gen/services/ScriptService.js +13 -0
  175. package/infer.d.ts +1 -1
  176. package/infer.js +6 -1
  177. package/package.json +67 -35
  178. package/script_helpers.d.ts +5 -2
  179. package/script_helpers.js +41 -13
  180. package/stores.d.ts +1 -1
  181. package/utils.d.ts +6 -4
  182. package/utils.js +27 -4
  183. package/components/FlowEditor.svelte +0 -55
  184. package/components/FlowPreview.svelte +0 -107
  185. package/components/FlowPreview.svelte.d.ts +0 -23
  186. package/components/ModuleStep.svelte +0 -131
  187. package/components/ModuleStep.svelte.d.ts +0 -25
  188. package/components/flows/CopyFirstStepSchema.svelte +0 -13
  189. package/components/flows/FlowBox.svelte +0 -16
  190. package/components/flows/FlowBox.svelte.d.ts +0 -23
  191. package/components/flows/FlowBoxHeader.svelte +0 -16
  192. package/components/flows/FlowBoxHeader.svelte.d.ts +0 -21
  193. package/components/flows/FlowInput.svelte +0 -22
  194. package/components/flows/FlowModuleHeader.svelte +0 -109
  195. package/components/flows/FlowSettings.svelte +0 -165
  196. package/components/flows/FlowTimeline.svelte +0 -169
  197. package/components/flows/FlowTimeline.svelte.d.ts +0 -21
  198. package/components/flows/stepOpenedStore.d.ts +0 -1
  199. package/components/flows/stepOpenedStore.js +0 -6
  200. package/components/propertyPicker/OverlayPropertyPicker.svelte +0 -69
  201. package/components/propertyPicker/OverlayPropertyPicker.svelte.d.ts +0 -24
@@ -0,0 +1,190 @@
1
+ <script context="module">export {};
2
+ </script>
3
+
4
+ <script>import { VSplitPane } from 'svelte-split-pane';
5
+ import Tab from '../../common/tabs/Tab.svelte';
6
+ import TabContent from '../../common/tabs/TabContent.svelte';
7
+ import Tabs from '../../common/tabs/Tabs.svelte';
8
+ import Editor from '../../Editor.svelte';
9
+ import EditorBar from '../../EditorBar.svelte';
10
+ import ModulePreview from '../../ModulePreview.svelte';
11
+ import FlowInputs from './FlowInputs.svelte';
12
+ import { createInlineScriptModule, createLoop, createScriptFromInlineScript, fork, getStepPropPicker, isEmptyFlowModule, pickScript } from '../flowStateUtils';
13
+ import { flowStore } from '../flowStore';
14
+ import SchemaForm from '../../SchemaForm.svelte';
15
+ import { RawScript } from '../../../gen';
16
+ import FlowCard from '../common/FlowCard.svelte';
17
+ import FlowModuleHeader from './FlowModuleHeader.svelte';
18
+ import { flowStateStore } from '../flowState';
19
+ import { scriptLangToEditorLang } from '../../../utils';
20
+ import PropPickerWrapper from '../propPicker/PropPickerWrapper.svelte';
21
+ import { getContext, setContext } from 'svelte';
22
+ import FlowModuleAdvancedSettings from './FlowModuleAdvancedSettings.svelte';
23
+ import { loadSchemaFromModule } from '../utils';
24
+ import { writable } from 'svelte/store';
25
+ import FlowModuleScript from './FlowModuleScript.svelte';
26
+ const { selectedId, select } = getContext('FlowEditorContext');
27
+ export let flowModule;
28
+ export let previewArgs = {};
29
+ export let flowModuleState;
30
+ $: [parentIndex, childIndex] = $selectedId.split('-').map(Number);
31
+ let editor;
32
+ let modulePreview;
33
+ let websocketAlive = { pyright: false, black: false, deno: false };
34
+ let selected = 'inputs';
35
+ $: shouldPick = isEmptyFlowModule(flowModule);
36
+ $: stepPropPicker = getStepPropPicker($selectedId.split('-').map(Number), $flowStore.schema, $flowStateStore, previewArgs);
37
+ function onKeyDown(event) {
38
+ if ((event.ctrlKey || event.metaKey) && event.key == 'Enter') {
39
+ event.preventDefault();
40
+ selected = 'test';
41
+ modulePreview?.runTestWithStepArgs();
42
+ }
43
+ }
44
+ async function apply(fn, arg) {
45
+ const [module, moduleState] = await fn(arg);
46
+ if (JSON.stringify(flowModule) != JSON.stringify(module) ||
47
+ JSON.stringify(flowModuleState) != JSON.stringify(moduleState)) {
48
+ flowModule = module;
49
+ flowModuleState = moduleState;
50
+ }
51
+ }
52
+ async function reload(flowModule) {
53
+ const { input_transforms, schema } = await loadSchemaFromModule(flowModule);
54
+ flowModuleState.schema = schema;
55
+ flowModule.input_transforms = input_transforms;
56
+ }
57
+ async function applyCreateLoop() {
58
+ await apply(createLoop, null);
59
+ }
60
+ export const FLOW_MODULE_WIDTH_THRESHOLD = 768;
61
+ const width = writable(0);
62
+ setContext('FlowModuleWidth', {
63
+ width,
64
+ threshold: FLOW_MODULE_WIDTH_THRESHOLD
65
+ });
66
+ </script>
67
+
68
+ <svelte:window on:keydown={onKeyDown} />
69
+
70
+ <div class="flex flex-col h-full" bind:clientWidth={$width}>
71
+ <FlowCard bind:flowModule>
72
+ <svelte:fragment slot="header">
73
+ <FlowModuleHeader
74
+ bind:module={flowModule}
75
+ on:delete
76
+ on:fork={() => apply(fork, flowModule)}
77
+ on:createScriptFromInlineScript={() => {
78
+ apply(createScriptFromInlineScript, {
79
+ flowModule: flowModule,
80
+ suffix: $selectedId,
81
+ schema: flowModuleState.schema
82
+ })
83
+ }}
84
+ />
85
+ </svelte:fragment>
86
+ {#if shouldPick}
87
+ <FlowInputs
88
+ shouldDisableTriggerScripts={parentIndex != 0}
89
+ shouldDisableLoopCreation={childIndex !== undefined ||
90
+ parentIndex === 0 ||
91
+ $selectedId.includes('failure')}
92
+ on:loop={() => {
93
+ applyCreateLoop()
94
+ select(['loop', $selectedId].join('-'))
95
+ }}
96
+ on:pick={(e) => apply(pickScript, e.detail.path)}
97
+ on:new={(e) =>
98
+ apply(createInlineScriptModule, {
99
+ language: e.detail.language,
100
+ kind: e.detail.kind,
101
+ subkind: e.detail.subkind
102
+ })}
103
+ />
104
+ {:else}
105
+ {#if flowModule.value.type === 'rawscript'}
106
+ <div class="flex-shrink-0 border-b p-1">
107
+ <EditorBar
108
+ {editor}
109
+ lang={flowModule.value['language'] ?? 'deno'}
110
+ {websocketAlive}
111
+ iconOnly={$width < FLOW_MODULE_WIDTH_THRESHOLD}
112
+ />
113
+ </div>
114
+ {/if}
115
+
116
+ <div class="overflow-hidden flex-grow">
117
+ <VSplitPane
118
+ topPanelSize={flowModule.value.type === 'rawscript' ? '50%' : '0%'}
119
+ downPanelSize={flowModule.value.type === 'rawscript' ? '50%' : '100%'}
120
+ minTopPaneSize="20%"
121
+ minDownPaneSize="20%"
122
+ >
123
+ <top slot="top">
124
+ {#if flowModule.value.type === 'rawscript'}
125
+ <div on:mouseleave={() => reload(flowModule)} class="h-full overflow-auto">
126
+ <Editor
127
+ bind:websocketAlive
128
+ bind:this={editor}
129
+ class="h-full px-2"
130
+ bind:code={flowModule.value.content}
131
+ deno={flowModule.value.language === RawScript.language.DENO}
132
+ lang={scriptLangToEditorLang(flowModule.value.language)}
133
+ automaticLayout={true}
134
+ cmdEnterAction={() => {
135
+ selected = 'test'
136
+ modulePreview?.runTestWithStepArgs()
137
+ }}
138
+ formatAction={() => reload(flowModule)}
139
+ />
140
+ </div>
141
+ {:else if flowModule.value.type === 'script'}
142
+ <FlowModuleScript {flowModule} />
143
+ {/if}
144
+ </top>
145
+
146
+ <down slot="down" class="flex flex-col flex-1 h-full">
147
+ <Tabs bind:selected>
148
+ <Tab value="inputs">Inputs</Tab>
149
+ <Tab value="test">Test</Tab>
150
+ {#if !$selectedId.includes('failure')}
151
+ <Tab value="advanced">Advanced</Tab>
152
+ {/if}
153
+
154
+ <svelte:fragment slot="content">
155
+ <div class="overflow-hidden bg-white" style="height:calc(100% - 32px);">
156
+ <TabContent value="inputs" class="flex flex-col flex-1 h-full">
157
+ <PropPickerWrapper bind:pickableProperties={stepPropPicker.pickableProperties}>
158
+ <!-- <pre class="text-xs">{JSON.stringify($flowStateStore, null, 4)}</pre> -->
159
+ <SchemaForm
160
+ schema={flowModuleState.schema}
161
+ inputTransform={true}
162
+ importPath={$selectedId}
163
+ bind:args={flowModule.input_transforms}
164
+ bind:extraLib={stepPropPicker.extraLib}
165
+ />
166
+ </PropPickerWrapper>
167
+ </TabContent>
168
+ <TabContent value="test" class="flex flex-col flex-1 h-full" alwaysMounted={true}>
169
+ <ModulePreview
170
+ bind:this={modulePreview}
171
+ mod={flowModule}
172
+ schema={flowModuleState.schema}
173
+ indices={[parentIndex, childIndex]}
174
+ />
175
+ </TabContent>
176
+
177
+ <TabContent value="advanced" class="flex flex-col flex-1 h-full">
178
+ <div class="p-4 overflow-y-auto">
179
+ <FlowModuleAdvancedSettings bind:flowModule />
180
+ </div>
181
+ </TabContent>
182
+ </div>
183
+ </svelte:fragment>
184
+ </Tabs>
185
+ </down>
186
+ </VSplitPane>
187
+ </div>
188
+ {/if}
189
+ </FlowCard>
190
+ </div>
@@ -0,0 +1,29 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ export declare type FlowModuleWidthContext = {
3
+ width: Writable<number>;
4
+ threshold: number;
5
+ };
6
+ import { type FlowModule } from '../../../gen';
7
+ import { type FlowModuleState } from '../flowState';
8
+ import { type Writable } from 'svelte/store';
9
+ declare const __propDef: {
10
+ props: {
11
+ flowModule: FlowModule;
12
+ previewArgs?: Record<string, any> | undefined;
13
+ flowModuleState: FlowModuleState;
14
+ FLOW_MODULE_WIDTH_THRESHOLD?: 768 | undefined;
15
+ };
16
+ events: {
17
+ delete: CustomEvent<any>;
18
+ } & {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export declare type FlowModuleProps = typeof __propDef.props;
24
+ export declare type FlowModuleEvents = typeof __propDef.events;
25
+ export declare type FlowModuleSlots = typeof __propDef.slots;
26
+ export default class FlowModule extends SvelteComponentTyped<FlowModuleProps, FlowModuleEvents, FlowModuleSlots> {
27
+ get FLOW_MODULE_WIDTH_THRESHOLD(): number;
28
+ }
29
+ export {};
@@ -0,0 +1,64 @@
1
+ <script>import SimpleEditor from '../../SimpleEditor.svelte';
2
+ import Toggle from '../../Toggle.svelte';
3
+ export let flowModule;
4
+ $: isSuspendEnabled = Boolean(flowModule.suspend);
5
+ $: isStopAfterIfEnabled = Boolean(flowModule.stop_after_if);
6
+ </script>
7
+
8
+ <div class="flex flex-col items-start space-y-2">
9
+ <Toggle
10
+ checked={isSuspendEnabled}
11
+ on:change={() => {
12
+ if (isSuspendEnabled && flowModule.suspend != undefined) {
13
+ flowModule.suspend = undefined
14
+ } else {
15
+ flowModule.suspend = 1
16
+ }
17
+ }}
18
+ options={{
19
+ right: 'Suspend flow execution until events received enabled'
20
+ }}
21
+ />
22
+ <span class="text-xs font-bold">Number of events to wait for</span>
23
+
24
+ {#if flowModule.suspend}
25
+ <input bind:value={flowModule.suspend} type="number" min="1" placeholder="1" />
26
+ {:else}
27
+ <input type="number" disabled />
28
+ {/if}
29
+
30
+ <Toggle
31
+ checked={isStopAfterIfEnabled}
32
+ on:change={() => {
33
+ if (isStopAfterIfEnabled && flowModule.stop_after_if) {
34
+ flowModule.stop_after_if = undefined
35
+ } else {
36
+ flowModule.stop_after_if = {
37
+ expr: 'result == undefined',
38
+ skip_if_stopped: false
39
+ }
40
+ }
41
+ }}
42
+ options={{
43
+ right: 'Early stop if condition met enabled'
44
+ }}
45
+ />
46
+
47
+ {#if flowModule.stop_after_if}
48
+ <span class="text-xs font-bold">Stop condition expression</span>
49
+
50
+ <SimpleEditor
51
+ lang="javascript"
52
+ bind:code={flowModule.stop_after_if.expr}
53
+ class="few-lines-editor border w-full"
54
+ />
55
+ <span class="text-xs font-bold">Should skip if stopped</span>
56
+
57
+ <input type="checkbox" bind:checked={flowModule.stop_after_if.skip_if_stopped} />
58
+ {:else}
59
+ <span class="text-xs font-bold">Stop condition expression</span>
60
+ <textarea disabled rows="3" />
61
+ <span class="text-xs font-bold">Should skip if stopped</span>
62
+ <input type="checkbox" disabled />
63
+ {/if}
64
+ </div>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { FlowModule } from '../../../gen';
3
+ declare const __propDef: {
4
+ props: {
5
+ flowModule: FlowModule;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type FlowModuleAdvancedSettingsProps = typeof __propDef.props;
13
+ export declare type FlowModuleAdvancedSettingsEvents = typeof __propDef.events;
14
+ export declare type FlowModuleAdvancedSettingsSlots = typeof __propDef.slots;
15
+ export default class FlowModuleAdvancedSettings extends SvelteComponentTyped<FlowModuleAdvancedSettingsProps, FlowModuleAdvancedSettingsEvents, FlowModuleAdvancedSettingsSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,68 @@
1
+ <script>import Button from '../../common/button/Button.svelte';
2
+ import { isEmptyFlowModule } from '../flowStateUtils';
3
+ import { faCodeBranch, faSave, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
4
+ import { createEventDispatcher, getContext } from 'svelte';
5
+ import RemoveStepConfirmationModal from './RemoveStepConfirmationModal.svelte';
6
+ export let module;
7
+ let confirmationModalOpen = false;
8
+ $: shouldPick = isEmptyFlowModule(module);
9
+ const dispatch = createEventDispatcher();
10
+ const { selectedId, select } = getContext('FlowEditorContext');
11
+ const { width, threshold } = getContext('FlowModuleWidth');
12
+ $: iconOnly = $width < threshold;
13
+ </script>
14
+
15
+ <div class="flex flex-row space-x-2">
16
+ {#if module.value.type === 'script' && !shouldPick}
17
+ <Button
18
+ size="xs"
19
+ color="light"
20
+ variant="border"
21
+ on:click={() => dispatch('fork')}
22
+ startIcon={{ icon: faCodeBranch }}
23
+ {iconOnly}
24
+ >
25
+ Fork
26
+ </Button>
27
+ {/if}
28
+
29
+ {#if module.value.type === 'rawscript' && !shouldPick}
30
+ <Button
31
+ size="xs"
32
+ color="light"
33
+ variant="border"
34
+ startIcon={{ icon: faSave }}
35
+ on:click={() => dispatch('createScriptFromInlineScript')}
36
+ {iconOnly}
37
+ >
38
+ Save to workspace
39
+ </Button>
40
+ {/if}
41
+ <Button
42
+ size="xs"
43
+ color="light"
44
+ variant="border"
45
+ startIcon={{ icon: faTrashAlt }}
46
+ {iconOnly}
47
+ on:click={(event) => {
48
+ if (event.shiftKey || shouldPick) {
49
+ dispatch('delete')
50
+ select('settings')
51
+ } else {
52
+ confirmationModalOpen = true
53
+ }
54
+ }}
55
+ >
56
+ {$selectedId.includes('failure') ? 'Delete error handler' : 'Remove step'}
57
+ </Button>
58
+ </div>
59
+
60
+ <RemoveStepConfirmationModal
61
+ bind:open={confirmationModalOpen}
62
+ on:confirmed={() => {
63
+ dispatch('delete')
64
+ setTimeout(() => {
65
+ select('settings')
66
+ })
67
+ }}
68
+ />
@@ -1,9 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { FlowModule } from '../../gen';
2
+ import type { FlowModule } from '../../../gen';
3
3
  declare const __propDef: {
4
4
  props: {
5
- indexes: number[];
6
- mod: FlowModule;
5
+ module: FlowModule;
7
6
  };
8
7
  events: {
9
8
  fork: CustomEvent<any>;
@@ -0,0 +1,21 @@
1
+ <script>import HighlightCode from '../../HighlightCode.svelte';
2
+ import { getScriptByPath } from '../../../utils';
3
+ export let flowModule;
4
+ let code;
5
+ let language;
6
+ async function loadCode(module) {
7
+ if (module.value.type == 'script') {
8
+ const script = await getScriptByPath(module.value.path);
9
+ code = script.content;
10
+ language = script.language;
11
+ }
12
+ else {
13
+ throw Error('Not a script');
14
+ }
15
+ }
16
+ $: flowModule && loadCode(flowModule);
17
+ </script>
18
+
19
+ <div class="flex flex-col flex-1 h-full overflow-auto">
20
+ <HighlightCode {language} {code} />
21
+ </div>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { FlowModule } from '../../../gen';
3
+ declare const __propDef: {
4
+ props: {
5
+ flowModule: FlowModule;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type FlowModuleScriptProps = typeof __propDef.props;
13
+ export declare type FlowModuleScriptEvents = typeof __propDef.events;
14
+ export declare type FlowModuleScriptSlots = typeof __propDef.slots;
15
+ export default class FlowModuleScript extends SvelteComponentTyped<FlowModuleScriptProps, FlowModuleScriptEvents, FlowModuleScriptSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,47 @@
1
+ <script>import { getContext } from 'svelte';
2
+ import { flowStateStore } from '../flowState';
3
+ import { flowStore } from '../flowStore';
4
+ import FlowModule from './FlowModule.svelte';
5
+ const { selectedId, previewArgs, select } = getContext('FlowEditorContext');
6
+ function selectedIdToIndexes(selectedId) {
7
+ return selectedId.split('-').map(Number);
8
+ }
9
+ $: [parentIndex, childIndex] = selectedIdToIndexes($selectedId);
10
+ </script>
11
+
12
+ {#if childIndex != undefined}
13
+ {#each [$flowStore.value.modules[parentIndex].value] as mod, index (index)}
14
+ {#each [$flowStateStore.modules[parentIndex].childFlowModules] as state}
15
+ {#if mod.type == 'forloopflow' && state != undefined}
16
+ <FlowModule
17
+ previewArgs={$previewArgs}
18
+ bind:flowModule={mod.modules[childIndex]}
19
+ bind:flowModuleState={state[childIndex]}
20
+ on:delete={() => {
21
+ $flowStateStore.modules[parentIndex].childFlowModules?.splice(childIndex, 1)
22
+ let mod = $flowStore.value.modules[parentIndex].value
23
+ if (mod.type === 'forloopflow') {
24
+ mod.modules.splice(childIndex, 1)
25
+ } else {
26
+ throw new Error('Expected forloop')
27
+ }
28
+ }}
29
+ />
30
+ {:else}
31
+ <span>Incorrect state</span>
32
+ {/if}
33
+ {/each}
34
+ {/each}
35
+ {:else if $flowStore.value.modules[parentIndex]}
36
+ <FlowModule
37
+ previewArgs={$previewArgs}
38
+ bind:flowModule={$flowStore.value.modules[parentIndex]}
39
+ bind:flowModuleState={$flowStateStore.modules[parentIndex]}
40
+ on:delete={() => {
41
+ $flowStateStore.modules.splice(parentIndex, 1)
42
+ $flowStateStore = $flowStateStore
43
+ $flowStore.value.modules.splice(parentIndex, 1)
44
+ $flowStore = $flowStore
45
+ }}
46
+ />
47
+ {/if}
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type FlowModuleWrapperProps = typeof __propDef.props;
10
+ export declare type FlowModuleWrapperEvents = typeof __propDef.events;
11
+ export declare type FlowModuleWrapperSlots = typeof __propDef.slots;
12
+ export default class FlowModuleWrapper extends SvelteComponentTyped<FlowModuleWrapperProps, FlowModuleWrapperEvents, FlowModuleWrapperSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,80 @@
1
+ <script>import Toggle from '../../Toggle.svelte';
2
+ import { flowStore } from '../flowStore';
3
+ function setConstantRetries() {
4
+ $flowStore.value.retry = {
5
+ ...$flowStore.value.retry,
6
+ constant: {
7
+ attempts: 0,
8
+ seconds: 0
9
+ }
10
+ };
11
+ }
12
+ function setExpoentialRetries() {
13
+ $flowStore.value.retry = {
14
+ ...$flowStore.value.retry,
15
+ exponential: {
16
+ attempts: 0,
17
+ multiplier: 1,
18
+ seconds: 0
19
+ }
20
+ };
21
+ }
22
+ $: isConstantRetryEnabled = Boolean($flowStore.value.retry?.constant);
23
+ $: isExponentialRetryEnabled = Boolean($flowStore.value.retry?.exponential);
24
+ </script>
25
+
26
+ <div class="flex flex-col items-start space-y-1">
27
+ <Toggle
28
+ checked={isConstantRetryEnabled}
29
+ on:change={() => {
30
+ if (isConstantRetryEnabled && $flowStore.value.retry?.constant) {
31
+ $flowStore.value.retry.constant = undefined
32
+ } else {
33
+ setConstantRetries()
34
+ }
35
+ }}
36
+ options={{
37
+ right: 'Constant retry enabled'
38
+ }}
39
+ />
40
+ {#if $flowStore.value.retry?.constant}
41
+ <span class="text-xs font-bold">Attempts</span>
42
+ <input bind:value={$flowStore.value.retry.constant.attempts} type="number" />
43
+ <span class="text-xs font-bold">Delay (seconds)</span>
44
+ <input bind:value={$flowStore.value.retry.constant.seconds} type="number" />
45
+ {:else}
46
+ <span class="text-xs font-bold">Attempts</span>
47
+ <input type="number" disabled />
48
+ <span class="text-xs font-bold">Delay (seconds)</span>
49
+ <input type="number" disabled />
50
+ {/if}
51
+
52
+ <Toggle
53
+ checked={isExponentialRetryEnabled}
54
+ on:change={() => {
55
+ if (isExponentialRetryEnabled && $flowStore.value.retry?.exponential) {
56
+ $flowStore.value.retry.exponential = undefined
57
+ } else {
58
+ setExpoentialRetries()
59
+ }
60
+ }}
61
+ options={{
62
+ right: 'Exponential retry enabled'
63
+ }}
64
+ />
65
+ {#if $flowStore.value.retry?.exponential}
66
+ <span class="text-xs font-bold">Attempts</span>
67
+ <input bind:value={$flowStore.value.retry.exponential.attempts} type="number" />
68
+ <span class="text-xs font-bold">Mulitplier</span>
69
+ <input bind:value={$flowStore.value.retry.exponential.multiplier} type="number" />
70
+ <span class="text-xs font-bold">Initial delay (seconds)</span>
71
+ <input bind:value={$flowStore.value.retry.exponential.seconds} type="number" />
72
+ {:else}
73
+ <span class="text-xs font-bold">Attempts</span>
74
+ <input type="number" disabled />
75
+ <span class="text-xs font-bold">Mulitplier</span>
76
+ <input type="number" disabled />
77
+ <span class="text-xs font-bold">Initial delay (seconds)</span>
78
+ <input type="number" disabled />
79
+ {/if}
80
+ </div>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type FlowRetriesProps = typeof __propDef.props;
10
+ export declare type FlowRetriesEvents = typeof __propDef.events;
11
+ export declare type FlowRetriesSlots = typeof __propDef.slots;
12
+ export default class FlowRetries extends SvelteComponentTyped<FlowRetriesProps, FlowRetriesEvents, FlowRetriesSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,18 @@
1
+ <script>import CronInput from '../../CronInput.svelte';
2
+ import SchemaForm from '../../SchemaForm.svelte';
3
+ import Toggle from '../../Toggle.svelte';
4
+ import { getContext } from 'svelte';
5
+ import { flowStore } from '../flowStore';
6
+ const { schedule } = getContext('FlowEditorContext');
7
+ </script>
8
+
9
+ <CronInput bind:schedule={$schedule.cron} />
10
+
11
+ <SchemaForm schema={$flowStore.schema} bind:args={$schedule.args} />
12
+
13
+ <Toggle
14
+ bind:checked={$schedule.enabled}
15
+ options={{
16
+ right: 'Schedule enabled'
17
+ }}
18
+ />
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type FlowSchedulesProps = typeof __propDef.props;
10
+ export declare type FlowSchedulesEvents = typeof __propDef.events;
11
+ export declare type FlowSchedulesSlots = typeof __propDef.slots;
12
+ export default class FlowSchedules extends SvelteComponentTyped<FlowSchedulesProps, FlowSchedulesEvents, FlowSchedulesSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,51 @@
1
+ <script>import Tabs from '../../common/tabs/Tabs.svelte';
2
+ import Tab from '../../common/tabs/Tab.svelte';
3
+ import TabContent from '../../common/tabs/TabContent.svelte';
4
+ import { flowStore } from '../flowStore';
5
+ import Path from '../../Path.svelte';
6
+ import Required from '../../Required.svelte';
7
+ import { getContext } from 'svelte';
8
+ import FlowCard from '../common/FlowCard.svelte';
9
+ import FlowSchedules from './FlowSchedules.svelte';
10
+ import FlowRetries from './FlowRetries.svelte';
11
+ const { path } = getContext('FlowEditorContext');
12
+ export let defaultTab = 'configuration';
13
+ </script>
14
+
15
+ <FlowCard title="Settings">
16
+ <Tabs selected={defaultTab}>
17
+ <Tab value="configuration">Configuration</Tab>
18
+ <Tab value="schedule">Schedule</Tab>
19
+ <Tab value="retries">Retries</Tab>
20
+
21
+ <svelte:fragment slot="content">
22
+ <TabContent value="configuration" class="p-4">
23
+ <Path bind:path={$flowStore.path} initialPath={path} namePlaceholder="my_flow" kind="flow">
24
+ <div slot="ownerToolkit">
25
+ Flow permissions depend on their path. Select the group <span class="font-mono"
26
+ >all</span
27
+ >
28
+ to share your flow, and <span class="font-mono">user</span> to keep it private.
29
+ <a href="https://docs.windmill.dev/docs/reference/namespaces">docs</a>
30
+ </div>
31
+ </Path>
32
+
33
+ <label class="block mt-4">
34
+ <span class="text-gray-700">Summary <Required required={false} /></span>
35
+ <textarea
36
+ bind:value={$flowStore.summary}
37
+ class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"
38
+ placeholder="A very short summary of the flow displayed when the flow is listed"
39
+ rows="1"
40
+ />
41
+ </label>
42
+ </TabContent>
43
+ <TabContent value="schedule" class="p-4">
44
+ <FlowSchedules />
45
+ </TabContent>
46
+ <TabContent value="retries" class="px-4">
47
+ <FlowRetries />
48
+ </TabContent>
49
+ </svelte:fragment>
50
+ </Tabs>
51
+ </FlowCard>