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
@@ -0,0 +1,22 @@
1
+ <script>import { GroupService } from '../gen';
2
+ import { workspaceStore } from '../stores';
3
+ import Popover from './Popover.svelte';
4
+ export let name;
5
+ $: $workspaceStore && loadMembers();
6
+ let members = [];
7
+ async function loadMembers() {
8
+ members = (await GroupService.getGroup({ workspace: $workspaceStore, name })).members;
9
+ }
10
+ </script>
11
+
12
+ {#if members}
13
+ <Popover
14
+ ><div class="inline-flex gap-1 items-end"
15
+ ><span class="text-gray-500 text-xs mb-0.5">({members.length})</span>
16
+ <div class="max-w-xs truncate"
17
+ ><span class="text-gray-600 text-xs ">{members?.join(', ')}</span></div
18
+ ></div
19
+ >
20
+ <span slot="text">{members?.join(', ')}</span></Popover
21
+ >
22
+ {/if}
@@ -0,0 +1,16 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ name: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export type GroupInfoProps = typeof __propDef.props;
12
+ export type GroupInfoEvents = typeof __propDef.events;
13
+ export type GroupInfoSlots = typeof __propDef.slots;
14
+ export default class GroupInfo extends SvelteComponentTyped<GroupInfoProps, GroupInfoEvents, GroupInfoSlots> {
15
+ }
16
+ export {};
@@ -6,6 +6,9 @@ import { codeToStaticTemplate, getDefaultExpr, isCodeInjection } from './flows/u
6
6
  import SimpleEditor from './SimpleEditor.svelte';
7
7
  import { Button, ToggleButton, ToggleButtonGroup } from './common';
8
8
  import { faCode } from '@fortawesome/free-solid-svg-icons';
9
+ import TemplateEditor from './TemplateEditor.svelte';
10
+ import Tooltip from './Tooltip.svelte';
11
+ import { escape } from 'svelte/internal';
9
12
  export let schema;
10
13
  export let arg;
11
14
  export let argName;
@@ -84,6 +87,9 @@ function onFocus() {
84
87
  }
85
88
  }
86
89
  const { focusProp, propPickerConfig } = getContext('PropPickerWrapper');
90
+ $: isStaticTemplate(inputCat) && propertyType == 'static' && setPropertyType(arg.value);
91
+ const openBracket = '${';
92
+ const closeBracket = '}';
87
93
  </script>
88
94
 
89
95
  {#if arg != undefined}
@@ -159,7 +165,11 @@ const { focusProp, propPickerConfig } = getContext('PropPickerWrapper');
159
165
  >
160
166
  {#if isStaticTemplate(inputCat)}
161
167
  <ToggleButton light position="left" value="static" size="xs">
162
- {'${} '}Templatable</ToggleButton
168
+ {'${} '}Templatable &nbsp; <Tooltip
169
+ >Write javascript expressions between "{openBracket}" and "{closeBracket}". You may
170
+ refer to contextual objects like 'flow_input', or 'result' or functions like
171
+ 'resource' and 'variable'
172
+ </Tooltip></ToggleButton
163
173
  >
164
174
  {:else}
165
175
  <ToggleButton light position="left" value="static" size="xs">Static</ToggleButton>
@@ -192,7 +202,11 @@ const { focusProp, propPickerConfig } = getContext('PropPickerWrapper');
192
202
  Connect input &rightarrow;
193
203
  </span>
194
204
  {/if}
195
- {#if propertyType === undefined || propertyType == 'static'}
205
+ {#if isStaticTemplate(inputCat) && propertyType == 'static'}
206
+ <div class="py-1">
207
+ <TemplateEditor {extraLib} on:focus={onFocus} bind:code={arg.value} />
208
+ </div>
209
+ {:else if propertyType === undefined || propertyType == 'static'}
196
210
  <ArgInput
197
211
  noMargin
198
212
  compact
@@ -214,11 +228,6 @@ const { focusProp, propPickerConfig } = getContext('PropPickerWrapper');
214
228
  properties={schema.properties[argName].properties}
215
229
  displayHeader={false}
216
230
  bind:inputCat
217
- on:input={(e) => {
218
- if (isStaticTemplate(inputCat)) {
219
- setPropertyType(e.detail.rawValue)
220
- }
221
- }}
222
231
  {variableEditor}
223
232
  {itemPicker}
224
233
  bind:pickForField
@@ -0,0 +1,75 @@
1
+ <script>import { isOwner } from '../utils';
2
+ import { createEventDispatcher } from 'svelte';
3
+ import { userStore, workspaceStore } from '../stores';
4
+ import { Alert, Button, Drawer } from './common';
5
+ import DrawerContent from './common/drawer/DrawerContent.svelte';
6
+ import Path from './Path.svelte';
7
+ import { FlowService, ScriptService } from '../gen';
8
+ const dispatch = createEventDispatcher();
9
+ let kind;
10
+ let initialPath = '';
11
+ let path = '';
12
+ let drawer;
13
+ let own = false;
14
+ export async function openDrawer(initialPath_l, kind_l) {
15
+ kind = kind_l;
16
+ initialPath = initialPath_l;
17
+ await loadOwner();
18
+ drawer.openDrawer();
19
+ }
20
+ async function loadOwner() {
21
+ own = await isOwner(path, $userStore, $workspaceStore);
22
+ }
23
+ async function updatePath() {
24
+ if (kind == 'flow') {
25
+ const flow = await FlowService.getFlowByPath({
26
+ workspace: $workspaceStore,
27
+ path: initialPath
28
+ });
29
+ await FlowService.updateFlow({
30
+ workspace: $workspaceStore,
31
+ path: initialPath,
32
+ requestBody: {
33
+ path,
34
+ summary: flow.summary,
35
+ description: flow.description,
36
+ value: flow.value
37
+ }
38
+ });
39
+ }
40
+ else if (kind == 'script') {
41
+ const script = await ScriptService.getScriptByPath({
42
+ workspace: $workspaceStore,
43
+ path: initialPath
44
+ });
45
+ await ScriptService.createScript({
46
+ workspace: $workspaceStore,
47
+ requestBody: {
48
+ ...script,
49
+ description: script.description ?? '',
50
+ lock: script.lock?.split('\n'),
51
+ parent_hash: script.hash,
52
+ path
53
+ }
54
+ });
55
+ }
56
+ dispatch('update', path);
57
+ drawer.closeDrawer();
58
+ }
59
+ </script>
60
+
61
+ <Drawer bind:this={drawer}>
62
+ <DrawerContent title="Move {initialPath}" on:close={drawer.closeDrawer}>
63
+ <div class="flex flex-col gap-6">
64
+ <h1>Move {initialPath} to</h1>
65
+ {#if !own}
66
+ <Alert type="warning" title="Not owner"
67
+ >Since you do not own this item, you cannot move this item (you can however fork it)</Alert
68
+ >
69
+ {/if}
70
+ <Path disabled={!own} {kind} {initialPath} bind:path />
71
+ <Button disabled={!own} on:click={updatePath}>Move</Button>
72
+ <div />
73
+ </div>
74
+ </DrawerContent>
75
+ </Drawer>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ openDrawer?: ((initialPath_l: string, kind_l: "flow" | "script" | "resource" | "app" | "schedule" | "variable") => Promise<void>) | undefined;
5
+ };
6
+ events: {
7
+ update: CustomEvent<any>;
8
+ } & {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export type MoveDrawerProps = typeof __propDef.props;
14
+ export type MoveDrawerEvents = typeof __propDef.events;
15
+ export type MoveDrawerSlots = typeof __propDef.slots;
16
+ export default class MoveDrawer extends SvelteComponentTyped<MoveDrawerProps, MoveDrawerEvents, MoveDrawerSlots> {
17
+ get openDrawer(): (initialPath_l: string, kind_l: "flow" | "script" | "resource" | "app" | "schedule" | "variable") => Promise<void>;
18
+ }
19
+ export {};
@@ -1,31 +1,37 @@
1
1
  <script>import { pathToMeta } from '../common';
2
- import { FlowService, ResourceService, ScheduleService, ScriptService, VariableService } from '../gen';
3
- import { GroupService } from '../gen';
2
+ import { FlowService, FolderService, GroupService, ResourceService, ScheduleService, ScriptService, VariableService } from '../gen';
4
3
  import { superadmin, userStore, workspaceStore } from '../stores';
5
- import { sleep } from '../utils';
6
4
  import { createEventDispatcher } from 'svelte';
7
5
  import Required from './Required.svelte';
8
- import Popover from './Popover.svelte';
9
- export let meta = {
10
- ownerKind: 'user',
11
- owner: '',
12
- name: ''
13
- };
6
+ import { Button, Drawer, DrawerContent } from './common';
7
+ import { faEye, faPlus } from '@fortawesome/free-solid-svg-icons';
8
+ import ToggleButtonGroup from './common/toggleButton/ToggleButtonGroup.svelte';
9
+ import ToggleButton from './common/toggleButton/ToggleButton.svelte';
10
+ import { Icon } from 'svelte-awesome';
11
+ import Tooltip from './Tooltip.svelte';
12
+ import FolderEditor from './FolderEditor.svelte';
13
+ import GroupEditor from './GroupEditor.svelte';
14
+ let meta = undefined;
14
15
  export let namePlaceholder = '';
15
16
  export let initialPath;
16
17
  export let path = '';
17
18
  export let error = '';
18
19
  export let disabled = false;
20
+ export let checkInitialPathExistence = false;
19
21
  export let kind;
20
22
  let inputP = undefined;
21
23
  const dispatch = createEventDispatcher();
24
+ let folders = [];
22
25
  let groups = [];
23
- $: path = metaToPath(meta);
24
- function metaToPath(meta) {
25
- return [meta.ownerKind === 'group' ? 'g' : 'u', meta.owner, meta.name].join('/');
26
+ $: meta && onMetaChange();
27
+ function onMetaChange() {
28
+ if (meta) {
29
+ path = metaToPath(meta);
30
+ validate(meta, path, kind);
31
+ }
26
32
  }
27
- export function getPath() {
28
- return path;
33
+ function metaToPath(meta) {
34
+ return [meta.ownerKind?.charAt(0) ?? '', meta.owner, meta.name].join('/');
29
35
  }
30
36
  export function focus() {
31
37
  inputP?.focus();
@@ -39,29 +45,36 @@ function handleKeyUp(event) {
39
45
  }
40
46
  export async function reset() {
41
47
  if (path == '' || path == 'u//') {
42
- meta.ownerKind = 'user';
43
- while ($userStore == undefined) {
44
- await sleep(500);
45
- }
46
- meta.owner = $userStore.username;
47
- meta.name = namePlaceholder;
48
+ meta = { ownerKind: 'user', name: namePlaceholder, owner: '' };
49
+ meta.owner = $userStore.username.split('@')[0];
48
50
  let i = 1;
49
51
  while (await pathExists(metaToPath(meta), kind)) {
50
52
  meta.name = `${namePlaceholder}_${i}`;
51
53
  i += 1;
52
- if (initialPath && initialPath != '') {
53
- meta = pathToMeta(initialPath);
54
- }
55
54
  }
55
+ path = metaToPath(meta);
56
56
  }
57
57
  else {
58
58
  meta = pathToMeta(path);
59
59
  }
60
60
  }
61
- $: validate(meta, path, kind);
61
+ async function loadFolders() {
62
+ let initialFolders = [];
63
+ if (initialPath?.split('/')?.[0] == 'f') {
64
+ initialFolders.push(initialPath?.split('/')?.[1]);
65
+ }
66
+ folders = initialFolders.concat(await FolderService.listFolderNames({
67
+ workspace: $workspaceStore
68
+ }));
69
+ }
62
70
  async function loadGroups() {
63
- groups = await GroupService.listGroups({ workspace: $workspaceStore });
64
- meta.owner = meta.owner;
71
+ let initialGroups = [];
72
+ if (initialPath?.split('/')?.[0] == 'f') {
73
+ initialGroups.push(initialPath?.split('/')?.[1]);
74
+ }
75
+ groups = initialGroups.concat(await GroupService.listGroupNames({
76
+ workspace: $workspaceStore
77
+ }));
65
78
  }
66
79
  async function validate(meta, path, kind) {
67
80
  error = '';
@@ -73,10 +86,11 @@ async function validatePath(path, kind) {
73
86
  clearTimeout(validateTimeout);
74
87
  }
75
88
  validateTimeout = setTimeout(async () => {
76
- if ((path == '' || path != initialPath) && (await pathExists(path, kind))) {
89
+ if ((path == '' || checkInitialPathExistence || path != initialPath) &&
90
+ (await pathExists(path, kind))) {
77
91
  error = 'path already used';
78
92
  }
79
- else if (validateName(meta)) {
93
+ else if (meta && validateName(meta)) {
80
94
  error = '';
81
95
  }
82
96
  validateTimeout = undefined;
@@ -120,99 +134,232 @@ function validateName(meta) {
120
134
  error = 'This name is not valid';
121
135
  return false;
122
136
  }
137
+ else if (meta.owner == '' && meta.ownerKind == 'folder') {
138
+ error = 'Folder need to be chosen';
139
+ return false;
140
+ }
141
+ else if (meta.owner == '' && meta.ownerKind == 'group') {
142
+ error = 'Group need to be chosen';
143
+ return false;
144
+ }
123
145
  else {
124
146
  return true;
125
147
  }
126
148
  }
127
149
  $: {
128
- if ($workspaceStore) {
150
+ if ($workspaceStore && $userStore) {
151
+ loadFolders();
129
152
  loadGroups();
153
+ initPath();
130
154
  }
131
155
  }
132
- $: {
156
+ function initPath() {
133
157
  if (initialPath == undefined || initialPath == '') {
134
158
  reset();
135
159
  }
136
160
  else {
137
161
  meta = pathToMeta(initialPath);
162
+ onMetaChange();
163
+ path = initialPath;
164
+ }
165
+ }
166
+ let newFolder;
167
+ let viewFolder;
168
+ let newFolderName;
169
+ let folderCreated = undefined;
170
+ async function addFolder() {
171
+ await FolderService.createFolder({
172
+ workspace: $workspaceStore ?? '',
173
+ requestBody: { name: newFolderName }
174
+ });
175
+ folderCreated = newFolderName;
176
+ if (meta) {
177
+ meta.owner = newFolderName;
178
+ }
179
+ loadFolders();
180
+ }
181
+ let newGroup;
182
+ let viewGroup;
183
+ let newGroupName;
184
+ let groupCreated = undefined;
185
+ async function addGroup() {
186
+ await GroupService.createGroup({
187
+ workspace: $workspaceStore ?? '',
188
+ requestBody: { name: newGroupName }
189
+ });
190
+ groupCreated = newGroupName;
191
+ if (meta) {
192
+ meta.owner = newGroupName;
138
193
  }
194
+ loadGroups();
139
195
  }
140
196
  </script>
141
197
 
198
+ <Drawer bind:this={newGroup}>
199
+ <DrawerContent
200
+ title="New Folder"
201
+ on:close={() => {
202
+ newGroup.closeDrawer()
203
+ groupCreated = undefined
204
+ }}
205
+ >
206
+ <div class="flex flex-row">
207
+ <input class="mr-2" placeholder="New group name" bind:value={newGroupName} />
208
+ <Button size="md" startIcon={{ icon: faPlus }} disabled={!newGroupName} on:click={addGroup}>
209
+ New&nbsp;group
210
+ </Button>
211
+ </div>
212
+ {#if groupCreated}
213
+ <div class="mt-8" />
214
+ <GroupEditor name={groupCreated} />
215
+ {/if}
216
+ </DrawerContent>
217
+ </Drawer>
218
+ <Drawer bind:this={viewGroup}>
219
+ <DrawerContent title="Folder {meta?.owner}" on:close={viewGroup.closeDrawer}>
220
+ <GroupEditor name={meta?.owner ?? ''} />
221
+ </DrawerContent>
222
+ </Drawer>
223
+
224
+ <Drawer bind:this={newFolder}>
225
+ <DrawerContent
226
+ title="New Folder"
227
+ on:close={() => {
228
+ newFolder.closeDrawer()
229
+ folderCreated = undefined
230
+ }}
231
+ >
232
+ <div class="flex flex-row">
233
+ <input class="mr-2" placeholder="New folder name" bind:value={newFolderName} />
234
+ <Button size="md" startIcon={{ icon: faPlus }} disabled={!newFolderName} on:click={addFolder}>
235
+ New&nbsp;folder
236
+ </Button>
237
+ </div>
238
+
239
+ {#if folderCreated}
240
+ <div class="mt-8" />
241
+ <FolderEditor name={folderCreated} />
242
+ {/if}
243
+ </DrawerContent>
244
+ </Drawer>
245
+
246
+ <Drawer bind:this={viewFolder}>
247
+ <DrawerContent title="Folder {meta?.owner}" on:close={viewFolder.closeDrawer}>
248
+ <FolderEditor name={meta?.owner ?? ''} />
249
+ </DrawerContent>
250
+ </Drawer>
251
+
142
252
  <div>
143
- <div class="flex flex-col sm:grid sm:grid-cols-4 sm:gap-4 pb-0 mb-1">
144
- <label class="block">
145
- <span class="text-gray-700 text-sm whitespace-nowrap">
146
- <Popover
147
- >Owner Kind
148
- <span slot="text"
149
- >Select the group <span class="font-mono">all</span>
150
- to share it with all workspace users, and <span class="font-mono">user</span> to keep it
151
- private.
152
- <a href="https://docs.windmill.dev/docs/reference/namespaces">docs</a>
153
- </span>
154
- </Popover>
155
- </span>
253
+ <div class="flex flex-col sm:flex-row items-center gap-2 sm:gap-4 pb-0 mb-1">
254
+ {#if meta != undefined}
255
+ <div class="flex gap-4 shrink">
256
+ <label class="block">
257
+ <span class="text-gray-700 text-sm whitespace-nowrap">&nbsp;</span>
258
+
259
+ <ToggleButtonGroup
260
+ class="mt-0.5"
261
+ bind:selected={meta.ownerKind}
262
+ on:selected={(e) => {
263
+ const kind = e.detail
264
+ if (meta) {
265
+ if (kind === 'folder') {
266
+ meta.owner = $userStore?.folders?.[0] ?? ''
267
+ } else if (kind === 'group') {
268
+ meta.owner = 'all'
269
+ } else {
270
+ meta.owner = $userStore?.username?.split('@')[0] ?? ''
271
+ }
272
+ }
273
+ }}
274
+ >
275
+ <ToggleButton light size="xs" value="user" position="left">User</ToggleButton>
276
+ <!-- <ToggleButton light size="xs" value="group" position="center">Group</ToggleButton> -->
277
+ <ToggleButton light size="xs" value="folder" position="right">Folder</ToggleButton>
278
+ </ToggleButtonGroup>
279
+ </label>
280
+ {#if meta.ownerKind === 'user'}
281
+ <label class="block shrink min-w-0">
282
+ <span class="text-gray-700 text-sm">User</span>
283
+ <input
284
+ class="!w-36"
285
+ type="text"
286
+ bind:value={meta.owner}
287
+ placeholder={$userStore?.username ?? ''}
288
+ disabled={!($superadmin || ($userStore?.is_admin ?? false))}
289
+ />
290
+ </label>
291
+ {:else if meta.ownerKind === 'folder'}
292
+ <label class="block grow w-48">
293
+ <span class="text-gray-700 text-sm"
294
+ >Folder <Tooltip
295
+ >Read and write permissions are given to groups and users at the folder level and
296
+ shared by all items inside the folder.</Tooltip
297
+ ></span
298
+ >
156
299
 
157
- <select
158
- {disabled}
159
- bind:value={meta.ownerKind}
160
- on:change={() => {
161
- if (meta.ownerKind === 'group') {
162
- meta.owner = 'all'
163
- } else {
164
- meta.owner = $userStore?.username ?? ''
165
- }
166
- }}
167
- >
168
- <option>user</option>
169
- <option>group</option>
170
- </select>
171
- </label>
172
- {#if meta.ownerKind === 'user'}
173
- <label class="block">
174
- <span class="text-gray-700 text-sm">Owner</span>
300
+ <div class="flex flex-row gap-1 w-full">
301
+ <select class="grow w-full" {disabled} bind:value={meta.owner}>
302
+ {#each folders as f}
303
+ <option>{f}</option>
304
+ {/each}
305
+ </select>
306
+ <Button variant="border" size="xs" on:click={viewFolder.openDrawer}>
307
+ <Icon scale={0.8} data={faEye} /></Button
308
+ >
309
+ <Button variant="border" size="xs" on:click={newFolder.openDrawer}>
310
+ <Icon scale={0.8} data={faPlus} /></Button
311
+ ></div
312
+ >
313
+ </label>
314
+ {:else if meta.ownerKind === 'group'}
315
+ <label class="block grow w-48">
316
+ <span class="text-gray-700 text-sm"
317
+ >Group <Tooltip>Item will be owned by the group and hence all its member</Tooltip
318
+ ></span
319
+ >
320
+
321
+ <div class="flex flex-row gap-1">
322
+ <select class="grow w-full" {disabled} bind:value={meta.owner}>
323
+ {#each groups as g}
324
+ <option>{g}</option>
325
+ {/each}
326
+ </select>
327
+ <Button variant="border" size="xs" on:click={viewGroup.openDrawer}>
328
+ <Icon scale={0.8} data={faEye} /></Button
329
+ >
330
+ <Button variant="border" size="xs" on:click={newGroup.openDrawer}>
331
+ <Icon scale={0.8} data={faPlus} /></Button
332
+ ></div
333
+ >
334
+ </label>
335
+ {/if}
336
+ </div>
337
+ <label class="block grow w-full max-w-md">
338
+ <span class="text-gray-700 text-sm">
339
+ Name
340
+ <Required required={true} />
341
+ </span>
175
342
  <input
343
+ {disabled}
176
344
  type="text"
177
- bind:value={meta.owner}
178
- placeholder={$userStore?.username ?? ''}
179
- disabled={!($superadmin || ($userStore?.is_admin ?? false))}
345
+ id="path"
346
+ autofocus
347
+ bind:this={inputP}
348
+ autocomplete="off"
349
+ on:keyup={handleKeyUp}
350
+ bind:value={meta.name}
351
+ placeholder={namePlaceholder}
352
+ class={error === ''
353
+ ? ''
354
+ : 'border border-red-700 bg-red-100 border-opacity-30 focus:border-red-700 focus:border-opacity-30 focus-visible:ring-red-700 focus-visible:ring-opacity-25 focus-visible:border-red-700'}
180
355
  />
181
356
  </label>
182
- {:else}
183
- <label class="block">
184
- <span class="text-gray-700 text-sm">Owner</span>
185
- <select {disabled} bind:value={meta.owner}>
186
- {#each groups as g}
187
- <option>{g.name}</option>
188
- {/each}
189
- </select>
190
- </label>
191
357
  {/if}
192
- <label class="block col-span-2">
193
- <span class="text-gray-700 text-sm">
194
- Name
195
- <Required required={true} />
196
- </span>
197
- <input
198
- {disabled}
199
- type="text"
200
- id="path"
201
- autofocus
202
- bind:this={inputP}
203
- autocomplete="off"
204
- on:keyup={handleKeyUp}
205
- bind:value={meta.name}
206
- placeholder={namePlaceholder}
207
- class={error === ''
208
- ? ''
209
- : 'border border-red-700 bg-red-100 border-opacity-30 focus:border-red-700 focus:border-opacity-30 focus-visible:ring-red-700 focus-visible:ring-opacity-25 focus-visible:border-red-700'}
210
- />
211
- </label>
212
358
  </div>
213
- <div class="pt-0 text-xs px-1 flex flex-col-reverse sm:grid sm:grid-cols-4 sm:gap-4 w-full">
214
- <div class="col-span-2"><span class="font-mono">{path}</span></div>
215
- <div class="text-red-600 text-2xs col-span-2">{error}</div>
359
+
360
+ <div class="flex-row flex justify-between">
361
+ <div><span class="font-mono text-sm">{path}</span></div>
362
+ <div class="text-red-600 text-2xs">{error}</div>
216
363
  </div>
217
364
  </div>
218
365
 
@@ -1,15 +1,13 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import { type Meta } from '../common';
3
2
  declare const __propDef: {
4
3
  props: {
5
- meta?: Meta | undefined;
6
4
  namePlaceholder?: string | undefined;
7
5
  initialPath: string;
8
6
  path?: string | undefined;
9
7
  error?: string | undefined;
10
8
  disabled?: boolean | undefined;
9
+ checkInitialPathExistence?: boolean | undefined;
11
10
  kind: "flow" | "script" | "resource" | "app" | "schedule" | "variable";
12
- getPath?: (() => string) | undefined;
13
11
  focus?: (() => void) | undefined;
14
12
  reset?: (() => Promise<void>) | undefined;
15
13
  };
@@ -24,7 +22,6 @@ export type PathProps = typeof __propDef.props;
24
22
  export type PathEvents = typeof __propDef.events;
25
23
  export type PathSlots = typeof __propDef.slots;
26
24
  export default class Path extends SvelteComponentTyped<PathProps, PathEvents, PathSlots> {
27
- get getPath(): () => string;
28
25
  get focus(): () => void;
29
26
  get reset(): () => Promise<void>;
30
27
  }
@@ -1,6 +1,7 @@
1
1
  <script>export let label = '';
2
2
  export let options;
3
3
  export let value;
4
+ export let disabled = false;
4
5
  import { createEventDispatcher } from 'svelte';
5
6
  import Tooltip from './Tooltip.svelte';
6
7
  const dispatch = createEventDispatcher();
@@ -16,6 +17,7 @@ const dispatch = createEventDispatcher();
16
17
  {val === value ? '!bg-blue-50 !border-blue-500' : ''}"
17
18
  >
18
19
  <input
20
+ {disabled}
19
21
  type="radio"
20
22
  value={val}
21
23
  class="sr-only"
@@ -7,6 +7,7 @@ declare const __propDef: {
7
7
  desc: string;
8
8
  }, any][];
9
9
  value: any;
10
+ disabled?: boolean | undefined;
10
11
  };
11
12
  events: {
12
13
  change: CustomEvent<any>;