windmill-components 1.383.9 → 1.389.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 (189) hide show
  1. package/package/assets/app.css +25 -1
  2. package/package/components/ArgInput.svelte +2 -1
  3. package/package/components/ChangeInstanceUsername.svelte +9 -108
  4. package/package/components/ChangeInstanceUsernameInner.svelte +112 -0
  5. package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +21 -0
  6. package/package/components/DiffDrawer.svelte +27 -20
  7. package/package/components/DiffEditor.svelte +5 -1
  8. package/package/components/DisplayResult.svelte +39 -9
  9. package/package/components/DropdownV2.svelte +4 -26
  10. package/package/components/DropdownV2.svelte.d.ts +9 -1
  11. package/package/components/DropdownV2Inner.svelte +42 -0
  12. package/package/components/DropdownV2Inner.svelte.d.ts +40 -0
  13. package/package/components/Editor.svelte +24 -4
  14. package/package/components/Editor.svelte.d.ts +5 -4
  15. package/package/components/EditorBar.svelte +9 -11
  16. package/package/components/EditorSettings.svelte +44 -0
  17. package/package/components/EditorSettings.svelte.d.ts +17 -0
  18. package/package/components/EditorTheme.svelte +1 -1
  19. package/package/components/ErrorOrRecoveryHandler.svelte +27 -20
  20. package/package/components/FlowBuilder.svelte +17 -3
  21. package/package/components/FlowBuilder.svelte.d.ts +3 -0
  22. package/package/components/FlowGraphViewerStep.svelte +1 -1
  23. package/package/components/FlowStatusViewer.svelte +3 -1
  24. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  25. package/package/components/FlowStatusViewerInner.svelte +5 -2
  26. package/package/components/FlowViewerInner.svelte +3 -7
  27. package/package/components/FormatOnSave.svelte +12 -29
  28. package/package/components/GraphqlSchemaViewer.svelte +1 -1
  29. package/package/components/GraphqlSchemaViewer.svelte.d.ts +1 -1
  30. package/package/components/HighlightCode.svelte +3 -0
  31. package/package/components/InstanceNameEditor.svelte +64 -0
  32. package/package/components/InstanceNameEditor.svelte.d.ts +23 -0
  33. package/package/components/LightweightArgInput.svelte +6 -11
  34. package/package/components/LogViewer.svelte +37 -29
  35. package/package/components/LogViewer.svelte.d.ts +2 -0
  36. package/package/components/ObjectResourceInput.svelte +1 -1
  37. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +3 -3
  39. package/package/components/QueueMetricsDrawer.svelte +6 -218
  40. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -3
  41. package/package/components/QueueMetricsDrawerInner.svelte +211 -0
  42. package/package/components/QueueMetricsDrawerInner.svelte.d.ts +15 -0
  43. package/package/components/ResourceEditorDrawer.svelte +14 -11
  44. package/package/components/ResourceEditorDrawer.svelte.d.ts +1 -1
  45. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  46. package/package/components/S3FilePicker.svelte +20 -8
  47. package/package/components/ScheduleEditorInner.svelte +497 -469
  48. package/package/components/ScriptBuilder.svelte +12 -1
  49. package/package/components/ScriptBuilder.svelte.d.ts +3 -0
  50. package/package/components/ScriptEditor.svelte +1 -0
  51. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  52. package/package/components/ServiceLogsInner.svelte +511 -0
  53. package/package/components/ServiceLogsInner.svelte.d.ts +20 -0
  54. package/package/components/SimpleEditor.svelte +27 -2
  55. package/package/components/SimpleEditor.svelte.d.ts +5 -3
  56. package/package/components/Summary.svelte +33 -31
  57. package/package/components/Summary.svelte.d.ts +1 -0
  58. package/package/components/SuperadminSettings.svelte +28 -10
  59. package/package/components/TemplateEditor.svelte +1 -1
  60. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  61. package/package/components/VimMode.svelte +16 -0
  62. package/package/components/VimMode.svelte.d.ts +14 -0
  63. package/package/components/WorkerTagPicker.svelte +4 -1
  64. package/package/components/WorkspaceGroup.svelte +139 -68
  65. package/package/components/WorkspaceGroup.svelte.d.ts +3 -0
  66. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +19 -2
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  68. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +2 -1
  69. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -0
  70. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +2 -1
  71. package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -3
  72. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +2 -1
  73. package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -0
  74. package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +2 -1
  75. package/package/components/apps/editor/AppEditor.svelte +239 -92
  76. package/package/components/apps/editor/AppEditorBottomPanel.svelte +22 -0
  77. package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +24 -0
  78. package/package/components/apps/editor/AppEditorHeader.svelte +44 -2
  79. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +9 -0
  80. package/package/components/apps/editor/AppExportButton.svelte +1 -1
  81. package/package/components/apps/editor/AppPreview.svelte +4 -0
  82. package/package/components/apps/editor/DeploymentHistory.svelte +7 -3
  83. package/package/components/apps/editor/GridEditor.svelte +4 -13
  84. package/package/components/apps/editor/RunnableJobPanel.svelte +25 -58
  85. package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +10 -1
  86. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte +56 -0
  87. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte.d.ts +18 -0
  88. package/package/components/apps/editor/SubGridEditor.svelte +3 -1
  89. package/package/components/apps/editor/component/Component.svelte +26 -4
  90. package/package/components/apps/editor/component/Component.svelte.d.ts +1 -0
  91. package/package/components/apps/editor/component/components.d.ts +5 -0
  92. package/package/components/apps/editor/componentsPanel/CssProperty.svelte +2 -0
  93. package/package/components/apps/editor/componentsPanel/tailwindUtils.js +267 -1
  94. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +9 -1
  95. package/package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +2 -0
  96. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -0
  97. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +3 -0
  98. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +7 -2
  99. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +5 -1
  100. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +14 -2
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +1 -0
  102. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +25 -5
  103. package/package/components/apps/editor/settingsPanel/HideButton.svelte +47 -0
  104. package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +22 -0
  105. package/package/components/apps/editor/settingsPanel/TableActions.svelte +43 -4
  106. package/package/components/apps/editor/settingsPanel/TableActions.svelte.d.ts +2 -1
  107. package/package/components/apps/svelte-grid/Grid.svelte +6 -2
  108. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +1 -0
  109. package/package/components/apps/svelte-grid/MoveResize.svelte +11 -3
  110. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
  111. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  112. package/package/components/apps/svelte-grid/utils/item.js +11 -4
  113. package/package/components/common/button/Button.svelte.d.ts +2 -2
  114. package/package/components/common/calendarPicker/CalendarPicker.svelte +6 -2
  115. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
  116. package/package/components/common/drawer/ConditionalPortal.svelte +2 -1
  117. package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +1 -0
  118. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  119. package/package/components/common/popup/Popup.svelte +2 -1
  120. package/package/components/common/popup/Popup.svelte.d.ts +1 -0
  121. package/package/components/common/table/AppRow.svelte +11 -8
  122. package/package/components/common/table/AppRow.svelte.d.ts +1 -2
  123. package/package/components/common/table/FlowRow.svelte +3 -3
  124. package/package/components/common/table/FlowRow.svelte.d.ts +1 -2
  125. package/package/components/common/table/RawAppRow.svelte +3 -3
  126. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -2
  127. package/package/components/common/table/ScriptRow.svelte +3 -3
  128. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -2
  129. package/package/components/copilot/CodeCompletionStatus.svelte +21 -46
  130. package/package/components/copilot/StepGen.svelte +2 -1
  131. package/package/components/custom_ui.d.ts +4 -1
  132. package/package/components/flows/CreateActionsApp.svelte +11 -8
  133. package/package/components/flows/CreateActionsFlow.svelte +11 -8
  134. package/package/components/flows/FlowEditor.svelte +1 -2
  135. package/package/components/flows/FlowEditor.svelte.d.ts +0 -1
  136. package/package/components/flows/FlowHistory.svelte +6 -3
  137. package/package/components/flows/content/FlowModuleScript.svelte +15 -11
  138. package/package/components/flows/content/FlowSettings.svelte +1 -4
  139. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -0
  140. package/package/components/flows/header/FlowYamlEditor.svelte +55 -0
  141. package/package/components/flows/header/FlowYamlEditor.svelte.d.ts +17 -0
  142. package/package/components/flows/map/InsertTriggerButton.svelte +1 -1
  143. package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +1 -0
  144. package/package/components/flows/map/VirtualItem.svelte +1 -1
  145. package/package/components/flows/pickers/PickHubScript.svelte +1 -0
  146. package/package/components/flows/types.d.ts +7 -6
  147. package/package/components/flows/utils.d.ts +9 -0
  148. package/package/components/flows/utils.js +21 -0
  149. package/package/components/graph/graphBuilder.js +1 -0
  150. package/package/components/graph/model.d.ts +1 -0
  151. package/package/components/graph/renderers/edges/BaseEdge.svelte +16 -0
  152. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  153. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +5 -1
  154. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +1 -0
  155. package/package/components/home/Item.svelte +0 -17
  156. package/package/components/home/deploy_ui.d.ts +2 -0
  157. package/package/components/home/deploy_ui.js +21 -0
  158. package/package/components/icons/RustIcon.svelte +70 -0
  159. package/package/components/icons/RustIcon.svelte.d.ts +25 -0
  160. package/package/components/icons/rust-logo.svg +1 -0
  161. package/package/components/instanceSettings.js +2 -2
  162. package/package/components/monaco_keybindings.d.ts +3 -0
  163. package/package/components/monaco_keybindings.js +9 -0
  164. package/package/components/preview/FlowPreviewStatus.svelte +6 -2
  165. package/package/components/runs/JobLoader.svelte +12 -3
  166. package/package/components/runs/JobLoader.svelte.d.ts +1 -1
  167. package/package/components/runs/ManuelDatePicker.svelte +31 -44
  168. package/package/components/runs/ManuelDatePicker.svelte.d.ts +6 -2
  169. package/package/components/runs/RunsFilter.svelte +4 -1
  170. package/package/components/runs/RunsFilter.svelte.d.ts +1 -0
  171. package/package/components/search/GlobalSearchModal.svelte +36 -25
  172. package/package/components/wizards/TableActionsWizard.svelte +84 -0
  173. package/package/components/wizards/TableActionsWizard.svelte.d.ts +22 -0
  174. package/package/editorUtils.js +2 -0
  175. package/package/gen/core/OpenAPI.js +1 -1
  176. package/package/gen/schemas.gen.d.ts +8 -8
  177. package/package/gen/schemas.gen.js +8 -8
  178. package/package/gen/services.gen.d.ts +4 -0
  179. package/package/gen/services.gen.js +16 -0
  180. package/package/gen/types.gen.d.ts +20 -8
  181. package/package/infer.d.ts +1 -1
  182. package/package/infer.js +48 -7
  183. package/package/script_helpers.d.ts +1 -0
  184. package/package/script_helpers.js +39 -1
  185. package/package/scripts.d.ts +1 -1
  186. package/package/scripts.js +11 -3
  187. package/package/stores.d.ts +5 -1
  188. package/package/stores.js +7 -2
  189. package/package.json +13 -7
@@ -4,7 +4,6 @@ import DrawerContent from './common/drawer/DrawerContent.svelte';
4
4
  import CronInput from './CronInput.svelte';
5
5
  import Path from './Path.svelte';
6
6
  import Required from './Required.svelte';
7
- import SchemaForm from './SchemaForm.svelte';
8
7
  import ScriptPicker from './ScriptPicker.svelte';
9
8
  import ErrorOrRecoveryHandler from './ErrorOrRecoveryHandler.svelte';
10
9
  import Toggle from './Toggle.svelte';
@@ -49,85 +48,100 @@ let initialScriptPath = '';
49
48
  let runnable;
50
49
  let args = {};
51
50
  let loading = false;
51
+ let drawerLoading = true;
52
52
  export function openEdit(ePath, isFlow) {
53
- is_flow = isFlow;
54
- initialPath = ePath;
55
- itemKind = is_flow ? 'flow' : 'script';
56
- if (path == ePath) {
57
- loadSchedule();
53
+ drawerLoading = true;
54
+ try {
55
+ drawer?.openDrawer();
56
+ is_flow = isFlow;
57
+ initialPath = ePath;
58
+ itemKind = is_flow ? 'flow' : 'script';
59
+ if (path == ePath) {
60
+ loadSchedule();
61
+ }
62
+ else {
63
+ path = ePath;
64
+ }
65
+ edit = true;
58
66
  }
59
- else {
60
- path = ePath;
67
+ finally {
68
+ drawerLoading = false;
61
69
  }
62
- edit = true;
63
- drawer?.openDrawer();
64
70
  }
65
71
  export async function openNew(nis_flow, initial_script_path) {
66
- args = {};
67
- runnable = undefined;
68
- is_flow = nis_flow;
69
- schedule = '0 0 12 * *';
70
- paused_until = undefined;
71
- showPauseUntil = false;
72
- let defaultErrorHandlerMaybe = undefined;
73
- let defaultRecoveryHandlerMaybe = undefined;
74
- if ($workspaceStore) {
75
- defaultErrorHandlerMaybe = (await SettingService.getGlobal({
76
- key: 'default_error_handler_' + $workspaceStore
77
- }));
78
- defaultRecoveryHandlerMaybe = (await SettingService.getGlobal({
79
- key: 'default_recovery_handler_' + $workspaceStore
80
- }));
81
- }
82
- edit = false;
83
- itemKind = nis_flow ? 'flow' : 'script';
84
- initialScriptPath = initial_script_path ?? '';
85
- summary = '';
86
- no_flow_overlap = false;
87
- path = initialScriptPath;
88
- initialPath = initialScriptPath;
89
- script_path = initialScriptPath;
90
- await loadScript(script_path);
91
- if (defaultErrorHandlerMaybe !== undefined && defaultErrorHandlerMaybe !== null) {
92
- wsErrorHandlerMuted = defaultErrorHandlerMaybe['wsErrorHandlerMuted'];
93
- let splitted = defaultErrorHandlerMaybe['errorHandlerPath'].split('/');
94
- errorHandleritemKind = splitted[0];
95
- errorHandlerPath = splitted.slice(1)?.join('/');
96
- errorHandlerExtraArgs = defaultErrorHandlerMaybe['errorHandlerExtraArgs'];
97
- errorHandlerCustomInitialPath = errorHandlerPath;
98
- errorHandlerSelected = isSlackHandler('error', errorHandlerPath) ? 'slack' : 'custom';
99
- failedTimes = defaultErrorHandlerMaybe['failedTimes'];
100
- failedExact = defaultErrorHandlerMaybe['failedExact'];
101
- }
102
- else {
103
- wsErrorHandlerMuted = false;
104
- errorHandlerPath = undefined;
105
- errorHandleritemKind = 'script';
106
- errorHandlerExtraArgs = {};
107
- errorHandlerCustomInitialPath = undefined;
108
- errorHandlerSelected = 'slack';
109
- failedTimes = 1;
110
- failedExact = false;
111
- }
112
- if (defaultRecoveryHandlerMaybe !== undefined && defaultRecoveryHandlerMaybe !== null) {
113
- let splitted = defaultRecoveryHandlerMaybe['recoveryHandlerPath'].split('/');
114
- recoveryHandlerItemKind = splitted[0];
115
- recoveryHandlerPath = splitted.slice(1)?.join('/');
116
- recoveryHandlerExtraArgs = defaultRecoveryHandlerMaybe['recoveryHandlerExtraArgs'];
117
- recoveryHandlerCustomInitialPath = recoveryHandlerPath;
118
- recoveryHandlerSelected = isSlackHandler('recovery', recoveryHandlerPath) ? 'slack' : 'custom';
119
- recoveredTimes = defaultRecoveryHandlerMaybe['recoveredTimes'];
72
+ drawerLoading = true;
73
+ try {
74
+ drawer?.openDrawer();
75
+ args = {};
76
+ runnable = undefined;
77
+ is_flow = nis_flow;
78
+ schedule = '0 0 12 * *';
79
+ paused_until = undefined;
80
+ showPauseUntil = false;
81
+ let defaultErrorHandlerMaybe = undefined;
82
+ let defaultRecoveryHandlerMaybe = undefined;
83
+ if ($workspaceStore) {
84
+ defaultErrorHandlerMaybe = (await SettingService.getGlobal({
85
+ key: 'default_error_handler_' + $workspaceStore
86
+ }));
87
+ defaultRecoveryHandlerMaybe = (await SettingService.getGlobal({
88
+ key: 'default_recovery_handler_' + $workspaceStore
89
+ }));
90
+ }
91
+ edit = false;
92
+ itemKind = nis_flow ? 'flow' : 'script';
93
+ initialScriptPath = initial_script_path ?? '';
94
+ summary = '';
95
+ no_flow_overlap = false;
96
+ path = initialScriptPath;
97
+ initialPath = initialScriptPath;
98
+ script_path = initialScriptPath;
99
+ await loadScript(script_path);
100
+ if (defaultErrorHandlerMaybe !== undefined && defaultErrorHandlerMaybe !== null) {
101
+ wsErrorHandlerMuted = defaultErrorHandlerMaybe['wsErrorHandlerMuted'];
102
+ let splitted = defaultErrorHandlerMaybe['errorHandlerPath'].split('/');
103
+ errorHandleritemKind = splitted[0];
104
+ errorHandlerPath = splitted.slice(1)?.join('/');
105
+ errorHandlerExtraArgs = defaultErrorHandlerMaybe['errorHandlerExtraArgs'];
106
+ errorHandlerCustomInitialPath = errorHandlerPath;
107
+ errorHandlerSelected = isSlackHandler('error', errorHandlerPath) ? 'slack' : 'custom';
108
+ failedTimes = defaultErrorHandlerMaybe['failedTimes'];
109
+ failedExact = defaultErrorHandlerMaybe['failedExact'];
110
+ }
111
+ else {
112
+ wsErrorHandlerMuted = false;
113
+ errorHandlerPath = undefined;
114
+ errorHandleritemKind = 'script';
115
+ errorHandlerExtraArgs = {};
116
+ errorHandlerCustomInitialPath = undefined;
117
+ errorHandlerSelected = 'slack';
118
+ failedTimes = 1;
119
+ failedExact = false;
120
+ }
121
+ if (defaultRecoveryHandlerMaybe !== undefined && defaultRecoveryHandlerMaybe !== null) {
122
+ let splitted = defaultRecoveryHandlerMaybe['recoveryHandlerPath'].split('/');
123
+ recoveryHandlerItemKind = splitted[0];
124
+ recoveryHandlerPath = splitted.slice(1)?.join('/');
125
+ recoveryHandlerExtraArgs = defaultRecoveryHandlerMaybe['recoveryHandlerExtraArgs'];
126
+ recoveryHandlerCustomInitialPath = recoveryHandlerPath;
127
+ recoveryHandlerSelected = isSlackHandler('recovery', recoveryHandlerPath)
128
+ ? 'slack'
129
+ : 'custom';
130
+ recoveredTimes = defaultRecoveryHandlerMaybe['recoveredTimes'];
131
+ }
132
+ else {
133
+ recoveryHandlerPath = undefined;
134
+ recoveryHandlerItemKind = 'script';
135
+ recoveryHandlerExtraArgs = {};
136
+ recoveryHandlerCustomInitialPath = undefined;
137
+ recoveryHandlerSelected = 'slack';
138
+ recoveredTimes = 1;
139
+ }
140
+ timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
120
141
  }
121
- else {
122
- recoveryHandlerPath = undefined;
123
- recoveryHandlerItemKind = 'script';
124
- recoveryHandlerExtraArgs = {};
125
- recoveryHandlerCustomInitialPath = undefined;
126
- recoveryHandlerSelected = 'slack';
127
- recoveredTimes = 1;
142
+ finally {
143
+ drawerLoading = false;
128
144
  }
129
- timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
130
- drawer?.openDrawer();
131
145
  }
132
146
  async function resetRetries() {
133
147
  if (itemKind === 'flow') {
@@ -381,428 +395,442 @@ $: !showPauseUntil && (paused_until = undefined);
381
395
  on:close={drawer.closeDrawer}
382
396
  >
383
397
  <svelte:fragment slot="actions">
384
- {#if edit}
385
- <div class="mr-8">
386
- <Button
387
- size="sm"
388
- variant="border"
389
- startIcon={{ icon: List }}
390
- disabled={!allowSchedule || pathError != '' || emptyString(script_path)}
391
- href={`${base}/runs/${script_path}?show_schedules=true&show_future_jobs=true`}
392
- >
393
- View runs
394
- </Button>
395
- </div>
396
- <div class="mr-8 center-center -mt-1">
397
- <Toggle
398
- disabled={!can_write}
399
- checked={enabled}
400
- options={{ right: 'enable', left: 'disable' }}
401
- on:change={async (e) => {
402
- await ScheduleService.setScheduleEnabled({
403
- path: initialPath,
404
- workspace: $workspaceStore ?? '',
405
- requestBody: { enabled: e.detail }
406
- })
407
- sendUserToast(`${e.detail ? 'enabled' : 'disabled'} schedule ${initialPath}`)
408
- }}
409
- />
410
- </div>
411
- {/if}
412
- <Button
413
- startIcon={{ icon: Save }}
414
- disabled={!allowSchedule ||
415
- pathError != '' ||
416
- emptyString(script_path) ||
417
- (errorHandlerSelected == 'slack' &&
418
- !emptyString(errorHandlerPath) &&
419
- emptyString(errorHandlerExtraArgs['channel']))}
420
- on:click={scheduleScript}
421
- >
422
- {edit ? 'Save' : 'Schedule'}
423
- </Button>
424
- </svelte:fragment>
425
-
426
- <div class="flex flex-col gap-12">
427
- <div class="flex flex-col gap-4">
428
- <div>
429
- <h2 class="text-base font-semibold mb-2">Metadata</h2>
430
- <Label label="Summary">
431
- <!-- svelte-ignore a11y-autofocus -->
432
- <input
433
- autofocus
434
- type="text"
435
- placeholder="Short summary to be displayed when listed"
436
- class="text-sm w-full"
437
- bind:value={summary}
438
- on:keyup={() => {
439
- if (!edit && summary?.length > 0 && !dirtyPath) {
440
- pathC?.setName(
441
- summary
442
- .toLowerCase()
443
- .replace(/[^a-z0-9_]/g, '_')
444
- .replace(/-+/g, '_')
445
- .replace(/^-|-$/g, '')
446
- )
447
- }
398
+ {#if !drawerLoading}
399
+ {#if edit}
400
+ <div class="mr-8">
401
+ <Button
402
+ size="sm"
403
+ variant="border"
404
+ startIcon={{ icon: List }}
405
+ disabled={!allowSchedule || pathError != '' || emptyString(script_path)}
406
+ href={`${base}/runs/${script_path}?show_schedules=true&show_future_jobs=true`}
407
+ >
408
+ View runs
409
+ </Button>
410
+ </div>
411
+ <div class="mr-8 center-center -mt-1">
412
+ <Toggle
413
+ disabled={!can_write}
414
+ checked={enabled}
415
+ options={{ right: 'enable', left: 'disable' }}
416
+ on:change={async (e) => {
417
+ await ScheduleService.setScheduleEnabled({
418
+ path: initialPath,
419
+ workspace: $workspaceStore ?? '',
420
+ requestBody: { enabled: e.detail }
421
+ })
422
+ sendUserToast(`${e.detail ? 'enabled' : 'disabled'} schedule ${initialPath}`)
448
423
  }}
449
424
  />
425
+ </div>
426
+ {/if}
427
+ <Button
428
+ startIcon={{ icon: Save }}
429
+ disabled={!allowSchedule ||
430
+ pathError != '' ||
431
+ emptyString(script_path) ||
432
+ (errorHandlerSelected == 'slack' &&
433
+ !emptyString(errorHandlerPath) &&
434
+ emptyString(errorHandlerExtraArgs['channel']))}
435
+ on:click={scheduleScript}
436
+ >
437
+ {edit ? 'Save' : 'Schedule'}
438
+ </Button>
439
+ {/if}
440
+ </svelte:fragment>
441
+ {#if drawerLoading}
442
+ <Loader2 class="animate-spin" />
443
+ {:else}
444
+ <div class="flex flex-col gap-12">
445
+ <div class="flex flex-col gap-4">
446
+ <div>
447
+ <h2 class="text-base font-semibold mb-2">Metadata</h2>
448
+ <Label label="Summary">
449
+ <!-- svelte-ignore a11y-autofocus -->
450
+ <input
451
+ autofocus
452
+ type="text"
453
+ placeholder="Short summary to be displayed when listed"
454
+ class="text-sm w-full"
455
+ bind:value={summary}
456
+ on:keyup={() => {
457
+ if (!edit && summary?.length > 0 && !dirtyPath) {
458
+ pathC?.setName(
459
+ summary
460
+ .toLowerCase()
461
+ .replace(/[^a-z0-9_]/g, '_')
462
+ .replace(/-+/g, '_')
463
+ .replace(/^-|-$/g, '')
464
+ )
465
+ }
466
+ }}
467
+ />
468
+ </Label>
469
+ </div>
470
+ <Label label="Path">
471
+ {#if !edit}
472
+ <Path
473
+ bind:dirty={dirtyPath}
474
+ bind:this={pathC}
475
+ checkInitialPathExistence
476
+ bind:error={pathError}
477
+ bind:path
478
+ {initialPath}
479
+ namePlaceholder="schedule"
480
+ kind="schedule"
481
+ />
482
+ {:else}
483
+ <div class="flex justify-start w-full">
484
+ <Badge
485
+ color="gray"
486
+ class="center-center !bg-surface-secondary !text-tertiary !h-[24px] rounded-r-none border"
487
+ >
488
+ Schedule path (not editable)
489
+ </Badge>
490
+ <input
491
+ type="text"
492
+ readonly
493
+ value={path}
494
+ size={path?.length || 50}
495
+ class="font-mono !text-xs grow shrink overflow-x-auto !h-[24px] !py-0 !border-l-0 !rounded-l-none"
496
+ on:focus={({ currentTarget }) => {
497
+ currentTarget.select()
498
+ }}
499
+ />
500
+ <!-- <span class="font-mono text-sm break-all">{path}</span> -->
501
+ </div>
502
+ {/if}
450
503
  </Label>
451
504
  </div>
452
- <Label label="Path">
505
+
506
+ <Section label="Schedule">
507
+ <svelte:fragment slot="header">
508
+ <Tooltip>Schedules use CRON syntax. Seconds are mandatory.</Tooltip>
509
+ </svelte:fragment>
510
+ <CronInput disabled={!can_write} bind:schedule bind:timezone bind:validCRON />
511
+ <Toggle
512
+ options={{
513
+ right: 'Pause schedule until...',
514
+ rightTooltip:
515
+ '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.'
516
+ }}
517
+ bind:checked={showPauseUntil}
518
+ size="xs"
519
+ />
520
+ {#if showPauseUntil}
521
+ <DateTimeInput bind:value={paused_until} />
522
+ {/if}
523
+ </Section>
524
+ <Section label="Runnable">
453
525
  {#if !edit}
454
- <Path
455
- bind:dirty={dirtyPath}
456
- bind:this={pathC}
457
- checkInitialPathExistence
458
- bind:error={pathError}
459
- bind:path
460
- {initialPath}
461
- namePlaceholder="schedule"
462
- kind="schedule"
526
+ <p class="text-xs mb-1 text-tertiary">
527
+ Pick a script or flow to be triggered by the schedule<Required required={true} />
528
+ </p>
529
+ <ScriptPicker
530
+ disabled={initialScriptPath != '' || !can_write}
531
+ initialPath={initialScriptPath}
532
+ kinds={['script']}
533
+ allowFlow={true}
534
+ bind:itemKind
535
+ bind:scriptPath={script_path}
536
+ on:select={(e) => {
537
+ loadScript(e.detail.path)
538
+ }}
463
539
  />
464
540
  {:else}
465
- <div class="flex justify-start w-full">
466
- <Badge
467
- color="gray"
468
- class="center-center !bg-surface-secondary !text-tertiary !h-[24px] rounded-r-none border"
541
+ <Alert type="info" title="Runnable path cannot be edited" collapsible>
542
+ Once a schedule is created, the runnable path cannot be changed. However, when
543
+ renaming a script or a flow, the runnable path will automatically update itself.
544
+ </Alert>
545
+ <div class="my-2" />
546
+ <ScriptPicker
547
+ disabled
548
+ initialPath={script_path}
549
+ scriptPath={script_path}
550
+ allowFlow={true}
551
+ {itemKind}
552
+ />
553
+ {/if}
554
+ {#if itemKind == 'flow'}
555
+ <Toggle
556
+ options={{ right: 'no overlap of flows' }}
557
+ bind:checked={no_flow_overlap}
558
+ class="mt-2"
559
+ />
560
+ {/if}
561
+ {#if itemKind == 'script'}
562
+ <div class="flex gap-2 items-center mt-2">
563
+ <Toggle options={{ right: 'no overlap' }} checked={true} disabled /><Tooltip
564
+ >Currently, overlapping scripts' executions is not supported. The next execution
565
+ will be scheduled only after the previous iteration has completed.</Tooltip
469
566
  >
470
- Schedule path (not editable)
471
- </Badge>
472
- <input
473
- type="text"
474
- readonly
475
- value={path}
476
- size={path?.length || 50}
477
- class="font-mono !text-xs grow shrink overflow-x-auto !h-[24px] !py-0 !border-l-0 !rounded-l-none"
478
- on:focus={({ currentTarget }) => {
479
- currentTarget.select()
480
- }}
481
- />
482
- <!-- <span class="font-mono text-sm break-all">{path}</span> -->
483
567
  </div>
484
568
  {/if}
485
- </Label>
486
- </div>
487
-
488
- <Section label="Schedule">
489
- <svelte:fragment slot="header">
490
- <Tooltip>Schedules use CRON syntax. Seconds are mandatory.</Tooltip>
491
- </svelte:fragment>
492
- <CronInput disabled={!can_write} bind:schedule bind:timezone bind:validCRON />
493
- <Toggle
494
- options={{
495
- right: 'Pause schedule until...',
496
- rightTooltip:
497
- '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.'
498
- }}
499
- bind:checked={showPauseUntil}
500
- size="xs"
501
- />
502
- {#if showPauseUntil}
503
- <DateTimeInput bind:value={paused_until} />
504
- {/if}
505
- </Section>
506
- <Section label="Runnable">
507
- {#if !edit}
508
- <p class="text-xs mb-1 text-tertiary">
509
- Pick a script or flow to be triggered by the schedule<Required required={true} />
510
- </p>
511
- <ScriptPicker
512
- disabled={initialScriptPath != '' || !can_write}
513
- initialPath={initialScriptPath}
514
- kinds={['script']}
515
- allowFlow={true}
516
- bind:itemKind
517
- bind:scriptPath={script_path}
518
- on:select={(e) => {
519
- loadScript(e.detail.path)
520
- }}
521
- />
522
- {:else}
523
- <Alert type="info" title="Runnable path cannot be edited" collapsible>
524
- Once a schedule is created, the runnable path cannot be changed. However, when renaming
525
- a script or a flow, the runnable path will automatically update itself.
526
- </Alert>
527
- <div class="my-2" />
528
- <ScriptPicker
529
- disabled
530
- initialPath={script_path}
531
- scriptPath={script_path}
532
- allowFlow={true}
533
- {itemKind}
534
- />
535
- {/if}
536
- {#if itemKind == 'flow'}
537
- <Toggle
538
- options={{ right: 'no overlap of flows' }}
539
- bind:checked={no_flow_overlap}
540
- class="mt-2"
541
- />
542
- {/if}
543
- {#if itemKind == 'script'}
544
- <div class="flex gap-2 items-center mt-2">
545
- <Toggle options={{ right: 'no overlap' }} checked={true} disabled /><Tooltip
546
- >Currently, overlapping scripts' executions is not supported. The next execution will
547
- be scheduled only after the previous iteration has completed.</Tooltip
548
- >
549
- </div>
550
- {/if}
551
- <div class="mt-6">
552
- {#if !loading}
553
- {#if runnable}
554
- {#if runnable?.schema && runnable.schema.properties && Object.keys(runnable.schema.properties).length > 0}
555
- <SchemaForm
556
- showReset
557
- disabled={!can_write}
558
- schema={runnable.schema}
559
- bind:isValid
560
- bind:args
561
- />
569
+ <div class="mt-6">
570
+ {#if !loading}
571
+ {#if runnable}
572
+ {#if runnable?.schema && runnable.schema.properties && Object.keys(runnable.schema.properties).length > 0}
573
+ {#await import('./SchemaForm.svelte')}
574
+ <Loader2 class="animate-spin" />
575
+ {:then Module}
576
+ <Module.default
577
+ showReset
578
+ disabled={!can_write}
579
+ schema={runnable.schema}
580
+ bind:isValid
581
+ bind:args
582
+ />
583
+ {/await}
584
+ {:else}
585
+ <div class="text-xs texg-gray-700">
586
+ This {is_flow ? 'flow' : 'script'} takes no argument
587
+ </div>
588
+ {/if}
562
589
  {:else}
563
- <div class="text-xs texg-gray-700">
564
- This {is_flow ? 'flow' : 'script'} takes no argument
590
+ <div class="text-xs texg-gray-700 my-2">
591
+ Pick a {is_flow ? 'flow' : 'script'} and fill its argument here
565
592
  </div>
566
593
  {/if}
567
594
  {:else}
568
- <div class="text-xs texg-gray-700 my-2">
569
- Pick a {is_flow ? 'flow' : 'script'} and fill its argument here
570
- </div>
595
+ <Loader2 class="animate-spin" />
571
596
  {/if}
572
- {:else}
573
- <Loader2 class="animate-spin" />
574
- {/if}
575
- </div>
576
- </Section>
577
-
578
- <div class="flex flex-col gap-2">
579
- {#if !loading}
580
- <Tabs bind:selected={optionTabSelected}>
581
- <Tab value="error_handler">Error Handler</Tab>
582
- <Tab value="recovery_handler">Recovery Handler</Tab>
583
- {#if itemKind === 'script'}
584
- <Tab value="retries">Retries</Tab>
585
- <Tab value="tag">Custom tag</Tab>
586
- {/if}
587
- </Tabs>
588
- <div class="pt-0.5" />
589
- {#if optionTabSelected === 'error_handler'}
590
- <Section label="Error handler">
591
- <svelte:fragment slot="header">
592
- <div class="flex flex-row gap-2">
593
- {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span>{/if}
594
- </div>
595
- </svelte:fragment>
596
- <svelte:fragment slot="action">
597
- <div class="flex flex-row items-center gap-1 text-2xs text-tertiary">
598
- defaults
599
- <Dropdown
600
- items={[
601
- {
602
- displayName: `Override future schedules only`,
603
- action: () => saveAsDefaultErrorHandler(false)
604
- },
605
- {
606
- displayName: 'Override all existing',
607
- type: 'delete',
608
- action: () => saveAsDefaultErrorHandler(true)
609
- }
610
- ]}
611
- >
612
- <svelte:fragment>
613
- <Save size={12} class="mr-1" />
614
- Set as default
615
- </svelte:fragment>
616
- </Dropdown>
617
- </div>
618
- </svelte:fragment>
619
- <div class="flex flex-row py-2">
620
- <Toggle
621
- size="xs"
622
- disabled={!can_write || !$enterpriseLicense}
623
- bind:checked={wsErrorHandlerMuted}
624
- options={{ right: 'Mute workspace error handler for this schedule' }}
625
- />
626
- </div>
597
+ </div>
598
+ </Section>
627
599
 
628
- <ErrorOrRecoveryHandler
629
- isEditable={can_write}
630
- errorOrRecovery="error"
631
- showScriptHelpText={true}
632
- bind:handlerSelected={errorHandlerSelected}
633
- bind:handlerPath={errorHandlerPath}
634
- customInitialScriptPath={errorHandlerCustomInitialPath}
635
- slackToggleText="Alert channel on error"
636
- customScriptTemplate="/scripts/add?hub=hub%2F2420%2Fwindmill%2Fschedule_error_handler_template"
637
- bind:customHandlerKind={errorHandleritemKind}
638
- bind:handlerExtraArgs={errorHandlerExtraArgs}
639
- >
640
- <svelte:fragment slot="custom-tab-tooltip">
641
- <Tooltip>
642
- <div class="flex gap-20 items-start mt-3">
643
- <div class="text-sm"
644
- >The following args will be passed to the error handler:
645
- <ul class="mt-1 ml-2">
646
- <li><b>path</b>: The path of the script or flow that failed.</li>
647
- <li><b>is_flow</b>: Whether the runnable is a flow.</li>
648
- <li><b>schedule_path</b>: The path of the schedule.</li>
649
- <li><b>error</b>: The error details.</li>
650
- <li
651
- ><b>failed_times</b>: Minimum number of times the schedule failed before
652
- calling the error handler.</li
653
- >
654
- <li
655
- ><b>started_at</b>: The start datetime of the latest job that failed.</li
656
- >
657
- </ul>
658
- </div>
659
- </div>
660
- </Tooltip>
600
+ <div class="flex flex-col gap-2">
601
+ {#if !loading}
602
+ <Tabs bind:selected={optionTabSelected}>
603
+ <Tab value="error_handler">Error Handler</Tab>
604
+ <Tab value="recovery_handler">Recovery Handler</Tab>
605
+ {#if itemKind === 'script'}
606
+ <Tab value="retries">Retries</Tab>
607
+ <Tab value="tag">Custom tag</Tab>
608
+ {/if}
609
+ </Tabs>
610
+ <div class="pt-0.5" />
611
+ {#if optionTabSelected === 'error_handler'}
612
+ <Section label="Error handler">
613
+ <svelte:fragment slot="header">
614
+ <div class="flex flex-row gap-2">
615
+ {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span
616
+ >{/if}
617
+ </div>
661
618
  </svelte:fragment>
662
- </ErrorOrRecoveryHandler>
663
- <div class="flex flex-row items-center justify-between">
664
- <div class="flex flex-row items-center mt-4 font-semibold text-sm gap-2">
665
- <p class={emptyString(errorHandlerPath) ? 'text-tertiary' : ''}>
666
- Triggered when schedule failed</p
667
- >
668
- <select
669
- class="!w-14"
670
- bind:value={failedExact}
671
- disabled={!$enterpriseLicense || emptyString(errorHandlerPath)}
672
- >
673
- <option value={false}>&gt;=</option>
674
- <option value={true}>==</option>
675
- </select>
676
- <input
677
- type="number"
678
- class="!w-14 text-center {emptyString(errorHandlerPath) ? 'text-tertiary' : ''}"
679
- bind:value={failedTimes}
680
- disabled={!$enterpriseLicense}
681
- min="1"
619
+ <svelte:fragment slot="action">
620
+ <div class="flex flex-row items-center gap-1 text-2xs text-tertiary">
621
+ defaults
622
+ <Dropdown
623
+ items={[
624
+ {
625
+ displayName: `Override future schedules only`,
626
+ action: () => saveAsDefaultErrorHandler(false)
627
+ },
628
+ {
629
+ displayName: 'Override all existing',
630
+ type: 'delete',
631
+ action: () => saveAsDefaultErrorHandler(true)
632
+ }
633
+ ]}
634
+ >
635
+ <svelte:fragment>
636
+ <Save size={12} class="mr-1" />
637
+ Set as default
638
+ </svelte:fragment>
639
+ </Dropdown>
640
+ </div>
641
+ </svelte:fragment>
642
+ <div class="flex flex-row py-2">
643
+ <Toggle
644
+ size="xs"
645
+ disabled={!can_write || !$enterpriseLicense}
646
+ bind:checked={wsErrorHandlerMuted}
647
+ options={{ right: 'Mute workspace error handler for this schedule' }}
682
648
  />
683
- <p class={emptyString(errorHandlerPath) ? 'text-tertiary' : ''}
684
- >time{failedTimes > 1 ? 's in a row' : ''}</p
685
- >
686
649
  </div>
687
- </div>
688
- </Section>
689
- {:else if optionTabSelected === 'recovery_handler'}
690
- <Section label="Recovery handler">
691
- <svelte:fragment slot="header">
692
- <div class="flex flex-row gap-2">
693
- {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span>{/if}
650
+
651
+ <ErrorOrRecoveryHandler
652
+ isEditable={can_write}
653
+ errorOrRecovery="error"
654
+ showScriptHelpText={true}
655
+ bind:handlerSelected={errorHandlerSelected}
656
+ bind:handlerPath={errorHandlerPath}
657
+ customInitialScriptPath={errorHandlerCustomInitialPath}
658
+ slackToggleText="Alert channel on error"
659
+ customScriptTemplate="/scripts/add?hub=hub%2F2420%2Fwindmill%2Fschedule_error_handler_template"
660
+ bind:customHandlerKind={errorHandleritemKind}
661
+ bind:handlerExtraArgs={errorHandlerExtraArgs}
662
+ >
663
+ <svelte:fragment slot="custom-tab-tooltip">
664
+ <Tooltip>
665
+ <div class="flex gap-20 items-start mt-3">
666
+ <div class="text-sm"
667
+ >The following args will be passed to the error handler:
668
+ <ul class="mt-1 ml-2">
669
+ <li><b>path</b>: The path of the script or flow that failed.</li>
670
+ <li><b>is_flow</b>: Whether the runnable is a flow.</li>
671
+ <li><b>schedule_path</b>: The path of the schedule.</li>
672
+ <li><b>error</b>: The error details.</li>
673
+ <li
674
+ ><b>failed_times</b>: Minimum number of times the schedule failed
675
+ before calling the error handler.</li
676
+ >
677
+ <li
678
+ ><b>started_at</b>: The start datetime of the latest job that failed.</li
679
+ >
680
+ </ul>
681
+ </div>
682
+ </div>
683
+ </Tooltip>
684
+ </svelte:fragment>
685
+ </ErrorOrRecoveryHandler>
686
+ <div class="flex flex-row items-center justify-between">
687
+ <div class="flex flex-row items-center mt-4 font-semibold text-sm gap-2">
688
+ <p class={emptyString(errorHandlerPath) ? 'text-tertiary' : ''}>
689
+ Triggered when schedule failed</p
690
+ >
691
+ <select
692
+ class="!w-14"
693
+ bind:value={failedExact}
694
+ disabled={!$enterpriseLicense || emptyString(errorHandlerPath)}
695
+ >
696
+ <option value={false}>&gt;=</option>
697
+ <option value={true}>==</option>
698
+ </select>
699
+ <input
700
+ type="number"
701
+ class="!w-14 text-center {emptyString(errorHandlerPath)
702
+ ? 'text-tertiary'
703
+ : ''}"
704
+ bind:value={failedTimes}
705
+ disabled={!$enterpriseLicense}
706
+ min="1"
707
+ />
708
+ <p class={emptyString(errorHandlerPath) ? 'text-tertiary' : ''}
709
+ >time{failedTimes > 1 ? 's in a row' : ''}</p
710
+ >
711
+ </div>
694
712
  </div>
695
- </svelte:fragment>
696
- <svelte:fragment slot="action">
697
- <div class="flex flex-row items-center text-tertiary text-2xs gap-2">
698
- defaults
699
- <Dropdown
700
- items={[
701
- {
702
- displayName: `Override future schedules only`,
703
- action: () => saveAsDefaultRecoveryHandler(false)
704
- },
705
- {
706
- displayName: 'Override all existing',
707
- type: 'delete',
708
- action: () => saveAsDefaultRecoveryHandler(true)
709
- }
710
- ]}
713
+ </Section>
714
+ {:else if optionTabSelected === 'recovery_handler'}
715
+ <Section label="Recovery handler">
716
+ <svelte:fragment slot="header">
717
+ <div class="flex flex-row gap-2">
718
+ {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span
719
+ >{/if}
720
+ </div>
721
+ </svelte:fragment>
722
+ <svelte:fragment slot="action">
723
+ <div class="flex flex-row items-center text-tertiary text-2xs gap-2">
724
+ defaults
725
+ <Dropdown
726
+ items={[
727
+ {
728
+ displayName: `Override future schedules only`,
729
+ action: () => saveAsDefaultRecoveryHandler(false)
730
+ },
731
+ {
732
+ displayName: 'Override all existing',
733
+ type: 'delete',
734
+ action: () => saveAsDefaultRecoveryHandler(true)
735
+ }
736
+ ]}
737
+ >
738
+ <svelte:fragment>
739
+ <Save size={12} class="mr-1" />
740
+ Set as default
741
+ </svelte:fragment>
742
+ </Dropdown>
743
+ </div>
744
+ </svelte:fragment>
745
+ <ErrorOrRecoveryHandler
746
+ isEditable={can_write && !emptyString($enterpriseLicense)}
747
+ errorOrRecovery="recovery"
748
+ bind:handlerSelected={recoveryHandlerSelected}
749
+ bind:handlerPath={recoveryHandlerPath}
750
+ customInitialScriptPath={recoveryHandlerCustomInitialPath}
751
+ slackToggleText="Alert channel when error recovered"
752
+ customScriptTemplate="/scripts/add?hub=hub%2F2421%2Fwindmill%2Fschedule_recovery_handler_template"
753
+ bind:customHandlerKind={recoveryHandlerItemKind}
754
+ bind:handlerExtraArgs={recoveryHandlerExtraArgs}
755
+ >
756
+ <svelte:fragment slot="custom-tab-tooltip">
757
+ <Tooltip>
758
+ <div class="flex gap-20 items-start mt-3">
759
+ <div class=" text-sm"
760
+ >The following args will be passed to the recovery handler:
761
+ <ul class="mt-1 ml-2">
762
+ <li><b>path</b>: The path of the script or flow that recovered.</li>
763
+ <li><b>is_flow</b>: Whether the runnable is a flow.</li>
764
+ <li><b>schedule_path</b>: The path of the schedule.</li>
765
+ <li><b>error</b>: The error of the last job that errored</li>
766
+ <li
767
+ ><b>error_started_at</b>: The start datetime of the last job that
768
+ errored</li
769
+ >
770
+ <li
771
+ ><b>success_times</b>: The number of times the schedule succeeded
772
+ before calling the recovery handler.</li
773
+ >
774
+ <li><b>success_result</b>: The result of the latest successful job</li>
775
+ <li
776
+ ><b>success_started_at</b>: The start datetime of the latest
777
+ successful job</li
778
+ >
779
+ </ul>
780
+ </div>
781
+ </div>
782
+ </Tooltip>
783
+ </svelte:fragment>
784
+ </ErrorOrRecoveryHandler>
785
+ <div class="flex flex-row items-center justify-between">
786
+ <div
787
+ class="flex flex-row items-center mt-5 font-semibold text-sm {emptyString(
788
+ recoveryHandlerPath
789
+ )
790
+ ? 'text-tertiary'
791
+ : ''}"
711
792
  >
712
- <svelte:fragment>
713
- <Save size={12} class="mr-1" />
714
- Set as default
715
- </svelte:fragment>
716
- </Dropdown>
793
+ <p>Triggered when schedule recovered</p>
794
+ <input
795
+ type="number"
796
+ class="!w-14 mx-2 text-center"
797
+ bind:value={recoveredTimes}
798
+ min="1"
799
+ />
800
+ <p>time{recoveredTimes > 1 ? 's in a row' : ''}</p>
801
+ </div>
717
802
  </div>
718
- </svelte:fragment>
719
- <ErrorOrRecoveryHandler
720
- isEditable={can_write && !emptyString($enterpriseLicense)}
721
- errorOrRecovery="recovery"
722
- bind:handlerSelected={recoveryHandlerSelected}
723
- bind:handlerPath={recoveryHandlerPath}
724
- customInitialScriptPath={recoveryHandlerCustomInitialPath}
725
- slackToggleText="Alert channel when error recovered"
726
- customScriptTemplate="/scripts/add?hub=hub%2F2421%2Fwindmill%2Fschedule_recovery_handler_template"
727
- bind:customHandlerKind={recoveryHandlerItemKind}
728
- bind:handlerExtraArgs={recoveryHandlerExtraArgs}
729
- >
730
- <svelte:fragment slot="custom-tab-tooltip">
803
+ </Section>
804
+ {:else if optionTabSelected === 'retries'}
805
+ <Section label="Retries">
806
+ <svelte:fragment slot="header">
807
+ <div class="flex flex-row gap-2">
808
+ {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span
809
+ >{/if}
810
+ </div>
731
811
  <Tooltip>
732
- <div class="flex gap-20 items-start mt-3">
733
- <div class=" text-sm"
734
- >The following args will be passed to the recovery handler:
735
- <ul class="mt-1 ml-2">
736
- <li><b>path</b>: The path of the script or flow that recovered.</li>
737
- <li><b>is_flow</b>: Whether the runnable is a flow.</li>
738
- <li><b>schedule_path</b>: The path of the schedule.</li>
739
- <li><b>error</b>: The error of the last job that errored</li>
740
- <li
741
- ><b>error_started_at</b>: The start datetime of the last job that
742
- errored</li
743
- >
744
- <li
745
- ><b>success_times</b>: The number of times the schedule succeeded before
746
- calling the recovery handler.</li
747
- >
748
- <li><b>success_result</b>: The result of the latest successful job</li>
749
- <li
750
- ><b>success_started_at</b>: The start datetime of the latest successful
751
- job</li
752
- >
753
- </ul>
754
- </div>
755
- </div>
812
+ If defined, upon error this schedule will be retried with a delay and a maximum
813
+ number of attempts as defined below.
814
+ <br />
815
+ This is only available for individual script. For flows, retries can be set on each
816
+ flow step in the flow editor.
756
817
  </Tooltip>
757
818
  </svelte:fragment>
758
- </ErrorOrRecoveryHandler>
759
- <div class="flex flex-row items-center justify-between">
760
- <div
761
- class="flex flex-row items-center mt-5 font-semibold text-sm {emptyString(
762
- recoveryHandlerPath
763
- )
764
- ? 'text-tertiary'
765
- : ''}"
766
- >
767
- <p>Triggered when schedule recovered</p>
768
- <input
769
- type="number"
770
- class="!w-14 mx-2 text-center"
771
- bind:value={recoveredTimes}
772
- min="1"
773
- />
774
- <p>time{recoveredTimes > 1 ? 's in a row' : ''}</p>
775
- </div>
776
- </div>
777
- </Section>
778
- {:else if optionTabSelected === 'retries'}
779
- <Section label="Retries">
780
- <svelte:fragment slot="header">
781
- <div class="flex flex-row gap-2">
782
- {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span>{/if}
783
- </div>
784
- <Tooltip>
785
- If defined, upon error this schedule will be retried with a delay and a maximum
786
- number of attempts as defined below.
787
- <br />
788
- This is only available for individual script. For flows, retries can be set on each
789
- flow step in the flow editor.
790
- </Tooltip>
791
- </svelte:fragment>
792
- <FlowRetries bind:flowModuleRetry={retry} disabled={itemKind !== 'script'} />
793
- </Section>
794
- {:else if optionTabSelected === 'tag'}
795
- <Section
796
- label="Custom script tag"
797
- tooltip="When set, the script tag will be overridden by this tag"
798
- >
799
- <WorkerTagPicker bind:tag popupPlacement="top-end" />
800
- </Section>
819
+ <FlowRetries bind:flowModuleRetry={retry} disabled={itemKind !== 'script'} />
820
+ </Section>
821
+ {:else if optionTabSelected === 'tag'}
822
+ <Section
823
+ label="Custom script tag"
824
+ tooltip="When set, the script tag will be overridden by this tag"
825
+ >
826
+ <WorkerTagPicker bind:tag popupPlacement="top-end" />
827
+ </Section>
828
+ {/if}
829
+ {:else}
830
+ <Loader2 class="animate-spin" />
801
831
  {/if}
802
- {:else}
803
- <Loader2 class="animate-spin" />
804
- {/if}
832
+ </div>
805
833
  </div>
806
- </div>
834
+ {/if}
807
835
  </DrawerContent>
808
836
  </Drawer>