windmill-components 1.352.9 → 1.362.1

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 (208) hide show
  1. package/package/assets/app.css +8 -45
  2. package/package/components/ApiConnectForm.svelte +1 -0
  3. package/package/components/ArgInput.svelte +5 -1
  4. package/package/components/ChangeInstanceUsername.svelte +20 -12
  5. package/package/components/ContentSearchInner.svelte +359 -0
  6. package/package/components/{ContentSearch.svelte.d.ts → ContentSearchInner.svelte.d.ts} +9 -5
  7. package/package/components/CustomPopover.svelte +73 -0
  8. package/package/components/CustomPopover.svelte.d.ts +29 -0
  9. package/package/components/DateTimeInput.svelte +29 -3
  10. package/package/components/DateTimeInput.svelte.d.ts +4 -0
  11. package/package/components/Dev.svelte +8 -3
  12. package/package/components/DurationMs.svelte +2 -2
  13. package/package/components/FlowBuilder.svelte +122 -24
  14. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  15. package/package/components/FlowGraphViewerStep.svelte +2 -2
  16. package/package/components/FlowJobResult.svelte +5 -3
  17. package/package/components/FlowStatusViewer.svelte +4 -3
  18. package/package/components/FlowStatusViewerInner.svelte +265 -160
  19. package/package/components/FlowStatusViewerInner.svelte.d.ts +15 -2
  20. package/package/components/HighlightTheme.svelte +75 -77
  21. package/package/components/InputTransformForm.svelte +2 -0
  22. package/package/components/JobArgs.svelte +59 -44
  23. package/package/components/JobArgs.svelte.d.ts +2 -0
  24. package/package/components/LightweightArgInput.svelte +27 -2
  25. package/package/components/Path.svelte +3 -8
  26. package/package/components/Popover.svelte +1 -1
  27. package/package/components/ResourceEditor.svelte +3 -2
  28. package/package/components/ResourceEditorDrawer.svelte +4 -1
  29. package/package/components/ResourcePicker.svelte +1 -0
  30. package/package/components/RunChart.svelte +6 -3
  31. package/package/components/RunChart.svelte.d.ts +1 -0
  32. package/package/components/RunForm.svelte +24 -23
  33. package/package/components/RunForm.svelte.d.ts +0 -2
  34. package/package/components/SavedInputs.svelte +50 -39
  35. package/package/components/ScheduleEditorInner.svelte +26 -4
  36. package/package/components/ScriptBuilder.svelte +47 -22
  37. package/package/components/ScriptBuilder.svelte.d.ts +1 -0
  38. package/package/components/SearchItems.svelte +5 -4
  39. package/package/components/Summary.svelte +74 -0
  40. package/package/components/Summary.svelte.d.ts +16 -0
  41. package/package/components/apps/components/display/AppMarkdown.svelte +3 -2
  42. package/package/components/apps/components/display/AppMenu.svelte +2 -2
  43. package/package/components/apps/components/display/AppNavbar.svelte +94 -0
  44. package/package/components/apps/components/display/AppNavbar.svelte.d.ts +24 -0
  45. package/package/components/apps/components/display/AppNavbarItem.svelte +146 -0
  46. package/package/components/apps/components/display/AppNavbarItem.svelte.d.ts +27 -0
  47. package/package/components/apps/components/display/ResolveNavbarItemPath.svelte +21 -0
  48. package/package/components/apps/components/display/ResolveNavbarItemPath.svelte.d.ts +20 -0
  49. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +16 -0
  50. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +12 -16
  51. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte.d.ts +1 -0
  52. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +5 -0
  53. package/package/components/apps/components/display/table/AppAggridTable.svelte +28 -6
  54. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +68 -43
  55. package/package/components/apps/components/inputs/AppDateSelect.svelte +284 -0
  56. package/package/components/apps/components/inputs/AppDateSelect.svelte.d.ts +21 -0
  57. package/package/components/apps/components/inputs/AppDateTimeInput.svelte +2 -0
  58. package/package/components/apps/components/inputs/AppFileInput.svelte +22 -27
  59. package/package/components/apps/components/inputs/AppFileInput.svelte.d.ts +1 -0
  60. package/package/components/apps/components/inputs/AppTextInput.svelte +1 -1
  61. package/package/components/apps/components/layout/AppDecisionTree.svelte +32 -30
  62. package/package/components/apps/components/layout/AppModal.svelte +17 -6
  63. package/package/components/apps/editor/AppDeploymentHistory.svelte +2 -3
  64. package/package/components/apps/editor/AppDeploymentHistory.svelte.d.ts +3 -2
  65. package/package/components/apps/editor/AppEditor.svelte +9 -2
  66. package/package/components/apps/editor/AppEditorHeader.svelte +7 -10
  67. package/package/components/apps/editor/AppPreview.svelte +12 -3
  68. package/package/components/apps/editor/AppPreview.svelte.d.ts +2 -0
  69. package/package/components/apps/editor/DecisionTreeDebug.svelte +92 -68
  70. package/package/components/apps/editor/DeploymentHistory.svelte +0 -2
  71. package/package/components/apps/editor/appUtils.d.ts +1 -0
  72. package/package/components/apps/editor/appUtils.js +17 -0
  73. package/package/components/apps/editor/component/Component.svelte +23 -0
  74. package/package/components/apps/editor/component/components.d.ts +205 -3
  75. package/package/components/apps/editor/component/components.js +160 -1
  76. package/package/components/apps/editor/component/default-codes.js +13 -13
  77. package/package/components/apps/editor/component/sets.js +4 -2
  78. package/package/components/apps/editor/componentsPanel/ComponentList.svelte +12 -12
  79. package/package/components/apps/editor/componentsPanel/cssUtils.js +39 -3
  80. package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +6 -0
  81. package/package/components/apps/editor/contextPanel/ComponentOutput.svelte +2 -2
  82. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +6 -0
  83. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +11 -0
  84. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +4 -0
  85. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +21 -8
  86. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +64 -20
  87. package/package/components/apps/editor/settingsPanel/ContextVariables.svelte +48 -15
  88. package/package/components/apps/editor/settingsPanel/ContextVariables.svelte.d.ts +1 -0
  89. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +25 -5
  90. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +2 -1
  91. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +1 -0
  92. package/package/components/apps/editor/settingsPanel/DocLink.svelte +33 -0
  93. package/package/components/apps/editor/settingsPanel/DocLink.svelte.d.ts +19 -0
  94. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +192 -0
  95. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte.d.ts +18 -0
  96. package/package/components/apps/editor/settingsPanel/GridTab.svelte +2 -2
  97. package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte +17 -0
  98. package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte.d.ts +16 -0
  99. package/package/components/apps/editor/settingsPanel/TableActions.svelte +81 -38
  100. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +12 -5
  101. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +11 -12
  102. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte.d.ts +4 -2
  103. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +4 -1
  104. package/package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +7 -1
  105. package/package/components/apps/inputType.d.ts +2 -2
  106. package/package/components/apps/svelte-select/lib/Select.svelte +2 -3
  107. package/package/components/apps/types.d.ts +3 -0
  108. package/package/components/auditLogs/AuditLogsTable.svelte +2 -2
  109. package/package/components/common/CloseButton.svelte +10 -10
  110. package/package/components/common/CloseButton.svelte.d.ts +6 -14
  111. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -0
  112. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
  113. package/package/components/common/confirmationModal/UnsavedConfirmationModal.svelte +7 -1
  114. package/package/components/common/fileInput/FileInput.svelte +2 -0
  115. package/package/components/common/fileInput/FileInput.svelte.d.ts +1 -0
  116. package/package/components/common/popup/Popup.svelte +4 -3
  117. package/package/components/common/popup/Popup.svelte.d.ts +1 -0
  118. package/package/components/common/table/AppRow.svelte +3 -10
  119. package/package/components/common/table/FlowRow.svelte +12 -1
  120. package/package/components/copilot/IteratorGen.svelte +1 -1
  121. package/package/components/copilot/PredicateGen.svelte +1 -1
  122. package/package/components/copilot/StepInputGen.svelte +8 -3
  123. package/package/components/copilot/StepInputsGen.svelte +5 -2
  124. package/package/components/details/WebhooksPanel.svelte +32 -1
  125. package/package/components/details/WebhooksPanel.svelte.d.ts +2 -11
  126. package/package/components/flows/FlowHistory.svelte +208 -0
  127. package/package/components/flows/FlowHistory.svelte.d.ts +21 -0
  128. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +1 -1
  129. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +1 -1
  130. package/package/components/flows/content/FlowEditorPanel.svelte +1 -1
  131. package/package/components/flows/content/FlowLoop.svelte +23 -26
  132. package/package/components/flows/content/FlowModuleComponent.svelte +2 -18
  133. package/package/components/flows/content/FlowModuleEarlyStop.svelte +10 -4
  134. package/package/components/flows/content/FlowModuleHeader.svelte +3 -4
  135. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  136. package/package/components/flows/content/FlowModuleSleep.svelte +1 -0
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
  138. package/package/components/flows/content/SuspendDrawer.svelte +7 -7
  139. package/package/components/flows/flowStateUtils.js +2 -1
  140. package/package/components/flows/flowStore.js +1 -1
  141. package/package/components/flows/header/FlowImportExportMenu.svelte +3 -16
  142. package/package/components/flows/header/FlowImportExportMenu.svelte.d.ts +4 -1
  143. package/package/components/flows/map/FlowJobsMenu.svelte +69 -0
  144. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +22 -0
  145. package/package/components/flows/map/FlowModuleSchemaItem.svelte +7 -4
  146. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  147. package/package/components/flows/map/MapItem.svelte +20 -0
  148. package/package/components/flows/map/MapItem.svelte.d.ts +9 -0
  149. package/package/components/flows/map/VirtualItem.svelte +4 -2
  150. package/package/components/flows/map/VirtualItem.svelte.d.ts +1 -0
  151. package/package/components/flows/previousResults.d.ts +9 -0
  152. package/package/components/flows/previousResults.js +42 -8
  153. package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
  154. package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
  155. package/package/components/flows/types.d.ts +1 -1
  156. package/package/components/graph/FlowGraph.svelte +80 -42
  157. package/package/components/graph/FlowGraph.svelte.d.ts +1 -0
  158. package/package/components/graph/model.d.ts +6 -1
  159. package/package/components/graph/svelvet/container/controllers/middleware.js +4 -4
  160. package/package/components/graph/svelvet/container/views/GraphView.svelte +2 -0
  161. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +24 -25
  162. package/package/components/graph/util.d.ts +1 -1
  163. package/package/components/graph/util.js +1 -2
  164. package/package/components/home/ItemsList.svelte +22 -19
  165. package/package/components/jobs/JobPreview.svelte +11 -2
  166. package/package/components/propertyPicker/PropPicker.svelte +30 -0
  167. package/package/components/propertyPicker/PropPickerResult.svelte +14 -1
  168. package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
  169. package/package/components/runs/JobLoader.svelte +21 -8
  170. package/package/components/runs/JobLoader.svelte.d.ts +2 -0
  171. package/package/components/runs/JobPreview.svelte +5 -1
  172. package/package/components/runs/RunRow.svelte +12 -8
  173. package/package/components/runs/RunsFilter.svelte +2 -4
  174. package/package/components/runs/RunsFilter.svelte.d.ts +0 -1
  175. package/package/components/runs/RunsTable.svelte +63 -29
  176. package/package/components/runs/RunsTable.svelte.d.ts +1 -0
  177. package/package/components/schema/EditableSchemaWrapper.svelte +9 -1
  178. package/package/components/schema/PropertyEditor.svelte +1 -1
  179. package/package/components/search/GlobalSearchModal.svelte +559 -0
  180. package/package/components/search/GlobalSearchModal.svelte.d.ts +17 -0
  181. package/package/components/search/QuickMenuItem.svelte +76 -0
  182. package/package/components/search/QuickMenuItem.svelte.d.ts +27 -0
  183. package/package/components/sidebar/MenuButton.svelte +11 -0
  184. package/package/components/sidebar/MenuButton.svelte.d.ts +4 -0
  185. package/package/components/sidebar/changelogs.js +35 -0
  186. package/package/components/wizards/AppPicker.svelte +68 -0
  187. package/package/components/wizards/AppPicker.svelte.d.ts +17 -0
  188. package/package/components/wizards/NavbarWizard.svelte +131 -0
  189. package/package/components/wizards/NavbarWizard.svelte.d.ts +19 -0
  190. package/package/defaults.d.ts +1 -1
  191. package/package/defaults.js +1 -1
  192. package/package/es6.d.ts.txt +370 -1
  193. package/package/gen/core/OpenAPI.js +1 -1
  194. package/package/gen/schemas.gen.d.ts +42 -3
  195. package/package/gen/schemas.gen.js +42 -3
  196. package/package/gen/services.gen.d.ts +80 -5
  197. package/package/gen/services.gen.js +149 -8
  198. package/package/gen/types.gen.d.ts +265 -11
  199. package/package/inferArgSig.js +4 -0
  200. package/package/script_helpers.d.ts +3 -3
  201. package/package/script_helpers.js +46 -22
  202. package/package/stores.d.ts +1 -1
  203. package/package/stores.js +1 -1
  204. package/package/utils.d.ts +7 -23
  205. package/package/utils.js +54 -33
  206. package/package/windmill_fetch.d.ts.txt +6 -6
  207. package/package.json +3 -11
  208. package/package/components/ContentSearch.svelte +0 -355
@@ -24,7 +24,6 @@ let { flowStateStore, retryStatus, suspendStatus } = getContext('FlowStatusViewe
24
24
  export let jobId;
25
25
  export let workspaceId = undefined;
26
26
  export let flowJobIds = undefined;
27
- export let job = undefined;
28
27
  //only useful when forloops are optimized and the job doesn't contain the mod id anymore
29
28
  export let innerModule = undefined;
30
29
  export let render = true;
@@ -32,29 +31,33 @@ export let isOwner = false;
32
31
  export let selectedNode = undefined;
33
32
  export let globalModuleStates;
34
33
  export let globalDurationStatuses;
34
+ export let globalRefreshes = {};
35
35
  export let childFlow = false;
36
36
  export let reducedPolling = false;
37
37
  export let wideResults = false;
38
- let jobResults = [];
39
- let jobFailures = [];
40
- let forloop_selected = '';
38
+ let jobResults = flowJobIds?.flowJobs?.map((x, id) => `iter #${id + 1} not loaded by frontend yet`) ?? [];
41
39
  let retry_selected = '';
42
40
  let timeout;
43
41
  let localModuleStates = writable({});
44
42
  let localDurationStatuses = writable({});
45
- let lastSize = 0;
46
- $: {
47
- let len = (flowJobIds?.flowJobs ?? []).length;
48
- if (len != lastSize) {
49
- updateForloop(len);
50
- }
51
- }
52
- function setModuleState(key, value) {
53
- if (!deepEqual($localModuleStates[key], value)) {
54
- $localModuleStates[key] = value;
55
- globalModuleStates.forEach((s) => {
43
+ export let job = undefined;
44
+ // let lastSize = 0
45
+ // $: {
46
+ // let len = (flowJobIds?.flowJobs ?? []).length
47
+ // if (len != lastSize) {
48
+ // updateForloop(len)
49
+ // }
50
+ // }
51
+ function setModuleState(key, value, force, keepType) {
52
+ let newValue = { ...($localModuleStates[key] ?? {}), ...value };
53
+ if (!deepEqual($localModuleStates[key], value) || force) {
54
+ ;
55
+ [localModuleStates, ...globalModuleStates].forEach((s) => {
56
56
  s.update((x) => {
57
- x[key] = value;
57
+ if (keepType && (x[key]?.type == 'Success' || x[key]?.type == 'Failure')) {
58
+ newValue.type = x[key].type;
59
+ }
60
+ x[key] = newValue;
58
61
  return x;
59
62
  });
60
63
  });
@@ -83,10 +86,6 @@ function initializeByJob(modId) {
83
86
  return x;
84
87
  }));
85
88
  }
86
- function updateForloop(len) {
87
- forloop_selected = flowJobIds?.flowJobs[len - 1] ?? '';
88
- lastSize = len;
89
- }
90
89
  let innerModules = [];
91
90
  function updateStatus(status) {
92
91
  innerModules =
@@ -131,17 +130,59 @@ function updateInnerModules() {
131
130
  parent_module: mod['parent_module'],
132
131
  args: job?.args
133
132
  };
134
- if (!deepEqual(newState, $localModuleStates[mod.id ?? ''])) {
135
- setModuleState(mod.id ?? '', newState);
136
- }
133
+ setModuleState(mod.id ?? '', newState);
137
134
  })
138
135
  .catch((e) => {
139
136
  console.error(`Could not load inner module for job ${mod.job}`, e);
140
137
  });
141
138
  }
139
+ else if (mod.flow_jobs &&
140
+ (mod.type == 'Success' || mod.type == 'Failure') &&
141
+ !['Success', 'Failure'].includes($localModuleStates?.[mod.id ?? '']?.type)) {
142
+ // console.log(mod.id, 'FOO')
143
+ setModuleState(mod.id ?? '', {
144
+ type: mod.type
145
+ }, true);
146
+ }
147
+ if (mod.branch_chosen) {
148
+ setModuleState(mod.id ?? '', {
149
+ branchChosen: mod.branch_chosen.type == 'default' ? 0 : (mod.branch_chosen.branch ?? 0) + 1
150
+ }, true);
151
+ }
142
152
  });
143
153
  }
144
154
  }
155
+ let recursiveRefresh = {};
156
+ export async function refresh(root, loopJob) {
157
+ let modId = flowJobIds?.moduleId;
158
+ if (!loopJob) {
159
+ loopJob = {
160
+ index: $localModuleStates[modId ?? '']?.selectedForloopIndex ?? 0,
161
+ job: $localModuleStates[modId ?? '']?.selectedForloop ?? ''
162
+ };
163
+ }
164
+ let last = root ? undefined : flowJobIds?.flowJobs?.[flowJobIds?.flowJobs.length - 1];
165
+ Object.entries(recursiveRefresh).forEach(([key, v]) => {
166
+ if (modId) {
167
+ if ((root && key == loopJob?.job) || key == last) {
168
+ v(false);
169
+ }
170
+ else {
171
+ }
172
+ }
173
+ else {
174
+ v(false);
175
+ }
176
+ });
177
+ let njob = flowJobIds
178
+ ? root && modId
179
+ ? storedListJobs?.[loopJob.job]
180
+ : storedListJobs[flowJobIds.length - 1]
181
+ : job;
182
+ if (njob) {
183
+ dispatch('jobsLoaded', { job: njob, force: true });
184
+ }
185
+ }
145
186
  let errorCount = 0;
146
187
  let notAnonynmous = false;
147
188
  async function loadJobInProgress() {
@@ -156,7 +197,7 @@ async function loadJobInProgress() {
156
197
  if (!deepEqual(job, newJob)) {
157
198
  job = newJob;
158
199
  job?.flow_status && updateStatus(job?.flow_status);
159
- dispatch('jobsLoaded', job);
200
+ dispatch('jobsLoaded', { job, force: false });
160
201
  }
161
202
  errorCount = 0;
162
203
  notAnonynmous = false;
@@ -188,8 +229,9 @@ async function updateJobId() {
188
229
  if (flowJobIds) {
189
230
  let modId = flowJobIds?.moduleId ?? '';
190
231
  let common = {
191
- iteration_from: $localDurationStatuses?.[modId]?.iteration_from ??
192
- Math.max(flowJobIds.flowJobs.length - 20, 0),
232
+ iteration_from:
233
+ // $localDurationStatuses?.[modId]?.iteration_from ??
234
+ Math.max(flowJobIds.flowJobs.length - 20, 0),
193
235
  iteration_total: $localDurationStatuses?.[modId]?.iteration_total ?? flowJobIds?.length
194
236
  };
195
237
  $localDurationStatuses[modId] = {
@@ -210,6 +252,18 @@ async function updateJobId() {
210
252
  }
211
253
  $: jobId && updateJobId();
212
254
  $: isListJob = flowJobIds != undefined && Array.isArray(flowJobIds?.flowJobs);
255
+ $: flowJobIds?.moduleId && onFlowJobFlowStatus();
256
+ function onFlowJobFlowStatus() {
257
+ if (globalRefreshes) {
258
+ let modId = flowJobIds?.moduleId;
259
+ if (modId) {
260
+ globalRefreshes[modId] = async (loopJob) => {
261
+ setIteration(loopJob.index, loopJob.job, false, modId ?? '');
262
+ refresh(true, loopJob);
263
+ };
264
+ }
265
+ }
266
+ }
213
267
  onDestroy(() => {
214
268
  destroyed = true;
215
269
  timeout && clearTimeout(timeout);
@@ -223,7 +277,7 @@ function isSuccess(arg) {
223
277
  return arg == true;
224
278
  }
225
279
  }
226
- function onJobsLoaded(mod, job) {
280
+ function onJobsLoaded(mod, job, force) {
227
281
  if (mod.id && (mod.flow_jobs ?? []).length == 0) {
228
282
  if (!childFlow) {
229
283
  if ($flowStateStore?.[mod.id]) {
@@ -244,7 +298,7 @@ function onJobsLoaded(mod, job) {
244
298
  args: job.args,
245
299
  started_at,
246
300
  parent_module: mod['parent_module']
247
- });
301
+ }, force);
248
302
  setDurationStatusByJob(mod.id, job.id, {
249
303
  created_at: job.created_at ? new Date(job.created_at).getTime() : undefined,
250
304
  started_at
@@ -260,11 +314,12 @@ function onJobsLoaded(mod, job) {
260
314
  parent_module: mod['parent_module'],
261
315
  duration_ms: job['duration_ms'],
262
316
  started_at: started_at,
263
- iteration: mod.iterator?.itered?.length,
317
+ flow_jobs: mod.flow_jobs,
318
+ flow_jobs_success: mod.flow_jobs_success,
264
319
  iteration_total: mod.iterator?.itered?.length,
265
320
  retries: mod?.failed_retries?.length
266
321
  // retries: $flowStateStore?.raw_flow
267
- });
322
+ }, force);
268
323
  setDurationStatusByJob(mod.id, job.id, {
269
324
  created_at: job.created_at ? new Date(job.created_at).getTime() : undefined,
270
325
  started_at,
@@ -273,12 +328,39 @@ function onJobsLoaded(mod, job) {
273
328
  }
274
329
  }
275
330
  }
276
- function innerJobLoaded(jobLoaded, j) {
331
+ function setIteration(j, id, clicked, modId) {
332
+ if (modId) {
333
+ if (!$localModuleStates?.[modId]) {
334
+ $localModuleStates[modId] = {
335
+ type: 'InProgress',
336
+ args: undefined
337
+ };
338
+ }
339
+ let state = $localModuleStates?.[modId];
340
+ if (state) {
341
+ if (state.selectedForloop == id && clicked) {
342
+ setModuleState(modId, {
343
+ selectedForloop: undefined,
344
+ selectedForloopIndex: -1
345
+ }, false, true);
346
+ }
347
+ else {
348
+ setModuleState(modId, {
349
+ selectedForloop: id,
350
+ selectedForloopIndex: j
351
+ }, false, true);
352
+ clicked && refresh(true, undefined);
353
+ }
354
+ }
355
+ }
356
+ }
357
+ function innerJobLoaded(jobLoaded, j, clicked, force) {
277
358
  let modId = flowJobIds?.moduleId;
278
359
  if (modId) {
360
+ setIteration(j, jobLoaded.id, clicked, modId);
279
361
  if ($flowStateStore && $flowStateStore?.[modId] == undefined) {
280
362
  $flowStateStore[modId] = {
281
- ...$flowStateStore[modId],
363
+ ...($flowStateStore[modId] ?? {}),
282
364
  previewResult: jobLoaded.args
283
365
  };
284
366
  }
@@ -293,10 +375,9 @@ function innerJobLoaded(jobLoaded, j) {
293
375
  if (jobLoaded.type == 'QueuedJob') {
294
376
  jobResults[j] = 'Job in progress ...';
295
377
  }
296
- else {
378
+ else if (jobLoaded.type == 'CompletedJob') {
297
379
  $flowStateStore[modId].previewResult[j] = jobLoaded.result;
298
380
  jobResults[j] = jobLoaded.result;
299
- jobFailures[j] = jobLoaded.success === false;
300
381
  }
301
382
  }
302
383
  let started_at = jobLoaded.started_at ? new Date(jobLoaded.started_at).getTime() : undefined;
@@ -304,34 +385,38 @@ function innerJobLoaded(jobLoaded, j) {
304
385
  let job_id = jobLoaded.id;
305
386
  initializeByJob(modId);
306
387
  if (jobLoaded.type == 'QueuedJob') {
307
- setModuleState(modId, {
308
- type: 'InProgress',
309
- started_at,
310
- logs: jobLoaded.logs,
311
- job_id,
312
- args: jobLoaded.args,
313
- iteration: flowJobIds?.flowJobs.length,
314
- iteration_total: flowJobIds?.length,
315
- duration_ms: undefined
316
- });
388
+ if ($localModuleStates[modId]?.selectedForloopIndex == j) {
389
+ setModuleState(modId, {
390
+ started_at,
391
+ logs: jobLoaded.logs,
392
+ job_id,
393
+ args: jobLoaded.args,
394
+ flow_jobs: flowJobIds?.flowJobs,
395
+ flow_jobs_success: flowJobIds?.flowJobsSuccess,
396
+ iteration_total: flowJobIds?.length,
397
+ duration_ms: undefined
398
+ }, force, true);
399
+ }
317
400
  setDurationStatusByJob(modId, job_id, {
318
401
  created_at,
319
402
  started_at
320
403
  });
321
404
  }
322
- else {
323
- setModuleState(modId, {
324
- started_at,
325
- args: jobLoaded.args,
326
- type: jobLoaded.success ? 'Success' : 'Failure',
327
- logs: 'All jobs completed',
328
- result: jobResults,
329
- job_id,
330
- iteration: flowJobIds?.flowJobs.length,
331
- iteration_total: flowJobIds?.length,
332
- duration_ms: undefined,
333
- isListJob: true
334
- });
405
+ else if (jobLoaded.type == 'CompletedJob') {
406
+ if ($localModuleStates[modId]?.selectedForloopIndex == j) {
407
+ setModuleState(modId, {
408
+ started_at,
409
+ args: jobLoaded.args,
410
+ result: jobLoaded.result,
411
+ flow_jobs_results: jobResults,
412
+ job_id,
413
+ flow_jobs: flowJobIds?.flowJobs,
414
+ flow_jobs_success: flowJobIds?.flowJobsSuccess,
415
+ iteration_total: flowJobIds?.length,
416
+ duration_ms: undefined,
417
+ isListJob: true
418
+ }, force, true);
419
+ }
335
420
  setDurationStatusByJob(modId, job_id, {
336
421
  created_at,
337
422
  started_at,
@@ -340,34 +425,17 @@ function innerJobLoaded(jobLoaded, j) {
340
425
  }
341
426
  if (jobLoaded.job_kind == 'script' || jobLoaded.job_kind == 'preview') {
342
427
  let id = undefined;
343
- if (innerModule?.type == 'forloopflow') {
428
+ if (innerModule?.type == 'forloopflow' && innerModule.modules.length == 1) {
344
429
  id = innerModule?.modules?.[0]?.id;
345
430
  }
346
431
  if (id) {
347
- setModuleState(id, {
348
- ...($localModuleStates[modId] ?? {}),
349
- iteration: undefined,
350
- isListJob: false,
351
- iteration_total: undefined
352
- });
353
- initializeByJob(id);
354
- setDurationStatusByJob(id, job_id, $localDurationStatuses[modId].byJob[job_id]);
432
+ onJobsLoaded({ id }, jobLoaded);
355
433
  }
356
434
  }
357
435
  }
358
436
  }
359
437
  let flowTimeline;
360
438
  let rightColumnSelect = 'timeline';
361
- let slicedListJobIds = [];
362
- $: flowJobIds && !deepEqual(flowJobIds, lastFlowJobIds) && updateSlicedListJobIds();
363
- let lastFlowJobIds = undefined;
364
- function updateSlicedListJobIds() {
365
- lastFlowJobIds = flowJobIds;
366
- slicedListJobIds =
367
- (flowJobIds?.flowJobs.length ?? 0) > 20
368
- ? flowJobIds?.flowJobs?.slice($localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0) ?? []
369
- : flowJobIds?.flowJobs ?? [];
370
- }
371
439
  function loadPreviousIters(lenToAdd) {
372
440
  let r = $localDurationStatuses[flowJobIds?.moduleId ?? ''];
373
441
  if (r.iteration_from) {
@@ -375,10 +443,14 @@ function loadPreviousIters(lenToAdd) {
375
443
  $localDurationStatuses = $localDurationStatuses;
376
444
  globalDurationStatuses.forEach((x) => x.update((x) => x));
377
445
  }
378
- jobResults = [...new Array(lenToAdd), ...jobResults];
379
- updateSlicedListJobIds();
446
+ jobResults = [
447
+ ...[...new Array(lenToAdd).keys()].map((x) => 'not computed or loaded yet'),
448
+ ...jobResults
449
+ ];
450
+ // updateSlicedListJobIds()
380
451
  }
381
452
  let stepDetail = undefined;
453
+ let storedListJobs = {};
382
454
  </script>
383
455
 
384
456
  {#if notAnonynmous}
@@ -393,13 +465,11 @@ let stepDetail = undefined;
393
465
  <div class="h-8" />
394
466
  {/if} -->
395
467
  {#if isListJob}
396
- {@const lenToAdd = Math.min(
397
- 20,
398
- $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0
399
- )}
468
+ {@const sliceFrom = $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0}
469
+ {@const lenToAdd = Math.min(20, sliceFrom)}
400
470
 
401
471
  {#if (flowJobIds?.flowJobs.length ?? 0) > 20 && lenToAdd > 0}
402
- {@const allToAdd = (flowJobIds?.length ?? 0) - (slicedListJobIds.length ?? 0)}
472
+ {@const allToAdd = (flowJobIds?.length ?? 0) - sliceFrom}
403
473
  <p class="text-tertiary italic text-xs">
404
474
  For performance reasons, only the last 20 items are shown by default <button
405
475
  class="text-primary underline ml-4"
@@ -408,7 +478,8 @@ let stepDetail = undefined;
408
478
  }}
409
479
  >Load {lenToAdd} prior
410
480
  </button>
411
- {#if allToAdd > 0}
481
+ {#if allToAdd > 0 && allToAdd > lenToAdd}
482
+ {sliceFrom}
412
483
  <button
413
484
  class="text-primary underline ml-4"
414
485
  on:click={() => {
@@ -499,79 +570,70 @@ let stepDetail = undefined;
499
570
  {/if}
500
571
  <div class="{selected != 'sequence' ? 'hidden' : ''} max-w-7xl mx-auto">
501
572
  {#if isListJob}
502
- {@const lenToAdd = Math.min(
503
- 20,
504
- $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0
505
- )}
573
+ {@const sliceFrom = $localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0}
574
+ {@const forloop_selected =
575
+ $localModuleStates?.[flowJobIds?.moduleId ?? '']?.selectedForloop}
506
576
  <h3 class="text-md leading-6 font-bold text-tertiary border-b mb-4">
507
- Embedded flows: ({flowJobIds?.flowJobs.length} items)
577
+ Subflows ({flowJobIds?.flowJobs.length})
508
578
  </h3>
509
- {#if (flowJobIds?.flowJobs.length ?? 0) > 20 && lenToAdd > 0}
510
- {@const allToAdd = (flowJobIds?.length ?? 0) - (slicedListJobIds.length ?? 0)}
511
-
512
- <p class="text-tertiary italic text-xs">
513
- For performance reasons, only the last 20 items are shown by default <button
514
- class="text-primary underline ml-4"
515
- on:click={() => {
516
- loadPreviousIters(lenToAdd)
517
- }}
518
- >Load {lenToAdd} prior
519
- </button>
520
- {#if allToAdd > 0}
521
- <button
522
- class="text-primary underline ml-4"
523
- on:click={() => {
524
- loadPreviousIters(allToAdd)
579
+ <div class="overflow-auto max-h-1/2">
580
+ {forloop_selected}
581
+ {#each flowJobIds?.flowJobs ?? [] as loopJobId, j (loopJobId)}
582
+ {#if render}
583
+ <Button
584
+ variant={forloop_selected === loopJobId ? 'contained' : 'border'}
585
+ color={flowJobIds?.flowJobsSuccess?.[j] === false
586
+ ? 'red'
587
+ : forloop_selected === loopJobId
588
+ ? 'dark'
589
+ : 'light'}
590
+ btnClasses="w-full flex justify-start"
591
+ on:click={async () => {
592
+ let storedJob = storedListJobs[j]
593
+ if (!storedJob) {
594
+ storedJob = await JobService.getJob({
595
+ workspace: workspaceId ?? $workspaceStore ?? '',
596
+ id: loopJobId,
597
+ noLogs: true
598
+ })
599
+ storedListJobs[j] = storedJob
600
+ }
601
+ innerJobLoaded(storedJob, j, true, false)
602
+ }}
603
+ endIcon={{
604
+ icon: ChevronDown,
605
+ classes: forloop_selected == loopJobId ? '!rotate-180' : ''
525
606
  }}
526
- >Load {allToAdd} prior
527
- </button>
607
+ >
608
+ <span class="truncate font-mono">
609
+ #{j + 1}: {loopJobId}
610
+ </span>
611
+ </Button>
528
612
  {/if}
529
- </p>
530
- {/if}
531
- {#each slicedListJobIds as loopJobId, j (loopJobId)}
532
- {#if render}
533
- <Button
534
- variant={forloop_selected === loopJobId ? 'contained' : 'border'}
535
- color={jobFailures[j] === true
536
- ? 'red'
537
- : forloop_selected === loopJobId
538
- ? 'dark'
539
- : 'light'}
540
- btnClasses="w-full flex justify-start"
541
- on:click={() => {
542
- if (forloop_selected == loopJobId) {
543
- forloop_selected = ''
544
- } else {
545
- forloop_selected = loopJobId
546
- }
547
- }}
548
- endIcon={{
549
- icon: ChevronDown,
550
- classes: forloop_selected == loopJobId ? '!rotate-180' : ''
551
- }}
552
- >
553
- <span class="truncate font-mono">
554
- #{($localDurationStatuses[flowJobIds?.moduleId ?? '']?.iteration_from ?? 0) +
555
- j +
556
- 1}: {loopJobId}
557
- </span>
558
- </Button>
559
- {/if}
560
-
561
- <!-- <LogId id={loopJobId} /> -->
562
- <div class="border p-6" class:hidden={forloop_selected != loopJobId}>
563
- <svelte:self
564
- {childFlow}
565
- globalModuleStates={[localModuleStates, ...globalModuleStates]}
566
- globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
567
- render={forloop_selected == loopJobId && selected == 'sequence' && render}
568
- reducedPolling={flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20}
569
- {workspaceId}
570
- jobId={loopJobId}
571
- on:jobsLoaded={(e) => innerJobLoaded(e.detail, j)}
572
- />
573
- </div>
574
- {/each}
613
+ {#if j >= sliceFrom || forloop_selected == loopJobId}
614
+ <!-- <LogId id={loopJobId} /> -->
615
+ <div class="border p-6" class:hidden={forloop_selected != loopJobId}>
616
+ <svelte:self
617
+ bind:refresh={recursiveRefresh[loopJobId]}
618
+ {globalRefreshes}
619
+ {childFlow}
620
+ job={storedListJobs[j]}
621
+ globalModuleStates={[localModuleStates, ...globalModuleStates]}
622
+ globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
623
+ render={forloop_selected == loopJobId && selected == 'sequence' && render}
624
+ reducedPolling={flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20}
625
+ {workspaceId}
626
+ jobId={loopJobId}
627
+ on:jobsLoaded={(e) => {
628
+ let { job, force } = e.detail
629
+ storedListJobs[j] = job
630
+ innerJobLoaded(job, j, false, force)
631
+ }}
632
+ />
633
+ </div>
634
+ {/if}
635
+ {/each}
636
+ </div>
575
637
  {:else if innerModules.length > 0}
576
638
  <ul class="w-full">
577
639
  <h3 class="text-md leading-6 font-bold text-primary border-b mb-4 py-2">
@@ -627,6 +689,8 @@ let stepDetail = undefined;
627
689
  <!-- <LogId id={loopJobId} /> -->
628
690
  <div class="border p-6" class:hidden={retry_selected != failedRetry}>
629
691
  <svelte:self
692
+ {globalRefreshes}
693
+ bind:refresh={recursiveRefresh[failedRetry]}
630
694
  {childFlow}
631
695
  globalModuleStates={[localModuleStates, ...globalModuleStates]}
632
696
  globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
@@ -641,6 +705,8 @@ let stepDetail = undefined;
641
705
  {#if ['InProgress', 'Success', 'Failure'].includes(mod.type)}
642
706
  {#if job.raw_flow?.modules[i]?.value.type == 'flow'}
643
707
  <svelte:self
708
+ {globalRefreshes}
709
+ bind:refresh={recursiveRefresh[mod.job ?? '']}
644
710
  globalModuleStates={[]}
645
711
  globalDurationStatuses={[]}
646
712
  render={selected == 'sequence' && render}
@@ -648,11 +714,16 @@ let stepDetail = undefined;
648
714
  jobId={mod.job}
649
715
  childFlow
650
716
  on:jobsLoaded={(e) => {
651
- onJobsLoaded(mod, e.detail)
717
+ let { force, job } = e.detail
718
+ onJobsLoaded(mod, job, force)
652
719
  }}
653
720
  />
721
+ {:else if mod.flow_jobs?.length == 0 && mod.job == '00000000-0000-0000-0000-000000000000'}
722
+ <div class="text-secondary">no subflow (empty loop?)</div>
654
723
  {:else}
655
724
  <svelte:self
725
+ {globalRefreshes}
726
+ bind:refresh={recursiveRefresh[mod.job ?? '']}
656
727
  {childFlow}
657
728
  globalModuleStates={[localModuleStates, ...globalModuleStates]}
658
729
  globalDurationStatuses={[localDurationStatuses, ...globalDurationStatuses]}
@@ -664,10 +735,14 @@ let stepDetail = undefined;
664
735
  ? {
665
736
  moduleId: mod.id,
666
737
  flowJobs: mod.flow_jobs,
738
+ flowJobsSuccess: mod.flow_jobs_success,
667
739
  length: mod.iterator?.itered?.length ?? mod.flow_jobs.length
668
740
  }
669
741
  : undefined}
670
- on:jobsLoaded={(e) => onJobsLoaded(mod, e.detail)}
742
+ on:jobsLoaded={(e) => {
743
+ let { job, force } = e.detail
744
+ onJobsLoaded(mod, job, force)
745
+ }}
671
746
  />
672
747
  {/if}
673
748
  {:else}
@@ -728,12 +803,20 @@ let stepDetail = undefined;
728
803
  selectedNode = e.detail.id
729
804
  }
730
805
  }}
806
+ on:selectedIteration={(e) => {
807
+ let detail = e.detail
808
+ setModuleState(detail.moduleId, {
809
+ selectedForloop: detail.id,
810
+ selectedForloopIndex: detail.index
811
+ })
812
+ globalRefreshes[detail.moduleId]?.({ job: detail.id, index: detail.index })
813
+ }}
731
814
  modules={job.raw_flow?.modules ?? []}
732
815
  failureModule={job.raw_flow?.failure_module}
733
816
  />
734
817
  </div>
735
818
  <div
736
- class="border-l border-tertiary-inverse pt-1 overflow-auto min-h-[700px] flex flex-col z-0"
819
+ class="border-l border-tertiary-inverse pt-1 overflow-auto min-h-[700px] flex flex-col z-0 h-full"
737
820
  >
738
821
  <Tabs bind:selected={rightColumnSelect}>
739
822
  <Tab value="timeline"><span class="font-semibold text-md">Timeline</span></Tab>
@@ -753,7 +836,7 @@ let stepDetail = undefined;
753
836
  durationStatuses={localDurationStatuses}
754
837
  />
755
838
  {:else if rightColumnSelect == 'node_status'}
756
- <div class="pt-2 max-h-[80vh]">
839
+ <div class="pt-2 max-h-[80vh] grow flex flex-col">
757
840
  {#if selectedNode}
758
841
  {@const node = $localModuleStates[selectedNode]}
759
842
 
@@ -772,13 +855,31 @@ let stepDetail = undefined;
772
855
  {:else if selectedNode == 'start'}
773
856
  {#if job.args}
774
857
  <div class="p-2">
775
- <JobArgs args={job.args} />
858
+ <JobArgs
859
+ id={job.id}
860
+ workspace={job.workspace_id ?? $workspaceStore ?? 'no_w'}
861
+ args={job.args}
862
+ />
776
863
  </div>
777
864
  {:else}
778
865
  <p class="p-2 text-secondary">No arguments</p>
779
866
  {/if}
780
867
  {:else if node}
781
- <div class="px-2 flex gap-2 min-w-0 overflow-hidden w-full">
868
+ {#if node.flow_jobs_results}
869
+ <span class="pl-1 text-tertiary"
870
+ >Result of step as collection of all subflows</span
871
+ >
872
+ <div class="p-2">
873
+ <div class="overflow-auto max-h-[200px]">
874
+ <DisplayResult
875
+ workspaceId={job?.workspace_id}
876
+ result={node.flow_jobs_results}
877
+ />
878
+ </div>
879
+ </div>
880
+ <span class="pl-1 text-tertiary text-lg pt-4">Selected subflow</span>
881
+ {/if}
882
+ <div class="px-2 flex gap-2 min-w-0 w-full">
782
883
  <ModuleStatus type={node.type} scheduled_for={node.scheduled_for} />
783
884
  {#if node.duration_ms}
784
885
  <Badge>
@@ -801,7 +902,11 @@ let stepDetail = undefined;
801
902
  </div>
802
903
  {#if !node.isListJob}
803
904
  <div class="px-1 py-1">
804
- <JobArgs args={node.args} />
905
+ <JobArgs
906
+ id={node.job_id}
907
+ workspace={job.workspace_id ?? $workspaceStore ?? 'no_w'}
908
+ args={node.args}
909
+ />
805
910
  </div>
806
911
  {/if}
807
912
  <FlowJobResult