windmill-components 1.291.4 → 1.305.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 (224) hide show
  1. package/package/autosize.d.ts +4 -0
  2. package/package/autosize.js +76 -0
  3. package/package/components/AppConnect.svelte +26 -7
  4. package/package/components/ArgInput.svelte +129 -103
  5. package/package/components/ContentSearch.svelte +8 -2
  6. package/package/components/ContextualVariableEditor.svelte +69 -0
  7. package/package/components/ContextualVariableEditor.svelte.d.ts +21 -0
  8. package/package/components/CronInput.svelte +3 -0
  9. package/package/components/DBSchemaExplorer.svelte +2 -2
  10. package/package/components/DarkModeObserver.svelte +2 -2
  11. package/package/components/DateTimeInput.svelte +9 -3
  12. package/package/components/DefaultScripts.svelte +1 -0
  13. package/package/components/DisplayResult.svelte +83 -41
  14. package/package/components/DisplayResult.svelte.d.ts +1 -0
  15. package/package/components/DurationMs.svelte +1 -10
  16. package/package/components/DurationMs.svelte.d.ts +0 -1
  17. package/package/components/Editor.svelte +40 -10
  18. package/package/components/ErrorOrRecoveryHandler.svelte +5 -2
  19. package/package/components/FlowBuilder.svelte +9 -5
  20. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  21. package/package/components/FlowGraphViewerStep.svelte +5 -4
  22. package/package/components/FlowJobResult.svelte +36 -1
  23. package/package/components/FlowJobResult.svelte.d.ts +2 -1
  24. package/package/components/FlowLoopIterationPreview.svelte +18 -2
  25. package/package/components/FlowLoopIterationPreview.svelte.d.ts +6 -0
  26. package/package/components/FlowStatusViewer.svelte +1 -1
  27. package/package/components/FlowStatusViewerInner.svelte +117 -44
  28. package/package/components/FlowStatusViewerInner.svelte.d.ts +1 -0
  29. package/package/components/FlowStatusWaitingForEvents.svelte +97 -54
  30. package/package/components/GfmMarkdown.svelte +14 -0
  31. package/package/components/GfmMarkdown.svelte.d.ts +16 -0
  32. package/package/components/GroupEditor.svelte +1 -2
  33. package/package/components/HighlightCode.svelte +1 -1
  34. package/package/components/InputTransformForm.svelte +24 -2
  35. package/package/components/InstanceGroupEditor.svelte +1 -2
  36. package/package/components/InstanceSettings.svelte +4 -0
  37. package/package/components/JobArgs.svelte +5 -4
  38. package/package/components/JobArgs.svelte.d.ts +1 -0
  39. package/package/components/JobStatus.svelte +2 -8
  40. package/package/components/LightweightArgInput.svelte +3 -6
  41. package/package/components/LightweightArgInput.svelte.d.ts +0 -1
  42. package/package/components/LogId.svelte +3 -0
  43. package/package/components/LogId.svelte.d.ts +16 -0
  44. package/package/components/LogViewer.svelte +14 -5
  45. package/package/components/MapResult.svelte +151 -0
  46. package/package/components/MapResult.svelte.d.ts +27 -0
  47. package/package/components/MoveDrawer.svelte +2 -1
  48. package/package/components/ObjectStoreConfigSettings.svelte +169 -0
  49. package/package/components/ObjectStoreConfigSettings.svelte.d.ts +32 -0
  50. package/package/components/ParqetTableRenderer.svelte +3 -2
  51. package/package/components/ResourceEditor.svelte +33 -11
  52. package/package/components/RunChart.svelte +0 -1
  53. package/package/components/RunForm.svelte.d.ts +1 -1
  54. package/package/components/RunFormAdvancedPopup.svelte.d.ts +1 -1
  55. package/package/components/SavedInputs.svelte +1 -1
  56. package/package/components/ScriptBuilder.svelte +38 -8
  57. package/package/components/SimpleEditor.svelte +1 -3
  58. package/package/components/SimpleEditor.svelte.d.ts +0 -3
  59. package/package/components/SupabaseConnect.svelte +2 -2
  60. package/package/components/TableSimple.svelte +12 -1
  61. package/package/components/TableSimple.svelte.d.ts +1 -0
  62. package/package/components/TestConnection.svelte +29 -4
  63. package/package/components/TestConnection.svelte.d.ts +2 -0
  64. package/package/components/TestJobLoader.svelte +19 -2
  65. package/package/components/TestJobLoader.svelte.d.ts +3 -0
  66. package/package/components/UserSettings.svelte +5 -2
  67. package/package/components/UserSettings.svelte.d.ts +4 -0
  68. package/package/components/VariableEditor.svelte +2 -3
  69. package/package/components/WorkspaceGroup.svelte +10 -1
  70. package/package/components/apps/components/display/AppCustomComponent.svelte +3 -0
  71. package/package/components/apps/components/display/AppText.svelte +14 -19
  72. package/package/components/apps/components/display/PlotlyHtml.svelte +5 -1
  73. package/package/components/apps/components/display/PlotlyHtmlV2.svelte +4 -1
  74. package/package/components/apps/components/display/VegaLiteHtml.svelte +3 -3
  75. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +18 -2
  76. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +8 -5
  77. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte.d.ts +2 -0
  78. package/package/components/apps/components/display/dbtable/InsertRow.svelte +32 -18
  79. package/package/components/apps/components/display/dbtable/queries/count.js +2 -2
  80. package/package/components/apps/components/display/dbtable/queries/select.js +8 -6
  81. package/package/components/apps/components/display/dbtable/utils.d.ts +10 -5
  82. package/package/components/apps/components/display/dbtable/utils.js +83 -29
  83. package/package/components/apps/components/display/table/AppAggridTable.svelte +1 -1
  84. package/package/components/apps/components/display/table/AppTable.svelte +5 -1
  85. package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -0
  86. package/package/components/apps/components/helpers/eval.d.ts +1 -0
  87. package/package/components/apps/components/inputs/AppFileInput.svelte +8 -1
  88. package/package/components/apps/editor/AppEditorHeader.svelte +1 -1
  89. package/package/components/apps/editor/GridEditorMenu.svelte +11 -1
  90. package/package/components/apps/editor/RunnableJobPanel.svelte +5 -30
  91. package/package/components/apps/editor/appUtils.js +2 -1
  92. package/package/components/apps/editor/component/components.d.ts +78 -78
  93. package/package/components/apps/editor/component/components.js +12 -12
  94. package/package/components/apps/editor/component/default-codes.js +5 -1
  95. package/package/components/apps/editor/componentsPanel/CssEval.svelte +0 -1
  96. package/package/components/apps/editor/componentsPanel/CssProperty.svelte +113 -109
  97. package/package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte +14 -7
  98. package/package/components/apps/editor/componentsPanel/componentControlUtils.js +2 -0
  99. package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +2 -1
  100. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +3 -1
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +6 -0
  102. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +4 -0
  103. package/package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +1 -1
  104. package/package/components/apps/editor/settingsPanel/GridPane.svelte +11 -15
  105. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  106. package/package/components/apps/editor/settingsPanel/StylePanel.svelte +40 -39
  107. package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +2 -0
  108. package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte.d.ts +1 -0
  109. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +0 -1
  110. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -6
  111. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte.d.ts +1 -0
  112. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +6 -2
  113. package/package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +1 -6
  114. package/package/components/apps/svelte-select/lib/Select.svelte.d.ts +2 -2
  115. package/package/components/apps/types.d.ts +1 -0
  116. package/package/components/apps/utils.js +3 -3
  117. package/package/components/build_workers.js +2 -1
  118. package/package/components/common/FileProgressBar.svelte +1 -1
  119. package/package/components/common/clearableInput/ClearableInput.svelte.d.ts +1 -1
  120. package/package/components/common/fileInput/FileInput.svelte +4 -0
  121. package/package/components/common/fileInput/FileInput.svelte.d.ts +2 -0
  122. package/package/components/common/modal/Modal.svelte +2 -0
  123. package/package/components/copilot/MetadataGen.svelte +17 -12
  124. package/package/components/copilot/MetadataGen.svelte.d.ts +1 -1
  125. package/package/components/copilot/ScriptGen.svelte +61 -27
  126. package/package/components/copilot/lib.d.ts +4 -1
  127. package/package/components/copilot/lib.js +46 -31
  128. package/package/components/copilot/prompts/edit.yaml +1 -0
  129. package/package/components/copilot/prompts/editPrompt.js +1 -1
  130. package/package/components/copilot/prompts/fix.yaml +1 -0
  131. package/package/components/copilot/prompts/fixPrompt.js +1 -1
  132. package/package/components/copilot/prompts/gen.yaml +1 -0
  133. package/package/components/copilot/prompts/genPrompt.js +1 -1
  134. package/package/components/details/WebhooksPanel.svelte +10 -3
  135. package/package/components/flows/content/FlowInputs.svelte +35 -36
  136. package/package/components/flows/content/FlowLoop.svelte +0 -1
  137. package/package/components/flows/content/FlowModuleComponent.svelte +18 -1
  138. package/package/components/flows/content/FlowModuleSuspend.svelte +7 -0
  139. package/package/components/flows/content/FlowModuleWrapper.svelte +4 -1
  140. package/package/components/flows/content/FlowSettings.svelte +32 -4
  141. package/package/components/flows/content/FlowWhileLoop.svelte +137 -0
  142. package/package/components/flows/content/FlowWhileLoop.svelte.d.ts +19 -0
  143. package/package/components/flows/content/SuspendDrawer.svelte +4 -4
  144. package/package/components/flows/dfs.js +1 -1
  145. package/package/components/flows/flowExplorer.js +1 -1
  146. package/package/components/flows/flowStateUtils.d.ts +1 -0
  147. package/package/components/flows/flowStateUtils.js +12 -0
  148. package/package/components/flows/map/FlowModuleSchemaMap.svelte +6 -2
  149. package/package/components/flows/map/InsertModuleButton.svelte +12 -0
  150. package/package/components/flows/map/MapItem.svelte +5 -5
  151. package/package/components/flows/map/MapItem.svelte.d.ts +1 -1
  152. package/package/components/flows/types.d.ts +1 -0
  153. package/package/components/flows/utils.d.ts +1 -0
  154. package/package/components/flows/utils.js +3 -0
  155. package/package/components/graph/FlowGraph.svelte +1 -1
  156. package/package/components/graph/model.d.ts +5 -2
  157. package/package/components/graph/svelvet/container/views/GraphView.svelte +2 -0
  158. package/package/components/home/Item.svelte +7 -2
  159. package/package/components/home/TreeView.svelte +4 -2
  160. package/package/components/home/TreeViewRoot.svelte +1 -1
  161. package/package/components/instanceSettings.d.ts +1 -1
  162. package/package/components/instanceSettings.js +12 -4
  163. package/package/components/jobs/JobPreview.svelte +1 -4
  164. package/package/components/propertyPicker/ObjectViewer.svelte +3 -0
  165. package/package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -0
  166. package/package/components/runs/JobLoader.svelte +3 -2
  167. package/package/components/runs/JobPreview.svelte +13 -7
  168. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  169. package/package/components/scriptEditor/LogPanel.svelte +6 -8
  170. package/package/components/settings/ChangeWorkspaceId.svelte +98 -0
  171. package/package/components/settings/ChangeWorkspaceId.svelte.d.ts +16 -0
  172. package/package/components/settings/ChangeWorkspaceName.svelte +71 -0
  173. package/package/components/settings/ChangeWorkspaceName.svelte.d.ts +16 -0
  174. package/package/components/settings/PremiumInfo.svelte +2 -1
  175. package/package/components/sidebar/OperatorMenu.svelte +3 -2
  176. package/package/components/sidebar/UserMenu.svelte +13 -2
  177. package/package/components/sidebar/WorkspaceMenu.svelte +30 -1
  178. package/package/components/sidebar/changelogs.js +51 -1
  179. package/package/components/table/AutoDataTable.svelte +62 -41
  180. package/package/components/tutorials/FlowBuilderTutorialSimpleFlow.svelte +2 -2
  181. package/package/es6.d.ts.txt +1 -12395
  182. package/package/gen/core/OpenAPI.js +1 -1
  183. package/package/gen/index.d.ts +2 -0
  184. package/package/gen/models/CacheTtl.d.ts +4 -0
  185. package/package/gen/models/CacheTtl.js +5 -0
  186. package/package/gen/models/ContextualVariable.d.ts +1 -0
  187. package/package/gen/models/CreateWorkspace.d.ts +1 -1
  188. package/package/gen/models/FlowMetadata.d.ts +1 -0
  189. package/package/gen/models/FlowModule.d.ts +2 -0
  190. package/package/gen/models/FlowModuleValue.d.ts +2 -1
  191. package/package/gen/models/FlowStatus.d.ts +1 -0
  192. package/package/gen/models/FlowValue.d.ts +1 -0
  193. package/package/gen/models/GitRepositorySettings.d.ts +2 -1
  194. package/package/gen/models/GlobalUserInfo.d.ts +1 -0
  195. package/package/gen/models/NewScript.d.ts +1 -0
  196. package/package/gen/models/OpenFlowWPath.d.ts +1 -0
  197. package/package/gen/models/Script.d.ts +1 -0
  198. package/package/gen/models/WhileloopFlow.d.ts +8 -0
  199. package/package/gen/models/WhileloopFlow.js +5 -0
  200. package/package/gen/models/WorkspaceGitSyncSettings.d.ts +1 -1
  201. package/package/gen/services/JobService.d.ts +74 -8
  202. package/package/gen/services/JobService.js +55 -8
  203. package/package/gen/services/ScheduleService.d.ts +5 -1
  204. package/package/gen/services/ScheduleService.js +2 -1
  205. package/package/gen/services/SettingService.d.ts +11 -0
  206. package/package/gen/services/SettingService.js +13 -0
  207. package/package/gen/services/UserService.d.ts +29 -1
  208. package/package/gen/services/UserService.js +30 -0
  209. package/package/gen/services/WorkspaceService.d.ts +57 -2
  210. package/package/gen/services/WorkspaceService.js +76 -0
  211. package/package/hub.d.ts +3 -3
  212. package/package/hub.js +6 -6
  213. package/package/infer.d.ts +1 -20
  214. package/package/infer.js +1 -95
  215. package/package/inferArgSig.d.ts +20 -0
  216. package/package/inferArgSig.js +95 -0
  217. package/package/script_helpers.d.ts +3 -3
  218. package/package/script_helpers.js +47 -7
  219. package/package/scripts.d.ts +2 -2
  220. package/package/scripts.js +4 -4
  221. package/package/stores.d.ts +4 -0
  222. package/package/stores.js +2 -0
  223. package/package/utils.js +1 -0
  224. package/package.json +3 -2
@@ -5,7 +5,7 @@ import { isOwner as loadIsOwner } from '../utils';
5
5
  import { userStore, workspaceStore } from '../stores';
6
6
  export let jobId;
7
7
  export let workspaceId = undefined;
8
- export let flowStateStore = undefined;
8
+ export let flowStateStore = writable({});
9
9
  export let selectedJobStep = undefined;
10
10
  export let isOwner = false;
11
11
  let lastJobId = jobId;
@@ -31,6 +31,7 @@ export let selectedNode = undefined;
31
31
  export let globalModuleStates;
32
32
  export let globalDurationStatuses;
33
33
  export let childFlow = false;
34
+ export let reducedPolling = false;
34
35
  let jobResults = [];
35
36
  let jobFailures = [];
36
37
  let forloop_selected = '';
@@ -78,22 +79,6 @@ function initializeByJob(modId) {
78
79
  return x;
79
80
  }));
80
81
  }
81
- if (flowJobIds) {
82
- let common = {
83
- iteration_from: Math.max(flowJobIds.flowJobs.length - 20, 0),
84
- iteration_total: flowJobIds?.length
85
- };
86
- let modId = flowJobIds?.moduleId ?? '';
87
- $localDurationStatuses[modId] = {
88
- ...($localDurationStatuses[modId] ?? { byJob: {} }),
89
- ...common
90
- };
91
- let prefixed = modId;
92
- globalDurationStatuses.forEach((x) => x.update((x) => {
93
- x[prefixed] = { ...(x[prefixed] ?? { byJob: {} }), ...common };
94
- return x;
95
- }));
96
- }
97
82
  function updateForloop(len) {
98
83
  forloop_selected = flowJobIds?.flowJobs[len - 1] ?? '';
99
84
  lastSize = len;
@@ -110,7 +95,13 @@ function updateStatus(status) {
110
95
  else if ($retryStatus[jobId ?? ''] != undefined) {
111
96
  delete $retryStatus[jobId ?? ''];
112
97
  }
113
- $suspendStatus[jobId ?? ''] = job?.flow_status?.modules?.[job?.flow_status.step]?.count;
98
+ let jobStatus = job?.flow_status?.modules?.[job?.flow_status.step];
99
+ if (jobStatus && jobStatus.count != undefined) {
100
+ $suspendStatus[jobId ?? ''] = { nb: jobStatus.count, job: job };
101
+ }
102
+ else if ($suspendStatus[jobId ?? ''] != undefined) {
103
+ delete $suspendStatus[jobId ?? ''];
104
+ }
114
105
  }
115
106
  function updateInnerModules() {
116
107
  if ($localModuleStates) {
@@ -124,7 +115,8 @@ function updateInnerModules() {
124
115
  $localModuleStates[mod.id ?? '']?.scheduled_for == undefined) {
125
116
  JobService.getJob({
126
117
  workspace: workspaceId ?? $workspaceStore ?? '',
127
- id: mod.job ?? ''
118
+ id: mod.job ?? '',
119
+ noLogs: true
128
120
  })
129
121
  .then((job) => {
130
122
  const newState = {
@@ -151,7 +143,8 @@ async function loadJobInProgress() {
151
143
  try {
152
144
  const newJob = await JobService.getJob({
153
145
  workspace: workspaceId ?? $workspaceStore ?? '',
154
- id: jobId ?? ''
146
+ id: jobId ?? '',
147
+ noLogs: true
155
148
  });
156
149
  if (!deepEqual(job, newJob)) {
157
150
  job = newJob;
@@ -166,16 +159,34 @@ async function loadJobInProgress() {
166
159
  }
167
160
  }
168
161
  if (job?.type !== 'CompletedJob' && errorCount < 4) {
169
- timeout = setTimeout(() => loadJobInProgress(), 500);
162
+ timeout = setTimeout(() => loadJobInProgress(), reducedPolling ? 5000 : 1000);
170
163
  }
171
164
  }
172
165
  async function updateJobId() {
173
166
  if (jobId !== job?.id) {
174
167
  $localModuleStates = {};
175
- $localDurationStatuses = {};
176
168
  flowTimeline?.reset();
177
169
  timeout && clearTimeout(timeout);
178
170
  innerModules = [];
171
+ if (flowJobIds) {
172
+ let common = {
173
+ iteration_from: Math.max(flowJobIds.flowJobs.length - 20, 0),
174
+ iteration_total: flowJobIds?.length
175
+ };
176
+ let modId = flowJobIds?.moduleId ?? '';
177
+ $localDurationStatuses[modId] = {
178
+ ...($localDurationStatuses[modId] ?? { byJob: {} }),
179
+ ...common
180
+ };
181
+ let prefixed = modId;
182
+ globalDurationStatuses.forEach((x) => x.update((x) => {
183
+ x[prefixed] = { ...(x[prefixed] ?? { byJob: {} }), ...common };
184
+ return x;
185
+ }));
186
+ }
187
+ else {
188
+ $localDurationStatuses = {};
189
+ }
179
190
  await loadJobInProgress();
180
191
  }
181
192
  }
@@ -245,6 +256,12 @@ function onJobsLoaded(mod, job) {
245
256
  function innerJobLoaded(jobLoaded, j) {
246
257
  let modId = flowJobIds?.moduleId;
247
258
  if (modId) {
259
+ if ($flowStateStore && $flowStateStore?.[modId] == undefined) {
260
+ $flowStateStore[modId] = {
261
+ ...$flowStateStore[modId],
262
+ previewResult: jobLoaded.args
263
+ };
264
+ }
248
265
  if ($flowStateStore?.[modId]) {
249
266
  if (!childFlow) {
250
267
  if (!$flowStateStore[modId].previewResult ||
@@ -321,6 +338,26 @@ function innerJobLoaded(jobLoaded, j) {
321
338
  }
322
339
  let flowTimeline;
323
340
  let rightColumnSelect = 'timeline';
341
+ let slicedListJobIds = [];
342
+ $: flowJobIds && !deepEqual(flowJobIds, lastFlowJobIds) && updateSlicedListJobIds();
343
+ let lastFlowJobIds = undefined;
344
+ function updateSlicedListJobIds() {
345
+ lastFlowJobIds = flowJobIds;
346
+ slicedListJobIds =
347
+ (flowJobIds?.flowJobs.length ?? 0) > 20
348
+ ? flowJobIds?.flowJobs?.slice($localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0) ?? []
349
+ : flowJobIds?.flowJobs ?? [];
350
+ }
351
+ function loadPreviousIters(lenToAdd) {
352
+ let r = $localDurationStatuses[flowJobIds?.moduleId ?? ''];
353
+ if (r.iteration_from) {
354
+ r.iteration_from -= lenToAdd;
355
+ $localDurationStatuses = $localDurationStatuses;
356
+ globalDurationStatuses.forEach((x) => x.update((x) => x));
357
+ }
358
+ jobResults = [...new Array(lenToAdd), ...jobResults];
359
+ updateSlicedListJobIds();
360
+ }
324
361
  </script>
325
362
 
326
363
  {#if job}
@@ -337,23 +374,28 @@ let rightColumnSelect = 'timeline';
337
374
  )}
338
375
 
339
376
  {#if (flowJobIds?.flowJobs.length ?? 0) > 20 && lenToAdd > 0}
377
+ {@const allToAdd = (flowJobIds?.length ?? 0) - (slicedListJobIds.length ?? 0)}
340
378
  <p class="text-tertiary italic text-xs">
341
379
  For performance reasons, only the last 20 items are shown by default <button
342
380
  class="text-primary underline ml-4"
343
381
  on:click={() => {
344
- let r = $localDurationStatuses[flowJobIds?.moduleId ?? '']
345
- if (r.iteration_from) {
346
- r.iteration_from -= lenToAdd
347
- $localDurationStatuses = $localDurationStatuses
348
- globalDurationStatuses.forEach((x) => x.update((x) => x))
349
- }
382
+ loadPreviousIters(lenToAdd)
350
383
  }}
351
384
  >Load {lenToAdd} prior
352
385
  </button>
386
+ {#if allToAdd > 0}
387
+ <button
388
+ class="text-primary underline ml-4"
389
+ on:click={() => {
390
+ loadPreviousIters(allToAdd)
391
+ }}
392
+ >Load {allToAdd} prior
393
+ </button>
394
+ {/if}
353
395
  </p>
354
396
  {/if}
355
397
  {#if render}
356
- <div class="w-full h-full border border-gray-600 bg-surface p-1 overflow-auto">
398
+ <div class="w-full h-full border border-secondary bg-surface p-1 overflow-auto">
357
399
  <DisplayResult workspaceId={job?.workspace_id} {jobId} result={jobResults} />
358
400
  </div>
359
401
  {/if}
@@ -371,13 +413,26 @@ let rightColumnSelect = 'timeline';
371
413
  jobId={job?.id}
372
414
  loading={job['running'] == true}
373
415
  result={job.result}
374
- logs={job.logs ?? ''}
416
+ logs={job.logs}
375
417
  />
376
418
  </div>
377
419
  {:else if job.flow_status?.modules?.[job?.flow_status?.step]?.type === FlowStatusModule.type.WAITING_FOR_EVENTS}
378
420
  <FlowStatusWaitingForEvents {workspaceId} {job} {isOwner} />
421
+ {:else if $suspendStatus && Object.keys($suspendStatus).length > 0}
422
+ <div class="flex gap-2 flex-col">
423
+ {#each Object.values($suspendStatus) as suspendCount (suspendCount.job.id)}
424
+ <div>
425
+ <div class="text-sm">
426
+ Flow suspended, waiting for {suspendCount.nb} events
427
+ </div>
428
+ <FlowStatusWaitingForEvents job={suspendCount.job} {workspaceId} {isOwner} />
429
+ </div>
430
+ {/each}
431
+ </div>
379
432
  {:else if job.logs}
380
- <div class="text-xs p-4 bg-gray-50 overflow-auto max-h-80 border">
433
+ <div
434
+ class="text-xs p-4 bg-surface-secondary overflow-auto max-h-80 border border-tertiary-inverse"
435
+ >
381
436
  <pre class="w-full">{job.logs}</pre>
382
437
  </div>
383
438
  {:else if innerModules?.length > 0}
@@ -426,22 +481,28 @@ let rightColumnSelect = 'timeline';
426
481
  Embedded flows: ({flowJobIds?.flowJobs.length} items)
427
482
  </h3>
428
483
  {#if (flowJobIds?.flowJobs.length ?? 0) > 20 && lenToAdd > 0}
484
+ {@const allToAdd = (flowJobIds?.length ?? 0) - (slicedListJobIds.length ?? 0)}
485
+
429
486
  <p class="text-tertiary italic text-xs">
430
487
  For performance reasons, only the last 20 items are shown by default <button
431
488
  class="text-primary underline ml-4"
432
489
  on:click={() => {
433
- let r = $localDurationStatuses[flowJobIds?.moduleId ?? '']
434
- if (r.iteration_from) {
435
- r.iteration_from -= lenToAdd
436
- $localDurationStatuses = $localDurationStatuses
437
- globalDurationStatuses.forEach((x) => x.update((x) => x))
438
- }
490
+ loadPreviousIters(lenToAdd)
439
491
  }}
440
492
  >Load {lenToAdd} prior
441
493
  </button>
494
+ {#if allToAdd > 0}
495
+ <button
496
+ class="text-primary underline ml-4"
497
+ on:click={() => {
498
+ loadPreviousIters(allToAdd)
499
+ }}
500
+ >Load {allToAdd} prior
501
+ </button>
502
+ {/if}
442
503
  </p>
443
504
  {/if}
444
- {#each (flowJobIds?.flowJobs.length ?? 0) > 20 ? flowJobIds?.flowJobs?.slice($localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0) ?? [] : flowJobIds?.flowJobs ?? [] as loopJobId, j (loopJobId)}
505
+ {#each slicedListJobIds as loopJobId, j (loopJobId)}
445
506
  {#if render}
446
507
  <Button
447
508
  variant={forloop_selected === loopJobId ? 'contained' : 'border'}
@@ -471,12 +532,14 @@ let rightColumnSelect = 'timeline';
471
532
  </Button>
472
533
  {/if}
473
534
 
535
+ <!-- <LogId id={loopJobId} /> -->
474
536
  <div class="border p-6" class:hidden={forloop_selected != loopJobId}>
475
537
  <svelte:self
476
538
  {childFlow}
477
539
  globalModuleStates={[localModuleStates, ...globalModuleStates]}
478
540
  globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
479
541
  render={forloop_selected == loopJobId && selected == 'sequence' && render}
542
+ reducedPolling={flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20}
480
543
  {workspaceId}
481
544
  jobId={loopJobId}
482
545
  on:jobsLoaded={(e) => innerJobLoaded(e.detail, j)}
@@ -570,9 +633,9 @@ let rightColumnSelect = 'timeline';
570
633
  {/if}
571
634
  {/each}
572
635
  {#each Object.values($suspendStatus) as count}
573
- {#if count}
636
+ {#if count.nb}
574
637
  <span class="text-sm">
575
- Flow suspended, waiting for {count} events
638
+ Flow suspended, waiting for {count.nb} events
576
639
  </span>
577
640
  {/if}
578
641
  {/each}
@@ -600,10 +663,15 @@ let rightColumnSelect = 'timeline';
600
663
  failureModule={job.raw_flow?.failure_module}
601
664
  />
602
665
  </div>
603
- <div class="border-l border-gray-400 pt-1 overflow-auto min-h-[800px] flex flex-col">
666
+ <div
667
+ class="border-l border-tertiary-inverse pt-1 overflow-auto min-h-[700px] flex flex-col"
668
+ >
604
669
  <Tabs bind:selected={rightColumnSelect}>
605
670
  <Tab value="timeline"><span class="font-semibold text-md">Timeline</span></Tab>
606
671
  <Tab value="detail"><span class="font-semibold">Details</span></Tab>
672
+ {#if Object.keys(job?.flow_status?.user_states ?? {}).length > 0}
673
+ <Tab value="user_states"><span class="font-semibold">User States</span></Tab>
674
+ {/if}
607
675
  </Tabs>
608
676
  {#if rightColumnSelect == 'timeline'}
609
677
  <FlowTimeline
@@ -613,7 +681,7 @@ let rightColumnSelect = 'timeline';
613
681
  durationStatuses={localDurationStatuses}
614
682
  />
615
683
  {:else if rightColumnSelect == 'detail'}
616
- <div class="pt-2">
684
+ <div class="pt-2 h-full">
617
685
  {#if selectedNode}
618
686
  {@const node = $localModuleStates[selectedNode]}
619
687
 
@@ -663,15 +731,16 @@ let rightColumnSelect = 'timeline';
663
731
  <JobArgs args={node.args} />
664
732
  </div>
665
733
  {/if}
666
-
667
734
  <FlowJobResult
668
735
  workspaceId={job?.workspace_id}
669
736
  jobId={node.job_id}
670
737
  noBorder
671
- loading={false}
738
+ loading={node.type != FlowStatusModule.type.SUCCESS &&
739
+ node.type != FlowStatusModule.type.FAILURE}
740
+ refreshLog={node.type == FlowStatusModule.type.IN_PROGRESS}
672
741
  col
673
742
  result={node.result}
674
- logs={node.logs ?? ''}
743
+ logs={node.logs}
675
744
  />
676
745
  {:else}
677
746
  <p class="p-2 text-tertiary italic"
@@ -682,6 +751,10 @@ let rightColumnSelect = 'timeline';
682
751
  {:else}<p class="p-2 text-tertiary italic">Select a node to see its details here</p
683
752
  >{/if}
684
753
  </div>
754
+ {:else if rightColumnSelect == 'user_states'}
755
+ <div class="p-2">
756
+ <JobArgs argLabel="Key" args={job?.flow_status?.user_states ?? {}} />
757
+ </div>
685
758
  {/if}
686
759
  </div>
687
760
  </div>
@@ -19,6 +19,7 @@ declare const __propDef: {
19
19
  globalModuleStates: Writable<Record<string, GraphModuleState>>[];
20
20
  globalDurationStatuses: Writable<Record<string, DurationStatus>>[];
21
21
  childFlow?: boolean | undefined;
22
+ reducedPolling?: boolean | undefined;
22
23
  };
23
24
  events: {
24
25
  jobsLoaded: CustomEvent<any>;
@@ -2,6 +2,8 @@
2
2
  import { Job, JobService } from '../gen';
3
3
  import { workspaceStore } from '../stores';
4
4
  import { sendUserToast } from '../toast';
5
+ import { X } from 'lucide-svelte';
6
+ import DisplayResult from './DisplayResult.svelte';
5
7
  import LightweightSchemaForm from './LightweightSchemaForm.svelte';
6
8
  import Tooltip from './Tooltip.svelte';
7
9
  import { Button } from './common';
@@ -9,73 +11,120 @@ export let isOwner;
9
11
  export let workspaceId;
10
12
  export let job;
11
13
  let default_payload = {};
12
- let enum_payload = {};
13
14
  let resumeUrl = undefined;
15
+ let cancelUrl = undefined;
16
+ let description = undefined;
17
+ let hide_cancel = false;
14
18
  $: approvalStep = (job?.flow_status?.step ?? 1) - 1;
19
+ let defaultValues = {};
15
20
  $: job && getDefaultArgs();
21
+ let schema = {};
22
+ let lastJobId = undefined;
16
23
  async function getDefaultArgs() {
17
- let jobId = job.flow_status?.modules?.[approvalStep]?.job;
24
+ let jobId = job?.flow_status?.modules?.[approvalStep]?.job;
25
+ if (jobId === lastJobId) {
26
+ return;
27
+ }
18
28
  if (!jobId) {
19
29
  return {};
20
30
  }
31
+ lastJobId = jobId;
21
32
  let job_result = await JobService.getCompletedJobResult({
22
33
  workspace: workspaceId ?? $workspaceStore ?? '',
23
34
  id: jobId
24
35
  });
25
- default_payload = job_result?.default_args ?? {};
26
- enum_payload = job_result?.enums ?? {};
36
+ const args = job_result?.default_args ?? {};
37
+ description = job_result?.description;
38
+ defaultValues = JSON.parse(JSON.stringify(args));
39
+ default_payload = args;
27
40
  resumeUrl = job_result?.['resume'];
41
+ cancelUrl = job_result?.['cancel'];
42
+ hide_cancel = job?.raw_flow?.modules?.[approvalStep]?.suspend?.hide_cancel ?? false;
43
+ schema = mergeSchema(job?.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema ?? {}, job_result?.enums ?? {});
44
+ }
45
+ async function continu(approve) {
46
+ if ((resumeUrl && approve) || (cancelUrl && !approve)) {
47
+ let split = (approve ? resumeUrl : cancelUrl).split('/');
48
+ let signatureUrl = split.pop() ?? '';
49
+ const regex = /([^?]+)(?:\?[^=]+=(\w+))?/;
50
+ const matches = signatureUrl.match(regex);
51
+ const signature = matches?.[1];
52
+ if (!signature) {
53
+ sendUserToast(`Could not parse signature: ${signatureUrl}`, true);
54
+ return;
55
+ }
56
+ const approver = matches?.[2] || undefined;
57
+ let resumeId = -1;
58
+ let parsedResumeId = split.pop() ?? '';
59
+ try {
60
+ resumeId = new Number(parsedResumeId).valueOf();
61
+ }
62
+ catch (e) {
63
+ console.error(`Could not parse resume id: ${parsedResumeId}`);
64
+ }
65
+ let jobId = split.pop() ?? '';
66
+ if (approve) {
67
+ await JobService.resumeSuspendedJobPost({
68
+ workspace: workspaceId ?? $workspaceStore ?? '',
69
+ id: jobId,
70
+ requestBody: default_payload,
71
+ resumeId,
72
+ signature,
73
+ approver
74
+ });
75
+ }
76
+ else {
77
+ await JobService.cancelSuspendedJobPost({
78
+ workspace: workspaceId ?? $workspaceStore ?? '',
79
+ id: jobId,
80
+ resumeId,
81
+ signature,
82
+ approver,
83
+ requestBody: {}
84
+ });
85
+ }
86
+ }
87
+ else {
88
+ if (approve) {
89
+ await JobService.resumeSuspendedFlowAsOwner({
90
+ workspace: workspaceId ?? $workspaceStore ?? '',
91
+ id: job?.id ?? '',
92
+ requestBody: default_payload
93
+ });
94
+ }
95
+ else {
96
+ await JobService.cancelQueuedJob({
97
+ workspace: workspaceId ?? $workspaceStore ?? '',
98
+ id: job?.id ?? '',
99
+ requestBody: {}
100
+ });
101
+ }
102
+ }
28
103
  }
29
104
  </script>
30
105
 
31
106
  <div class="w-full h-full mt-2 text-sm text-tertiary">
32
107
  <p>Waiting to be resumed</p>
108
+ {#if description != undefined}
109
+ <DisplayResult noControls result={description} />
110
+ {/if}
33
111
  <div>
34
112
  {#if isOwner || resumeUrl}
35
113
  <div class="flex flex-row gap-2 mt-2">
114
+ {#if cancelUrl && !hide_cancel}
115
+ <div>
116
+ <Button
117
+ color="red"
118
+ title="Cancel the flow"
119
+ iconOnly
120
+ startIcon={{ icon: X }}
121
+ variant="border"
122
+ on:click={() => continu(false)}
123
+ />
124
+ </div>
125
+ {/if}
36
126
  <div>
37
- <Button
38
- color="green"
39
- variant="border"
40
- on:click={async () => {
41
- if (resumeUrl) {
42
- let split = resumeUrl.split('/')
43
- let signatureUrl = split.pop() ?? ''
44
- const regex = /([^?]+)(?:\?[^=]+=(\w+))?/
45
-
46
- const matches = signatureUrl.match(regex)
47
-
48
- const signature = matches?.[1]
49
- if (!signature) {
50
- sendUserToast(`Could not parse signature: ${signatureUrl}`, true)
51
- return
52
- }
53
- const approver = matches?.[2] || undefined
54
-
55
- let resumeId = -1
56
- let parsedResumeId = split.pop() ?? ''
57
- try {
58
- resumeId = new Number(parsedResumeId).valueOf()
59
- } catch (e) {
60
- console.error(`Could not parse resume id: ${parsedResumeId}`)
61
- }
62
- let jobId = split.pop() ?? ''
63
- await JobService.resumeSuspendedJobPost({
64
- workspace: workspaceId ?? $workspaceStore ?? '',
65
- id: jobId,
66
- requestBody: default_payload,
67
- resumeId,
68
- signature,
69
- approver
70
- })
71
- } else {
72
- await JobService.resumeSuspendedFlowAsOwner({
73
- workspace: workspaceId ?? $workspaceStore ?? '',
74
- id: job?.id ?? '',
75
- requestBody: default_payload
76
- })
77
- }
78
- }}
127
+ <Button color="green" variant="border" on:click={() => continu(true)}
79
128
  >Resume <Tooltip
80
129
  >Since you are an owner of this flow, you can send resume events without necessarily
81
130
  knowing the resume id sent by the approval step</Tooltip
@@ -83,15 +132,9 @@ async function getDefaultArgs() {
83
132
  >
84
133
  </div>
85
134
 
86
- {#if job.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema}
135
+ {#if job?.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema}
87
136
  <div class="w-full border rounded-lg p-2">
88
- <LightweightSchemaForm
89
- bind:args={default_payload}
90
- schema={mergeSchema(
91
- job.raw_flow?.modules?.[approvalStep]?.suspend?.resume_form?.schema ?? {},
92
- enum_payload
93
- )}
94
- />
137
+ <LightweightSchemaForm bind:args={default_payload} {defaultValues} {schema} />
95
138
  </div>
96
139
  {/if}
97
140
  <Tooltip
@@ -0,0 +1,14 @@
1
+ <script>import Markdown from 'svelte-exmarkdown';
2
+ import { gfmPlugin } from 'svelte-exmarkdown/gfm';
3
+ export let md;
4
+ </script>
5
+
6
+ <div class="!prose-xs pgap">
7
+ <Markdown {md} plugins={[gfmPlugin()]} />
8
+ </div>
9
+
10
+ <style global>
11
+ :global(.pgap) > :global(p) {
12
+ margin-top: 0.5rem;
13
+ margin-bottom: 0.5rem;
14
+ }</style>
@@ -0,0 +1,16 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ md: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export type GfmMarkdownProps = typeof __propDef.props;
12
+ export type GfmMarkdownEvents = typeof __propDef.events;
13
+ export type GfmMarkdownSlots = typeof __propDef.slots;
14
+ export default class GfmMarkdown extends SvelteComponent<GfmMarkdownProps, GfmMarkdownEvents, GfmMarkdownSlots> {
15
+ }
16
+ export {};
@@ -2,7 +2,7 @@
2
2
  import { userStore, workspaceStore } from '../stores';
3
3
  import AutoComplete from 'simple-svelte-autocomplete';
4
4
  import { createEventDispatcher } from 'svelte';
5
- import autosize from 'svelte-autosize';
5
+ import autosize from '../autosize';
6
6
  import { Button } from './common';
7
7
  import Skeleton from './common/skeleton/Skeleton.svelte';
8
8
  import TableCustom from './TableCustom.svelte';
@@ -89,7 +89,6 @@ function getRole(x) {
89
89
  <textarea
90
90
  disabled={!can_write}
91
91
  rows="2"
92
- type="text"
93
92
  use:autosize
94
93
  bind:value={group.summary}
95
94
  placeholder="Summary of the group"
@@ -50,7 +50,7 @@ $: lang = getLang(language);
50
50
 
51
51
  <div class="relative overflow-x-auto">
52
52
  <Button
53
- wrapperClasses="absolute top-2 right-2"
53
+ wrapperClasses="absolute top-2 right-2 z-20"
54
54
  on:click={() => copyToClipboard(code)}
55
55
  color="light"
56
56
  size="xs2"
@@ -210,7 +210,7 @@ loadResourceTypes();
210
210
  staticTemplate
211
211
  ? `\`${arg?.value?.toString().replaceAll('`', '\\`') ?? ''}\``
212
212
  : arg.value
213
- ? JSON.stringify(arg?.value, null, 4)
213
+ ? '(' + JSON.stringify(arg?.value, null, 4) + ')'
214
214
  : ''
215
215
  )
216
216
  }
@@ -226,6 +226,19 @@ loadResourceTypes();
226
226
  arg.expr = undefined
227
227
  }
228
228
  setPropertyType(arg?.value)
229
+ } else if (inputCat == 'list' || inputCat == 'object') {
230
+ if (arg) {
231
+ try {
232
+ let newExpr = arg.expr
233
+ if (newExpr.startsWith('(') && newExpr.endsWith(')')) {
234
+ newExpr = newExpr.slice(1, -1)
235
+ }
236
+ arg.value = JSON.parse(newExpr)
237
+ } catch (e) {
238
+ arg.value = undefined
239
+ }
240
+ arg.expr = undefined
241
+ }
229
242
  } else {
230
243
  if (arg) {
231
244
  arg.type = 'static'
@@ -282,7 +295,7 @@ loadResourceTypes();
282
295
  <!-- svelte-ignore a11y-no-static-element-interactions -->
283
296
  <div
284
297
  class="relative {$propPickerConfig?.propName == argName
285
- ? 'outline outline-offset-0 outline-2 outline-blue-500 rounded-md'
298
+ ? 'outline outline-offset-1 outline-1 outline-blue-500 rounded-md'
286
299
  : ''}"
287
300
  on:keyup={stepInputGen?.onKeyUp}
288
301
  >
@@ -372,6 +385,15 @@ loadResourceTypes();
372
385
  <div class="mb-2" />
373
386
  {:else}
374
387
  Not recognized input type {argName} ({arg.expr}, {propertyType})
388
+ <div class="flex mt-2">
389
+ <Button
390
+ variant="border"
391
+ size="xs"
392
+ on:click={() => {
393
+ arg.expr = ''
394
+ }}>Set expr to empty string</Button
395
+ ></div
396
+ >
375
397
  {/if}
376
398
  </div>
377
399
  </div>
@@ -1,6 +1,6 @@
1
1
  <script>import { GroupService } from '../gen';
2
2
  import { createEventDispatcher } from 'svelte';
3
- import autosize from 'svelte-autosize';
3
+ import autosize from '../autosize';
4
4
  import { Button } from './common';
5
5
  import Skeleton from './common/skeleton/Skeleton.svelte';
6
6
  import TableCustom from './TableCustom.svelte';
@@ -32,7 +32,6 @@ async function loadInstanceGroup() {
32
32
  <div class="flex flex-col gap-1">
33
33
  <textarea
34
34
  rows="2"
35
- type="text"
36
35
  use:autosize
37
36
  bind:value={instance_group.summary}
38
37
  placeholder="Summary of the group"