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.
Files changed (199) hide show
  1. package/common.d.ts +1 -1
  2. package/common.js +3 -0
  3. package/components/AppConnect.svelte +2 -2
  4. package/components/ArgInput.svelte +1 -1
  5. package/components/CronInput.svelte +54 -53
  6. package/components/Dropdown.svelte +21 -9
  7. package/components/Editor.svelte +10 -10
  8. package/components/EditorBar.svelte +2 -2
  9. package/components/FlowBuilder.svelte +41 -25
  10. package/components/FlowGraphViewer.svelte +6 -2
  11. package/components/FlowMetadata.svelte +8 -3
  12. package/components/FolderEditor.svelte +299 -0
  13. package/components/FolderEditor.svelte.d.ts +16 -0
  14. package/components/FolderInfo.svelte +13 -0
  15. package/components/FolderInfo.svelte.d.ts +16 -0
  16. package/components/FolderUsageInfo.svelte +17 -0
  17. package/components/FolderUsageInfo.svelte.d.ts +16 -0
  18. package/components/GroupEditor.svelte +287 -0
  19. package/components/GroupEditor.svelte.d.ts +18 -0
  20. package/components/GroupInfo.svelte +22 -0
  21. package/components/GroupInfo.svelte.d.ts +16 -0
  22. package/components/InputTransformForm.svelte +16 -7
  23. package/components/MoveDrawer.svelte +75 -0
  24. package/components/MoveDrawer.svelte.d.ts +19 -0
  25. package/components/Path.svelte +243 -96
  26. package/components/Path.svelte.d.ts +1 -4
  27. package/components/RadioButton.svelte +2 -0
  28. package/components/RadioButton.svelte.d.ts +1 -0
  29. package/components/ResourceEditor.svelte +11 -16
  30. package/components/RunForm.svelte +20 -3
  31. package/components/RunForm.svelte.d.ts +1 -1
  32. package/components/ScheduleEditor.svelte +226 -0
  33. package/components/ScheduleEditor.svelte.d.ts +26 -0
  34. package/components/ScriptBuilder.svelte +109 -114
  35. package/components/ScriptEditor.svelte +17 -14
  36. package/components/ScriptEditor.svelte.d.ts +1 -0
  37. package/components/ScriptPicker.svelte +55 -29
  38. package/components/ScriptPicker.svelte.d.ts +1 -0
  39. package/components/ShareModal.svelte +94 -73
  40. package/components/ShareModal.svelte.d.ts +2 -4
  41. package/components/SimpleEditor.svelte +15 -10
  42. package/components/TemplateEditor.svelte +496 -0
  43. package/components/TemplateEditor.svelte.d.ts +25 -0
  44. package/components/TestJobLoader.svelte +1 -1
  45. package/components/VariableEditor.svelte +2 -1
  46. package/components/apps/CreateApp.svelte +1 -1
  47. package/components/apps/components/buttons/AppButton.svelte +3 -3
  48. package/components/apps/components/dataDisplay/AppBarChart.svelte +5 -4
  49. package/components/apps/components/dataDisplay/AppPieChart.svelte +3 -3
  50. package/components/apps/components/dateInputs/AppDateInput.svelte +34 -0
  51. package/components/apps/components/dateInputs/AppDateInput.svelte.d.ts +22 -0
  52. package/components/apps/components/form/AppForm.svelte +4 -5
  53. package/components/apps/components/form/AppForm.svelte.d.ts +0 -1
  54. package/components/apps/components/helpers/AlignWrapper.svelte +3 -4
  55. package/components/apps/components/helpers/AlignWrapper.svelte.d.ts +2 -3
  56. package/components/apps/components/helpers/InputValue.svelte +54 -5
  57. package/components/apps/components/helpers/InputValue.svelte.d.ts +1 -0
  58. package/components/apps/components/helpers/NonRunnableComponent.svelte +2 -1
  59. package/components/apps/components/helpers/RefreshButton.svelte +20 -0
  60. package/components/apps/components/helpers/RefreshButton.svelte.d.ts +16 -0
  61. package/components/apps/components/helpers/RunnableComponent.svelte +38 -42
  62. package/components/apps/components/helpers/RunnableWrapper.svelte +6 -3
  63. package/components/apps/components/numberInputs/AppNumberInput.svelte +8 -11
  64. package/components/apps/components/numberInputs/AppNumberInput.svelte.d.ts +1 -0
  65. package/components/apps/components/selectInputs/AppCheckbox.svelte +1 -1
  66. package/components/apps/components/selectInputs/AppSelect.svelte +26 -0
  67. package/components/apps/components/selectInputs/AppSelect.svelte.d.ts +22 -0
  68. package/components/apps/components/table/AppTable.svelte +159 -0
  69. package/components/apps/components/{dataDisplay → table}/AppTable.svelte.d.ts +0 -0
  70. package/components/apps/components/table/AppTableFooter.svelte +54 -0
  71. package/components/apps/components/table/AppTableFooter.svelte.d.ts +20 -0
  72. package/components/apps/components/table/tableOptions.d.ts +10 -0
  73. package/components/apps/components/table/tableOptions.js +11 -0
  74. package/components/apps/components/textInputs/AppTextInput.svelte +17 -10
  75. package/components/apps/components/textInputs/AppTextInput.svelte.d.ts +2 -0
  76. package/components/apps/editor/AppEditor.svelte +35 -20
  77. package/components/apps/editor/AppEditorHeader.svelte +15 -7
  78. package/components/apps/editor/AppPreview.svelte +5 -3
  79. package/components/apps/editor/AppPreview.svelte.d.ts +4 -1
  80. package/components/apps/editor/ComponentEditor.svelte +21 -3
  81. package/components/apps/editor/ComponentEditor.svelte.d.ts +2 -0
  82. package/components/apps/editor/ComponentHeader.svelte +21 -4
  83. package/components/apps/editor/ComponentHeader.svelte.d.ts +2 -0
  84. package/components/apps/editor/GridEditor.svelte +40 -20
  85. package/components/apps/editor/RecomputeAllComponents.svelte +5 -7
  86. package/components/apps/editor/componentsPanel/ComponentList.svelte +30 -82
  87. package/components/apps/editor/componentsPanel/data.js +78 -29
  88. package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +5 -1
  89. package/components/apps/editor/contextPanel/ContextPanel.svelte +35 -152
  90. package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +1 -3
  91. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +64 -0
  92. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte.d.ts +18 -0
  93. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +95 -0
  94. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +20 -0
  95. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +32 -0
  96. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +19 -0
  97. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte +63 -0
  98. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte.d.ts +17 -0
  99. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +44 -0
  100. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +14 -0
  101. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +126 -0
  102. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +16 -0
  103. package/components/apps/editor/settingsPanel/AlignmentEditor.svelte +41 -0
  104. package/components/apps/editor/settingsPanel/AlignmentEditor.svelte.d.ts +17 -0
  105. package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +44 -0
  106. package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte.d.ts +18 -0
  107. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +48 -130
  108. package/components/apps/editor/settingsPanel/ComponentPanel.svelte.d.ts +3 -0
  109. package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -2
  110. package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +1 -1
  111. package/components/apps/editor/settingsPanel/Recompute.svelte +2 -2
  112. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +46 -0
  113. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte.d.ts +17 -0
  114. package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +1 -1
  115. package/components/apps/editor/settingsPanel/common/PanelSection.svelte +1 -1
  116. package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte → inputEditor/ConnectedInputEditor.svelte} +1 -2
  117. package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte.d.ts → inputEditor/ConnectedInputEditor.svelte.d.ts} +1 -1
  118. package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte +12 -0
  119. package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte.d.ts +17 -0
  120. package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte → inputEditor/StaticInputEditor.svelte} +5 -5
  121. package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte.d.ts → inputEditor/StaticInputEditor.svelte.d.ts} +1 -1
  122. package/components/apps/editor/settingsPanel/mainInput/InlineScriptList.svelte +6 -3
  123. package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +66 -22
  124. package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte.d.ts +2 -3
  125. package/components/apps/editor/settingsPanel/mainInput/WorkspaceFlowList.svelte +1 -1
  126. package/components/apps/gridUtils.d.ts +3 -1
  127. package/components/apps/gridUtils.js +16 -1
  128. package/components/apps/inputType.d.ts +10 -4
  129. package/components/apps/rx.d.ts +8 -8
  130. package/components/apps/rx.js +17 -9
  131. package/components/apps/types.d.ts +14 -2
  132. package/components/apps/utils.d.ts +4 -3
  133. package/components/apps/utils.js +37 -5
  134. package/components/common/drawer/Drawer.svelte +1 -1
  135. package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  136. package/components/common/table/FlowRow.svelte +21 -7
  137. package/components/common/table/FlowRow.svelte.d.ts +2 -0
  138. package/components/common/table/ScriptRow.svelte +22 -7
  139. package/components/common/table/ScriptRow.svelte.d.ts +2 -0
  140. package/components/common/toggleButton/ToggleButton.svelte +1 -1
  141. package/components/common/toggleButton/ToggleButtonGroup.svelte +1 -1
  142. package/components/common/toggleButton/ToggleButtonGroup.svelte.d.ts +1 -0
  143. package/components/flows/content/FlowEditorPanel.svelte +10 -16
  144. package/components/flows/content/FlowInputs.svelte +18 -4
  145. package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
  146. package/components/flows/content/FlowModuleComponent.svelte +1 -1
  147. package/components/flows/content/FlowModuleWrapper.svelte +26 -1
  148. package/components/flows/content/FlowSchedules.svelte +5 -0
  149. package/components/flows/content/FlowSettings.svelte +13 -23
  150. package/components/flows/content/FlowSettings.svelte.d.ts +0 -1
  151. package/components/flows/header/FlowPreviewButtons.svelte +1 -0
  152. package/components/flows/map/FlowErrorHandlerItem.svelte +1 -1
  153. package/components/flows/map/FlowModuleSchemaMap.svelte +12 -3
  154. package/components/flows/map/FlowSettingsItem.svelte +8 -15
  155. package/components/flows/map/InsertModuleButton.svelte +29 -2
  156. package/components/flows/map/InsertModuleButton.svelte.d.ts +3 -1
  157. package/components/flows/map/MapItem.svelte +2 -1
  158. package/components/flows/map/MapItem.svelte.d.ts +1 -0
  159. package/components/flows/pickers/WorkspaceScriptPicker.svelte +3 -0
  160. package/components/flows/previousResults.js +1 -1
  161. package/components/graph/FlowGraph.svelte +13 -13
  162. package/components/home/ItemsList.svelte +20 -12
  163. package/components/jobs/JobDetail.svelte +9 -3
  164. package/components/sidebar/SidebarContent.svelte +4 -3
  165. package/components/sidebar/UserMenu.svelte +1 -1
  166. package/editorUtils.d.ts +7 -1
  167. package/editorUtils.js +98 -3
  168. package/es5.d.ts.txt +4526 -0
  169. package/gen/index.d.ts +2 -0
  170. package/gen/index.js +1 -0
  171. package/gen/models/CompletedJob.d.ts +1 -0
  172. package/gen/models/EditSchedule.d.ts +0 -2
  173. package/gen/models/Folder.d.ts +5 -0
  174. package/gen/models/Folder.js +4 -0
  175. package/gen/models/QueuedJob.d.ts +1 -0
  176. package/gen/models/Script.d.ts +1 -1
  177. package/gen/models/User.d.ts +1 -0
  178. package/gen/services/FolderService.d.ts +128 -0
  179. package/gen/services/FolderService.js +151 -0
  180. package/gen/services/GranularAclService.d.ts +3 -3
  181. package/gen/services/GroupService.d.ts +5 -1
  182. package/gen/services/GroupService.js +4 -1
  183. package/gen/services/JobService.d.ts +25 -5
  184. package/gen/services/JobService.js +10 -5
  185. package/gen/services/ScriptService.d.ts +2 -1
  186. package/gen/services/UserService.d.ts +9 -0
  187. package/gen/services/UserService.js +15 -0
  188. package/package.json +33 -9
  189. package/script_helpers.d.ts +2 -2
  190. package/script_helpers.js +4 -4
  191. package/stores.d.ts +1 -0
  192. package/utils.d.ts +3 -0
  193. package/utils.js +44 -7
  194. package/components/GroupModal.svelte +0 -98
  195. package/components/GroupModal.svelte.d.ts +0 -17
  196. package/components/apps/components/dataDisplay/AppTable.svelte +0 -132
  197. package/components/apps/components/dataDisplay/app.md +0 -49
  198. package/components/apps/editor/contextPanel/InlineScriptCreationPanel.svelte +0 -29
  199. 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
- try {
44
- if (resourceToEdit) {
45
- await ResourceService.updateResource({
46
- workspace: $workspaceStore,
47
- path: resourceToEdit.path,
48
- requestBody: { path, value: args, description }
49
- });
50
- sendUserToast(`Updated resource at ${path}`);
51
- dispatch('refresh');
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
- catch (err) {
59
- sendUserToast(`${err}`, true);
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>) => void;
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
- <div class="space-y-6">
162
- <h2 class="border-b pb-1 mt-4">Path & Summary</h2>
163
- <Path
164
- bind:this={pathC}
165
- bind:error={pathError}
166
- bind:path={script.path}
167
- {initialPath}
168
- on:enter={() => changeStep(2)}
169
- namePlaceholder="my_script"
170
- kind="script"
171
- />
172
- <label class="block ">
173
- <span class="text-gray-700 text-sm">Summary <Required required={false} /></span>
174
- <input
175
- type="text"
176
- bind:this={summaryC}
177
- bind:value={script.summary}
178
- placeholder="A very short summary of the script displayed when the script is listed"
179
- rows="1"
180
- />
181
- </label>
182
- <h2 class="border-b pb-1 mt-4">Language</h2>
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={template == 'mysql' ? 'blue' : 'dark'}
217
- btnClasses={template == 'mysql' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
185
+ color={isPicked ? 'blue' : 'dark'}
186
+ btnClasses={isPicked ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
218
187
  on:click={() => {
219
- script.language = Script.language.DENO
220
- template = 'mysql'
221
- initContent(script.language, script.kind, template)
188
+ script.language = lang
189
+ template = 'script'
190
+ initContent(lang, script.kind, template)
222
191
  }}
223
192
  >
224
- <LanguageIcon lang="mysql" /><span class="ml-2">MySQL</span>
193
+ <LanguageIcon {lang} /><span class="ml-2">{label}</span>
225
194
  </Button>
226
- </div>
227
- <h2 class="border-b pb-1 mt-4">Advanced</h2>
228
- <div>
229
- <Button
230
- color="light"
231
- size="sm"
232
- endIcon={{ icon: viewScriptKind ? faChevronUp : faChevronDown }}
233
- on:click={() => (viewScriptKind = !viewScriptKind)}
234
- >
235
- Tag this script as having a specific purpose inside flows
236
- </Button>
237
- </div>
238
- {#if viewScriptKind}
239
- <div class="max-w-lg">
240
- <RadioButton
241
- label="Script Type"
242
- options={[
243
- ['Common Script', Script.kind.SCRIPT],
244
- [
245
- {
246
- title: 'Trigger Script',
247
- desc: `First module of flows to trigger them based on watching changes external periodically using an internal state`
248
- },
249
- Script.kind.TRIGGER
250
- ],
251
- [
252
- {
253
- title: 'Error Handler',
254
- desc: `Handle errors for flows after all retries attempts have been exhausted`
255
- },
256
- Script.kind.FAILURE
257
- ],
258
- [
259
- {
260
- title: 'Approval Script',
261
- desc: `Send notification externally to ask for approval to continue a flow`
262
- },
263
- Script.kind.APPROVAL
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
- // ['Command Handler', Script.kind.COMMAND]
267
- ]}
268
- on:change={(e) => {
269
- if (isInitialCode(script.content)) {
270
- template = 'script'
271
- initContent(script.language, e.detail, template)
272
- }
273
- }}
274
- bind:value={script.kind}
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
- <div class="py-1">
107
- <Button
108
- target="_blank"
109
- href="https://github.com/windmill-labs/windmill/tree/main/cli"
110
- color="light"
111
- size="xs"
112
- btnClasses="mr-1 hidden md:block"
113
- startIcon={{
114
- icon: faGithub
115
- }}
116
- >
117
- Sync from Github
118
- </Button>
119
- </div>
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>;