windmill-components 1.352.9 → 1.362.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 (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
@@ -47,11 +47,16 @@ export type GraphModuleState = {
47
47
  type: FlowStatusModule['type'];
48
48
  args: any;
49
49
  logs?: string;
50
+ flow_jobs_results?: any;
51
+ branchChosen?: number;
50
52
  result?: any;
51
53
  scheduled_for?: Date;
52
54
  job_id?: string;
53
55
  parent_module?: string;
54
- iteration?: number;
56
+ selectedForloop?: string;
57
+ selectedForloopIndex?: number;
58
+ flow_jobs_success?: (boolean | undefined)[];
59
+ flow_jobs?: string[];
55
60
  iteration_total?: number;
56
61
  retries?: number;
57
62
  duration_ms?: number;
@@ -3,7 +3,7 @@ This file contains "middleware" functions that sanitize user input (UserNodeType
3
3
  maintain consistency between previous
4
4
 
5
5
  */
6
- import { bottomCb, leftCb, rightCb, topCb, } from '../../edges/controllers/anchorCbUser';
6
+ import { bottomCb, leftCb, rightCb, topCb } from '../../edges/controllers/anchorCbUser';
7
7
  /**
8
8
  * sanitizeUserNodesAndEdges will sanitize the data initially passed in to Svelvet component. For example, the node that user specified have an integar as its id but to instantiate a Node and be compatible with uuid we will need to convert the integar id to a string.
9
9
  * @param userNodes The array of nodes that have a UserNodeType
@@ -51,6 +51,8 @@ function convertAnchorPositionsToCallbacks(userNodes, userEdges) {
51
51
  for (let userEdge of userEdges) {
52
52
  const userNodeSource = userNodesObj[userEdge.source];
53
53
  const userNodeTarget = userNodesObj[userEdge.target];
54
+ if (!userNodeSource || !userNodeTarget)
55
+ continue;
54
56
  const sourcePosition = userNodeSource.sourcePosition;
55
57
  const targetPosition = userNodeTarget.targetPosition;
56
58
  const cbs = { left: leftCb, right: rightCb, top: topCb, bottom: bottomCb };
@@ -68,9 +70,7 @@ function convertIdToString(userNodes) {
68
70
  userNodes = userNodes.map((node) => {
69
71
  node.id = node.id.toString();
70
72
  node.childNodes =
71
- node.childNodes === undefined
72
- ? []
73
- : node.childNodes.map((childId) => childId.toString());
73
+ node.childNodes === undefined ? [] : node.childNodes.map((childId) => childId.toString());
74
74
  return node;
75
75
  });
76
76
  }
@@ -123,6 +123,8 @@ $: {
123
123
  on:nodeInsert={(e) => node?.data?.custom?.cb?.('nodeInsert', e.detail)}
124
124
  on:addBranch={(e) => node?.data?.custom?.cb?.('addBranch', e.detail)}
125
125
  on:removeBranch={(e) => node?.data?.custom?.cb?.('removeBranch', e.detail)}
126
+ on:selectedIteration={(e) =>
127
+ node?.data?.custom?.cb?.('selectedIteration', e.detail)}
126
128
  {...node.data.custom.props}
127
129
  />
128
130
  </Node>
@@ -1,7 +1,6 @@
1
1
  <script>// destructuring props to pass into BaseEdge component
2
2
  export let edgeTextProps;
3
- $: ({ label, labelBgColor, labelTextColor, centerX, centerY } =
4
- edgeTextProps);
3
+ $: ({ label, labelBgColor, labelTextColor, centerX, centerY } = edgeTextProps);
5
4
  const shiftRectY = 7;
6
5
  $: pxRatio = label.length < 3 ? 9 : 7;
7
6
  // determine the center point of the edge to be used in the EdgeText component
@@ -16,28 +15,28 @@ $: labelPx = newLength * pxRatio;
16
15
  </script>
17
16
 
18
17
  {#if typeof label === 'undefined' || !label}
19
- {null}
18
+ {null}
20
19
  {:else}
21
- <g>
22
- <rect
23
- class="EdgeTextBg"
24
- data-testid="edge-text-bg"
25
- fill={labelBgColor ? labelBgColor : 'white'}
26
- x={textCenterX - labelPx / 2}
27
- y={textCenterY - shiftRectY}
28
- width={labelPx}
29
- height={16}
30
- />
31
- <text
32
- class="EdgeText"
33
- x={textCenterX}
34
- y={textCenterY}
35
- font-size="12px"
36
- dominant-baseline="central"
37
- text-anchor="middle"
38
- fill={labelTextColor ? labelTextColor : 'black'}
39
- >
40
- {label}
41
- </text>
42
- </g>
20
+ <g>
21
+ <rect
22
+ class="EdgeTextBg"
23
+ data-testid="edge-text-bg"
24
+ fill={labelBgColor ? labelBgColor : 'white'}
25
+ x={textCenterX - labelPx / 2}
26
+ y={textCenterY - shiftRectY}
27
+ width={labelPx}
28
+ height={16}
29
+ />
30
+ <text
31
+ class="EdgeText"
32
+ x={textCenterX}
33
+ y={textCenterY}
34
+ font-size="12px"
35
+ dominant-baseline="central"
36
+ text-anchor="middle"
37
+ fill={labelTextColor ? labelTextColor : 'black'}
38
+ >
39
+ {label}
40
+ </text>
41
+ </g>
43
42
  {/if}
@@ -8,4 +8,4 @@ export declare const NODE: {
8
8
  };
9
9
  };
10
10
  export declare function createIdGenerator(): Generator<number, number, unknown>;
11
- export declare function getStateColor(state: FlowStatusModule['type'] | undefined): string;
11
+ export declare function getStateColor(state: FlowStatusModule['type'] | undefined, isDark: boolean): string;
@@ -12,8 +12,7 @@ export function* createIdGenerator() {
12
12
  yield id++;
13
13
  }
14
14
  }
15
- export function getStateColor(state) {
16
- const isDark = document.documentElement.classList.contains('dark');
15
+ export function getStateColor(state, isDark) {
17
16
  switch (state) {
18
17
  case 'Success':
19
18
  return isDark ? '#059669' : 'rgb(193, 255, 216)';
@@ -16,13 +16,13 @@ import FlowIcon from './FlowIcon.svelte';
16
16
  import { canWrite, getLocalSetting, storeLocalSetting } from '../../utils';
17
17
  import { page } from '$app/stores';
18
18
  import { setQuery } from '../../navigation';
19
- import ContentSearch from '../ContentSearch.svelte';
20
19
  import Drawer from '../common/drawer/Drawer.svelte';
21
20
  import HighlightCode from '../HighlightCode.svelte';
22
21
  import DrawerContent from '../common/drawer/DrawerContent.svelte';
23
22
  import Item from './Item.svelte';
24
23
  import TreeViewRoot from './TreeViewRoot.svelte';
25
24
  import { Popup } from '../common';
25
+ import { getContext } from 'svelte';
26
26
  let scripts;
27
27
  let flows;
28
28
  let apps;
@@ -31,11 +31,12 @@ let filteredItems = [];
31
31
  let itemKind = $page.url.searchParams.get('kind') ?? 'all';
32
32
  let loading = true;
33
33
  let nbDisplayed = 15;
34
- async function loadScripts(hideWithoutMain) {
34
+ async function loadScripts(includeWithoutMain) {
35
35
  const loadedScripts = await ScriptService.listScripts({
36
36
  workspace: $workspaceStore,
37
37
  showArchived: archived ? true : undefined,
38
- hideWithoutMain: hideWithoutMain ? true : undefined
38
+ includeWithoutMain: includeWithoutMain ? true : undefined,
39
+ includeDraftOnly: true
39
40
  });
40
41
  scripts = loadedScripts.map((script) => {
41
42
  return {
@@ -48,7 +49,8 @@ async function loadScripts(hideWithoutMain) {
48
49
  async function loadFlows() {
49
50
  flows = (await FlowService.listFlows({
50
51
  workspace: $workspaceStore,
51
- showArchived: archived ? true : undefined
52
+ showArchived: archived ? true : undefined,
53
+ includeDraftOnly: true
52
54
  })).map((x) => {
53
55
  return {
54
56
  canWrite: canWrite(x.path, x.extra_perms, $userStore) &&
@@ -60,7 +62,7 @@ async function loadFlows() {
60
62
  loading = false;
61
63
  }
62
64
  async function loadApps() {
63
- apps = (await AppService.listApps({ workspace: $workspaceStore })).map((app) => {
65
+ apps = (await AppService.listApps({ workspace: $workspaceStore, includeDraftOnly: true })).map((app) => {
64
66
  return {
65
67
  canWrite: canWrite(app.path, app.extra_perms, $userStore) &&
66
68
  app.workspace_id == $workspaceStore &&
@@ -131,7 +133,7 @@ $: if ($workspaceStore) {
131
133
  }
132
134
  $: {
133
135
  if ($userStore && $workspaceStore) {
134
- loadScripts(hideWithoutMain);
136
+ loadScripts(includeWithoutMain);
135
137
  loadFlows();
136
138
  if (!archived) {
137
139
  loadApps();
@@ -187,14 +189,16 @@ $: items && resetScroll();
187
189
  let archived = false;
188
190
  const TREE_VIEW_SETTING_NAME = 'treeView';
189
191
  const FILTER_USER_FOLDER_SETTING_NAME = 'filterUserFolders';
190
- const HIDE_WITHOUT_MAIN_SETTING = 'hideWithoutMain';
192
+ const INCLUDE_WITHOUT_MAIN_SETTING_NAME = 'includeWithoutMain';
191
193
  let treeView = getLocalSetting(TREE_VIEW_SETTING_NAME) == 'true';
192
194
  let filterUserFolders = getLocalSetting(FILTER_USER_FOLDER_SETTING_NAME) == 'true';
193
- let hideWithoutMain = getLocalSetting(HIDE_WITHOUT_MAIN_SETTING) == 'true';
195
+ let includeWithoutMain = getLocalSetting(INCLUDE_WITHOUT_MAIN_SETTING_NAME)
196
+ ? getLocalSetting(INCLUDE_WITHOUT_MAIN_SETTING_NAME) == 'true'
197
+ : true;
194
198
  $: storeLocalSetting(TREE_VIEW_SETTING_NAME, treeView ? 'true' : undefined);
195
199
  $: storeLocalSetting(FILTER_USER_FOLDER_SETTING_NAME, filterUserFolders ? 'true' : undefined);
196
- $: storeLocalSetting(HIDE_WITHOUT_MAIN_SETTING, hideWithoutMain ? 'true' : undefined);
197
- let contentSearch;
200
+ $: storeLocalSetting(INCLUDE_WITHOUT_MAIN_SETTING_NAME, includeWithoutMain ? 'true' : undefined);
201
+ const openSearchWithPrefilledText = getContext("openSearchWithPrefilledText");
198
202
  let viewCodeDrawer;
199
203
  let viewCodeTitle;
200
204
  let script;
@@ -235,7 +239,6 @@ let collapseAll = true;
235
239
  </DrawerContent>
236
240
  </Drawer>
237
241
 
238
- <ContentSearch bind:this={contentSearch} />
239
242
  <CenteredPage>
240
243
  <div class="flex flex-wrap gap-2 items-center justify-between w-full mt-2">
241
244
  <div class="flex justify-start">
@@ -300,7 +303,7 @@ let collapseAll = true;
300
303
  </button>
301
304
  </div>
302
305
  <Button
303
- on:click={() => contentSearch?.open()}
306
+ on:click={() => openSearchWithPrefilledText("#")}
304
307
  variant="border"
305
308
  size="sm"
306
309
  spacingSize="lg"
@@ -345,12 +348,12 @@ let collapseAll = true;
345
348
  <div>
346
349
  <span class="text-sm font-semibold">Filters</span>
347
350
  <div class="flex flex-col gap-2 mt-2">
348
- <Toggle size="xs" bind:checked={archived} options={{ right: 'Show archived' }} />
351
+ <Toggle size="xs" bind:checked={archived} options={{ right: 'Only archived' }} />
349
352
  {#if $userStore && !$userStore.operator}
350
353
  <Toggle
351
354
  size="xs"
352
- bind:checked={hideWithoutMain}
353
- options={{ right: 'Hide without main function' }}
355
+ bind:checked={includeWithoutMain}
356
+ options={{ right: 'Include without main function' }}
354
357
  />
355
358
  {/if}
356
359
  </div>
@@ -402,12 +405,12 @@ let collapseAll = true;
402
405
  {nbDisplayed}
403
406
  {collapseAll}
404
407
  isSearching={filter !== ''}
405
- on:scriptChanged={() => loadScripts(hideWithoutMain)}
408
+ on:scriptChanged={() => loadScripts(includeWithoutMain)}
406
409
  on:flowChanged={loadFlows}
407
410
  on:appChanged={loadApps}
408
411
  on:rawAppChanged={loadRawApps}
409
412
  on:reload={() => {
410
- loadScripts(hideWithoutMain)
413
+ loadScripts(includeWithoutMain)
411
414
  loadFlows()
412
415
  loadApps()
413
416
  loadRawApps()
@@ -419,12 +422,12 @@ let collapseAll = true;
419
422
  {#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path)}
420
423
  <Item
421
424
  {item}
422
- on:scriptChanged={() => loadScripts(hideWithoutMain)}
425
+ on:scriptChanged={() => loadScripts(includeWithoutMain)}
423
426
  on:flowChanged={loadFlows}
424
427
  on:appChanged={loadApps}
425
428
  on:rawAppChanged={loadRawApps}
426
429
  on:reload={() => {
427
- loadScripts(hideWithoutMain)
430
+ loadScripts(includeWithoutMain)
428
431
  loadFlows()
429
432
  loadApps()
430
433
  loadRawApps()
@@ -12,6 +12,7 @@ import LogViewer from '../LogViewer.svelte';
12
12
  import { Badge } from '../common';
13
13
  import { forLater } from '../../forLater';
14
14
  import DurationMs from '../DurationMs.svelte';
15
+ import { workspaceStore } from '../../stores';
15
16
  const POPUP_HEIGHT = 320;
16
17
  export let id;
17
18
  let job = undefined;
@@ -95,7 +96,11 @@ onDestroy(() => {
95
96
  Mem: {job?.['mem_peak'] ? `${(job['mem_peak'] / 1024).toPrecision(4)}MB` : 'N/A'}
96
97
  </Badge>
97
98
  {#if job?.['duration_ms']}
98
- <DurationMs duration_ms={job?.['duration_ms']} self_wait_time_ms={job?.self_wait_time_ms} aggregate_wait_time_ms={job?.aggregate_wait_time_ms} />
99
+ <DurationMs
100
+ duration_ms={job?.['duration_ms']}
101
+ self_wait_time_ms={job?.self_wait_time_ms}
102
+ aggregate_wait_time_ms={job?.aggregate_wait_time_ms}
103
+ />
99
104
  {/if}
100
105
  {#if job?.['labels'] && Array.isArray(job?.['labels']) && job?.['labels'].length > 0}
101
106
  {#each job?.['labels'] as label}
@@ -104,7 +109,11 @@ onDestroy(() => {
104
109
  {/if}
105
110
  </div>
106
111
  <div class="w-1/2 h-full overflow-auto">
107
- <JobArgs args={job?.args} />
112
+ <JobArgs
113
+ id={job?.id}
114
+ workspace={job?.workspace_id ?? $workspaceStore ?? 'no_w'}
115
+ args={job?.args}
116
+ />
108
117
  </div>
109
118
  <div class="w-1/2 h-full overflow-auto p-2">
110
119
  {#if job && 'scheduled_for' in job && !job.running && job.scheduled_for && forLater(job.scheduled_for)}
@@ -97,6 +97,36 @@ async function loadResources() {
97
97
  on:select
98
98
  />
99
99
  </div>
100
+ {#if Object.keys(pickableProperties.priorIds).length > 0}
101
+ {#if suggestedPropsFiltered && Object.keys(suggestedPropsFiltered).length > 0}
102
+ <span class="font-bold text-sm">Suggested Results</span>
103
+ <div class="overflow-y-auto mb-2">
104
+ <ObjectViewer
105
+ allowCopy={false}
106
+ topLevelNode
107
+ pureViewer={!$propPickerConfig}
108
+ collapsed={false}
109
+ json={suggestedPropsFiltered}
110
+ on:select={(e) => {
111
+ dispatch('select', `results.${e.detail}`)
112
+ }}
113
+ />
114
+ </div>
115
+ {/if}
116
+ <span class="font-bold text-sm">All Results</span>
117
+ <div class="overflow-y-auto mb-2">
118
+ <ObjectViewer
119
+ allowCopy={false}
120
+ topLevelNode
121
+ pureViewer={!$propPickerConfig}
122
+ collapsed={true}
123
+ json={resultByIdFiltered}
124
+ on:select={(e) => {
125
+ dispatch('select', `results.${e.detail}`)
126
+ }}
127
+ />
128
+ </div>
129
+ {/if}
100
130
  {:else}
101
131
  {#if previousId}
102
132
  <span class="font-bold text-sm">Previous Result</span>
@@ -1,5 +1,8 @@
1
- <script>import ObjectViewer from './ObjectViewer.svelte';
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ import ObjectViewer from './ObjectViewer.svelte';
2
3
  export let result;
4
+ export let flow_input = undefined;
5
+ const dispatch = createEventDispatcher();
3
6
  </script>
4
7
 
5
8
  <div class="w-full px-2">
@@ -7,4 +10,14 @@ export let result;
7
10
  <div class="overflow-y-auto mb-2 w-full">
8
11
  <ObjectViewer allowCopy={false} json={{ result }} on:select />
9
12
  </div>
13
+ {#if flow_input}
14
+ <span class="font-bold text-sm">Flow Input</span>
15
+ <div class="overflow-y-auto w-full">
16
+ <ObjectViewer
17
+ allowCopy={false}
18
+ json={flow_input}
19
+ on:select={(e) => dispatch('select', `flow_input.${e.detail}`)}
20
+ />
21
+ </div>
22
+ {/if}
10
23
  </div>
@@ -2,6 +2,7 @@ import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  result: any;
5
+ flow_input?: any;
5
6
  };
6
7
  events: {
7
8
  select: CustomEvent<any>;
@@ -3,6 +3,7 @@ import { JobService, ConcurrencyGroupsService } from '../../gen';
3
3
  import { sendUserToast } from '../../toast';
4
4
  import { workspaceStore } from '../../stores';
5
5
  import { tweened } from 'svelte/motion';
6
+ import { subtractDaysFromDateString } from '../../utils';
6
7
  export let jobs;
7
8
  export let user;
8
9
  export let label = null;
@@ -32,6 +33,8 @@ export let refreshRate = 5000;
32
33
  export let syncQueuedRunsCount = true;
33
34
  export let allWorkspaces = false;
34
35
  export let computeMinAndMax;
36
+ export let lookback = 0;
37
+ export let perPage = undefined;
35
38
  let intervalId;
36
39
  let sync = true;
37
40
  $: jobKinds = computeJobKinds(jobKindsCat);
@@ -42,6 +45,7 @@ $: ($workspaceStore && loadJobsIntern(true)) ||
42
45
  isSkipped != undefined &&
43
46
  jobKinds &&
44
47
  concurrencyKey &&
48
+ lookback &&
45
49
  user &&
46
50
  folder &&
47
51
  showFutureJobs != undefined &&
@@ -91,11 +95,12 @@ function computeJobKinds(jobKindsCat) {
91
95
  return kinds.join(',');
92
96
  }
93
97
  }
94
- async function fetchJobs(startedBefore, startedAfter) {
98
+ async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs) {
95
99
  return JobService.listJobs({
96
100
  workspace: $workspaceStore,
97
101
  createdOrStartedBefore: startedBefore,
98
102
  createdOrStartedAfter: startedAfter,
103
+ createdOrStartedAfterCompletedJobs: startedAfterCompletedJobs,
99
104
  schedulePath,
100
105
  scriptPathExact: path === null || path === '' ? undefined : path,
101
106
  createdBy: user === null || user === '' ? undefined : user,
@@ -112,16 +117,18 @@ async function fetchJobs(startedBefore, startedAfter) {
112
117
  result: resultFilter && resultFilter != '{}' && resultFilter != '' && resultError == ''
113
118
  ? resultFilter
114
119
  : undefined,
115
- allWorkspaces: allWorkspaces ? true : undefined
120
+ allWorkspaces: allWorkspaces ? true : undefined,
121
+ perPage
116
122
  });
117
123
  }
118
- async function fetchExtendedJobs(concurrencyKey, startedBefore, startedAfter) {
124
+ async function fetchExtendedJobs(concurrencyKey, startedBefore, startedAfter, startedAfterCompletedJobs) {
119
125
  return ConcurrencyGroupsService.listExtendedJobs({
120
126
  rowLimit: 1000,
121
127
  concurrencyKey: concurrencyKey == null || concurrencyKey == '' ? undefined : concurrencyKey,
122
128
  workspace: $workspaceStore,
123
129
  createdOrStartedBefore: startedBefore,
124
130
  createdOrStartedAfter: startedAfter,
131
+ createdOrStartedAfterCompletedJobs: startedAfterCompletedJobs,
125
132
  schedulePath,
126
133
  scriptPathExact: path === null || path === '' ? undefined : path,
127
134
  createdBy: user === null || user === '' ? undefined : user,
@@ -138,7 +145,8 @@ async function fetchExtendedJobs(concurrencyKey, startedBefore, startedAfter) {
138
145
  result: resultFilter && resultFilter != '{}' && resultFilter != '' && resultError == ''
139
146
  ? resultFilter
140
147
  : undefined,
141
- allWorkspaces: allWorkspaces ? true : undefined
148
+ allWorkspaces: allWorkspaces ? true : undefined,
149
+ perPage
142
150
  });
143
151
  }
144
152
  export async function loadJobs(nMinTs, nMaxTs, reset, shouldGetCount) {
@@ -160,8 +168,12 @@ async function loadJobsIntern(shouldGetCount) {
160
168
  }
161
169
  loading = true;
162
170
  try {
171
+ // Extend MinTs to fetch jobs mefore minTs and show a correct concurrency graph
172
+ // TODO: when an ended_at column is created on the completed_job table,
173
+ // lookback won't be needed anymore (just filter ended_at > minTs instead
174
+ const extendedMinTs = subtractDaysFromDateString(minTs, lookback);
163
175
  if (concurrencyKey == null || concurrencyKey === '') {
164
- let newJobs = await fetchJobs(maxTs, undefined);
176
+ let newJobs = await fetchJobs(maxTs, undefined, extendedMinTs);
165
177
  extendedJobs = { jobs: newJobs, obscured_jobs: [] };
166
178
  // Filter on minTs here and not in the backend
167
179
  // to get enough data for the concurrency graph
@@ -169,7 +181,7 @@ async function loadJobsIntern(shouldGetCount) {
169
181
  externalJobs = [];
170
182
  }
171
183
  else {
172
- extendedJobs = await fetchExtendedJobs(concurrencyKey, maxTs, undefined);
184
+ extendedJobs = await fetchExtendedJobs(concurrencyKey, maxTs, undefined, extendedMinTs);
173
185
  const newJobs = extendedJobs.jobs;
174
186
  const newExternalJobs = extendedJobs.obscured_jobs;
175
187
  // Filter on minTs here and not in the backend
@@ -245,11 +257,11 @@ async function syncer() {
245
257
  loading = true;
246
258
  let newJobs;
247
259
  if (concurrencyKey == null || concurrencyKey === '') {
248
- newJobs = await fetchJobs(maxTs, minTs ?? ts);
260
+ newJobs = await fetchJobs(maxTs, minTs ?? ts, undefined);
249
261
  }
250
262
  else {
251
263
  // Obscured jobs have no ids, so we have to do the full request
252
- extendedJobs = await fetchExtendedJobs(concurrencyKey, maxTs, undefined);
264
+ extendedJobs = await fetchExtendedJobs(concurrencyKey, maxTs, undefined, minTs ?? ts);
253
265
  externalJobs = computeExternalJobs(extendedJobs.obscured_jobs);
254
266
  // Filter on minTs here and not in the backend
255
267
  // to get enough data for the concurrency graph
@@ -336,6 +348,7 @@ onMount(() => {
336
348
  };
337
349
  });
338
350
  onDestroy(() => {
351
+ sync = false;
339
352
  if (intervalId) {
340
353
  clearInterval(intervalId);
341
354
  }
@@ -35,6 +35,8 @@ declare const __propDef: {
35
35
  minTs: string;
36
36
  maxTs: string;
37
37
  } | undefined) | undefined;
38
+ lookback?: number | undefined;
39
+ perPage?: number | undefined;
38
40
  loadJobs?: ((nMinTs: string | undefined, nMaxTs: string | undefined, reset: boolean, shouldGetCount?: boolean) => Promise<void>) | undefined;
39
41
  };
40
42
  events: {
@@ -121,7 +121,11 @@ const dispatch = createEventDispatcher();
121
121
  <span class="font-semibold text-xs leading-6">Arguments</span>
122
122
 
123
123
  <div class="w-full">
124
- <JobArgs args={job?.args} />
124
+ <JobArgs
125
+ id={job?.id}
126
+ workspace={job?.workspace_id ?? $workspaceStore ?? 'no_w'}
127
+ args={job?.args}
128
+ />
125
129
  </div>
126
130
 
127
131
  {#if job?.type === 'CompletedJob'}
@@ -1,5 +1,5 @@
1
1
  <script>import { goto } from '$app/navigation';
2
- import { displayDate, msToSec, truncateHash, truncateRev } from '../../utils';
2
+ import { displayDate, msToReadableTime, truncateHash, truncateRev } from '../../utils';
3
3
  import { Badge, Button } from '../common';
4
4
  import ScheduleEditor from '../ScheduleEditor.svelte';
5
5
  import BarsStaggered from '../icons/BarsStaggered.svelte';
@@ -45,9 +45,9 @@ function isJobCancelable(j) {
45
45
  >
46
46
  <div class="w-1/12 flex justify-center">
47
47
  {#if isSelectingJobsToCancel && isJobCancelable(job)}
48
- <div class="px-2">
49
- <input type="checkbox" checked={selected}/>
50
- </div>
48
+ <div class="px-2">
49
+ <input type="checkbox" checked={selected} />
50
+ </div>
51
51
  {/if}
52
52
  {#if isExternal}
53
53
  <Badge color="gray" baseClass="!px-1.5">
@@ -86,11 +86,11 @@ function isJobCancelable(j) {
86
86
  <div class="flex flex-row items-center gap-1 text-gray-500 dark:text-gray-300 text-2xs">
87
87
  {#if job}
88
88
  {#if 'started_at' in job && job.started_at}
89
- Started <TimeAgo date={job.started_at ?? ''} />
89
+ Started <TimeAgo withDate agoOnlyIfRecent date={job.started_at ?? ''} />
90
90
  {#if job && 'duration_ms' in job && job.duration_ms != undefined}
91
- (Ran in {msToSec(
91
+ (Ran in {msToReadableTime(
92
92
  job.duration_ms
93
- )}s{#if job.job_kind == 'flow' || job.job_kind == 'flowpreview'}&nbsp;total{/if})
93
+ )}{#if job.job_kind == 'flow' || job.job_kind == 'flowpreview'}&nbsp;total{/if})
94
94
  {/if}
95
95
  {#if job && (job.self_wait_time_ms || job.aggregate_wait_time_ms)}
96
96
  <WaitTimeWarning
@@ -102,7 +102,11 @@ function isJobCancelable(j) {
102
102
  {:else if `scheduled_for` in job && job.scheduled_for && forLater(job.scheduled_for)}
103
103
  Scheduled for {displayDate(job.scheduled_for)}
104
104
  {:else}
105
- Waiting for executor (created <TimeAgo date={job.created_at || ''} />)
105
+ Waiting for executor (created <TimeAgo
106
+ withDate
107
+ agoOnlyIfRecent
108
+ date={job.created_at || ''}
109
+ />)
106
110
  {/if}
107
111
  {/if}
108
112
  </div>
@@ -530,10 +530,10 @@ let concurrencyKeyTimeout = undefined;
530
530
  {`Filter by a json being a subset of the args/result. Try '\{"foo": "bar"\}'`}
531
531
  </span>
532
532
  <Label label="Filter by args">
533
- <JsonEditor on:change bind:error={argError} bind:code={copyArgFilter} />
533
+ <JsonEditor bind:error={argError} bind:code={copyArgFilter} />
534
534
  </Label>
535
535
  <Label label="Filter by result">
536
- <JsonEditor on:change bind:error={resultError} bind:code={copyResultFilter} />
536
+ <JsonEditor bind:error={resultError} bind:code={copyResultFilter} />
537
537
  </Label>
538
538
 
539
539
  <div class="flex flex-row gap-2 justify-between">
@@ -543,7 +543,6 @@ let concurrencyKeyTimeout = undefined;
543
543
  on:click={() => {
544
544
  argFilter = ''
545
545
  resultFilter = ''
546
- close(null)
547
546
  }}
548
547
  >
549
548
  Clear
@@ -555,7 +554,6 @@ let concurrencyKeyTimeout = undefined;
555
554
  on:click={() => {
556
555
  argFilter = copyArgFilter
557
556
  resultFilter = copyResultFilter
558
- close(null)
559
557
  }}
560
558
  >
561
559
  Set args/result filter
@@ -21,7 +21,6 @@ declare const __propDef: {
21
21
  filterBy?: "path" | "folder" | "user" | "label" | "concurrencyKey" | undefined;
22
22
  };
23
23
  events: {
24
- change: CustomEvent<any>;
25
24
  reset: CustomEvent<any>;
26
25
  } & {
27
26
  [evt: string]: CustomEvent<any>;