windmill-components 1.109.8 → 1.121.0

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 (216) hide show
  1. package/package/cloud.js +0 -14
  2. package/package/common.d.ts +1 -0
  3. package/package/components/ArgEnum.svelte +53 -0
  4. package/package/components/ArgEnum.svelte.d.ts +24 -0
  5. package/package/components/ArgInfo.svelte +26 -14
  6. package/package/components/ArgInput.svelte +69 -83
  7. package/package/components/ArgInput.svelte.d.ts +2 -0
  8. package/package/components/ArrayTypeNarrowing.svelte +73 -0
  9. package/package/components/ArrayTypeNarrowing.svelte.d.ts +20 -0
  10. package/package/components/CenteredModal.svelte +7 -9
  11. package/package/components/DeployToSetting.svelte +35 -0
  12. package/package/components/DeployToSetting.svelte.d.ts +16 -0
  13. package/package/components/DeployWorkspace.svelte +555 -0
  14. package/package/components/DeployWorkspace.svelte.d.ts +23 -0
  15. package/package/components/DeployWorkspaceDrawer.svelte +35 -0
  16. package/package/components/DeployWorkspaceDrawer.svelte.d.ts +17 -0
  17. package/package/components/DiffDrawer.svelte +60 -0
  18. package/package/components/DiffDrawer.svelte.d.ts +23 -0
  19. package/package/components/DisplayResult.svelte +17 -24
  20. package/package/components/DraftBadge.svelte +1 -1
  21. package/package/components/Editor.svelte +0 -4
  22. package/package/components/EditorBar.svelte +127 -26
  23. package/package/components/EditorBar.svelte.d.ts +1 -0
  24. package/package/components/FieldHeader.svelte +2 -2
  25. package/package/components/FlowBuilder.svelte +9 -0
  26. package/package/components/FlowBuilder.svelte.d.ts +6 -0
  27. package/package/components/FlowJobResult.svelte +3 -2
  28. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  29. package/package/components/FlowStatusViewer.svelte +6 -39
  30. package/package/components/FlowStatusWaitingForEvents.svelte +64 -0
  31. package/package/components/FlowStatusWaitingForEvents.svelte.d.ts +19 -0
  32. package/package/components/InputTransformForm.svelte +21 -11
  33. package/package/components/InputTransformForm.svelte.d.ts +1 -1
  34. package/package/components/InputTransformSchemaForm.svelte +1 -1
  35. package/package/components/JobArgs.svelte +120 -27
  36. package/package/components/LightweightArgInput.svelte +28 -15
  37. package/package/components/LightweightArgInput.svelte.d.ts +1 -0
  38. package/package/components/LightweightSchemaForm.svelte +24 -24
  39. package/package/components/LogViewer.svelte +23 -11
  40. package/package/components/LogViewer.svelte.d.ts +1 -0
  41. package/package/components/ModulePreview.svelte +7 -1
  42. package/package/components/ModulePreviewForm.svelte +8 -0
  43. package/package/components/ModulePreviewForm.svelte.d.ts +1 -1
  44. package/package/components/MoveDrawer.svelte +3 -3
  45. package/package/components/Path.svelte +27 -7
  46. package/package/components/Popover.svelte +11 -2
  47. package/package/components/Popover.svelte.d.ts +1 -0
  48. package/package/components/Required.svelte +1 -1
  49. package/package/components/ResourcePicker.svelte +7 -1
  50. package/package/components/RunForm.svelte +15 -8
  51. package/package/components/RunForm.svelte.d.ts +2 -0
  52. package/package/components/SchemaEditor.svelte +14 -12
  53. package/package/components/SchemaForm.svelte +9 -2
  54. package/package/components/SchemaModal.svelte +9 -5
  55. package/package/components/ScriptBuilder.svelte +21 -19
  56. package/package/components/ScriptEditor.svelte +6 -19
  57. package/package/components/ScriptPicker.svelte +13 -7
  58. package/package/components/ScriptVersionHistory.svelte +57 -0
  59. package/package/components/ScriptVersionHistory.svelte.d.ts +16 -0
  60. package/package/components/SimpleEditor.svelte +3 -1
  61. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  62. package/package/components/Slider.svelte +2 -1
  63. package/package/components/Slider.svelte.d.ts +1 -0
  64. package/package/components/SuperadminSettings.svelte +12 -14
  65. package/package/components/SuperadminSettings.svelte.d.ts +0 -2
  66. package/package/components/Toast.svelte +1 -1
  67. package/package/components/Uptodate.svelte +26 -0
  68. package/package/components/Uptodate.svelte.d.ts +14 -0
  69. package/package/components/UserSettings.svelte +8 -12
  70. package/package/components/UserSettings.svelte.d.ts +0 -2
  71. package/package/components/Version.svelte +9 -0
  72. package/package/components/Version.svelte.d.ts +14 -0
  73. package/package/components/apps/components/buttons/AppButton.svelte +2 -2
  74. package/package/components/apps/components/buttons/AppForm.svelte +1 -2
  75. package/package/components/apps/components/buttons/AppFormButton.svelte +35 -38
  76. package/package/components/apps/components/buttons/AppSchemaForm.svelte +5 -0
  77. package/package/components/apps/components/display/AppChartJs.svelte +4 -3
  78. package/package/components/apps/components/display/AppFlowStatusComponent.svelte +2 -2
  79. package/package/components/apps/components/display/AppLogsComponent.svelte +7 -1
  80. package/package/components/apps/components/display/AppMap.svelte +11 -7
  81. package/package/components/apps/components/display/PlotlyHtml.svelte +1 -1
  82. package/package/components/apps/components/display/VegaLiteHtml.svelte +1 -1
  83. package/package/components/apps/components/display/table/AppAggridTable.svelte +86 -39
  84. package/package/components/apps/components/display/table/AppTable.svelte +29 -3
  85. package/package/components/apps/components/display/table/AppTableFooter.svelte +48 -43
  86. package/package/components/apps/components/display/table/AppTableFooter.svelte.d.ts +1 -0
  87. package/package/components/apps/components/helpers/InputValue.svelte +25 -3
  88. package/package/components/apps/components/helpers/RunnableComponent.svelte +14 -3
  89. package/package/components/apps/components/helpers/eval.d.ts +1 -0
  90. package/package/components/apps/components/helpers/eval.js +3 -1
  91. package/package/components/apps/components/inputs/AppCheckbox.svelte +5 -0
  92. package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
  93. package/package/components/apps/components/inputs/AppNumberInput.svelte +8 -1
  94. package/package/components/apps/components/inputs/AppQuillEditor.svelte +78 -0
  95. package/package/components/apps/components/inputs/AppQuillEditor.svelte.d.ts +27 -0
  96. package/package/components/apps/components/inputs/AppRangeInput.svelte +8 -1
  97. package/package/components/apps/components/inputs/AppSelect.svelte +17 -2
  98. package/package/components/apps/components/inputs/AppSliderInputs.svelte +18 -5
  99. package/package/components/apps/components/inputs/AppTextInput.svelte +66 -57
  100. package/package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +5 -0
  101. package/package/components/apps/components/layout/AppDrawer.svelte +2 -2
  102. package/package/components/apps/components/layout/AppList.svelte +112 -0
  103. package/package/components/apps/components/layout/AppList.svelte.d.ts +23 -0
  104. package/package/components/apps/components/layout/AppModal.svelte +35 -33
  105. package/package/components/apps/components/layout/ListWrapper.svelte +23 -0
  106. package/package/components/apps/components/layout/ListWrapper.svelte.d.ts +23 -0
  107. package/package/components/apps/editor/AppEditor.svelte +3 -2
  108. package/package/components/apps/editor/AppEditorHeader.svelte +14 -9
  109. package/package/components/apps/editor/AppPreview.svelte +2 -2
  110. package/package/components/apps/editor/RecomputeAllComponents.svelte +4 -0
  111. package/package/components/apps/editor/SettingsPanel.svelte +1 -1
  112. package/package/components/apps/editor/SubGridEditor.svelte +4 -2
  113. package/package/components/apps/editor/appUtils.d.ts +1 -1
  114. package/package/components/apps/editor/appUtils.js +2 -2
  115. package/package/components/apps/editor/component/Component.svelte +13 -0
  116. package/package/components/apps/editor/component/ComponentNavigation.svelte +9 -7
  117. package/package/components/apps/editor/component/ComponentWrapper.svelte +1 -4
  118. package/package/components/apps/editor/component/components.d.ts +138 -3
  119. package/package/components/apps/editor/component/components.js +131 -4
  120. package/package/components/apps/editor/component/default-codes.js +65 -35
  121. package/package/components/apps/editor/component/sets.js +2 -0
  122. package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +6 -0
  123. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +2 -2
  124. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +2 -1
  125. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +3 -2
  126. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +1 -1
  127. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +3 -3
  128. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +1 -1
  129. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +1 -1
  130. package/package/components/apps/editor/settingsPanel/GridPane.svelte +1 -2
  131. package/package/components/apps/editor/settingsPanel/GridTab.svelte +2 -2
  132. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +6 -2
  133. package/package/components/apps/editor/settingsPanel/Recompute.svelte +1 -1
  134. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +16 -2
  135. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts +1 -0
  136. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +7 -4
  137. package/package/components/apps/editor/settingsPanel/script/shared/ScriptRunConfiguration.svelte +2 -2
  138. package/package/components/apps/types.d.ts +8 -0
  139. package/package/components/apps/utils.js +2 -0
  140. package/package/components/common/badge/Badge.svelte +2 -1
  141. package/package/components/common/badge/Badge.svelte.d.ts +1 -0
  142. package/package/components/common/fileInput/FileInput.svelte +1 -1
  143. package/package/components/common/modal/AlwaysMountedModal.svelte +52 -54
  144. package/package/components/common/modal/AlwaysMountedModal.svelte.d.ts +1 -0
  145. package/package/components/common/table/AppRow.svelte +28 -1
  146. package/package/components/common/table/AppRow.svelte.d.ts +2 -0
  147. package/package/components/common/table/FlowRow.svelte +29 -2
  148. package/package/components/common/table/FlowRow.svelte.d.ts +2 -0
  149. package/package/components/common/table/RawAppRow.svelte +16 -0
  150. package/package/components/common/table/RawAppRow.svelte.d.ts +2 -0
  151. package/package/components/common/table/ScriptRow.svelte +29 -2
  152. package/package/components/common/table/ScriptRow.svelte.d.ts +2 -0
  153. package/package/components/common/tabs/Tab.svelte +2 -2
  154. package/package/components/common/tabs/Tabs.svelte +3 -6
  155. package/package/components/common/tabs/Tabs.svelte.d.ts +1 -1
  156. package/package/components/common/toggleButton-v2/ToggleButton.svelte +3 -1
  157. package/package/components/common/toggleButton-v2/ToggleButton.svelte.d.ts +1 -0
  158. package/package/components/flows/common/FlowCardHeader.svelte +13 -15
  159. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +8 -1
  160. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +8 -1
  161. package/package/components/flows/content/FlowLoop.svelte +8 -1
  162. package/package/components/flows/content/FlowModuleCache.svelte +1 -1
  163. package/package/components/flows/content/FlowModuleComponent.svelte +13 -4
  164. package/package/components/flows/content/FlowModuleHeader.svelte +27 -18
  165. package/package/components/flows/content/FlowModuleHeader.svelte.d.ts +1 -0
  166. package/package/components/flows/content/FlowModuleMock.svelte +51 -0
  167. package/package/components/flows/content/FlowModuleMock.svelte.d.ts +17 -0
  168. package/package/components/flows/content/FlowModuleSuspend.svelte +49 -2
  169. package/package/components/flows/flowExplorer.d.ts +11 -0
  170. package/package/components/flows/flowExplorer.js +137 -0
  171. package/package/components/flows/map/FlowErrorHandlerItem.svelte +3 -2
  172. package/package/components/flows/map/FlowModuleSchemaItem.svelte +13 -1
  173. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  174. package/package/components/flows/map/FlowModuleSchemaMap.svelte +1 -1
  175. package/package/components/flows/map/MapItem.svelte +2 -1
  176. package/package/components/flows/previousResults.d.ts +0 -2
  177. package/package/components/flows/previousResults.js +1 -67
  178. package/package/components/graph/FlowGraph.svelte +71 -13
  179. package/package/components/graph/svelvet/container/views/GraphView.svelte +22 -0
  180. package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +2 -0
  181. package/package/components/graph/svelvet/container/views/Svelvet.svelte +13 -1
  182. package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +2 -0
  183. package/package/components/graph/svelvet/edges/models/Edge.d.ts +2 -1
  184. package/package/components/graph/svelvet/edges/models/Edge.js +3 -1
  185. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +2 -13
  186. package/package/components/graph/svelvet/store/controllers/util.js +1 -1
  187. package/package/components/graph/svelvet/types/types.d.ts +1 -0
  188. package/package/components/home/ItemsList.svelte +50 -41
  189. package/package/components/home/ListFilters.svelte +0 -1
  190. package/package/components/jobs/JobDetail.svelte +1 -1
  191. package/package/components/jobs/JobPreview.svelte +29 -13
  192. package/package/components/jobs/JobPreview.svelte.d.ts +1 -2
  193. package/package/components/scriptEditor/LogPanel.svelte +6 -1
  194. package/package/components/scriptEditor/LogPanel.svelte.d.ts +1 -1
  195. package/package/gen/core/OpenAPI.js +1 -1
  196. package/package/gen/index.d.ts +1 -0
  197. package/package/gen/models/EditResourceType.d.ts +1 -1
  198. package/package/gen/models/FlowModule.d.ts +7 -0
  199. package/package/gen/models/ScheduleWJobs.d.ts +8 -0
  200. package/package/gen/models/ScheduleWJobs.js +4 -0
  201. package/package/gen/services/DraftService.d.ts +10 -0
  202. package/package/gen/services/DraftService.js +16 -0
  203. package/package/gen/services/JobService.d.ts +24 -3
  204. package/package/gen/services/JobService.js +21 -3
  205. package/package/gen/services/ScheduleService.d.ts +17 -0
  206. package/package/gen/services/ScheduleService.js +18 -0
  207. package/package/gen/services/SettingsService.d.ts +6 -0
  208. package/package/gen/services/SettingsService.js +11 -0
  209. package/package/gen/services/WorkspaceService.d.ts +22 -0
  210. package/package/gen/services/WorkspaceService.js +30 -0
  211. package/package/infer.js +17 -3
  212. package/package/script_helpers.js +16 -5
  213. package/package/scripts.js +11 -1
  214. package/package/utils.d.ts +1 -0
  215. package/package/utils.js +1 -0
  216. package/package.json +21 -12
@@ -0,0 +1,23 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ button?: {
5
+ text: string;
6
+ onClick: () => void;
7
+ } | undefined;
8
+ openDrawer?: (() => void) | undefined;
9
+ setDiff?: ((local: string, remote: string) => void) | undefined;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {};
15
+ };
16
+ export type DiffDrawerProps = typeof __propDef.props;
17
+ export type DiffDrawerEvents = typeof __propDef.events;
18
+ export type DiffDrawerSlots = typeof __propDef.slots;
19
+ export default class DiffDrawer extends SvelteComponentTyped<DiffDrawerProps, DiffDrawerEvents, DiffDrawerSlots> {
20
+ get openDrawer(): () => void;
21
+ get setDiff(): (local: string, remote: string) => void;
22
+ }
23
+ export {};
@@ -3,8 +3,7 @@ import { json } from 'svelte-highlight/languages';
3
3
  import TableCustom from './TableCustom.svelte';
4
4
  import { copyToClipboard, truncate } from '../utils';
5
5
  import { Button, Drawer, DrawerContent } from './common';
6
- import autosize from 'svelte-autosize';
7
- import { ClipboardCopy } from 'lucide-svelte';
6
+ import { ClipboardCopy, Download, Expand } from 'lucide-svelte';
8
7
  import Portal from 'svelte-portal';
9
8
  import ObjectViewer from './propertyPicker/ObjectViewer.svelte';
10
9
  export let result;
@@ -87,8 +86,8 @@ function inferResultKind(result) {
87
86
  }
88
87
  return 'json';
89
88
  }
90
- let payload = '';
91
89
  let jsonViewer;
90
+ $: jsonStr = JSON.stringify(result, null, 4);
92
91
  </script>
93
92
 
94
93
  <div class="inline-highlight">
@@ -97,11 +96,11 @@ let jsonViewer;
97
96
  <div class="mb-2 text-gray-500 text-sm bg-gray-50/20">
98
97
  as JSON&nbsp;<input class="windmillapp" type="checkbox" bind:checked={forceJson} /></div
99
98
  >{/if}{#if typeof result == 'object' && Object.keys(result).length > 0}<div
100
- class="mb-2 w-full text-sm text-gray-700 relative"
99
+ class="mb-2 w-full text-sm relative"
101
100
  >The result keys are: <b>{truncate(Object.keys(result).join(', '), 50)}</b>
102
101
  {#if !disableExpand}
103
- <div class="text-gray-500 text-xs absolute top-5 right-0">
104
- <button on:click={jsonViewer.openDrawer}>Expand</button>
102
+ <div class="text-gray-500 text-xs absolute top-5.5 right-0">
103
+ <button on:click={jsonViewer.openDrawer}><Expand size={16} /></button>
105
104
  </div>
106
105
  {/if}
107
106
  </div>{/if}{#if !forceJson && resultKind == 'table-col'}<div
@@ -200,14 +199,14 @@ let jsonViewer;
200
199
  >
201
200
  <pre class="text-sm whitespace-pre-wrap text-gray-900">{result.error.stack ?? ''}</pre>
202
201
  </div>
203
- {:else if !forceJson && resultKind == 'approval'}<div class="flex flex-col gap-1 mx-4">
202
+ {:else if !forceJson && resultKind == 'approval'}<div class="flex flex-col gap-3 mt-8 mx-4">
204
203
  <Button
205
204
  color="green"
206
205
  variant="border"
207
206
  on:click={() =>
208
207
  fetch(result['resume'], {
209
208
  method: 'POST',
210
- body: JSON.stringify(payload),
209
+ body: JSON.stringify({}),
211
210
  headers: { 'Content-Type': 'application/json' }
212
211
  })}
213
212
  >
@@ -215,18 +214,11 @@ let jsonViewer;
215
214
  >
216
215
  <Button color="red" variant="border" on:click={() => fetch(result['cancel'])}>Cancel</Button
217
216
  >
218
- <div>
219
- <h3>Payload</h3>
220
- <div class="border border-black">
221
- <input type="text" bind:value={payload} use:autosize />
222
- </div>
223
- </div>
224
217
  <div class="center-center"
225
218
  ><a rel="noreferrer" target="_blank" href={result['approvalPage']}>Approval Page</a></div
226
219
  >
227
220
  </div>
228
221
  {:else}
229
- {@const jsonStr = JSON.stringify(result, null, 4).replace(/\\n/g, '\n')}
230
222
  {#if jsonStr.length > 10000}
231
223
  <div class="text-sm mb-2 text-gray-600">
232
224
  <a
@@ -241,7 +233,7 @@ let jsonViewer;
241
233
  {/if}
242
234
  {/if}
243
235
  {:else}
244
- <div class="text-gray-500 text-sm">No result: {JSON.stringify(result)}</div>
236
+ <div class="text-gray-500 text-sm">No result: {jsonStr}</div>
245
237
  {/if}
246
238
  </div>
247
239
 
@@ -250,25 +242,26 @@ let jsonViewer;
250
242
  <Drawer bind:this={jsonViewer} size="900px">
251
243
  <DrawerContent title="Expanded Result" on:close={jsonViewer.closeDrawer}>
252
244
  <svelte:fragment slot="actions">
253
- <Button
254
- on:click={() => copyToClipboard(JSON.stringify(result, null, 4))}
255
- color="light"
256
- size="xs"
245
+ <a
246
+ class="text-sm text-gray-600 mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-gray-100 rounded-lg"
247
+ download="{filename ?? 'result'}.json"
248
+ href="data:text/json;charset=utf-8,{encodeURIComponent(jsonStr)}"
249
+ >Download <Download size={14} /></a
257
250
  >
251
+ <Button on:click={() => copyToClipboard(jsonStr)} color="light" size="xs">
258
252
  <div class="flex gap-2 items-center">Copy to clipboard <ClipboardCopy /> </div>
259
253
  </Button>
260
254
  </svelte:fragment>
261
- {@const str = JSON.stringify(result, null, 4).replace(/\\n/g, '\n')}
262
- {#if str.length > 100000}
255
+ {#if jsonStr.length > 100000}
263
256
  <div class="text-sm mb-2 text-gray-600">
264
257
  <a
265
258
  download="{filename ?? 'result'}.json"
266
- href="data:text/json;charset=utf-8,{encodeURIComponent(str)}">Download</a
259
+ href="data:text/json;charset=utf-8,{encodeURIComponent(jsonStr)}">Download</a
267
260
  >
268
261
  JSON is too large to be displayed in full.
269
262
  </div>
270
263
  {:else}
271
- <Highlight language={json} code={JSON.stringify(result, null, 4).replace(/\\n/g, '\n')} />
264
+ <Highlight language={json} code={jsonStr.replace(/\\n/g, '\n')} />
272
265
  {/if}
273
266
  </DrawerContent>
274
267
  </Drawer>
@@ -13,7 +13,7 @@ export let draft_only = false;
13
13
  {:else}
14
14
  <Popover notClickable>
15
15
  <svelte:fragment slot="text">Is deployed and has a draft</svelte:fragment>
16
- <Badge color="indigo" baseClass="border border-indigo-200">+Draft</Badge>
16
+ <Badge small color="indigo" baseClass="border border-indigo-200">+Draft</Badge>
17
17
  </Popover>
18
18
  {/if}
19
19
  {/if}
@@ -591,10 +591,6 @@ onDestroy(() => {
591
591
 
592
592
  <style global>
593
593
  :global(.editor) {
594
- border-radius: 0.375rem;
595
- border-width: 1px;
596
- --tw-border-opacity: 1;
597
- border-color: rgb(249 250 251 / var(--tw-border-opacity));
598
594
  padding: 0px;
599
595
  }
600
596
  :global(.yRemoteSelection) {
@@ -2,7 +2,7 @@
2
2
  </script>
3
3
 
4
4
  <script>import { ResourceService, VariableService } from '../gen';
5
- import { faCube, faDollarSign, faEye, faPlus, faRotate, faRotateLeft } from '@fortawesome/free-solid-svg-icons';
5
+ import { faBook, faCube, faDollarSign, faHistory, faPlus, faRotate, faRotateLeft } from '@fortawesome/free-solid-svg-icons';
6
6
  import { workspaceStore } from '../stores';
7
7
  import ItemPicker from './ItemPicker.svelte';
8
8
  import ResourceEditor from './ResourceEditor.svelte';
@@ -10,7 +10,7 @@ import VariableEditor from './VariableEditor.svelte';
10
10
  import Button from './common/button/Button.svelte';
11
11
  import HighlightCode from './HighlightCode.svelte';
12
12
  import DrawerContent from './common/drawer/DrawerContent.svelte';
13
- import { Badge, Drawer } from './common';
13
+ import { Drawer } from './common';
14
14
  import WorkspaceScriptPicker from './flows/pickers/WorkspaceScriptPicker.svelte';
15
15
  import PickHubScript from './flows/pickers/PickHubScript.svelte';
16
16
  import ToggleHubWorkspace from './ToggleHubWorkspace.svelte';
@@ -21,6 +21,8 @@ import { sendUserToast } from '../toast';
21
21
  import { getScriptByPath } from '../scripts';
22
22
  import Toggle from './Toggle.svelte';
23
23
  import { Link, Users } from 'lucide-svelte';
24
+ import { capitalize } from '../utils';
25
+ import ScriptVersionHistory from './ScriptVersionHistory.svelte';
24
26
  export let lang;
25
27
  export let editor;
26
28
  export let websocketAlive;
@@ -30,9 +32,11 @@ export let kind = 'script';
30
32
  export let collabMode = false;
31
33
  export let collabLive = false;
32
34
  export let collabUsers = [];
35
+ export let scriptPath = undefined;
33
36
  let contextualVariablePicker;
34
37
  let variablePicker;
35
38
  let resourcePicker;
39
+ let resourceTypePicker;
36
40
  let variableEditor;
37
41
  let resourceEditor;
38
42
  let codeViewer;
@@ -64,8 +68,45 @@ async function onScriptPick(e) {
64
68
  }
65
69
  let version = __pkg__.version;
66
70
  const dispatch = createEventDispatcher();
71
+ function compile(schema) {
72
+ function rec(x, root = false) {
73
+ let res = '{\n';
74
+ const entries = Object.entries(x);
75
+ let i = 0;
76
+ for (let [name, prop] of entries) {
77
+ if (prop.type == 'object') {
78
+ res += `${name}: ${rec(prop.properties ?? {})}`;
79
+ }
80
+ else if (prop.type == 'array') {
81
+ res += `${name}: ${prop?.items?.type ?? 'any'}[]`;
82
+ }
83
+ else {
84
+ let typ = prop?.type ?? 'any';
85
+ if (typ == 'integer') {
86
+ typ = 'number';
87
+ }
88
+ res += `${name}: ${typ}`;
89
+ }
90
+ i++;
91
+ if (i < entries.length) {
92
+ res += ',\n';
93
+ }
94
+ }
95
+ return res;
96
+ }
97
+ return rec(schema.properties, true);
98
+ }
99
+ let historyBrowserDrawerOpen = false;
67
100
  </script>
68
101
 
102
+ {#if scriptPath}
103
+ <Drawer bind:open={historyBrowserDrawerOpen} size="1200px">
104
+ <DrawerContent title="Versions History" on:close={() => (historyBrowserDrawerOpen = false)}>
105
+ <ScriptVersionHistory {scriptPath} />
106
+ </DrawerContent>
107
+ </Drawer>
108
+ {/if}
109
+
69
110
  <Drawer bind:this={scriptPicker} size="900px">
70
111
  <DrawerContent title="Code" on:close={scriptPicker.closeDrawer}>
71
112
  {#if pick_existing == 'hub'}
@@ -219,19 +260,48 @@ const dispatch = createEventDispatcher();
219
260
  </div>
220
261
  </ItemPicker>
221
262
 
263
+ {#if lang == 'deno'}
264
+ <ItemPicker
265
+ bind:this={resourceTypePicker}
266
+ pickCallback={async (_, name) => {
267
+ if (!editor) return
268
+ const toCamel = (s) => {
269
+ return s.replace(/([-_][a-z])/gi, ($1) => {
270
+ return $1.toUpperCase().replace('-', '').replace('_', '')
271
+ })
272
+ }
273
+ const resourceType = await ResourceService.getResourceType({
274
+ workspace: $workspaceStore ?? 'NO_W',
275
+ path: name
276
+ })
277
+
278
+ const tsSchema = compile(resourceType.schema)
279
+ console.log(tsSchema)
280
+ editor.insertAtCursor(`type ${toCamel(capitalize(name))} = ${tsSchema}\n`)
281
+ sendUserToast(`${name} inserted at cursor`)
282
+ }}
283
+ tooltip="Resources Types are the schemas associated with a Resource. They define the structure of the data that is returned from a Resource."
284
+ documentationLink="https://docs.windmill.dev/docs/core_concepts/resources_and_types"
285
+ itemName="Resource Type"
286
+ extraField="name"
287
+ loadItems={async () =>
288
+ await ResourceService.listResourceType({ workspace: $workspaceStore ?? 'NO_W' })}
289
+ />
290
+ {/if}
222
291
  <ResourceEditor bind:this={resourceEditor} on:refresh={resourcePicker.openDrawer} />
223
292
  <VariableEditor bind:this={variableEditor} on:create={variablePicker.openDrawer} />
224
293
 
225
- <div class="flex justify-between items-center overflow-y-auto w-full p-1">
294
+ <div class="flex justify-between items-center overflow-y-auto w-full p-0.5">
226
295
  <div class="flex items-center">
227
- <Badge color={validCode ? 'green' : 'red'} class="min-w-[60px] mr-3">
228
- {validCode ? 'Valid' : 'Invalid'}
229
- </Badge>
230
- <div class="flex items-center divide-x">
296
+ <div
297
+ title={validCode ? 'Main function parsable' : 'Main function not parsable'}
298
+ class="rounded-full w-2 h-2 mx-2 {validCode ? 'bg-green-300' : 'bg-red-300'}"
299
+ />
300
+ <div class="flex items-center">
231
301
  <Button
232
302
  title="Add context variable"
233
303
  color="light"
234
- btnClasses="!font-medium !h-full"
304
+ btnClasses="!font-medium text-gray-600"
235
305
  on:click={contextualVariablePicker.openDrawer}
236
306
  size="xs"
237
307
  spacingSize="md"
@@ -244,7 +314,7 @@ const dispatch = createEventDispatcher();
244
314
  <Button
245
315
  title="Add variable"
246
316
  color="light"
247
- btnClasses="!font-medium !h-full"
317
+ btnClasses="!font-medium text-gray-600"
248
318
  on:click={variablePicker.openDrawer}
249
319
  size="xs"
250
320
  spacingSize="md"
@@ -256,7 +326,7 @@ const dispatch = createEventDispatcher();
256
326
 
257
327
  <Button
258
328
  title="Add resource"
259
- btnClasses="!font-medium !h-full"
329
+ btnClasses="!font-medium text-gray-600"
260
330
  size="xs"
261
331
  spacingSize="md"
262
332
  color="light"
@@ -267,9 +337,24 @@ const dispatch = createEventDispatcher();
267
337
  +Resource
268
338
  </Button>
269
339
 
340
+ {#if lang == 'deno'}
341
+ <Button
342
+ title="Add resource"
343
+ btnClasses="!font-medium text-gray-600"
344
+ size="xs"
345
+ spacingSize="md"
346
+ color="light"
347
+ on:click={resourceTypePicker.openDrawer}
348
+ {iconOnly}
349
+ startIcon={{ icon: faCube }}
350
+ >
351
+ +Resource Type
352
+ </Button>
353
+ {/if}
354
+
270
355
  <Button
271
356
  title="Reset Content"
272
- btnClasses="!font-medium !h-full"
357
+ btnClasses="!font-medium text-gray-600"
273
358
  size="xs"
274
359
  spacingSize="md"
275
360
  color="light"
@@ -281,7 +366,7 @@ const dispatch = createEventDispatcher();
281
366
  </Button>
282
367
 
283
368
  <Button
284
- btnClasses="!font-medium !h-full"
369
+ btnClasses="!font-medium text-gray-600"
285
370
  size="xs"
286
371
  spacingSize="md"
287
372
  color="light"
@@ -366,20 +451,36 @@ const dispatch = createEventDispatcher();
366
451
  </div>
367
452
  </div>
368
453
 
369
- {#if SCRIPT_EDITOR_SHOW_EXPLORE_OTHER_SCRIPTS}
370
- <Button
371
- btnClasses="!font-medium"
372
- size="xs"
373
- spacingSize="md"
374
- color="light"
375
- on:click={scriptPicker.openDrawer}
376
- {iconOnly}
377
- startIcon={{ icon: faEye }}
378
- title="Explore other scripts"
379
- >
380
- Explore other scripts
381
- </Button>
382
- {/if}
454
+ <div class="flex flex-row items-center gap-2">
455
+ {#if scriptPath}
456
+ <Button
457
+ btnClasses="!font-medium text-gray-600"
458
+ size="xs"
459
+ spacingSize="md"
460
+ color="light"
461
+ on:click={() => (historyBrowserDrawerOpen = true)}
462
+ {iconOnly}
463
+ startIcon={{ icon: faHistory }}
464
+ title="See history"
465
+ >
466
+ History
467
+ </Button>
468
+ {/if}
469
+ {#if SCRIPT_EDITOR_SHOW_EXPLORE_OTHER_SCRIPTS}
470
+ <Button
471
+ btnClasses="!font-medium text-gray-600"
472
+ size="xs"
473
+ spacingSize="md"
474
+ color="light"
475
+ on:click={scriptPicker.openDrawer}
476
+ {iconOnly}
477
+ startIcon={{ icon: faBook }}
478
+ title="Explore other scripts"
479
+ >
480
+ Library
481
+ </Button>
482
+ {/if}
483
+ </div>
383
484
  </div>
384
485
 
385
486
  <style>
@@ -21,6 +21,7 @@ declare const __propDef: {
21
21
  collabUsers?: {
22
22
  name: string;
23
23
  }[] | undefined;
24
+ scriptPath?: string | undefined;
24
25
  };
25
26
  events: {
26
27
  toggleCollabMode: CustomEvent<any>;
@@ -23,11 +23,11 @@ export let prettify = false;
23
23
 
24
24
  {#if displayType}
25
25
  {#if format && format != ''}
26
- <span class="text-sm italic ml-1 text-indigo-800">
26
+ <span class="text-sm italic ml-1 text-indigo-800 dark:text-indigo-400">
27
27
  ({format})
28
28
  </span>
29
29
  {:else}
30
- <span class="text-sm italic ml-1 text-indigo-800">
30
+ <span class="text-sm italic ml-1 text-indigo-800 dark:text-indigo-400">
31
31
  ({type ?? 'any'}{contentEncoding && contentEncoding != ''
32
32
  ? `, encoding: ${contentEncoding}`
33
33
  : ''})
@@ -20,6 +20,7 @@ import { Pen } from 'lucide-svelte';
20
20
  import { loadHubScripts } from '../scripts';
21
21
  import { createEventDispatcher } from 'svelte';
22
22
  import Awareness from './Awareness.svelte';
23
+ import { getAllModules } from './flows/flowExplorer';
23
24
  export let initialPath = '';
24
25
  export let selectedId;
25
26
  export let initialArgs = {};
@@ -83,10 +84,18 @@ async function saveDraft() {
83
84
  }
84
85
  loadingDraft = false;
85
86
  }
87
+ export function computeUnlockedSteps(flow) {
88
+ return Object.fromEntries(getAllModules(flow.value.modules, flow.value.failure_module)
89
+ .filter((m) => m.value.type == 'script' && m.value.hash == null)
90
+ .map((m) => [m.id, m.value.path]));
91
+ }
86
92
  async function saveFlow() {
87
93
  loadingSave = true;
88
94
  try {
89
95
  const flow = cleanInputs($flowStore);
96
+ // console.log('flow', computeUnlockedSteps(flow)) // del
97
+ // loadingSave = false // del
98
+ // return
90
99
  const { cron, timezone, args, enabled } = $scheduleStore;
91
100
  $dirtyStore = false;
92
101
  if (initialPath === '') {
@@ -10,6 +10,9 @@ declare const __propDef: {
10
10
  loading?: boolean | undefined;
11
11
  flowStore: Writable<Flow>;
12
12
  flowStateStore: Writable<FlowState>;
13
+ computeUnlockedSteps?: ((flow: Flow) => {
14
+ [k: string]: string;
15
+ }) | undefined;
13
16
  getSelectedId?: (() => string) | undefined;
14
17
  };
15
18
  events: {
@@ -25,6 +28,9 @@ export type FlowBuilderProps = typeof __propDef.props;
25
28
  export type FlowBuilderEvents = typeof __propDef.events;
26
29
  export type FlowBuilderSlots = typeof __propDef.slots;
27
30
  export default class FlowBuilder extends SvelteComponentTyped<FlowBuilderProps, FlowBuilderEvents, FlowBuilderSlots> {
31
+ get computeUnlockedSteps(): (flow: Flow) => {
32
+ [k: string]: string;
33
+ };
28
34
  get getSelectedId(): () => string;
29
35
  }
30
36
  export {};
@@ -7,11 +7,12 @@ export let col = false;
7
7
  export let noBorder = false;
8
8
  export let loading;
9
9
  export let filename = undefined;
10
+ export let jobId = undefined;
10
11
  </script>
11
12
 
12
13
  <div
13
14
  class:border={!noBorder}
14
- class="grid {!col ? 'grid-cols-2' : 'grid-rows-2'} shadow border-gray-400 h-full max-h-screen"
15
+ class="grid {!col ? 'grid-cols-2' : 'grid-rows-2'} shadow border-gray-400 h-full max-h-screen"
15
16
  >
16
17
  <div class="bg-white {col ? '' : 'max-h-80'} h-full p-1 overflow-auto relative">
17
18
  <span class="text-gray-500">Result</span>
@@ -24,6 +25,6 @@ export let filename = undefined;
24
25
  {/if}
25
26
  </div>
26
27
  <div class="overflow-auto {col ? '' : 'max-h-80'} h-full relative">
27
- <LogViewer content={logs ?? ''} isLoading={false} />
28
+ <LogViewer content={logs ?? ''} {jobId} isLoading={false} />
28
29
  </div>
29
30
  </div>
@@ -7,6 +7,7 @@ declare const __propDef: {
7
7
  noBorder?: boolean | undefined;
8
8
  loading: any;
9
9
  filename?: string | undefined;
10
+ jobId?: string | undefined;
10
11
  };
11
12
  events: {
12
13
  [evt: string]: CustomEvent<any>;
@@ -13,9 +13,8 @@ import { FlowGraph } from './graph';
13
13
  import ModuleStatus from './ModuleStatus.svelte';
14
14
  import { displayDate, emptyString, isOwner, pluralize, truncateRev } from '../utils';
15
15
  import JobArgs from './JobArgs.svelte';
16
- import Tooltip from './Tooltip.svelte';
17
- import SimpleEditor from './SimpleEditor.svelte';
18
16
  import { Loader2 } from 'lucide-svelte';
17
+ import FlowStatusWaitingForEvents from './FlowStatusWaitingForEvents.svelte';
19
18
  const dispatch = createEventDispatcher();
20
19
  export let jobId;
21
20
  export let workspaceId = undefined;
@@ -129,7 +128,6 @@ function loadOwner(path) {
129
128
  is_owner = isOwner(path, $userStore, workspaceId ?? $workspaceStore);
130
129
  }
131
130
  $: selected = isListJob ? 'sequence' : 'graph';
132
- let payload = '"a test payload in json"';
133
131
  function isSuccess(arg) {
134
132
  if (arg == undefined) {
135
133
  return undefined;
@@ -185,47 +183,14 @@ function onJobsLoaded(mod, job) {
185
183
  {#if `result` in job}
186
184
  <div class="w-full h-full">
187
185
  <FlowJobResult
186
+ jobId={job?.id}
188
187
  loading={job['running'] == true}
189
188
  result={job.result}
190
189
  logs={job.logs ?? ''}
191
190
  />
192
191
  </div>
193
192
  {:else if job.flow_status?.modules?.[job?.flow_status?.step]?.type === FlowStatusModule.type.WAITING_FOR_EVENTS}
194
- <div class="w-full h-full mt-2 text-sm text-gray-600">
195
- <p>Waiting to be resumed</p>
196
- <div>
197
- {#if is_owner}
198
- <div class="flex flex-row gap-2 mt-2">
199
- <div>
200
- <Button
201
- color="green"
202
- variant="border"
203
- on:click={async () =>
204
- await JobService.resumeSuspendedFlowAsOwner({
205
- workspace: workspaceId ?? $workspaceStore ?? '',
206
- id: job?.id ?? '',
207
- requestBody: JSON.parse(payload)
208
- })}
209
- >Resume <Tooltip
210
- >Since you are an owner of this flow, you can send resume events without
211
- necessarily knowing the resume id sent by the approval step</Tooltip
212
- ></Button
213
- >
214
- </div>
215
- <div class="w-full border rounded-lg border-gray-600 p-2">
216
- <SimpleEditor automaticLayout lang="json" bind:code={payload} autoHeight />
217
- </div>
218
- <Tooltip
219
- >The payload is optional, it is passed to the following step through the
220
- `resume` variable</Tooltip
221
- >
222
- </div>
223
- {:else}
224
- You cannot resume the flow yourself without receiving the resume secret since you
225
- are not an owner of {job.script_path}
226
- {/if}
227
- </div>
228
- </div>
193
+ <FlowStatusWaitingForEvents {workspaceId} {job} {is_owner} />
229
194
  {:else if job.logs}
230
195
  <div class="text-xs p-4 bg-gray-50 overflow-auto max-h-80 border">
231
196
  <pre class="w-full">{job.logs}</pre>
@@ -456,11 +421,12 @@ function onJobsLoaded(mod, job) {
456
421
  failureModule={job.raw_flow?.failure_module}
457
422
  />
458
423
  </div>
459
- <div class="border-l border-gray-400 pt-1 overflow-hidden">
424
+ <div class="border-l border-gray-400 pt-1 overflow-auto min-h-[800px] flex flex-col">
460
425
  {#if selectedNode}
461
426
  {@const node = localFlowModuleStates[selectedNode]}
462
427
  {#if selectedNode == 'end'}
463
428
  <FlowJobResult
429
+ jobId={job?.id}
464
430
  filename={job.id}
465
431
  loading={job['running']}
466
432
  noBorder
@@ -499,6 +465,7 @@ function onJobsLoaded(mod, job) {
499
465
  </div>
500
466
 
501
467
  <FlowJobResult
468
+ jobId={job?.id}
502
469
  loading={job['running'] == true}
503
470
  noBorder
504
471
  col
@@ -0,0 +1,64 @@
1
+ <script>import { Job, JobService } from '../gen';
2
+ import { workspaceStore } from '../stores';
3
+ import SchemaForm from './SchemaForm.svelte';
4
+ import Tooltip from './Tooltip.svelte';
5
+ import { Button } from './common';
6
+ export let is_owner;
7
+ export let workspaceId;
8
+ export let job;
9
+ let payload = {};
10
+ $: approvalStep = (job?.flow_status?.step ?? 1) - 1;
11
+ $: job && getDefaultArgs();
12
+ async function getDefaultArgs() {
13
+ let jobId = job.flow_status?.modules?.[approvalStep]?.job;
14
+ if (!jobId) {
15
+ return {};
16
+ }
17
+ let job_result = await JobService.getCompletedJobResult({
18
+ workspace: workspaceId ?? $workspaceStore ?? '',
19
+ id: jobId
20
+ });
21
+ payload = job_result?.default_args ?? {};
22
+ }
23
+ </script>
24
+
25
+ <div class="w-full h-full mt-2 text-sm text-gray-600">
26
+ <p>Waiting to be resumed</p>
27
+ <div>
28
+ {#if is_owner}
29
+ <div class="flex flex-row gap-2 mt-2">
30
+ <div>
31
+ <Button
32
+ color="green"
33
+ variant="border"
34
+ on:click={async () =>
35
+ await JobService.resumeSuspendedFlowAsOwner({
36
+ workspace: workspaceId ?? $workspaceStore ?? '',
37
+ id: job?.id ?? '',
38
+ requestBody: payload
39
+ })}
40
+ >Resume <Tooltip
41
+ >Since you are an owner of this flow, you can send resume events without necessarily
42
+ knowing the resume id sent by the approval step</Tooltip
43
+ ></Button
44
+ >
45
+ </div>
46
+ {#if job.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema}
47
+ <div class="w-full border rounded-lg p-2">
48
+ <SchemaForm
49
+ noVariablePicker
50
+ bind:args={payload}
51
+ schema={job.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema}
52
+ />
53
+ </div>
54
+ {/if}
55
+ <Tooltip
56
+ >The payload is optional, it is passed to the following step through the `resume` variable</Tooltip
57
+ >
58
+ </div>
59
+ {:else}
60
+ You cannot resume the flow yourself without receiving the resume secret since you are not an
61
+ owner of {job.script_path}
62
+ {/if}
63
+ </div>
64
+ </div>