windmill-components 1.55.1 → 1.55.2
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/common.d.ts +1 -1
- package/common.js +3 -0
- package/components/AppConnect.svelte +2 -2
- package/components/ArgInput.svelte +1 -1
- package/components/CronInput.svelte +54 -53
- package/components/Dropdown.svelte +21 -9
- package/components/Editor.svelte +10 -10
- package/components/EditorBar.svelte +2 -2
- package/components/FlowBuilder.svelte +41 -25
- package/components/FlowGraphViewer.svelte +6 -2
- package/components/FlowMetadata.svelte +8 -3
- package/components/FolderEditor.svelte +299 -0
- package/components/FolderEditor.svelte.d.ts +16 -0
- package/components/FolderInfo.svelte +13 -0
- package/components/FolderInfo.svelte.d.ts +16 -0
- package/components/FolderUsageInfo.svelte +17 -0
- package/components/FolderUsageInfo.svelte.d.ts +16 -0
- package/components/GroupEditor.svelte +287 -0
- package/components/GroupEditor.svelte.d.ts +18 -0
- package/components/GroupInfo.svelte +22 -0
- package/components/GroupInfo.svelte.d.ts +16 -0
- package/components/InputTransformForm.svelte +16 -7
- package/components/MoveDrawer.svelte +75 -0
- package/components/MoveDrawer.svelte.d.ts +19 -0
- package/components/Path.svelte +243 -96
- package/components/Path.svelte.d.ts +1 -4
- package/components/RadioButton.svelte +2 -0
- package/components/RadioButton.svelte.d.ts +1 -0
- package/components/ResourceEditor.svelte +11 -16
- package/components/RunForm.svelte +20 -3
- package/components/RunForm.svelte.d.ts +1 -1
- package/components/ScheduleEditor.svelte +226 -0
- package/components/ScheduleEditor.svelte.d.ts +26 -0
- package/components/ScriptBuilder.svelte +109 -114
- package/components/ScriptEditor.svelte +17 -14
- package/components/ScriptEditor.svelte.d.ts +1 -0
- package/components/ScriptPicker.svelte +55 -29
- package/components/ScriptPicker.svelte.d.ts +1 -0
- package/components/ShareModal.svelte +94 -73
- package/components/ShareModal.svelte.d.ts +2 -4
- package/components/SimpleEditor.svelte +15 -10
- package/components/TemplateEditor.svelte +496 -0
- package/components/TemplateEditor.svelte.d.ts +25 -0
- package/components/TestJobLoader.svelte +1 -1
- package/components/VariableEditor.svelte +2 -1
- package/components/apps/CreateApp.svelte +1 -1
- package/components/apps/components/buttons/AppButton.svelte +3 -3
- package/components/apps/components/dataDisplay/AppBarChart.svelte +5 -4
- package/components/apps/components/dataDisplay/AppPieChart.svelte +3 -3
- package/components/apps/components/dateInputs/AppDateInput.svelte +34 -0
- package/components/apps/components/dateInputs/AppDateInput.svelte.d.ts +22 -0
- package/components/apps/components/form/AppForm.svelte +4 -5
- package/components/apps/components/form/AppForm.svelte.d.ts +0 -1
- package/components/apps/components/helpers/AlignWrapper.svelte +3 -4
- package/components/apps/components/helpers/AlignWrapper.svelte.d.ts +2 -3
- package/components/apps/components/helpers/InputValue.svelte +54 -5
- package/components/apps/components/helpers/InputValue.svelte.d.ts +1 -0
- package/components/apps/components/helpers/NonRunnableComponent.svelte +2 -1
- package/components/apps/components/helpers/RefreshButton.svelte +20 -0
- package/components/apps/components/helpers/RefreshButton.svelte.d.ts +16 -0
- package/components/apps/components/helpers/RunnableComponent.svelte +38 -42
- package/components/apps/components/helpers/RunnableWrapper.svelte +6 -3
- package/components/apps/components/numberInputs/AppNumberInput.svelte +8 -11
- package/components/apps/components/numberInputs/AppNumberInput.svelte.d.ts +1 -0
- package/components/apps/components/selectInputs/AppCheckbox.svelte +1 -1
- package/components/apps/components/selectInputs/AppSelect.svelte +26 -0
- package/components/apps/components/selectInputs/AppSelect.svelte.d.ts +22 -0
- package/components/apps/components/table/AppTable.svelte +159 -0
- package/components/apps/components/{dataDisplay → table}/AppTable.svelte.d.ts +0 -0
- package/components/apps/components/table/AppTableFooter.svelte +54 -0
- package/components/apps/components/table/AppTableFooter.svelte.d.ts +20 -0
- package/components/apps/components/table/tableOptions.d.ts +10 -0
- package/components/apps/components/table/tableOptions.js +11 -0
- package/components/apps/components/textInputs/AppTextInput.svelte +17 -10
- package/components/apps/components/textInputs/AppTextInput.svelte.d.ts +2 -0
- package/components/apps/editor/AppEditor.svelte +35 -20
- package/components/apps/editor/AppEditorHeader.svelte +15 -7
- package/components/apps/editor/AppPreview.svelte +5 -3
- package/components/apps/editor/AppPreview.svelte.d.ts +4 -1
- package/components/apps/editor/ComponentEditor.svelte +21 -3
- package/components/apps/editor/ComponentEditor.svelte.d.ts +2 -0
- package/components/apps/editor/ComponentHeader.svelte +21 -4
- package/components/apps/editor/ComponentHeader.svelte.d.ts +2 -0
- package/components/apps/editor/GridEditor.svelte +40 -20
- package/components/apps/editor/RecomputeAllComponents.svelte +5 -7
- package/components/apps/editor/componentsPanel/ComponentList.svelte +30 -82
- package/components/apps/editor/componentsPanel/data.js +78 -29
- package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +5 -1
- package/components/apps/editor/contextPanel/ContextPanel.svelte +35 -152
- package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +1 -3
- package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +64 -0
- package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte.d.ts +18 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +95 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +20 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +32 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +19 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte +63 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte.d.ts +17 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +44 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +14 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +126 -0
- package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +16 -0
- package/components/apps/editor/settingsPanel/AlignmentEditor.svelte +41 -0
- package/components/apps/editor/settingsPanel/AlignmentEditor.svelte.d.ts +17 -0
- package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +44 -0
- package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte.d.ts +18 -0
- package/components/apps/editor/settingsPanel/ComponentPanel.svelte +48 -130
- package/components/apps/editor/settingsPanel/ComponentPanel.svelte.d.ts +3 -0
- package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -2
- package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +1 -1
- package/components/apps/editor/settingsPanel/Recompute.svelte +2 -2
- package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +46 -0
- package/components/apps/editor/settingsPanel/SelectedRunnable.svelte.d.ts +17 -0
- package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +1 -1
- package/components/apps/editor/settingsPanel/common/PanelSection.svelte +1 -1
- package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte → inputEditor/ConnectedInputEditor.svelte} +1 -2
- package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte.d.ts → inputEditor/ConnectedInputEditor.svelte.d.ts} +1 -1
- package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte +12 -0
- package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte.d.ts +17 -0
- package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte → inputEditor/StaticInputEditor.svelte} +5 -5
- package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte.d.ts → inputEditor/StaticInputEditor.svelte.d.ts} +1 -1
- package/components/apps/editor/settingsPanel/mainInput/InlineScriptList.svelte +6 -3
- package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +66 -22
- package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte.d.ts +2 -3
- package/components/apps/editor/settingsPanel/mainInput/WorkspaceFlowList.svelte +1 -1
- package/components/apps/gridUtils.d.ts +3 -1
- package/components/apps/gridUtils.js +16 -1
- package/components/apps/inputType.d.ts +10 -4
- package/components/apps/rx.d.ts +8 -8
- package/components/apps/rx.js +17 -9
- package/components/apps/types.d.ts +14 -2
- package/components/apps/utils.d.ts +4 -3
- package/components/apps/utils.js +37 -5
- package/components/common/drawer/Drawer.svelte +1 -1
- package/components/common/drawer/Drawer.svelte.d.ts +1 -0
- package/components/common/table/FlowRow.svelte +21 -7
- package/components/common/table/FlowRow.svelte.d.ts +2 -0
- package/components/common/table/ScriptRow.svelte +22 -7
- package/components/common/table/ScriptRow.svelte.d.ts +2 -0
- package/components/common/toggleButton/ToggleButton.svelte +1 -1
- package/components/common/toggleButton/ToggleButtonGroup.svelte +1 -1
- package/components/common/toggleButton/ToggleButtonGroup.svelte.d.ts +1 -0
- package/components/flows/content/FlowEditorPanel.svelte +10 -16
- package/components/flows/content/FlowInputs.svelte +18 -4
- package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
- package/components/flows/content/FlowModuleComponent.svelte +1 -1
- package/components/flows/content/FlowModuleWrapper.svelte +26 -1
- package/components/flows/content/FlowSchedules.svelte +5 -0
- package/components/flows/content/FlowSettings.svelte +13 -23
- package/components/flows/content/FlowSettings.svelte.d.ts +0 -1
- package/components/flows/header/FlowPreviewButtons.svelte +1 -0
- package/components/flows/map/FlowErrorHandlerItem.svelte +1 -1
- package/components/flows/map/FlowModuleSchemaMap.svelte +12 -3
- package/components/flows/map/FlowSettingsItem.svelte +8 -15
- package/components/flows/map/InsertModuleButton.svelte +29 -2
- package/components/flows/map/InsertModuleButton.svelte.d.ts +3 -1
- package/components/flows/map/MapItem.svelte +2 -1
- package/components/flows/map/MapItem.svelte.d.ts +1 -0
- package/components/flows/pickers/WorkspaceScriptPicker.svelte +3 -0
- package/components/flows/previousResults.js +1 -1
- package/components/graph/FlowGraph.svelte +13 -13
- package/components/home/ItemsList.svelte +20 -12
- package/components/jobs/JobDetail.svelte +9 -3
- package/components/sidebar/SidebarContent.svelte +4 -3
- package/components/sidebar/UserMenu.svelte +1 -1
- package/editorUtils.d.ts +7 -1
- package/editorUtils.js +98 -3
- package/es5.d.ts.txt +4526 -0
- package/gen/index.d.ts +2 -0
- package/gen/index.js +1 -0
- package/gen/models/CompletedJob.d.ts +1 -0
- package/gen/models/EditSchedule.d.ts +0 -2
- package/gen/models/Folder.d.ts +5 -0
- package/gen/models/Folder.js +4 -0
- package/gen/models/QueuedJob.d.ts +1 -0
- package/gen/models/Script.d.ts +1 -1
- package/gen/models/User.d.ts +1 -0
- package/gen/services/FolderService.d.ts +128 -0
- package/gen/services/FolderService.js +151 -0
- package/gen/services/GranularAclService.d.ts +3 -3
- package/gen/services/GroupService.d.ts +5 -1
- package/gen/services/GroupService.js +4 -1
- package/gen/services/JobService.d.ts +25 -5
- package/gen/services/JobService.js +10 -5
- package/gen/services/ScriptService.d.ts +2 -1
- package/gen/services/UserService.d.ts +9 -0
- package/gen/services/UserService.js +15 -0
- package/package.json +33 -9
- package/script_helpers.d.ts +2 -2
- package/script_helpers.js +4 -4
- package/stores.d.ts +1 -0
- package/utils.d.ts +3 -0
- package/utils.js +44 -7
- package/components/GroupModal.svelte +0 -98
- package/components/GroupModal.svelte.d.ts +0 -17
- package/components/apps/components/dataDisplay/AppTable.svelte +0 -132
- package/components/apps/components/dataDisplay/app.md +0 -49
- package/components/apps/editor/contextPanel/InlineScriptCreationPanel.svelte +0 -29
- package/components/apps/editor/contextPanel/InlineScriptCreationPanel.svelte.d.ts +0 -16
|
@@ -40,23 +40,18 @@ export async function initEdit(p) {
|
|
|
40
40
|
canWrite(p, resourceToEdit.extra_perms ?? {}, $userStore);
|
|
41
41
|
}
|
|
42
42
|
async function editResource() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
drawer.closeDrawer?.();
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
throw Error('Cannot edit undefined resourceToEdit');
|
|
56
|
-
}
|
|
43
|
+
if (resourceToEdit) {
|
|
44
|
+
await ResourceService.updateResource({
|
|
45
|
+
workspace: $workspaceStore,
|
|
46
|
+
path: resourceToEdit.path,
|
|
47
|
+
requestBody: { path, value: args, description }
|
|
48
|
+
});
|
|
49
|
+
sendUserToast(`Updated resource at ${path}`);
|
|
50
|
+
dispatch('refresh');
|
|
51
|
+
drawer.closeDrawer?.();
|
|
57
52
|
}
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
else {
|
|
54
|
+
throw Error('Cannot edit undefined resourceToEdit');
|
|
60
55
|
}
|
|
61
56
|
}
|
|
62
57
|
async function loadResourceType() {
|
|
@@ -5,6 +5,9 @@ import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';
|
|
|
5
5
|
import SchemaForm from './SchemaForm.svelte';
|
|
6
6
|
import { Badge, Button } from './common';
|
|
7
7
|
import SharedBadge from './SharedBadge.svelte';
|
|
8
|
+
import Toggle from './Toggle.svelte';
|
|
9
|
+
import { userStore } from '../stores';
|
|
10
|
+
import Tooltip from './Tooltip.svelte';
|
|
8
11
|
export let runnable;
|
|
9
12
|
export let runAction;
|
|
10
13
|
export let buttonText = 'Run';
|
|
@@ -14,12 +17,13 @@ export let autofocus = false;
|
|
|
14
17
|
export let topButton = false;
|
|
15
18
|
export let args = decodeArgs($page.url.searchParams.get('args') ?? undefined);
|
|
16
19
|
export function run() {
|
|
17
|
-
runAction(scheduledForStr, args);
|
|
20
|
+
runAction(scheduledForStr, args, invisible_to_owner);
|
|
18
21
|
}
|
|
19
22
|
export let isValid = true;
|
|
20
23
|
// Run later
|
|
21
24
|
let viewOptions = false;
|
|
22
25
|
let scheduledForStr;
|
|
26
|
+
let invisible_to_owner;
|
|
23
27
|
</script>
|
|
24
28
|
|
|
25
29
|
<div class="max-w-6xl">
|
|
@@ -125,10 +129,23 @@ let scheduledForStr;
|
|
|
125
129
|
>
|
|
126
130
|
Schedule to run later
|
|
127
131
|
</Button>
|
|
132
|
+
{#if runnable?.path?.startsWith(`u/${$userStore?.username}`) != true && (runnable?.path?.split('/')?.length ?? 0) > 2}
|
|
133
|
+
<div class="flex items-center gap-1">
|
|
134
|
+
<Toggle
|
|
135
|
+
options={{
|
|
136
|
+
right: `make run invisible to ${runnable?.path?.split('/').slice(0, 2).join('/')}`
|
|
137
|
+
}}
|
|
138
|
+
bind:checked={invisible_to_owner}
|
|
139
|
+
/>
|
|
140
|
+
<Tooltip
|
|
141
|
+
>By default, runs are visible to the owner of the script or flow being triggered</Tooltip
|
|
142
|
+
>
|
|
143
|
+
</div>
|
|
144
|
+
{/if}
|
|
128
145
|
<Button
|
|
129
146
|
btnClasses="!px-6 !py-1"
|
|
130
147
|
disabled={!isValid}
|
|
131
|
-
on:click={() => runAction(scheduledForStr, args)}
|
|
148
|
+
on:click={() => runAction(scheduledForStr, args, invisible_to_owner)}
|
|
132
149
|
>
|
|
133
150
|
{scheduledForStr ? 'Schedule run to a later time' : buttonText}
|
|
134
151
|
</Button>
|
|
@@ -137,7 +154,7 @@ let scheduledForStr;
|
|
|
137
154
|
<Button
|
|
138
155
|
btnClasses="!px-6 !py-1 w-full"
|
|
139
156
|
disabled={!isValid}
|
|
140
|
-
on:click={() => runAction(undefined, args)}
|
|
157
|
+
on:click={() => runAction(undefined, args, invisible_to_owner)}
|
|
141
158
|
>
|
|
142
159
|
{buttonText}
|
|
143
160
|
</Button>
|
|
@@ -15,7 +15,7 @@ declare const __propDef: {
|
|
|
15
15
|
created_by?: string;
|
|
16
16
|
extra_perms?: Record<string, boolean>;
|
|
17
17
|
} | undefined;
|
|
18
|
-
runAction: (scheduledForStr: string | undefined, args: Record<string, any
|
|
18
|
+
runAction: (scheduledForStr: string | undefined, args: Record<string, any>, invisible_to_owner?: boolean) => void;
|
|
19
19
|
buttonText?: string | undefined;
|
|
20
20
|
schedulable?: boolean | undefined;
|
|
21
21
|
detailed?: boolean | undefined;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
<script context="module">
|
|
2
|
+
export function load() {
|
|
3
|
+
return {
|
|
4
|
+
stuff: { title: 'New Schedule' }
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script>import { sendUserToast, formatCron, canWrite } from '../utils';
|
|
10
|
+
import { ScriptService, Script, ScheduleService, FlowService } from '../gen';
|
|
11
|
+
import Toggle from './Toggle.svelte';
|
|
12
|
+
import Path from './Path.svelte';
|
|
13
|
+
import { Alert, Badge, Button } from './common';
|
|
14
|
+
import Tooltip from './Tooltip.svelte';
|
|
15
|
+
import { userStore, workspaceStore } from '../stores';
|
|
16
|
+
import SchemaForm from './SchemaForm.svelte';
|
|
17
|
+
import ScriptPicker from './ScriptPicker.svelte';
|
|
18
|
+
import Required from './Required.svelte';
|
|
19
|
+
import CronInput, { OFFSET } from './CronInput.svelte';
|
|
20
|
+
import { faSave } from '@fortawesome/free-solid-svg-icons';
|
|
21
|
+
import Drawer from './common/drawer/Drawer.svelte';
|
|
22
|
+
import DrawerContent from './common/drawer/DrawerContent.svelte';
|
|
23
|
+
import { createEventDispatcher } from 'svelte';
|
|
24
|
+
let initialPath = '';
|
|
25
|
+
let edit = true;
|
|
26
|
+
let schedule = '0 0 12 * *';
|
|
27
|
+
let itemKind = 'script';
|
|
28
|
+
let script_path = '';
|
|
29
|
+
let initialScriptPath = '';
|
|
30
|
+
export function openEdit(ePath, isFlow) {
|
|
31
|
+
is_flow = isFlow;
|
|
32
|
+
initialPath = ePath;
|
|
33
|
+
itemKind = is_flow ? 'flow' : 'script';
|
|
34
|
+
path = ePath;
|
|
35
|
+
edit = true;
|
|
36
|
+
drawer?.openDrawer();
|
|
37
|
+
}
|
|
38
|
+
export function openNew(is_flow, initial_script_path) {
|
|
39
|
+
edit = false;
|
|
40
|
+
itemKind = is_flow ? 'flow' : 'script';
|
|
41
|
+
initialScriptPath = initial_script_path ?? '';
|
|
42
|
+
path = initialScriptPath;
|
|
43
|
+
initialPath = initialScriptPath;
|
|
44
|
+
script_path = initialScriptPath;
|
|
45
|
+
drawer?.openDrawer();
|
|
46
|
+
}
|
|
47
|
+
$: is_flow = itemKind == 'flow';
|
|
48
|
+
let runnable;
|
|
49
|
+
let args = {};
|
|
50
|
+
let isValid = true;
|
|
51
|
+
let path = '';
|
|
52
|
+
let enabled = false;
|
|
53
|
+
let pathError = '';
|
|
54
|
+
let validCRON = true;
|
|
55
|
+
$: allowSchedule = isValid && validCRON && script_path != '';
|
|
56
|
+
$: script_path != '' && loadScript(script_path);
|
|
57
|
+
const dispatch = createEventDispatcher();
|
|
58
|
+
async function loadScript(p) {
|
|
59
|
+
if (p) {
|
|
60
|
+
if (is_flow) {
|
|
61
|
+
runnable = await FlowService.getFlowByPath({ workspace: $workspaceStore, path: p });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
runnable = await ScriptService.getScriptByPath({ workspace: $workspaceStore, path: p });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
runnable = undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let can_write = true;
|
|
72
|
+
async function loadSchedule() {
|
|
73
|
+
try {
|
|
74
|
+
const s = await ScheduleService.getSchedule({
|
|
75
|
+
workspace: $workspaceStore,
|
|
76
|
+
path: initialPath
|
|
77
|
+
});
|
|
78
|
+
enabled = s.enabled;
|
|
79
|
+
schedule = s.schedule;
|
|
80
|
+
script_path = s.script_path ?? '';
|
|
81
|
+
is_flow = s.is_flow;
|
|
82
|
+
args = s.args ?? {};
|
|
83
|
+
can_write = canWrite(s.path, s.extra_perms, $userStore);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
sendUserToast(`Could not load schedule: ${err}`, true);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function scheduleScript() {
|
|
90
|
+
if (edit) {
|
|
91
|
+
await ScheduleService.updateSchedule({
|
|
92
|
+
workspace: $workspaceStore,
|
|
93
|
+
path: initialPath,
|
|
94
|
+
requestBody: {
|
|
95
|
+
schedule: formatCron(schedule),
|
|
96
|
+
args
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
sendUserToast(`Schedule ${path} updated`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
await ScheduleService.createSchedule({
|
|
103
|
+
workspace: $workspaceStore,
|
|
104
|
+
requestBody: {
|
|
105
|
+
path,
|
|
106
|
+
schedule: formatCron(schedule),
|
|
107
|
+
offset: OFFSET,
|
|
108
|
+
script_path,
|
|
109
|
+
is_flow,
|
|
110
|
+
args,
|
|
111
|
+
enabled: true
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
sendUserToast(`Schedule ${path} created`);
|
|
115
|
+
}
|
|
116
|
+
dispatch('update');
|
|
117
|
+
drawer.closeDrawer();
|
|
118
|
+
}
|
|
119
|
+
$: {
|
|
120
|
+
if ($workspaceStore) {
|
|
121
|
+
if (edit && path != '') {
|
|
122
|
+
loadSchedule();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
let drawer;
|
|
127
|
+
</script>
|
|
128
|
+
|
|
129
|
+
<Drawer size="900px" bind:this={drawer}>
|
|
130
|
+
<DrawerContent
|
|
131
|
+
title={edit ? `Edit ${initialPath}` : 'New schedule'}
|
|
132
|
+
on:close={drawer.closeDrawer}
|
|
133
|
+
>
|
|
134
|
+
<svelte:fragment slot="actions">
|
|
135
|
+
{#if edit}
|
|
136
|
+
<div class="mr-8">
|
|
137
|
+
<Toggle
|
|
138
|
+
disabled={!can_write}
|
|
139
|
+
checked={enabled}
|
|
140
|
+
options={{ right: 'enable', left: 'disable' }}
|
|
141
|
+
on:change={async (e) => {
|
|
142
|
+
await ScheduleService.setScheduleEnabled({
|
|
143
|
+
path: initialPath,
|
|
144
|
+
workspace: $workspaceStore ?? '',
|
|
145
|
+
requestBody: { enabled: e.detail }
|
|
146
|
+
})
|
|
147
|
+
sendUserToast(`${e.detail ? 'enabled' : 'disabled'} schedule ${initialPath}`)
|
|
148
|
+
}}
|
|
149
|
+
/>
|
|
150
|
+
</div>
|
|
151
|
+
{/if}
|
|
152
|
+
<Button
|
|
153
|
+
startIcon={{ icon: faSave }}
|
|
154
|
+
disabled={!allowSchedule || pathError != ''}
|
|
155
|
+
on:click={scheduleScript}
|
|
156
|
+
>
|
|
157
|
+
{edit ? 'Save' : 'Schedule'}
|
|
158
|
+
</Button>
|
|
159
|
+
</svelte:fragment>
|
|
160
|
+
<div>
|
|
161
|
+
{#if !edit}
|
|
162
|
+
<span class="font-semibold text-gray-700">Path</span>
|
|
163
|
+
<Path
|
|
164
|
+
checkInitialPathExistence
|
|
165
|
+
bind:error={pathError}
|
|
166
|
+
bind:path
|
|
167
|
+
{initialPath}
|
|
168
|
+
namePlaceholder={'my_schedule'}
|
|
169
|
+
kind="schedule"
|
|
170
|
+
/>
|
|
171
|
+
<div class="mb-8" />
|
|
172
|
+
{/if}
|
|
173
|
+
|
|
174
|
+
<h2 class="border-b pb-1 mb-2">
|
|
175
|
+
<span class="mr-1">Schedule</span>
|
|
176
|
+
<Tooltip>Schedules use CRON syntax. Seconds are mandatory.</Tooltip>
|
|
177
|
+
</h2>
|
|
178
|
+
<CronInput disabled={!can_write} bind:schedule bind:validCRON />
|
|
179
|
+
|
|
180
|
+
<h2 class="border-b pb-1 mt-8 mb-2">Runnable</h2>
|
|
181
|
+
{#if !edit}
|
|
182
|
+
<p class="text-xs mb-1 text-gray-600">
|
|
183
|
+
Pick a script or flow to be triggered by the schedule<Required required={true} />
|
|
184
|
+
</p>
|
|
185
|
+
<ScriptPicker
|
|
186
|
+
disabled={initialScriptPath != '' || !can_write}
|
|
187
|
+
initialPath={initialScriptPath}
|
|
188
|
+
kind={Script.kind.SCRIPT}
|
|
189
|
+
allowFlow={true}
|
|
190
|
+
bind:itemKind
|
|
191
|
+
bind:scriptPath={script_path}
|
|
192
|
+
/>
|
|
193
|
+
{:else}
|
|
194
|
+
<Alert type="info" title="Runnable path cannot be edited">
|
|
195
|
+
Once a schedule is created, the runnable path cannot be changed. However, when renaming a
|
|
196
|
+
script or a flow, the runnable path will automatically update itself.
|
|
197
|
+
</Alert>
|
|
198
|
+
<div class="my-2" />
|
|
199
|
+
<ScriptPicker
|
|
200
|
+
disabled
|
|
201
|
+
initialPath={script_path}
|
|
202
|
+
scriptPath={script_path}
|
|
203
|
+
allowFlow={true}
|
|
204
|
+
{itemKind}
|
|
205
|
+
/>
|
|
206
|
+
{/if}
|
|
207
|
+
<div class="mt-6">
|
|
208
|
+
<span class="font-semibold text-gray-700">Arguments</span>
|
|
209
|
+
|
|
210
|
+
{#if runnable}
|
|
211
|
+
{#if runnable?.schema && runnable.schema.properties && Object.keys(runnable.schema.properties).length > 0}
|
|
212
|
+
<SchemaForm disabled={!can_write} schema={runnable.schema} bind:isValid bind:args />
|
|
213
|
+
{:else}
|
|
214
|
+
<div class="text-xs texg-gray-700">
|
|
215
|
+
This {is_flow ? 'flow' : 'script'} takes no argument
|
|
216
|
+
</div>
|
|
217
|
+
{/if}
|
|
218
|
+
{:else}
|
|
219
|
+
<div class="text-xs texg-gray-700 my-2">
|
|
220
|
+
Pick a {is_flow ? 'flow' : 'script'} and fill its argument here
|
|
221
|
+
</div>
|
|
222
|
+
{/if}
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</DrawerContent>
|
|
226
|
+
</Drawer>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
export declare function load(): {
|
|
3
|
+
stuff: {
|
|
4
|
+
title: string;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
declare const __propDef: {
|
|
8
|
+
props: {
|
|
9
|
+
openEdit?: ((ePath: string, isFlow: boolean) => void) | undefined;
|
|
10
|
+
openNew?: ((is_flow: boolean, initial_script_path?: string) => void) | undefined;
|
|
11
|
+
};
|
|
12
|
+
events: {
|
|
13
|
+
update: CustomEvent<any>;
|
|
14
|
+
} & {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
};
|
|
17
|
+
slots: {};
|
|
18
|
+
};
|
|
19
|
+
export type ScheduleEditorProps = typeof __propDef.props;
|
|
20
|
+
export type ScheduleEditorEvents = typeof __propDef.events;
|
|
21
|
+
export type ScheduleEditorSlots = typeof __propDef.slots;
|
|
22
|
+
export default class ScheduleEditor extends SvelteComponentTyped<ScheduleEditorProps, ScheduleEditorEvents, ScheduleEditorSlots> {
|
|
23
|
+
get openEdit(): (ePath: string, isFlow: boolean) => void;
|
|
24
|
+
get openNew(): (is_flow: boolean, initial_script_path?: string | undefined) => void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -7,7 +7,6 @@ import { userStore, workspaceStore } from '../stores';
|
|
|
7
7
|
import { encodeState, sendUserToast, setQueryWithoutLoad } from '../utils';
|
|
8
8
|
import Path from './Path.svelte';
|
|
9
9
|
import RadioButton from './RadioButton.svelte';
|
|
10
|
-
import Required from './Required.svelte';
|
|
11
10
|
import ScriptEditor from './ScriptEditor.svelte';
|
|
12
11
|
import ScriptSchema from './ScriptSchema.svelte';
|
|
13
12
|
import CenteredPage from './CenteredPage.svelte';
|
|
@@ -158,129 +157,125 @@ $: kind = script.kind;
|
|
|
158
157
|
<!-- metadata -->
|
|
159
158
|
{#if step === 1}
|
|
160
159
|
<CenteredPage>
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
<div class="flex flex-row gap-2 flex-wrap">
|
|
184
|
-
{#each langs as [label, lang]}
|
|
185
|
-
{@const isPicked = script.language == lang && template == 'script'}
|
|
186
|
-
<Button
|
|
187
|
-
size="sm"
|
|
188
|
-
variant="border"
|
|
189
|
-
color={isPicked ? 'blue' : 'dark'}
|
|
190
|
-
btnClasses={isPicked ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
|
|
191
|
-
on:click={() => {
|
|
192
|
-
script.language = lang
|
|
193
|
-
template = 'script'
|
|
194
|
-
initContent(lang, script.kind, template)
|
|
195
|
-
}}
|
|
196
|
-
>
|
|
197
|
-
<LanguageIcon {lang} /><span class="ml-2">{label}</span>
|
|
198
|
-
</Button>
|
|
199
|
-
{/each}
|
|
200
|
-
<Button
|
|
201
|
-
size="sm"
|
|
202
|
-
variant="border"
|
|
203
|
-
color={template == 'pgsql' ? 'blue' : 'dark'}
|
|
204
|
-
btnClasses={template == 'pgsql' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
|
|
205
|
-
on:click={() => {
|
|
206
|
-
script.language = Script.language.DENO
|
|
207
|
-
template = 'pgsql'
|
|
208
|
-
initContent(script.language, script.kind, template)
|
|
209
|
-
}}
|
|
210
|
-
>
|
|
211
|
-
<LanguageIcon lang="pgsql" /><span class="ml-2">PostgreSQL</span>
|
|
212
|
-
</Button>
|
|
160
|
+
<h2 class="border-b pb-1 mt-4 mb-2">Path</h2>
|
|
161
|
+
<Path
|
|
162
|
+
bind:this={pathC}
|
|
163
|
+
bind:error={pathError}
|
|
164
|
+
bind:path={script.path}
|
|
165
|
+
{initialPath}
|
|
166
|
+
on:enter={() => changeStep(2)}
|
|
167
|
+
namePlaceholder="my_script"
|
|
168
|
+
kind="script"
|
|
169
|
+
/>
|
|
170
|
+
<h2 class="border-b pb-1 mt-8 mb-4">Summary</h2>
|
|
171
|
+
<input
|
|
172
|
+
type="text"
|
|
173
|
+
bind:this={summaryC}
|
|
174
|
+
bind:value={script.summary}
|
|
175
|
+
placeholder="A very short summary of the script displayed when the script is listed"
|
|
176
|
+
rows="1"
|
|
177
|
+
/>
|
|
178
|
+
<h2 class="border-b pb-1 mt-8 mb-6">Language</h2>
|
|
179
|
+
<div class="flex flex-row gap-2 flex-wrap">
|
|
180
|
+
{#each langs as [label, lang]}
|
|
181
|
+
{@const isPicked = script.language == lang && template == 'script'}
|
|
213
182
|
<Button
|
|
214
183
|
size="sm"
|
|
215
184
|
variant="border"
|
|
216
|
-
color={
|
|
217
|
-
btnClasses={
|
|
185
|
+
color={isPicked ? 'blue' : 'dark'}
|
|
186
|
+
btnClasses={isPicked ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
|
|
218
187
|
on:click={() => {
|
|
219
|
-
script.language =
|
|
220
|
-
template = '
|
|
221
|
-
initContent(
|
|
188
|
+
script.language = lang
|
|
189
|
+
template = 'script'
|
|
190
|
+
initContent(lang, script.kind, template)
|
|
222
191
|
}}
|
|
223
192
|
>
|
|
224
|
-
<LanguageIcon lang
|
|
193
|
+
<LanguageIcon {lang} /><span class="ml-2">{label}</span>
|
|
225
194
|
</Button>
|
|
226
|
-
|
|
227
|
-
<
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
195
|
+
{/each}
|
|
196
|
+
<Button
|
|
197
|
+
size="sm"
|
|
198
|
+
variant="border"
|
|
199
|
+
color={template == 'pgsql' ? 'blue' : 'dark'}
|
|
200
|
+
btnClasses={template == 'pgsql' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
|
|
201
|
+
on:click={() => {
|
|
202
|
+
script.language = Script.language.DENO
|
|
203
|
+
template = 'pgsql'
|
|
204
|
+
initContent(script.language, script.kind, template)
|
|
205
|
+
}}
|
|
206
|
+
>
|
|
207
|
+
<LanguageIcon lang="pgsql" /><span class="ml-2">PostgreSQL</span>
|
|
208
|
+
</Button>
|
|
209
|
+
<Button
|
|
210
|
+
size="sm"
|
|
211
|
+
variant="border"
|
|
212
|
+
color={template == 'mysql' ? 'blue' : 'dark'}
|
|
213
|
+
btnClasses={template == 'mysql' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
|
|
214
|
+
on:click={() => {
|
|
215
|
+
script.language = Script.language.DENO
|
|
216
|
+
template = 'mysql'
|
|
217
|
+
initContent(script.language, script.kind, template)
|
|
218
|
+
}}
|
|
219
|
+
>
|
|
220
|
+
<LanguageIcon lang="mysql" /><span class="ml-2">MySQL</span>
|
|
221
|
+
</Button>
|
|
222
|
+
</div>
|
|
223
|
+
<h2 class="border-b pb-1 mt-8 mb-4">Advanced</h2>
|
|
224
|
+
<div class="mb-4">
|
|
225
|
+
<Button
|
|
226
|
+
color="light"
|
|
227
|
+
size="sm"
|
|
228
|
+
endIcon={{ icon: viewScriptKind ? faChevronUp : faChevronDown }}
|
|
229
|
+
on:click={() => (viewScriptKind = !viewScriptKind)}
|
|
230
|
+
>
|
|
231
|
+
Tag this script as having a specific purpose inside flows
|
|
232
|
+
</Button>
|
|
233
|
+
</div>
|
|
234
|
+
{#if viewScriptKind}
|
|
235
|
+
<div class="max-w-lg">
|
|
236
|
+
<RadioButton
|
|
237
|
+
label="Script Type"
|
|
238
|
+
options={[
|
|
239
|
+
['Action', Script.kind.SCRIPT],
|
|
240
|
+
[
|
|
241
|
+
{
|
|
242
|
+
title: 'Trigger',
|
|
243
|
+
desc: `First module of flows to trigger them based on watching changes external periodically using an internal state`
|
|
244
|
+
},
|
|
245
|
+
Script.kind.TRIGGER
|
|
246
|
+
],
|
|
247
|
+
[
|
|
248
|
+
{
|
|
249
|
+
title: 'Approval',
|
|
250
|
+
desc: `Send notification externally to ask for approval to continue a flow`
|
|
251
|
+
},
|
|
252
|
+
Script.kind.APPROVAL
|
|
253
|
+
],
|
|
254
|
+
[
|
|
255
|
+
{
|
|
256
|
+
title: 'Error Handler',
|
|
257
|
+
desc: `Handle errors for flows after all retries attempts have been exhausted`
|
|
258
|
+
},
|
|
259
|
+
Script.kind.FAILURE
|
|
260
|
+
]
|
|
265
261
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
/>
|
|
276
|
-
</div>
|
|
277
|
-
{/if}
|
|
278
|
-
<div class="ml-3">
|
|
279
|
-
<Toggle
|
|
280
|
-
bind:checked={script.is_template}
|
|
281
|
-
options={{ right: 'Save as a workspace template' }}
|
|
262
|
+
// ['Command Handler', Script.kind.COMMAND]
|
|
263
|
+
]}
|
|
264
|
+
on:change={(e) => {
|
|
265
|
+
if (isInitialCode(script.content)) {
|
|
266
|
+
template = 'script'
|
|
267
|
+
initContent(script.language, e.detail, template)
|
|
268
|
+
}
|
|
269
|
+
}}
|
|
270
|
+
bind:value={script.kind}
|
|
282
271
|
/>
|
|
283
272
|
</div>
|
|
273
|
+
{/if}
|
|
274
|
+
<div class="ml-3">
|
|
275
|
+
<Toggle
|
|
276
|
+
bind:checked={script.is_template}
|
|
277
|
+
options={{ right: 'Save as a workspace template' }}
|
|
278
|
+
/>
|
|
284
279
|
</div>
|
|
285
280
|
</CenteredPage>
|
|
286
281
|
{:else if step === 2}
|
|
@@ -22,6 +22,7 @@ export let lang;
|
|
|
22
22
|
export let kind = undefined;
|
|
23
23
|
export let initialArgs = {};
|
|
24
24
|
export let fixedOverflowWidgets = true;
|
|
25
|
+
export let noSyncFromGithub = false;
|
|
25
26
|
let websocketAlive = { pyright: false, black: false, deno: false, go: false };
|
|
26
27
|
let width = 1200;
|
|
27
28
|
// Internal state
|
|
@@ -103,20 +104,22 @@ onMount(() => {
|
|
|
103
104
|
{websocketAlive}
|
|
104
105
|
{kind}
|
|
105
106
|
/>
|
|
106
|
-
|
|
107
|
-
<
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
107
|
+
{#if !noSyncFromGithub}
|
|
108
|
+
<div class="py-1">
|
|
109
|
+
<Button
|
|
110
|
+
target="_blank"
|
|
111
|
+
href="https://github.com/windmill-labs/windmill/tree/main/cli"
|
|
112
|
+
color="light"
|
|
113
|
+
size="xs"
|
|
114
|
+
btnClasses="mr-1 hidden md:block"
|
|
115
|
+
startIcon={{
|
|
116
|
+
icon: faGithub
|
|
117
|
+
}}
|
|
118
|
+
>
|
|
119
|
+
Sync from Github
|
|
120
|
+
</Button>
|
|
121
|
+
</div>
|
|
122
|
+
{/if}
|
|
120
123
|
</div>
|
|
121
124
|
</div>
|
|
122
125
|
<SplitPanesWrapper panesClass="!overflow-visible">
|
|
@@ -10,6 +10,7 @@ declare const __propDef: {
|
|
|
10
10
|
kind?: 'script' | 'trigger' | 'approval' | undefined;
|
|
11
11
|
initialArgs?: Record<string, any> | undefined;
|
|
12
12
|
fixedOverflowWidgets?: boolean | undefined;
|
|
13
|
+
noSyncFromGithub?: boolean | undefined;
|
|
13
14
|
};
|
|
14
15
|
events: {
|
|
15
16
|
[evt: string]: CustomEvent<any>;
|