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.
- package/package/assets/app.css +25 -1
- package/package/components/ArgInput.svelte +2 -1
- package/package/components/ChangeInstanceUsername.svelte +9 -108
- package/package/components/ChangeInstanceUsernameInner.svelte +112 -0
- package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +21 -0
- package/package/components/DiffDrawer.svelte +27 -20
- package/package/components/DiffEditor.svelte +5 -1
- package/package/components/DisplayResult.svelte +39 -9
- package/package/components/DropdownV2.svelte +4 -26
- package/package/components/DropdownV2.svelte.d.ts +9 -1
- package/package/components/DropdownV2Inner.svelte +42 -0
- package/package/components/DropdownV2Inner.svelte.d.ts +40 -0
- package/package/components/Editor.svelte +24 -4
- package/package/components/Editor.svelte.d.ts +5 -4
- package/package/components/EditorBar.svelte +9 -11
- package/package/components/EditorSettings.svelte +44 -0
- package/package/components/EditorSettings.svelte.d.ts +17 -0
- package/package/components/EditorTheme.svelte +1 -1
- package/package/components/ErrorOrRecoveryHandler.svelte +27 -20
- package/package/components/FlowBuilder.svelte +17 -3
- package/package/components/FlowBuilder.svelte.d.ts +3 -0
- package/package/components/FlowGraphViewerStep.svelte +1 -1
- package/package/components/FlowStatusViewer.svelte +3 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
- package/package/components/FlowStatusViewerInner.svelte +5 -2
- package/package/components/FlowViewerInner.svelte +3 -7
- package/package/components/FormatOnSave.svelte +12 -29
- package/package/components/GraphqlSchemaViewer.svelte +1 -1
- package/package/components/GraphqlSchemaViewer.svelte.d.ts +1 -1
- package/package/components/HighlightCode.svelte +3 -0
- package/package/components/InstanceNameEditor.svelte +64 -0
- package/package/components/InstanceNameEditor.svelte.d.ts +23 -0
- package/package/components/LightweightArgInput.svelte +6 -11
- package/package/components/LogViewer.svelte +37 -29
- package/package/components/LogViewer.svelte.d.ts +2 -0
- package/package/components/ObjectResourceInput.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/Path.svelte +3 -3
- package/package/components/QueueMetricsDrawer.svelte +6 -218
- package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -3
- package/package/components/QueueMetricsDrawerInner.svelte +211 -0
- package/package/components/QueueMetricsDrawerInner.svelte.d.ts +15 -0
- package/package/components/ResourceEditorDrawer.svelte +14 -11
- package/package/components/ResourceEditorDrawer.svelte.d.ts +1 -1
- package/package/components/ResultJobLoader.svelte.d.ts +1 -1
- package/package/components/S3FilePicker.svelte +20 -8
- package/package/components/ScheduleEditorInner.svelte +497 -469
- package/package/components/ScriptBuilder.svelte +12 -1
- package/package/components/ScriptBuilder.svelte.d.ts +3 -0
- package/package/components/ScriptEditor.svelte +1 -0
- package/package/components/ScriptEditor.svelte.d.ts +2 -1
- package/package/components/ServiceLogsInner.svelte +511 -0
- package/package/components/ServiceLogsInner.svelte.d.ts +20 -0
- package/package/components/SimpleEditor.svelte +27 -2
- package/package/components/SimpleEditor.svelte.d.ts +5 -3
- package/package/components/Summary.svelte +33 -31
- package/package/components/Summary.svelte.d.ts +1 -0
- package/package/components/SuperadminSettings.svelte +28 -10
- package/package/components/TemplateEditor.svelte +1 -1
- package/package/components/TestJobLoader.svelte.d.ts +1 -1
- package/package/components/VimMode.svelte +16 -0
- package/package/components/VimMode.svelte.d.ts +14 -0
- package/package/components/WorkerTagPicker.svelte +4 -1
- package/package/components/WorkspaceGroup.svelte +139 -68
- package/package/components/WorkspaceGroup.svelte.d.ts +3 -0
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +19 -2
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -3
- package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -0
- package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +2 -1
- package/package/components/apps/editor/AppEditor.svelte +239 -92
- package/package/components/apps/editor/AppEditorBottomPanel.svelte +22 -0
- package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +24 -0
- package/package/components/apps/editor/AppEditorHeader.svelte +44 -2
- package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +9 -0
- package/package/components/apps/editor/AppExportButton.svelte +1 -1
- package/package/components/apps/editor/AppPreview.svelte +4 -0
- package/package/components/apps/editor/DeploymentHistory.svelte +7 -3
- package/package/components/apps/editor/GridEditor.svelte +4 -13
- package/package/components/apps/editor/RunnableJobPanel.svelte +25 -58
- package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +10 -1
- package/package/components/apps/editor/RunnalbeJobPanelInner.svelte +56 -0
- package/package/components/apps/editor/RunnalbeJobPanelInner.svelte.d.ts +18 -0
- package/package/components/apps/editor/SubGridEditor.svelte +3 -1
- package/package/components/apps/editor/component/Component.svelte +26 -4
- package/package/components/apps/editor/component/Component.svelte.d.ts +1 -0
- package/package/components/apps/editor/component/components.d.ts +5 -0
- package/package/components/apps/editor/componentsPanel/CssProperty.svelte +2 -0
- package/package/components/apps/editor/componentsPanel/tailwindUtils.js +267 -1
- package/package/components/apps/editor/contextPanel/ContextPanel.svelte +9 -1
- package/package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +2 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +7 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +5 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +14 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +25 -5
- package/package/components/apps/editor/settingsPanel/HideButton.svelte +47 -0
- package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +22 -0
- package/package/components/apps/editor/settingsPanel/TableActions.svelte +43 -4
- package/package/components/apps/editor/settingsPanel/TableActions.svelte.d.ts +2 -1
- package/package/components/apps/svelte-grid/Grid.svelte +6 -2
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/MoveResize.svelte +11 -3
- package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
- package/package/components/apps/svelte-grid/utils/item.js +11 -4
- package/package/components/common/button/Button.svelte.d.ts +2 -2
- package/package/components/common/calendarPicker/CalendarPicker.svelte +6 -2
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
- package/package/components/common/drawer/ConditionalPortal.svelte +2 -1
- package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +1 -0
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/common/popup/Popup.svelte +2 -1
- package/package/components/common/popup/Popup.svelte.d.ts +1 -0
- package/package/components/common/table/AppRow.svelte +11 -8
- package/package/components/common/table/AppRow.svelte.d.ts +1 -2
- package/package/components/common/table/FlowRow.svelte +3 -3
- package/package/components/common/table/FlowRow.svelte.d.ts +1 -2
- package/package/components/common/table/RawAppRow.svelte +3 -3
- package/package/components/common/table/RawAppRow.svelte.d.ts +1 -2
- package/package/components/common/table/ScriptRow.svelte +3 -3
- package/package/components/common/table/ScriptRow.svelte.d.ts +1 -2
- package/package/components/copilot/CodeCompletionStatus.svelte +21 -46
- package/package/components/copilot/StepGen.svelte +2 -1
- package/package/components/custom_ui.d.ts +4 -1
- package/package/components/flows/CreateActionsApp.svelte +11 -8
- package/package/components/flows/CreateActionsFlow.svelte +11 -8
- package/package/components/flows/FlowEditor.svelte +1 -2
- package/package/components/flows/FlowEditor.svelte.d.ts +0 -1
- package/package/components/flows/FlowHistory.svelte +6 -3
- package/package/components/flows/content/FlowModuleScript.svelte +15 -11
- package/package/components/flows/content/FlowSettings.svelte +1 -4
- package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -0
- package/package/components/flows/header/FlowYamlEditor.svelte +55 -0
- package/package/components/flows/header/FlowYamlEditor.svelte.d.ts +17 -0
- package/package/components/flows/map/InsertTriggerButton.svelte +1 -1
- package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +1 -0
- package/package/components/flows/map/VirtualItem.svelte +1 -1
- package/package/components/flows/pickers/PickHubScript.svelte +1 -0
- package/package/components/flows/types.d.ts +7 -6
- package/package/components/flows/utils.d.ts +9 -0
- package/package/components/flows/utils.js +21 -0
- package/package/components/graph/graphBuilder.js +1 -0
- package/package/components/graph/model.d.ts +1 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte +16 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte +5 -1
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +1 -0
- package/package/components/home/Item.svelte +0 -17
- package/package/components/home/deploy_ui.d.ts +2 -0
- package/package/components/home/deploy_ui.js +21 -0
- package/package/components/icons/RustIcon.svelte +70 -0
- package/package/components/icons/RustIcon.svelte.d.ts +25 -0
- package/package/components/icons/rust-logo.svg +1 -0
- package/package/components/instanceSettings.js +2 -2
- package/package/components/monaco_keybindings.d.ts +3 -0
- package/package/components/monaco_keybindings.js +9 -0
- package/package/components/preview/FlowPreviewStatus.svelte +6 -2
- package/package/components/runs/JobLoader.svelte +12 -3
- package/package/components/runs/JobLoader.svelte.d.ts +1 -1
- package/package/components/runs/ManuelDatePicker.svelte +31 -44
- package/package/components/runs/ManuelDatePicker.svelte.d.ts +6 -2
- package/package/components/runs/RunsFilter.svelte +4 -1
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -0
- package/package/components/search/GlobalSearchModal.svelte +36 -25
- package/package/components/wizards/TableActionsWizard.svelte +84 -0
- package/package/components/wizards/TableActionsWizard.svelte.d.ts +22 -0
- package/package/editorUtils.js +2 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +8 -8
- package/package/gen/schemas.gen.js +8 -8
- package/package/gen/services.gen.d.ts +4 -0
- package/package/gen/services.gen.js +16 -0
- package/package/gen/types.gen.d.ts +20 -8
- package/package/infer.d.ts +1 -1
- package/package/infer.js +48 -7
- package/package/script_helpers.d.ts +1 -0
- package/package/script_helpers.js +39 -1
- package/package/scripts.d.ts +1 -1
- package/package/scripts.js +11 -3
- package/package/stores.d.ts +5 -1
- package/package/stores.js +7 -2
- 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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
defaultErrorHandlerMaybe =
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
122
|
-
|
|
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
|
|
385
|
-
|
|
386
|
-
<
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
<
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
{
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
<
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
569
|
-
Pick a {is_flow ? 'flow' : 'script'} and fill its argument here
|
|
570
|
-
</div>
|
|
595
|
+
<Loader2 class="animate-spin" />
|
|
571
596
|
{/if}
|
|
572
|
-
|
|
573
|
-
|
|
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
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
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
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
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
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
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}>>=</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
|
-
</
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
<
|
|
700
|
-
|
|
701
|
-
{
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
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
|
-
<
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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
|
-
</
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
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
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
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
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
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
|
-
|
|
803
|
-
<Loader2 class="animate-spin" />
|
|
804
|
-
{/if}
|
|
832
|
+
</div>
|
|
805
833
|
</div>
|
|
806
|
-
|
|
834
|
+
{/if}
|
|
807
835
|
</DrawerContent>
|
|
808
836
|
</Drawer>
|