windmill-components 1.444.2 → 1.447.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 (229) hide show
  1. package/package/autosize.js +1 -1
  2. package/package/components/AppConnectInner.svelte +2 -1
  3. package/package/components/ArgInput.svelte +37 -24
  4. package/package/components/CapturesInputs.svelte +16 -0
  5. package/package/components/CapturesInputs.svelte.d.ts +21 -0
  6. package/package/components/Dev.svelte +7 -1
  7. package/package/components/EditableSchemaForm.svelte +369 -290
  8. package/package/components/EditableSchemaForm.svelte.d.ts +12 -2
  9. package/package/components/Editor.svelte +5 -7
  10. package/package/components/FirstStepInputs.svelte +111 -0
  11. package/package/components/FirstStepInputs.svelte.d.ts +17 -0
  12. package/package/components/FlowBuilder.svelte +28 -7
  13. package/package/components/FlowPreviewContent.svelte +72 -1
  14. package/package/components/FlowPreviewContent.svelte.d.ts +1 -0
  15. package/package/components/GfmMarkdown.svelte +93 -2
  16. package/package/components/HighlightCode.svelte +2 -0
  17. package/package/components/HistoricInputs.svelte +193 -0
  18. package/package/components/HistoricInputs.svelte.d.ts +20 -0
  19. package/package/components/InfiniteList.svelte +161 -0
  20. package/package/components/InfiniteList.svelte.d.ts +40 -0
  21. package/package/components/LightweightArgInput.svelte +19 -15
  22. package/package/components/MoveDrawer.svelte +2 -1
  23. package/package/components/Path.svelte +7 -1
  24. package/package/components/Path.svelte.d.ts +1 -1
  25. package/package/components/ResourcePicker.svelte +2 -1
  26. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  27. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  28. package/package/components/SaveInputsButton.svelte +53 -0
  29. package/package/components/SaveInputsButton.svelte.d.ts +24 -0
  30. package/package/components/SavedInputs.svelte +33 -61
  31. package/package/components/SavedInputsPicker.svelte +264 -0
  32. package/package/components/SavedInputsPicker.svelte.d.ts +20 -0
  33. package/package/components/ScheduleEditorInner.svelte +0 -1
  34. package/package/components/SchemaForm.svelte +22 -3
  35. package/package/components/ScriptBuilder.svelte +595 -562
  36. package/package/components/ScriptEditor.svelte +10 -3
  37. package/package/components/ScriptEditor.svelte.d.ts +5 -2
  38. package/package/components/ScriptSchema.svelte +1 -2
  39. package/package/components/Section.svelte +6 -4
  40. package/package/components/ShareModal.svelte.d.ts +2 -2
  41. package/package/components/SimpleEditor.svelte +39 -7
  42. package/package/components/SimpleEditor.svelte.d.ts +1 -4
  43. package/package/components/StringTypeNarrowing.svelte +3 -1
  44. package/package/components/TestConnection.svelte +5 -0
  45. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  46. package/package/components/WorkerGroup.svelte +2 -1
  47. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -0
  48. package/package/components/apps/editor/component/components.d.ts +79 -79
  49. package/package/components/apps/editor/component/default-codes.d.ts +1 -1
  50. package/package/components/apps/editor/component/default-codes.js +10 -10
  51. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +2 -1
  52. package/package/components/apps/inputType.d.ts +2 -2
  53. package/package/components/common/button/Button.svelte +10 -52
  54. package/package/components/common/button/PulseButton.svelte +81 -0
  55. package/package/components/common/button/PulseButton.svelte.d.ts +34 -0
  56. package/package/components/common/button/RoundIconButton.svelte +11 -0
  57. package/package/components/common/button/RoundIconButton.svelte.d.ts +19 -0
  58. package/package/components/common/button/model.d.ts +1 -0
  59. package/package/components/common/button/model.js +47 -0
  60. package/package/components/common/fileUpload/FileUpload.svelte +3 -1
  61. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +1 -0
  62. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  63. package/package/components/common/layout/List.svelte +10 -4
  64. package/package/components/common/layout/List.svelte.d.ts +1 -0
  65. package/package/components/common/tabs/Tab.svelte +14 -1
  66. package/package/components/common/tabs/Tab.svelte.d.ts +1 -0
  67. package/package/components/copilot/ScriptGen.svelte +1 -1
  68. package/package/components/copilot/lib.js +1 -1
  69. package/package/components/copilot/prompts/edit.yaml +1 -1
  70. package/package/components/copilot/prompts/editPrompt.js +1 -1
  71. package/package/components/copilot/prompts/fix.yaml +1 -1
  72. package/package/components/copilot/prompts/fixPrompt.js +1 -1
  73. package/package/components/copilot/prompts/gen.yaml +1 -1
  74. package/package/components/copilot/prompts/genPrompt.js +1 -1
  75. package/package/components/custom_ui.d.ts +1 -0
  76. package/package/components/details/DetailPageDetailPanel.svelte +20 -19
  77. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +4 -1
  78. package/package/components/details/DetailPageLayout.svelte +4 -1
  79. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  80. package/package/components/details/DetailPageTriggerPanel.svelte +84 -63
  81. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +3 -1
  82. package/package/components/details/EmailTriggerConfigSection.svelte +1 -1
  83. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +2 -1
  84. package/package/components/details/EmailTriggerPanel.svelte +2 -0
  85. package/package/components/details/EmailTriggerPanel.svelte.d.ts +2 -0
  86. package/package/components/flows/FlowEditor.svelte +8 -2
  87. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  88. package/package/components/flows/common/FlowCard.svelte +12 -6
  89. package/package/components/flows/content/DynamicInputHelpBox.svelte +1 -0
  90. package/package/components/flows/content/FlowEditorPanel.svelte +15 -9
  91. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  92. package/package/components/flows/content/FlowInput.svelte +449 -98
  93. package/package/components/flows/content/FlowInput.svelte.d.ts +2 -0
  94. package/package/components/flows/content/FlowInputEditor.svelte +46 -0
  95. package/package/components/flows/content/FlowInputEditor.svelte.d.ts +25 -0
  96. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  97. package/package/components/flows/content/FlowLoop.svelte +192 -194
  98. package/package/components/flows/content/FlowModuleComponent.svelte +372 -382
  99. package/package/components/flows/content/FlowModuleMock.svelte +6 -7
  100. package/package/components/flows/content/FlowPathViewer.svelte +2 -1
  101. package/package/components/flows/content/FlowSettings.svelte +25 -3
  102. package/package/components/flows/content/FlowWhileLoop.svelte +97 -99
  103. package/package/components/flows/flowStore.d.ts +13 -0
  104. package/package/components/flows/flowStore.js +41 -0
  105. package/package/components/flows/header/FlowPreviewButtons.svelte +10 -4
  106. package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +4 -2
  107. package/package/components/flows/header/FlowYamlEditor.svelte +3 -0
  108. package/package/components/flows/map/FlowModuleSchemaItem.svelte +8 -58
  109. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +67 -0
  110. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte.d.ts +24 -0
  111. package/package/components/flows/map/FlowModuleSchemaMap.svelte +2 -2
  112. package/package/components/flows/pickers/FlowScriptPicker.svelte +1 -1
  113. package/package/components/flows/previousResults.d.ts +1 -1
  114. package/package/components/flows/previousResults.js +7 -2
  115. package/package/components/flows/types.d.ts +7 -0
  116. package/package/components/flows/utils.d.ts +1 -0
  117. package/package/components/flows/utils.js +3 -0
  118. package/package/components/graph/graphBuilder.js +1 -1
  119. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +22 -8
  120. package/package/components/graph/renderers/triggers/TriggersBadge.svelte.d.ts +1 -1
  121. package/package/components/icons/NatsIcon.svelte +19 -0
  122. package/package/components/icons/NatsIcon.svelte.d.ts +18 -0
  123. package/package/components/icons/OracleDBIcon.svelte +15 -0
  124. package/package/components/icons/OracleDBIcon.svelte.d.ts +25 -0
  125. package/package/components/icons/index.d.ts +7 -1
  126. package/package/components/icons/index.js +8 -2
  127. package/package/components/meltComponents/ButtonDropDown.svelte +32 -0
  128. package/package/components/meltComponents/ButtonDropDown.svelte.d.ts +27 -0
  129. package/package/components/meltComponents/Popover.svelte +7 -4
  130. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  131. package/package/components/runs/RunsFilter.svelte +2 -2
  132. package/package/components/schema/AddPropertyFormV2.svelte +46 -0
  133. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +18 -0
  134. package/package/components/schema/AddPropertyV2.svelte +151 -0
  135. package/package/components/schema/AddPropertyV2.svelte.d.ts +25 -0
  136. package/package/components/schema/EditableSchemaDrawer.svelte +17 -8
  137. package/package/components/schema/EditableSchemaWrapper.svelte +58 -14
  138. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +0 -1
  139. package/package/components/schema/FlowPropertyEditor.svelte +8 -3
  140. package/package/components/schema/JobSchemaPicker.svelte +32 -0
  141. package/package/components/schema/JobSchemaPicker.svelte.d.ts +19 -0
  142. package/package/components/schema/PropertyEditor.svelte +9 -1
  143. package/package/components/schema/RunningJobSchemaPicker.svelte +67 -0
  144. package/package/components/schema/RunningJobSchemaPicker.svelte.d.ts +21 -0
  145. package/package/components/schema/SchemaFormDND.svelte +1 -1
  146. package/package/components/schema/SchemaPicker.svelte +92 -0
  147. package/package/components/schema/SchemaPicker.svelte.d.ts +23 -0
  148. package/package/components/schema/SchemaPickerRow.svelte +95 -0
  149. package/package/components/schema/SchemaPickerRow.svelte.d.ts +22 -0
  150. package/package/components/scriptEditor/LogPanel.svelte +1 -1
  151. package/package/components/settings/ChangeWorkspaceColor.svelte +103 -0
  152. package/package/components/settings/ChangeWorkspaceColor.svelte.d.ts +16 -0
  153. package/package/components/settings/ChangeWorkspaceId.svelte +1 -0
  154. package/package/components/settings/ChangeWorkspaceName.svelte +4 -0
  155. package/package/components/sidebar/MenuButton.svelte +5 -2
  156. package/package/components/sidebar/MenuButton.svelte.d.ts +1 -0
  157. package/package/components/sidebar/SidebarContent.svelte +8 -0
  158. package/package/components/sidebar/WorkspaceMenu.svelte +40 -21
  159. package/package/components/table/DataTable.svelte +43 -3
  160. package/package/components/table/DataTable.svelte.d.ts +2 -0
  161. package/package/components/table/Head.svelte +1 -1
  162. package/package/components/table/Row.svelte +11 -1
  163. package/package/components/table/Row.svelte.d.ts +3 -0
  164. package/package/components/table/index.d.ts +3 -0
  165. package/package/components/table/index.js +3 -0
  166. package/package/components/triggers/CaptureButton.svelte +38 -4
  167. package/package/components/triggers/CaptureButton.svelte.d.ts +3 -1
  168. package/package/components/triggers/CaptureIcon.svelte +7 -4
  169. package/package/components/triggers/CaptureIcon.svelte.d.ts +7 -13
  170. package/package/components/triggers/CaptureSection.svelte +50 -17
  171. package/package/components/triggers/CaptureSection.svelte.d.ts +5 -3
  172. package/package/components/triggers/CaptureTable.svelte +239 -186
  173. package/package/components/triggers/CaptureTable.svelte.d.ts +9 -11
  174. package/package/components/triggers/CaptureWrapper.svelte +126 -109
  175. package/package/components/triggers/CaptureWrapper.svelte.d.ts +3 -1
  176. package/package/components/triggers/KafkaTriggerEditorInner.svelte +1 -0
  177. package/package/components/triggers/KafkaTriggersConfigSection.svelte +16 -4
  178. package/package/components/triggers/KafkaTriggersConfigSection.svelte.d.ts +3 -1
  179. package/package/components/triggers/KafkaTriggersPanel.svelte +2 -0
  180. package/package/components/triggers/KafkaTriggersPanel.svelte.d.ts +2 -0
  181. package/package/components/triggers/NatsTriggerEditor.svelte +19 -0
  182. package/package/components/triggers/NatsTriggerEditor.svelte.d.ts +21 -0
  183. package/package/components/triggers/NatsTriggerEditorInner.svelte +239 -0
  184. package/package/components/triggers/NatsTriggerEditorInner.svelte.d.ts +21 -0
  185. package/package/components/triggers/NatsTriggersConfigSection.svelte +276 -0
  186. package/package/components/triggers/NatsTriggersConfigSection.svelte.d.ts +37 -0
  187. package/package/components/triggers/NatsTriggersPanel.svelte +126 -0
  188. package/package/components/triggers/NatsTriggersPanel.svelte.d.ts +26 -0
  189. package/package/components/triggers/RouteEditorConfigSection.svelte +12 -2
  190. package/package/components/triggers/RouteEditorConfigSection.svelte.d.ts +5 -1
  191. package/package/components/triggers/RouteEditorInner.svelte +5 -0
  192. package/package/components/triggers/RoutesPanel.svelte +4 -0
  193. package/package/components/triggers/RoutesPanel.svelte.d.ts +3 -0
  194. package/package/components/triggers/TriggersEditor.svelte +146 -97
  195. package/package/components/triggers/TriggersEditor.svelte.d.ts +2 -0
  196. package/package/components/triggers/TriggersEditorSection.svelte +19 -13
  197. package/package/components/triggers/TriggersEditorSection.svelte.d.ts +3 -0
  198. package/package/components/triggers/TriggersWrapper.svelte +7 -3
  199. package/package/components/triggers/TriggersWrapper.svelte.d.ts +2 -1
  200. package/package/components/triggers/WebhooksConfigSection.svelte +1 -0
  201. package/package/components/triggers/WebhooksConfigSection.svelte.d.ts +2 -1
  202. package/package/components/triggers/WebhooksPanel.svelte +2 -0
  203. package/package/components/triggers/WebhooksPanel.svelte.d.ts +2 -0
  204. package/package/components/triggers/WebsocketEditorConfigSection.svelte +3 -1
  205. package/package/components/triggers/WebsocketEditorConfigSection.svelte.d.ts +2 -1
  206. package/package/components/triggers/WebsocketTriggersPanel.svelte +2 -0
  207. package/package/components/triggers/WebsocketTriggersPanel.svelte.d.ts +2 -0
  208. package/package/components/triggers.d.ts +2 -1
  209. package/package/components/triggers.js +2 -0
  210. package/package/components/vscode.js +12 -8
  211. package/package/consts.d.ts +1 -0
  212. package/package/consts.js +18 -0
  213. package/package/gen/core/OpenAPI.js +1 -1
  214. package/package/gen/schemas.gen.d.ts +207 -13
  215. package/package/gen/schemas.gen.js +207 -13
  216. package/package/gen/services.gen.d.ts +118 -10
  217. package/package/gen/services.gen.js +237 -17
  218. package/package/gen/types.gen.d.ts +400 -40
  219. package/package/hubPaths.json +2 -1
  220. package/package/infer.js +11 -2
  221. package/package/monaco_workers/build_workers.js +39 -37
  222. package/package/monaco_workers/graphql.worker.bundle.js +18371 -36513
  223. package/package/script_helpers.d.ts +5 -2
  224. package/package/script_helpers.js +46 -8
  225. package/package/scripts.js +4 -0
  226. package/package/stores.d.ts +2 -1
  227. package/package/stores.js +2 -1
  228. package/package.json +14 -16
  229. package/package/monaco_workers/graphql.worker.bundle.d.ts +0 -0
@@ -10,7 +10,7 @@ import FlowCard from '../common/FlowCard.svelte';
10
10
  import FlowModuleHeader from './FlowModuleHeader.svelte';
11
11
  import { getLatestHashForScript, scriptLangToEditorLang } from '../../../scripts';
12
12
  import PropPickerWrapper from '../propPicker/PropPickerWrapper.svelte';
13
- import { afterUpdate, getContext, tick } from 'svelte';
13
+ import { getContext, tick } from 'svelte';
14
14
  import FlowModuleScript from './FlowModuleScript.svelte';
15
15
  import FlowModuleEarlyStop from './FlowModuleEarlyStop.svelte';
16
16
  import FlowModuleSuspend from './FlowModuleSuspend.svelte';
@@ -67,9 +67,6 @@ let selected = preprocessorModule ? 'test' : 'inputs';
67
67
  let advancedSelected = 'retries';
68
68
  let advancedRuntimeSelected = 'concurrency';
69
69
  let s3Kind = 's3_client';
70
- let wrapper;
71
- let panes;
72
- let totalTopGap = 0;
73
70
  let validCode = true;
74
71
  let width = 1200;
75
72
  const { modulesStore: copilotModulesStore } = getContext('FlowCopilotContext') || {};
@@ -135,14 +132,6 @@ function selectAdvanced(subtab) {
135
132
  selected = 'advanced';
136
133
  advancedSelected = subtab;
137
134
  }
138
- afterUpdate(() => {
139
- totalTopGap = 0;
140
- if (!(wrapper && panes))
141
- return;
142
- const wrapperTop = wrapper.getBoundingClientRect().top;
143
- const panesTop = panes.getBoundingClientRect().top;
144
- totalTopGap = panesTop - wrapperTop;
145
- });
146
135
  let forceReload = 0;
147
136
  let editorPanelSize = noEditor ? 0 : flowModule.value.type == 'script' ? 30 : 50;
148
137
  let editorSettingsPanelSize = 100 - editorPanelSize;
@@ -170,7 +159,7 @@ function setFlowInput(argName) {
170
159
  <svelte:window on:keydown={onKeyDown} />
171
160
 
172
161
  {#if flowModule.value}
173
- <div class="h-full" bind:this={wrapper} bind:clientWidth={width}>
162
+ <div class="h-full" bind:clientWidth={width}>
174
163
  <FlowCard
175
164
  on:reload={() => {
176
165
  forceReload++
@@ -224,400 +213,401 @@ function setFlowInput(argName) {
224
213
  />
225
214
  </svelte:fragment>
226
215
 
227
- {#if flowModule.value.type === 'rawscript' && !noEditor}
228
- <div class="border-b-2 shadow-sm px-1">
229
- <EditorBar
230
- customUi={customUi?.editorBar}
231
- {validCode}
232
- {editor}
233
- {diffEditor}
234
- lang={flowModule.value['language'] ?? 'deno'}
235
- {websocketAlive}
236
- iconOnly={width < 950}
237
- kind={scriptKind}
238
- template={scriptTemplate}
239
- args={Object.entries(flowModule.value.input_transforms).reduce((acc, [key, obj]) => {
240
- acc[key] = obj.type === 'static' ? obj.value : undefined
241
- return acc
242
- }, {})}
243
- />
244
- </div>
245
- {/if}
216
+ <div class="h-full flex flex-col">
217
+ {#if flowModule.value.type === 'rawscript' && !noEditor}
218
+ <div class="border-b-2 shadow-sm px-1">
219
+ <EditorBar
220
+ customUi={customUi?.editorBar}
221
+ {validCode}
222
+ {editor}
223
+ {diffEditor}
224
+ lang={flowModule.value['language'] ?? 'deno'}
225
+ {websocketAlive}
226
+ iconOnly={width < 950}
227
+ kind={scriptKind}
228
+ template={scriptTemplate}
229
+ args={Object.entries(flowModule.value.input_transforms).reduce((acc, [key, obj]) => {
230
+ acc[key] = obj.type === 'static' ? obj.value : undefined
231
+ return acc
232
+ }, {})}
233
+ />
234
+ </div>
235
+ {/if}
246
236
 
247
- <div
248
- bind:this={panes}
249
- class="h-full"
250
- style="max-height: calc(100% - {totalTopGap}px) !important;"
251
- id="flow-editor-editor"
252
- >
253
- <Splitpanes horizontal>
254
- <Pane bind:size={editorPanelSize} minSize={20}>
255
- {#if flowModule.value.type === 'rawscript'}
256
- {#if !noEditor}
257
- {#key flowModule.id}
258
- <Editor
259
- folding
260
- path={$pathStore + '/' + flowModule.id}
261
- bind:websocketAlive
262
- bind:this={editor}
263
- class="h-full relative"
264
- bind:code={flowModule.value.content}
265
- lang={scriptLangToEditorLang(flowModule.value.language)}
266
- scriptLang={flowModule.value.language}
267
- automaticLayout={true}
268
- cmdEnterAction={async () => {
269
- selected = 'test'
270
- if ($selectedId == flowModule.id) {
237
+ <div class="min-h-0 flex-grow" id="flow-editor-editor">
238
+ <Splitpanes horizontal>
239
+ <Pane bind:size={editorPanelSize} minSize={10}>
240
+ {#if flowModule.value.type === 'rawscript'}
241
+ {#if !noEditor}
242
+ {#key flowModule.id}
243
+ <Editor
244
+ folding
245
+ path={$pathStore + '/' + flowModule.id}
246
+ bind:websocketAlive
247
+ bind:this={editor}
248
+ class="h-full relative"
249
+ bind:code={flowModule.value.content}
250
+ lang={scriptLangToEditorLang(flowModule.value.language)}
251
+ scriptLang={flowModule.value.language}
252
+ automaticLayout={true}
253
+ cmdEnterAction={async () => {
254
+ selected = 'test'
255
+ if ($selectedId == flowModule.id) {
256
+ if (flowModule.value.type === 'rawscript') {
257
+ flowModule.value.content = editor.getCode()
258
+ }
259
+ await reload(flowModule)
260
+ modulePreview?.runTestWithStepArgs()
261
+ }
262
+ }}
263
+ on:change={async (event) => {
271
264
  if (flowModule.value.type === 'rawscript') {
272
- flowModule.value.content = editor.getCode()
265
+ flowModule.value.content = event.detail
273
266
  }
274
267
  await reload(flowModule)
275
- modulePreview?.runTestWithStepArgs()
276
- }
277
- }}
278
- on:change={async (event) => {
279
- if (flowModule.value.type === 'rawscript') {
280
- flowModule.value.content = event.detail
281
- }
282
- await reload(flowModule)
283
- }}
284
- formatAction={() => {
285
- reload(flowModule)
286
- saveDraft()
287
- }}
288
- fixedOverflowWidgets={true}
289
- args={Object.entries(flowModule.value.input_transforms).reduce(
290
- (acc, [key, obj]) => {
291
- acc[key] = obj.type === 'static' ? obj.value : undefined
292
- return acc
293
- },
294
- {}
295
- )}
296
- />
297
- <DiffEditor
298
- open={false}
299
- bind:this={diffEditor}
300
- automaticLayout
301
- fixedOverflowWidgets
302
- defaultLang={scriptLangToEditorLang(flowModule.value.language)}
303
- class="h-full"
304
- />
305
- {/key}
306
- {/if}
307
- {:else if flowModule.value.type === 'script'}
308
- {#if !noEditor}
309
- <div class="border-t">
310
- {#key forceReload}
311
- <FlowModuleScript
312
- bind:tag
313
- showAllCode={false}
314
- path={flowModule.value.path}
315
- hash={flowModule.value.hash}
268
+ }}
269
+ formatAction={() => {
270
+ reload(flowModule)
271
+ saveDraft()
272
+ }}
273
+ fixedOverflowWidgets={true}
274
+ args={Object.entries(flowModule.value.input_transforms).reduce(
275
+ (acc, [key, obj]) => {
276
+ acc[key] = obj.type === 'static' ? obj.value : undefined
277
+ return acc
278
+ },
279
+ {}
280
+ )}
281
+ />
282
+ <DiffEditor
283
+ open={false}
284
+ bind:this={diffEditor}
285
+ automaticLayout
286
+ fixedOverflowWidgets
287
+ defaultLang={scriptLangToEditorLang(flowModule.value.language)}
288
+ class="h-full"
316
289
  />
317
290
  {/key}
318
- </div>
319
- {/if}
320
- {:else if flowModule.value.type === 'flow'}
321
- {#key forceReload}
322
- <FlowPathViewer path={flowModule.value.path} />
323
- {/key}
324
- {/if}
325
- </Pane>
326
- <Pane bind:size={editorSettingsPanelSize} minSize={20}>
327
- <Tabs bind:selected>
328
- {#if !preprocessorModule}
329
- <Tab value="inputs">Step Input</Tab>
330
- {/if}
331
- <Tab value="test">Test this step</Tab>
332
- {#if !preprocessorModule}
333
- <Tab value="advanced">Advanced</Tab>
291
+ {/if}
292
+ {:else if flowModule.value.type === 'script'}
293
+ {#if !noEditor && (customUi?.hubCode != false || flowModule?.value?.path?.startsWith('hub/'))}
294
+ <div class="border-t">
295
+ {#key forceReload}
296
+ <FlowModuleScript
297
+ bind:tag
298
+ showAllCode={false}
299
+ path={flowModule.value.path}
300
+ hash={flowModule.value.hash}
301
+ />
302
+ {/key}
303
+ </div>
304
+ {/if}
305
+ {:else if flowModule.value.type === 'flow'}
306
+ {#key forceReload}
307
+ <FlowPathViewer path={flowModule.value.path} />
308
+ {/key}
334
309
  {/if}
335
- </Tabs>
336
- <div
337
- class={advancedSelected === 'runtime' ? 'h-[calc(100%-68px)]' : 'h-[calc(100%-34px)]'}
338
- >
339
- {#if selected === 'inputs' && (flowModule.value.type == 'rawscript' || flowModule.value.type == 'script' || flowModule.value.type == 'flow')}
340
- <div class="h-full overflow-auto bg-surface" id="flow-editor-step-input">
341
- <PropPickerWrapper
342
- pickableProperties={stepPropPicker.pickableProperties}
343
- error={failureModule}
344
- noPadding
345
- >
346
- <InputTransformSchemaForm
347
- class="px-1 xl:px-2"
348
- bind:this={inputTransformSchemaForm}
310
+ </Pane>
311
+ <Pane bind:size={editorSettingsPanelSize} minSize={20}>
312
+ <Tabs bind:selected>
313
+ {#if !preprocessorModule}
314
+ <Tab value="inputs">Step Input</Tab>
315
+ {/if}
316
+ <Tab value="test">Test this step</Tab>
317
+ {#if !preprocessorModule}
318
+ <Tab value="advanced">Advanced</Tab>
319
+ {/if}
320
+ </Tabs>
321
+ <div
322
+ class={advancedSelected === 'runtime'
323
+ ? 'h-[calc(100%-68px)]'
324
+ : 'h-[calc(100%-34px)]'}
325
+ >
326
+ {#if selected === 'inputs' && (flowModule.value.type == 'rawscript' || flowModule.value.type == 'script' || flowModule.value.type == 'flow')}
327
+ <div class="h-full overflow-auto bg-surface" id="flow-editor-step-input">
328
+ <PropPickerWrapper
349
329
  pickableProperties={stepPropPicker.pickableProperties}
350
- schema={$flowStateStore[$selectedId]?.schema ?? {}}
351
- previousModuleId={previousModule?.id}
352
- bind:args={flowModule.value.input_transforms}
353
- extraLib={stepPropPicker.extraLib}
354
- {enableAi}
355
- on:changeArg={(e) => {
356
- const { argName } = e.detail
357
- setFlowInput(argName)
358
- }}
359
- />
360
- </PropPickerWrapper>
361
- </div>
362
- {:else if selected === 'test'}
363
- <ModulePreview
364
- pickableProperties={stepPropPicker.pickableProperties}
365
- bind:this={modulePreview}
366
- mod={flowModule}
367
- {editor}
368
- {diffEditor}
369
- {noEditor}
370
- lang={flowModule.value['language'] ?? 'deno'}
371
- schema={$flowStateStore[$selectedId]?.schema ?? {}}
372
- />
373
- {:else if selected === 'advanced'}
374
- <Tabs bind:selected={advancedSelected}>
375
- <Tab value="retries" active={flowModule.retry !== undefined}>Retries</Tab>
376
- {#if !$selectedId.includes('failure')}
377
- <Tab value="runtime">Runtime</Tab>
378
- <Tab value="cache" active={Boolean(flowModule.cache_ttl)}>Cache</Tab>
379
- <Tab
380
- value="early-stop"
381
- active={Boolean(
382
- flowModule.stop_after_if || flowModule.stop_after_all_iters_if
383
- )}
330
+ error={failureModule}
331
+ noPadding
384
332
  >
385
- Early Stop
386
- </Tab>
387
- <Tab value="skip" active={Boolean(flowModule.skip_if)}>Skip</Tab>
388
- <Tab value="suspend" active={Boolean(flowModule.suspend)}>Suspend</Tab>
389
- <Tab value="sleep" active={Boolean(flowModule.sleep)}>Sleep</Tab>
390
- <Tab value="mock" active={Boolean(flowModule.mock?.enabled)}>Mock</Tab>
391
- <Tab value="same_worker">Shared Directory</Tab>
392
- {#if flowModule.value['language'] === 'python3' || flowModule.value['language'] === 'deno'}
393
- <Tab value="s3">S3</Tab>
333
+ <InputTransformSchemaForm
334
+ class="px-1 xl:px-2"
335
+ bind:this={inputTransformSchemaForm}
336
+ pickableProperties={stepPropPicker.pickableProperties}
337
+ schema={$flowStateStore[$selectedId]?.schema ?? {}}
338
+ previousModuleId={previousModule?.id}
339
+ bind:args={flowModule.value.input_transforms}
340
+ extraLib={stepPropPicker.extraLib}
341
+ {enableAi}
342
+ on:changeArg={(e) => {
343
+ const { argName } = e.detail
344
+ setFlowInput(argName)
345
+ }}
346
+ />
347
+ </PropPickerWrapper>
348
+ </div>
349
+ {:else if selected === 'test'}
350
+ <ModulePreview
351
+ pickableProperties={stepPropPicker.pickableProperties}
352
+ bind:this={modulePreview}
353
+ mod={flowModule}
354
+ {editor}
355
+ {diffEditor}
356
+ {noEditor}
357
+ lang={flowModule.value['language'] ?? 'deno'}
358
+ schema={$flowStateStore[$selectedId]?.schema ?? {}}
359
+ />
360
+ {:else if selected === 'advanced'}
361
+ <Tabs bind:selected={advancedSelected}>
362
+ <Tab value="retries" active={flowModule.retry !== undefined}>Retries</Tab>
363
+ {#if !$selectedId.includes('failure')}
364
+ <Tab value="runtime">Runtime</Tab>
365
+ <Tab value="cache" active={Boolean(flowModule.cache_ttl)}>Cache</Tab>
366
+ <Tab
367
+ value="early-stop"
368
+ active={Boolean(
369
+ flowModule.stop_after_if || flowModule.stop_after_all_iters_if
370
+ )}
371
+ >
372
+ Early Stop
373
+ </Tab>
374
+ <Tab value="skip" active={Boolean(flowModule.skip_if)}>Skip</Tab>
375
+ <Tab value="suspend" active={Boolean(flowModule.suspend)}>Suspend</Tab>
376
+ <Tab value="sleep" active={Boolean(flowModule.sleep)}>Sleep</Tab>
377
+ <Tab value="mock" active={Boolean(flowModule.mock?.enabled)}>Mock</Tab>
378
+ <Tab value="same_worker">Shared Directory</Tab>
379
+ {#if flowModule.value['language'] === 'python3' || flowModule.value['language'] === 'deno'}
380
+ <Tab value="s3">S3</Tab>
381
+ {/if}
394
382
  {/if}
395
- {/if}
396
- </Tabs>
397
- {#if advancedSelected === 'runtime'}
398
- <Tabs bind:selected={advancedRuntimeSelected}>
399
- <Tab value="concurrency">Concurrency</Tab>
400
- <Tab value="timeout">Timeout</Tab>
401
- <Tab value="priority">Priority</Tab>
402
- <Tab value="lifetime">Lifetime</Tab>
403
383
  </Tabs>
404
- {/if}
405
- <div class="h-[calc(100%-32px)] overflow-auto p-4">
406
- {#if advancedSelected === 'retries'}
407
- <Section label="Retries">
408
- <svelte:fragment slot="header">
409
- <Tooltip documentationLink="https://www.windmill.dev/docs/flows/retries">
410
- If defined, upon error this step will be retried with a delay and a
411
- maximum number of attempts as defined below.
412
- </Tooltip>
413
- </svelte:fragment>
414
- <span class="text-2xs">After all retries attempts have been exhausted:</span>
415
- <div class="flex gap-2 mb-4">
384
+ {#if advancedSelected === 'runtime'}
385
+ <Tabs bind:selected={advancedRuntimeSelected}>
386
+ <Tab value="concurrency">Concurrency</Tab>
387
+ <Tab value="timeout">Timeout</Tab>
388
+ <Tab value="priority">Priority</Tab>
389
+ <Tab value="lifetime">Lifetime</Tab>
390
+ </Tabs>
391
+ {/if}
392
+ <div class="h-[calc(100%-32px)] overflow-auto p-4">
393
+ {#if advancedSelected === 'retries'}
394
+ <Section label="Retries">
395
+ <svelte:fragment slot="header">
396
+ <Tooltip documentationLink="https://www.windmill.dev/docs/flows/retries">
397
+ If defined, upon error this step will be retried with a delay and a
398
+ maximum number of attempts as defined below.
399
+ </Tooltip>
400
+ </svelte:fragment>
401
+ <span class="text-2xs">After all retries attempts have been exhausted:</span
402
+ >
403
+ <div class="flex gap-2 mb-4">
404
+ <Toggle
405
+ size="xs"
406
+ bind:checked={flowModule.continue_on_error}
407
+ options={{
408
+ left: 'Stop on error and propagate error up',
409
+ right: "Continue on error with error as step's return"
410
+ }}
411
+ />
412
+ <Tooltip>
413
+ When enabled, the flow will continue to the next step after going
414
+ through all the retries (if any) even if this step fails. This enables
415
+ to process the error in a branch one for instance.
416
+ </Tooltip>
417
+ </div>
418
+ <div class="my-8" />
419
+ <FlowRetries bind:flowModuleRetry={flowModule.retry} />
420
+ </Section>
421
+ {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'concurrency'}
422
+ <Section label="Concurrency limits" class="flex flex-col gap-4" eeOnly>
423
+ <svelte:fragment slot="header">
424
+ <Tooltip>Allowed concurrency within a given timeframe</Tooltip>
425
+ </svelte:fragment>
426
+ {#if flowModule.value.type == 'rawscript'}
427
+ <Label label="Max number of executions within the time window">
428
+ <div class="flex flex-row gap-2 max-w-sm">
429
+ <input
430
+ disabled={!$enterpriseLicense}
431
+ bind:value={flowModule.value.concurrent_limit}
432
+ type="number"
433
+ />
434
+ <Button
435
+ size="xs"
436
+ color="light"
437
+ variant="border"
438
+ on:click={() => {
439
+ if (flowModule.value.type == 'rawscript') {
440
+ flowModule.value.concurrent_limit = undefined
441
+ }
442
+ }}
443
+ >
444
+ <div class="flex flex-row gap-2"> Remove Limits </div>
445
+ </Button>
446
+ </div>
447
+ </Label>
448
+ <Label label="Time window in seconds">
449
+ <SecondsInput
450
+ disabled={!$enterpriseLicense}
451
+ bind:seconds={flowModule.value.concurrency_time_window_s}
452
+ />
453
+ </Label>
454
+ <Label label="Custom concurrency key (optional)">
455
+ <svelte:fragment slot="header">
456
+ <Tooltip>
457
+ Concurrency keys are global, you can have them be workspace specific
458
+ using the variable `$workspace`. You can also use an argument's
459
+ value using `$args[name_of_arg]`</Tooltip
460
+ >
461
+ </svelte:fragment>
462
+ <!-- svelte-ignore a11y-autofocus -->
463
+ <input
464
+ type="text"
465
+ autofocus
466
+ disabled={!$enterpriseLicense}
467
+ bind:value={flowModule.value.custom_concurrency_key}
468
+ placeholder={`$workspace/script/${$pathStore}-$args[foo]`}
469
+ />
470
+ </Label>
471
+ {:else}
472
+ <Alert type="warning" title="Limitation" size="xs">
473
+ The concurrency limit of a workspace script is only settable in the
474
+ script metadata itself. For hub scripts, this feature is non available
475
+ yet.
476
+ </Alert>
477
+ {/if}
478
+ </Section>
479
+ {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'timeout'}
480
+ <div>
481
+ <FlowModuleTimeout bind:flowModule />
482
+ </div>
483
+ {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'priority'}
484
+ <Section label="Priority" class="flex flex-col gap-4">
485
+ <!-- TODO: Add EE-only badge when we have it -->
416
486
  <Toggle
417
- size="xs"
418
- bind:checked={flowModule.continue_on_error}
487
+ disabled={!$enterpriseLicense || isCloudHosted()}
488
+ checked={flowModule.priority !== undefined && flowModule.priority > 0}
489
+ on:change={() => {
490
+ if (flowModule.priority) {
491
+ flowModule.priority = undefined
492
+ } else {
493
+ flowModule.priority = 100
494
+ }
495
+ }}
419
496
  options={{
420
- left: 'Stop on error and propagate error up',
421
- right: "Continue on error with error as step's return"
497
+ right: 'Enabled high priority flow step',
498
+ rightTooltip: `Jobs scheduled from this step when the flow is executed are labeled as high priority and take precedence over the other jobs in the jobs queue. ${
499
+ !$enterpriseLicense
500
+ ? 'This is a feature only available on enterprise edition.'
501
+ : ''
502
+ }`
422
503
  }}
423
504
  />
424
- <Tooltip>
425
- When enabled, the flow will continue to the next step after going through
426
- all the retries (if any) even if this step fails. This enables to process
427
- the error in a branch one for instance.
428
- </Tooltip>
429
- </div>
430
- <div class="my-8" />
431
- <FlowRetries bind:flowModuleRetry={flowModule.retry} />
432
- </Section>
433
- {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'concurrency'}
434
- <Section label="Concurrency limits" class="flex flex-col gap-4" eeOnly>
435
- <svelte:fragment slot="header">
436
- <Tooltip>Allowed concurrency within a given timeframe</Tooltip>
437
- </svelte:fragment>
438
- {#if flowModule.value.type == 'rawscript'}
439
- <Label label="Max number of executions within the time window">
440
- <div class="flex flex-row gap-2 max-w-sm">
441
- <input
442
- disabled={!$enterpriseLicense}
443
- bind:value={flowModule.value.concurrent_limit}
444
- type="number"
445
- />
446
- <Button
447
- size="xs"
448
- color="light"
449
- variant="border"
450
- on:click={() => {
451
- if (flowModule.value.type == 'rawscript') {
452
- flowModule.value.concurrent_limit = undefined
453
- }
454
- }}
455
- >
456
- <div class="flex flex-row gap-2"> Remove Limits </div>
457
- </Button>
458
- </div>
459
- </Label>
460
- <Label label="Time window in seconds">
461
- <SecondsInput
462
- disabled={!$enterpriseLicense}
463
- bind:seconds={flowModule.value.concurrency_time_window_s}
464
- />
465
- </Label>
466
- <Label label="Custom concurrency key (optional)">
505
+ <Label label="Priority number">
467
506
  <svelte:fragment slot="header">
468
- <Tooltip>
469
- Concurrency keys are global, you can have them be workspace specific
470
- using the variable `$workspace`. You can also use an argument's value
471
- using `$args[name_of_arg]`</Tooltip
472
- >
507
+ <Tooltip>The higher the number, the higher the priority.</Tooltip>
473
508
  </svelte:fragment>
474
- <!-- svelte-ignore a11y-autofocus -->
475
509
  <input
476
- type="text"
477
- autofocus
478
- disabled={!$enterpriseLicense}
479
- bind:value={flowModule.value.custom_concurrency_key}
480
- placeholder={`$workspace/script/${$pathStore}-$args[foo]`}
510
+ type="number"
511
+ class="!w-24"
512
+ disabled={flowModule.priority === undefined}
513
+ bind:value={flowModule.priority}
514
+ on:focus
515
+ on:change={() => {
516
+ if (flowModule.priority && flowModule.priority > 100) {
517
+ flowModule.priority = 100
518
+ } else if (flowModule.priority && flowModule.priority < 0) {
519
+ flowModule.priority = 0
520
+ }
521
+ }}
481
522
  />
482
523
  </Label>
483
- {:else}
524
+
484
525
  <Alert type="warning" title="Limitation" size="xs">
485
- The concurrency limit of a workspace script is only settable in the script
486
- metadata itself. For hub scripts, this feature is non available yet.
526
+ Setting priority is only available for enterprise edition and not
527
+ available on the cloud.
487
528
  </Alert>
488
- {/if}
489
- </Section>
490
- {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'timeout'}
491
- <div>
492
- <FlowModuleTimeout bind:flowModule />
493
- </div>
494
- {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'priority'}
495
- <Section label="Priority" class="flex flex-col gap-4">
496
- <!-- TODO: Add EE-only badge when we have it -->
497
- <Toggle
498
- disabled={!$enterpriseLicense || isCloudHosted()}
499
- checked={flowModule.priority !== undefined && flowModule.priority > 0}
500
- on:change={() => {
501
- if (flowModule.priority) {
502
- flowModule.priority = undefined
503
- } else {
504
- flowModule.priority = 100
505
- }
506
- }}
507
- options={{
508
- right: 'Enabled high priority flow step',
509
- rightTooltip: `Jobs scheduled from this step when the flow is executed are labeled as high priority and take precedence over the other jobs in the jobs queue. ${
510
- !$enterpriseLicense
511
- ? 'This is a feature only available on enterprise edition.'
512
- : ''
513
- }`
514
- }}
515
- />
516
- <Label label="Priority number">
517
- <svelte:fragment slot="header">
518
- <Tooltip>The higher the number, the higher the priority.</Tooltip>
519
- </svelte:fragment>
520
- <input
521
- type="number"
522
- class="!w-24"
523
- disabled={flowModule.priority === undefined}
524
- bind:value={flowModule.priority}
525
- on:focus
526
- on:change={() => {
527
- if (flowModule.priority && flowModule.priority > 100) {
528
- flowModule.priority = 100
529
- } else if (flowModule.priority && flowModule.priority < 0) {
530
- flowModule.priority = 0
531
- }
529
+ </Section>
530
+ {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'lifetime'}
531
+ <div>
532
+ <FlowModuleDeleteAfterUse bind:flowModule disabled={!$enterpriseLicense} />
533
+ </div>
534
+ {:else if advancedSelected === 'cache'}
535
+ <div>
536
+ <FlowModuleCache bind:flowModule />
537
+ </div>
538
+ {:else if advancedSelected === 'early-stop'}
539
+ <FlowModuleEarlyStop bind:flowModule />
540
+ {:else if advancedSelected === 'skip'}
541
+ <FlowModuleSkip bind:flowModule {parentModule} {previousModule} />
542
+ {:else if advancedSelected === 'suspend'}
543
+ <div>
544
+ <FlowModuleSuspend previousModuleId={previousModule?.id} bind:flowModule />
545
+ </div>
546
+ {:else if advancedSelected === 'sleep'}
547
+ <div>
548
+ <FlowModuleSleep previousModuleId={previousModule?.id} bind:flowModule />
549
+ </div>
550
+ {:else if advancedSelected === 'mock'}
551
+ <div>
552
+ <FlowModuleMock bind:flowModule />
553
+ </div>
554
+ {:else if advancedSelected === 'same_worker'}
555
+ <div>
556
+ <Alert type="info" title="Share a directory between steps">
557
+ If shared directory is set, will share a folder that will be mounted on
558
+ `./shared` for each of them to pass data between each other.
559
+ </Alert>
560
+ <Button
561
+ btnClasses="mt-4"
562
+ on:click={() => {
563
+ $selectedId = 'settings-same-worker'
532
564
  }}
533
- />
534
- </Label>
535
-
536
- <Alert type="warning" title="Limitation" size="xs">
537
- Setting priority is only available for enterprise edition and not available
538
- on the cloud.
539
- </Alert>
540
- </Section>
541
- {:else if advancedSelected === 'runtime' && advancedRuntimeSelected === 'lifetime'}
542
- <div>
543
- <FlowModuleDeleteAfterUse bind:flowModule disabled={!$enterpriseLicense} />
544
- </div>
545
- {:else if advancedSelected === 'cache'}
546
- <div>
547
- <FlowModuleCache bind:flowModule />
548
- </div>
549
- {:else if advancedSelected === 'early-stop'}
550
- <FlowModuleEarlyStop bind:flowModule />
551
- {:else if advancedSelected === 'skip'}
552
- <FlowModuleSkip bind:flowModule {parentModule} {previousModule} />
553
- {:else if advancedSelected === 'suspend'}
554
- <div>
555
- <FlowModuleSuspend previousModuleId={previousModule?.id} bind:flowModule />
556
- </div>
557
- {:else if advancedSelected === 'sleep'}
558
- <div>
559
- <FlowModuleSleep previousModuleId={previousModule?.id} bind:flowModule />
560
- </div>
561
- {:else if advancedSelected === 'mock'}
562
- <div>
563
- <FlowModuleMock bind:flowModule />
564
- </div>
565
- {:else if advancedSelected === 'same_worker'}
566
- <div>
567
- <Alert type="info" title="Share a directory between steps">
568
- If shared directory is set, will share a folder that will be mounted on
569
- `./shared` for each of them to pass data between each other.
570
- </Alert>
571
- <Button
572
- btnClasses="mt-4"
573
- on:click={() => {
574
- $selectedId = 'settings-same-worker'
575
- }}
576
- >
577
- Set shared directory in the flow settings
578
- </Button>
579
- </div>
580
- {:else if advancedSelected === 's3'}
581
- <div>
582
- <h2 class="pb-4">
583
- S3 snippets
584
- <Tooltip>
585
- Read/Write object from/to S3 and leverage Polars and DuckDB to run
586
- efficient ETL processes.
587
- </Tooltip>
588
- </h2>
589
- </div>
590
- <div class="flex gap-2 justify-between mb-4 items-center">
591
- <div class="flex gap-2">
592
- <ToggleButtonGroup bind:selected={s3Kind} class="w-auto">
593
- {#if flowModule.value['language'] === 'deno'}
594
- <ToggleButton value="s3_client" size="sm" label="S3 lite client" />
595
- {:else}
596
- <ToggleButton value="s3_client" size="sm" label="Boto3" />
597
- <ToggleButton value="polars" size="sm" label="Polars" />
598
- <ToggleButton value="duckdb" size="sm" label="DuckDB" />
599
- {/if}
600
- </ToggleButtonGroup>
565
+ >
566
+ Set shared directory in the flow settings
567
+ </Button>
601
568
  </div>
569
+ {:else if advancedSelected === 's3'}
570
+ <div>
571
+ <h2 class="pb-4">
572
+ S3 snippets
573
+ <Tooltip>
574
+ Read/Write object from/to S3 and leverage Polars and DuckDB to run
575
+ efficient ETL processes.
576
+ </Tooltip>
577
+ </h2>
578
+ </div>
579
+ <div class="flex gap-2 justify-between mb-4 items-center">
580
+ <div class="flex gap-2">
581
+ <ToggleButtonGroup bind:selected={s3Kind} class="w-auto">
582
+ {#if flowModule.value['language'] === 'deno'}
583
+ <ToggleButton value="s3_client" size="sm" label="S3 lite client" />
584
+ {:else}
585
+ <ToggleButton value="s3_client" size="sm" label="Boto3" />
586
+ <ToggleButton value="polars" size="sm" label="Polars" />
587
+ <ToggleButton value="duckdb" size="sm" label="DuckDB" />
588
+ {/if}
589
+ </ToggleButtonGroup>
590
+ </div>
602
591
 
603
- <Button
604
- size="xs"
605
- on:click={() =>
606
- editor.setCode(s3Scripts[flowModule.value['language']][s3Kind])}
607
- >
608
- Apply snippet
609
- </Button>
610
- </div>
611
- <HighlightCode
612
- language={flowModule.value['language']}
613
- code={s3Scripts[flowModule.value['language']][s3Kind]}
614
- />
615
- {/if}
616
- </div>
617
- {/if}
618
- </div>
619
- </Pane>
620
- </Splitpanes>
592
+ <Button
593
+ size="xs"
594
+ on:click={() =>
595
+ editor.setCode(s3Scripts[flowModule.value['language']][s3Kind])}
596
+ >
597
+ Apply snippet
598
+ </Button>
599
+ </div>
600
+ <HighlightCode
601
+ language={flowModule.value['language']}
602
+ code={s3Scripts[flowModule.value['language']][s3Kind]}
603
+ />
604
+ {/if}
605
+ </div>
606
+ {/if}
607
+ </div>
608
+ </Pane>
609
+ </Splitpanes>
610
+ </div>
621
611
  </div>
622
612
  </FlowCard>
623
613
  </div>