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
@@ -9,6 +9,7 @@ export let maxIsNow = false;
9
9
  export let minTimeSet = undefined;
10
10
  export let maxTimeSet = undefined;
11
11
  export let selectedIds = [];
12
+ export let canSelect = true;
12
13
  const dispatch = createEventDispatcher();
13
14
  const SUCCESS_COLOR = '#4ade80';
14
15
  // const SUCCESS_COLOR_TRANSPARENT = '#c9b638'
@@ -103,7 +104,7 @@ function mergeColors(color1, color2, slider) {
103
104
  return rgbToHex(blendedRgb);
104
105
  }
105
106
  function highlightSelectedPoints(ids) {
106
- if (ids.length === 0) {
107
+ if (!canSelect || ids.length === 0) {
107
108
  data.datasets[0].backgroundColor = FAIL_COLOR;
108
109
  data.datasets[1].backgroundColor = SUCCESS_COLOR;
109
110
  }
@@ -181,8 +182,10 @@ $: scatterOptions = {
181
182
  }
182
183
  },
183
184
  onClick: (e, u) => {
184
- const ids = u.map((j) => data.datasets[j.datasetIndex].data[j.index].id);
185
- selectedIds = ids;
185
+ if (canSelect) {
186
+ const ids = u.map((j) => data.datasets[j.datasetIndex].data[j.index].id);
187
+ selectedIds = ids;
188
+ }
186
189
  },
187
190
  scales: {
188
191
  x: {
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  minTimeSet?: string | undefined;
9
9
  maxTimeSet?: string | undefined;
10
10
  selectedIds?: string[] | undefined;
11
+ canSelect?: boolean | undefined;
11
12
  };
12
13
  events: {
13
14
  zoom: CustomEvent<any>;
@@ -1,16 +1,14 @@
1
- <script>import { defaultIfEmptyString, emptyString, truncateHash } from '../utils';
2
- import CliHelpBox from './CliHelpBox.svelte';
1
+ <script>import { computeSharableHash as computeSharableHash, defaultIfEmptyString, emptyString, truncateHash } from '../utils';
3
2
  import { Badge, Button } from './common';
4
3
  import SchemaForm from './SchemaForm.svelte';
5
4
  import SharedBadge from './SharedBadge.svelte';
6
- import CollapseLink from './CollapseLink.svelte';
7
- import { SCRIPT_VIEW_SHOW_RUN_FROM_CLI } from '../consts';
8
5
  import TimeAgo from './TimeAgo.svelte';
9
- import ClipboardPanel from './details/ClipboardPanel.svelte';
10
6
  import Popup from './common/popup/Popup.svelte';
11
7
  import { autoPlacement } from '@floating-ui/core';
12
8
  import { Calendar, CornerDownLeft } from 'lucide-svelte';
13
9
  import RunFormAdvancedPopup from './RunFormAdvancedPopup.svelte';
10
+ import { page } from '$app/stores';
11
+ import { replaceState } from '$app/navigation';
14
12
  export let runnable;
15
13
  export let runAction;
16
14
  export let buttonText = 'Run';
@@ -20,8 +18,6 @@ export let autofocus = false;
20
18
  export let topButton = false;
21
19
  export let loading = false;
22
20
  export let noVariablePicker = false;
23
- export let viewCliRun = false;
24
- export let isFlow;
25
21
  export let viewKeybinding = false;
26
22
  export let scheduledForStr;
27
23
  export let invisible_to_owner;
@@ -37,7 +33,26 @@ export function run() {
37
33
  runAction(scheduledForStr, args, invisible_to_owner, overrideTag);
38
34
  }
39
35
  export let isValid = true;
40
- $: cliCommand = `wmill ${isFlow ? 'flow' : 'script'} run ${runnable?.path} -d '${JSON.stringify(args)}'`;
36
+ $: onArgsChange(args);
37
+ let debounced = undefined;
38
+ function onArgsChange(args) {
39
+ try {
40
+ debounced && clearTimeout(debounced);
41
+ debounced = setTimeout(() => {
42
+ const nurl = new URL(window.location.href);
43
+ nurl.hash = computeSharableHash(args);
44
+ try {
45
+ replaceState(nurl.toString(), $page.state);
46
+ }
47
+ catch (e) {
48
+ console.error(e);
49
+ }
50
+ }, 200);
51
+ }
52
+ catch (e) {
53
+ console.error('Impossible to set hash in args', e);
54
+ }
55
+ }
41
56
  </script>
42
57
 
43
58
  <div class="max-w-3xl">
@@ -56,7 +71,7 @@ $: cliCommand = `wmill ${isFlow ? 'flow' : 'script'} run ${runnable?.path} -d '$
56
71
  <div class="flex items-center gap-2">
57
72
  <span class="text-sm text-tertiary">
58
73
  {#if runnable}
59
- Edited <TimeAgo withDate date={runnable.created_at || ''} /> by {runnable.created_by ||
74
+ Edited <TimeAgo withDate agoOnlyIfRecent date={runnable.created_at || ''} /> by {runnable.created_by ||
60
75
  'unknown'}
61
76
  {/if}
62
77
  </span>
@@ -180,18 +195,4 @@ $: cliCommand = `wmill ${isFlow ? 'flow' : 'script'} run ${runnable?.path} -d '$
180
195
  {buttonText}
181
196
  </Button>
182
197
  {/if}
183
-
184
- {#if viewCliRun}
185
- <div>
186
- <div class="mt-4" />
187
- {#if SCRIPT_VIEW_SHOW_RUN_FROM_CLI}
188
- <CollapseLink small text="Run it from CLI">
189
- <div class="mt-2" />
190
- <ClipboardPanel content={cliCommand} />
191
- <CliHelpBox />
192
- </CollapseLink>
193
- {/if}
194
- <div class="mb-20" />
195
- </div>
196
- {/if}
197
198
  </div>
@@ -23,8 +23,6 @@ declare const __propDef: {
23
23
  topButton?: boolean | undefined;
24
24
  loading?: boolean | undefined;
25
25
  noVariablePicker?: boolean | undefined;
26
- viewCliRun?: boolean | undefined;
27
- isFlow: boolean;
28
26
  viewKeybinding?: boolean | undefined;
29
27
  scheduledForStr: string | undefined;
30
28
  invisible_to_owner: boolean | undefined;
@@ -34,13 +34,23 @@ $: runnableType = scriptHash
34
34
  : flowPath
35
35
  ? 'FlowPath'
36
36
  : undefined;
37
+ let hasAlreadyFailed = false;
37
38
  async function loadInputHistory() {
38
- previousInputs = await InputService.getInputHistory({
39
- workspace: $workspaceStore,
40
- runnableId,
41
- runnableType,
42
- perPage: 10
43
- });
39
+ try {
40
+ previousInputs = await InputService.getInputHistory({
41
+ workspace: $workspaceStore,
42
+ runnableId,
43
+ runnableType,
44
+ perPage: 10
45
+ });
46
+ }
47
+ catch (e) {
48
+ console.error(e);
49
+ if (hasAlreadyFailed)
50
+ return;
51
+ hasAlreadyFailed = true;
52
+ sendUserToast(`Failed to load input history: ${e}`, true);
53
+ }
44
54
  }
45
55
  async function loadSavedInputs() {
46
56
  savedInputs = await InputService.listInputs({
@@ -113,28 +123,25 @@ async function deleteInput(input) {
113
123
  }
114
124
  }
115
125
  $: {
116
- if ($workspaceStore && jobs && (scriptHash || scriptPath || flowPath)) {
117
- console.log('loading inputs');
126
+ if ($workspaceStore && (scriptHash || scriptPath || flowPath)) {
118
127
  loadInputHistory();
119
128
  loadSavedInputs();
120
129
  }
121
130
  }
131
+ let previewArgs = undefined;
122
132
  function selectArgs(selected_args) {
123
- dispatch('selected_args', selected_args);
133
+ previewArgs = selected_args;
124
134
  }
125
- async function loadLargeArgs(id) {
135
+ async function loadLargeArgs(id, input, allowLarge) {
126
136
  if (!id)
127
137
  return;
128
- largeArgs = await InputService.getArgsFromHistoryOrSavedInput({
138
+ return await InputService.getArgsFromHistoryOrSavedInput({
129
139
  jobOrInputId: id,
130
- workspace: $workspaceStore
140
+ workspace: $workspaceStore,
141
+ input,
142
+ allowLarge
131
143
  });
132
144
  }
133
- let hasLargeArgs = false;
134
- $: hasLargeArgs =
135
- typeof selectedInput?.args === 'string' && selectedInput?.args === 'WINDMILL_TOO_BIG';
136
- let largeArgs = undefined;
137
- $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
138
145
  </script>
139
146
 
140
147
  <JobLoader
@@ -153,6 +160,7 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
153
160
  syncQueuedRunsCount={false}
154
161
  refreshRate={10000}
155
162
  computeMinAndMax={undefined}
163
+ perPage={5}
156
164
  />
157
165
 
158
166
  <div class="min-w-[300px] h-full">
@@ -179,17 +187,17 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
179
187
  {/if}
180
188
  </div>
181
189
 
182
- <div class="w-full flex flex-col gap-2 h-full overflow-y-auto p">
190
+ <div class="w-full flex flex-col gap-1 h-full overflow-y-auto p">
183
191
  {#if savedInputs === undefined}
184
192
  <Skeleton layout={[[8]]} />
185
193
  {:else if savedInputs.length > 0}
186
194
  {#each savedInputs as i}
187
195
  <button
188
196
  class={classNames(
189
- `w-full flex items-center group justify-between gap-4 py-2 px-4 text-left border rounded-md hover:bg-surface-hover transition-all`,
197
+ `w-full flex items-center text-sm group justify-between gap-4 py-1.5 px-4 text-left border rounded-sm hover:bg-surface-hover transition-all`,
190
198
  selectedInput === i ? 'border-blue-500 bg-blue-50 dark:bg-blue-900' : ''
191
199
  )}
192
- on:click={() => {
200
+ on:click={async () => {
193
201
  if (!i.isEditing) {
194
202
  if (selectedInput === i) {
195
203
  selectedInput = null
@@ -197,6 +205,7 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
197
205
  selectedInput = i
198
206
  }
199
207
  }
208
+ selectArgs(await loadLargeArgs(i.id, true, false))
200
209
  }}
201
210
  >
202
211
  <div class="w-full h-full items-center justify-between flex gap-1 min-w-0">
@@ -280,8 +289,8 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
280
289
  <span class="text-sm font-semibold">Previous runs</span>
281
290
 
282
291
  <div class="w-full flex flex-col gap-1 p-0 h-full overflow-y-auto">
283
- {#if loading}
284
- <Skeleton layout={[[2]]} />
292
+ {#if loading && (jobs == undefined || jobs?.length == 0)}
293
+ <div class="text-left text-tertiary text-xs">Loading current runs...</div>
285
294
  {:else if jobs.length > 0}
286
295
  {#each jobs as i (i.id)}
287
296
  <button
@@ -296,7 +305,7 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
296
305
  <div class="">
297
306
  <div class="rounded-full w-2 h-2 bg-orange-400 animate-pulse" />
298
307
  </div>
299
- <div class="col-span-2">
308
+ <div class="col-span-2 truncate">
300
309
  {i.created_by}
301
310
  </div>
302
311
  <div
@@ -317,6 +326,11 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
317
326
  </div>
318
327
  </button>
319
328
  {/each}
329
+ {#if jobs.length == 5}
330
+ <div class="text-left text-tertiary text-xs"
331
+ >... there may be more runs not displayed here as the limit is 5</div
332
+ >
333
+ {/if}
320
334
  {:else}
321
335
  <div class="text-left text-tertiary text-xs">No running runs</div>
322
336
  {/if}
@@ -332,12 +346,13 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
332
346
  `w-full flex items-center justify-between gap-4 py-2 px-4 text-left border rounded-sm hover:bg-surface-hover transition-a`,
333
347
  selectedInput === i ? 'border-blue-500 bg-blue-50 dark:bg-blue-900' : ''
334
348
  )}
335
- on:click={() => {
349
+ on:click={async () => {
336
350
  if (selectedInput === i) {
337
351
  selectedInput = null
338
352
  } else {
339
353
  selectedInput = i
340
354
  }
355
+ selectArgs(await loadLargeArgs(i.id, false, false))
341
356
  }}
342
357
  >
343
358
  <div
@@ -346,7 +361,7 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
346
361
  <div class="">
347
362
  <div class="rounded-full w-2 h-2 {i.success ? 'bg-green-400' : 'bg-red-400'}" />
348
363
  </div>
349
- <div class="col-span-2">
364
+ <div class="col-span-2 truncate" title={i.created_by}>
350
365
  {i.created_by}
351
366
  </div>
352
367
  <div
@@ -382,33 +397,29 @@ $: hasLargeArgs && loadLargeArgs(selectedInput?.id);
382
397
  <Pane>
383
398
  <div class="h-full overflow-hidden min-h-0 flex flex-col justify-between">
384
399
  <div class="w-full flex flex-col min-h-0 gap-2 px-2 py-2 grow">
385
- <div class="text-sm font-semibold">Preview</div>
386
400
  <div class="w-full flex flex-col">
387
401
  <Button
388
402
  color="blue"
389
403
  btnClasses="w-full"
390
404
  size="sm"
391
405
  spacingSize="xl"
392
- on:click={() => selectArgs(hasLargeArgs ? largeArgs : selectedInput?.args)}
393
- disabled={Object.keys(selectedInput?.args || {}).length === 0 ||
394
- (hasLargeArgs && Object.keys(largeArgs || {}).length === 0)}
406
+ on:click={async () => {
407
+ dispatch('selected_args', await loadLargeArgs(selectedInput?.id, undefined, false))
408
+ }}
409
+ disabled={!selectedInput}
395
410
  >
396
411
  <ArrowLeftIcon class="w-4 h-4 mr-2" />
397
412
  Use Input
398
413
  </Button>
399
414
  </div>
400
415
  <div class="w-full min-h-0 grow overflow-auto">
401
- {#if hasLargeArgs}
402
- {#if largeArgs}
403
- <div class=" overflow-auto h-full p-2">
404
- <ObjectViewer json={largeArgs} />
405
- </div>
406
- {:else}
407
- <Skeleton layout={[[8]]} />
408
- {/if}
409
- {:else if Object.keys(selectedInput?.args || {}).length > 0}
416
+ {#if typeof previewArgs == 'string' && previewArgs == 'WINDMILL_TOO_BIG'}
417
+ <div class="text-secondary mt-2">
418
+ Payload too big to preview but can still be loaded</div
419
+ >
420
+ {:else if Object.keys(previewArgs || {}).length > 0}
410
421
  <div class=" overflow-auto h-full p-2">
411
- <ObjectViewer json={selectedInput?.args} />
422
+ <ObjectViewer json={previewArgs} />
412
423
  </div>
413
424
  {:else}
414
425
  <div class="text-center text-tertiary">
@@ -19,12 +19,14 @@ import { List, Loader2, Save } from 'lucide-svelte';
19
19
  import FlowRetries from './flows/content/FlowRetries.svelte';
20
20
  import WorkerTagPicker from './WorkerTagPicker.svelte';
21
21
  import Label from './Label.svelte';
22
+ import DateTimeInput from './DateTimeInput.svelte';
22
23
  let optionTabSelected = 'error_handler';
23
24
  let is_flow = false;
24
25
  let initialPath = '';
25
26
  let edit = true;
26
27
  let schedule = '0 0 12 * *';
27
28
  let timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
29
+ let paused_until = undefined;
28
30
  let itemKind = 'script';
29
31
  let errorHandleritemKind = 'script';
30
32
  let wsErrorHandlerMuted = false;
@@ -64,6 +66,8 @@ export async function openNew(nis_flow, initial_script_path) {
64
66
  runnable = undefined;
65
67
  is_flow = nis_flow;
66
68
  schedule = '0 0 12 * *';
69
+ paused_until = undefined;
70
+ showPauseUntil = false;
67
71
  let defaultErrorHandlerMaybe = undefined;
68
72
  let defaultRecoveryHandlerMaybe = undefined;
69
73
  if ($workspaceStore) {
@@ -224,6 +228,8 @@ async function loadSchedule() {
224
228
  enabled = s.enabled;
225
229
  schedule = s.schedule;
226
230
  timezone = s.timezone;
231
+ paused_until = s.paused_until;
232
+ showPauseUntil = paused_until !== undefined;
227
233
  summary = s.summary ?? '';
228
234
  script_path = s.script_path ?? '';
229
235
  await loadScript(script_path);
@@ -306,7 +312,8 @@ async function scheduleScript() {
306
312
  retry: retry,
307
313
  summary: summary != '' ? summary : undefined,
308
314
  no_flow_overlap: no_flow_overlap,
309
- tag: tag
315
+ tag: tag,
316
+ paused_until: paused_until
310
317
  }
311
318
  });
312
319
  sendUserToast(`Schedule ${path} updated`);
@@ -335,7 +342,8 @@ async function scheduleScript() {
335
342
  retry: retry,
336
343
  summary: summary != '' ? summary : undefined,
337
344
  no_flow_overlap: no_flow_overlap,
338
- tag: tag
345
+ tag: tag,
346
+ paused_until: paused_until
339
347
  }
340
348
  });
341
349
  sendUserToast(`Schedule ${path} created`);
@@ -362,6 +370,8 @@ $: {
362
370
  let drawer;
363
371
  let pathC;
364
372
  let dirtyPath = false;
373
+ let showPauseUntil = false;
374
+ $: !showPauseUntil && (paused_until = undefined);
365
375
  </script>
366
376
 
367
377
  <Drawer size="900px" bind:this={drawer}>
@@ -377,9 +387,9 @@ let dirtyPath = false;
377
387
  variant="border"
378
388
  startIcon={{ icon: List }}
379
389
  disabled={!allowSchedule || pathError != '' || emptyString(script_path)}
380
- href={`/runs/${script_path}`}
390
+ href={`/runs/${script_path}?show_schedules=true&show_future_jobs=true`}
381
391
  >
382
- View Runs
392
+ View runs
383
393
  </Button>
384
394
  </div>
385
395
  <div class="mr-8 center-center -mt-1">
@@ -479,6 +489,18 @@ let dirtyPath = false;
479
489
  <Tooltip>Schedules use CRON syntax. Seconds are mandatory.</Tooltip>
480
490
  </svelte:fragment>
481
491
  <CronInput disabled={!can_write} bind:schedule bind:timezone bind:validCRON />
492
+ <Toggle
493
+ options={{
494
+ right: 'Pause schedule until...',
495
+ rightTooltip:
496
+ 'Pausing the schedule will program the next job to run as if the schedule starts at the time the pause is lifted, instead of now.'
497
+ }}
498
+ bind:checked={showPauseUntil}
499
+ size="xs"
500
+ />
501
+ {#if showPauseUntil}
502
+ <DateTimeInput bind:value={paused_until} />
503
+ {/if}
482
504
  </Section>
483
505
  <Section label="Runnable">
484
506
  {#if !edit}
@@ -12,7 +12,7 @@ import DrawerContent from './common/drawer/DrawerContent.svelte';
12
12
  import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
13
13
  import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
14
14
  import ErrorHandlerToggleButton from './details/ErrorHandlerToggleButton.svelte';
15
- import { Bug, Calendar, CheckCircle, Code, DiffIcon, Pen, Plus, Rocket, Save, Settings, X } from 'lucide-svelte';
15
+ import { Bug, Calendar, CheckCircle, Code, CornerDownLeft, DiffIcon, Pen, Plus, Rocket, Save, Settings, X } from 'lucide-svelte';
16
16
  import { sendUserToast } from '../toast';
17
17
  import { isCloudHosted } from '../cloud';
18
18
  import Awareness from './Awareness.svelte';
@@ -29,6 +29,8 @@ import { writable } from 'svelte/store';
29
29
  import { loadScriptSchedule, defaultScriptLanguages } from '../scripts';
30
30
  import DefaultScripts from './DefaultScripts.svelte';
31
31
  import { createEventDispatcher } from 'svelte';
32
+ import CustomPopover from './CustomPopover.svelte';
33
+ import Summary from './Summary.svelte';
32
34
  export let script;
33
35
  export let initialPath = '';
34
36
  export let template = 'script';
@@ -39,6 +41,7 @@ export let diffDrawer = undefined;
39
41
  export let savedScript = undefined;
40
42
  export let searchParams = new URLSearchParams();
41
43
  export let disableHistoryChange = false;
44
+ export let replaceStateFn = (url) => window.history.replaceState(null, '', url);
42
45
  let metadataOpen = showMeta ||
43
46
  (initialPath == '' &&
44
47
  searchParams.get('state') == undefined &&
@@ -110,7 +113,7 @@ $: {
110
113
  }
111
114
  });
112
115
  }
113
- $: !disableHistoryChange && window.history.replaceState(null, '', '#' + encodeState(script));
116
+ $: !disableHistoryChange && replaceStateFn('#' + encodeState(script));
114
117
  if (script.content == '') {
115
118
  initContent(script.language, script.kind, template);
116
119
  }
@@ -143,7 +146,7 @@ async function createSchedule(path) {
143
146
  sendUserToast(`The primary schedule could not be created: ${err}`, true);
144
147
  }
145
148
  }
146
- async function editScript(stay) {
149
+ async function editScript(stay, deploymentMsg) {
147
150
  loadingSave = true;
148
151
  try {
149
152
  try {
@@ -185,7 +188,8 @@ async function editScript(stay) {
185
188
  timeout: script.timeout,
186
189
  concurrency_key: emptyString(script.concurrency_key) ? undefined : script.concurrency_key,
187
190
  visible_to_runner_only: script.visible_to_runner_only,
188
- no_main_func: script.no_main_func
191
+ no_main_func: script.no_main_func,
192
+ deployment_message: deploymentMsg || undefined
189
193
  }
190
194
  });
191
195
  const { enabled, timezone, args, cron, summary } = $scheduleStore;
@@ -380,6 +384,8 @@ function onKeyDown(event) {
380
384
  let path = undefined;
381
385
  let dirtyPath = false;
382
386
  let selectedTab = 'metadata';
387
+ let deploymentMsg = '';
388
+ let msgInput = undefined;
383
389
  </script>
384
390
 
385
391
  <svelte:window on:keydown={onKeyDown} />
@@ -917,7 +923,7 @@ let selectedTab = 'metadata';
917
923
  <div class="flex flex-col h-screen">
918
924
  <div class="flex h-12 items-center px-4">
919
925
  <div class="justify-between flex gap-2 lg:gap-8 w-full items-center">
920
- <div class="flex flex-row gap-2">
926
+ <div class="flex flex-row gap-2 grow max-w-md">
921
927
  <div class="center-center">
922
928
  <button
923
929
  on:click={async () => {
@@ -927,14 +933,7 @@ let selectedTab = 'metadata';
927
933
  <LanguageIcon lang={script.language} height={20} />
928
934
  </button>
929
935
  </div>
930
- <div class="min-w-32 lg:min-w-64 w-full max-w-md">
931
- <input
932
- type="text"
933
- placeholder="Script summary"
934
- class="text-sm w-full font-semibold"
935
- bind:value={script.summary}
936
- />
937
- </div>
936
+ <Summary bind:value={script.summary} />
938
937
  </div>
939
938
 
940
939
  <div class="gap-4 flex">
@@ -1032,15 +1031,41 @@ let selectedTab = 'metadata';
1032
1031
  >
1033
1032
  <span class="hidden lg:flex"> Draft </span>
1034
1033
  </Button>
1035
- <Button
1036
- loading={loadingSave}
1037
- size="xs"
1038
- startIcon={{ icon: Save }}
1039
- on:click={() => editScript(false)}
1040
- dropdownItems={computeDropdownItems(initialPath)}
1041
- >
1042
- Deploy
1043
- </Button>
1034
+
1035
+ <CustomPopover appearTimeout={0} focusEl={msgInput}>
1036
+ <Button
1037
+ loading={loadingSave}
1038
+ size="xs"
1039
+ startIcon={{ icon: Save }}
1040
+ on:click={() => editScript(false)}
1041
+ dropdownItems={computeDropdownItems(initialPath)}
1042
+ >
1043
+ Deploy
1044
+ </Button>
1045
+ <svelte:fragment slot="overlay">
1046
+ <div class="flex flex-row gap-2 min-w-72">
1047
+ <input
1048
+ type="text"
1049
+ placeholder="Deployment message"
1050
+ bind:value={deploymentMsg}
1051
+ bind:this={msgInput}
1052
+ on:keydown={(e) => {
1053
+ if (e.key === 'Enter') {
1054
+ editScript(false, deploymentMsg)
1055
+ }
1056
+ }}
1057
+ />
1058
+ <Button
1059
+ size="xs"
1060
+ on:click={() => editScript(false, deploymentMsg)}
1061
+ endIcon={{ icon: CornerDownLeft }}
1062
+ loading={loadingSave}
1063
+ >
1064
+ Deploy
1065
+ </Button>
1066
+ </div>
1067
+ </svelte:fragment>
1068
+ </CustomPopover>
1044
1069
  </div>
1045
1070
  </div>
1046
1071
  </div>
@@ -13,6 +13,7 @@ declare const __propDef: {
13
13
  savedScript?: NewScriptWithDraft | undefined;
14
14
  searchParams?: URLSearchParams | undefined;
15
15
  disableHistoryChange?: boolean | undefined;
16
+ replaceStateFn?: ((url: string) => void) | undefined;
16
17
  setCode?: ((code: string) => void) | undefined;
17
18
  };
18
19
  events: {
@@ -8,14 +8,15 @@ let uf = new uFuzzy(opts);
8
8
  $: plaintextItems = items?.map((item) => f(item)) ?? [];
9
9
  $: plaintextItems && filter != undefined && setTimeout(() => filterItems(), 0);
10
10
  function filterItems() {
11
- if (items == undefined || filter.length == 0) {
11
+ let trimmed = filter.trim();
12
+ if (items == undefined || trimmed.length == 0) {
12
13
  filteredItems = items;
13
14
  return;
14
15
  }
15
16
  // pre-filter
16
- let idxs = uf.filter(plaintextItems, filter) ?? [];
17
- let info = uf.info(idxs, plaintextItems, filter);
18
- let order = uf.sort(info, plaintextItems, filter);
17
+ let idxs = uf.filter(plaintextItems, trimmed) ?? [];
18
+ let info = uf.info(idxs, plaintextItems, trimmed);
19
+ let order = uf.sort(info, plaintextItems, trimmed);
19
20
  let result = [];
20
21
  for (let i = 0; i < order.length; i++) {
21
22
  let infoIdx = order[i];
@@ -0,0 +1,74 @@
1
+ <script>import { Pen } from 'lucide-svelte';
2
+ export let value;
3
+ function blur(e) {
4
+ e.key === 'Enter' && e?.target?.blur();
5
+ }
6
+ </script>
7
+
8
+ <div class="flex flex-row center-center gap-1 min-w-32 lg:min-w-64 w-full max-w-md">
9
+ <div class="relative w-full">
10
+ <input
11
+ title="Rename"
12
+ type="text"
13
+ placeholder="Untitled"
14
+ class="windmillapp app-title text-sm w-full font-semibold"
15
+ bind:value
16
+ on:keydown={blur}
17
+ />
18
+ <Pen class="absolute top-2 right-2 pen-icon -z-10 opacity-60" size={14} />
19
+ </div>
20
+ </div>
21
+
22
+ <style global>
23
+ :global(.app-title) {
24
+ display: block;
25
+ width: 100%;
26
+ border-radius: 0.25rem;
27
+ border-width: 0px;
28
+ padding: 0.25rem;
29
+ padding-left: 0.5rem;
30
+ padding-right: 0.5rem;
31
+ font-size: 0.875rem;
32
+ line-height: 1.25rem;
33
+ font-weight: 600
34
+ }
35
+
36
+ :global(.app-title:hover) {
37
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
38
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
39
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
40
+ --tw-ring-opacity: 1;
41
+ --tw-ring-color: rgb(234 238 244 / var(--tw-ring-opacity));
42
+ --tw-ring-offset-width: 0px
43
+ }
44
+
45
+ :global(.app-title:focus) {
46
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
47
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
48
+ --tw-ring-opacity: 1;
49
+ --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
50
+ --tw-ring-offset-width: 0px;
51
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000)
52
+ }
53
+
54
+ :global(.dark) :global(.app-title) {
55
+ --tw-border-opacity: 1;
56
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
57
+ --tw-bg-opacity: 1;
58
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
59
+ --tw-text-opacity: 1;
60
+ color: rgb(var(--color-text-secondary) / var(--tw-text-opacity))
61
+ }
62
+
63
+ :global(.dark) :global(.app-title:focus) {
64
+ --tw-ring-opacity: 1 !important;
65
+ --tw-ring-color: rgb(94 129 172 / var(--tw-ring-opacity)) !important
66
+ }
67
+
68
+ :global(.dark) :global(.app-title:hover) {
69
+ --tw-ring-opacity: 1;
70
+ --tw-ring-color: rgb(54 77 110 / var(--tw-ring-opacity))
71
+ }
72
+ :global(.app-title:focus) + :global(.pen-icon) {
73
+ display: none
74
+ }</style>