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
|
@@ -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
|
|
168
|
+
{'${} '}Templatable <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 →
|
|
193
203
|
</span>
|
|
194
204
|
{/if}
|
|
195
|
-
{#if
|
|
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 {};
|
package/components/Path.svelte
CHANGED
|
@@ -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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
$:
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
+
$: meta && onMetaChange();
|
|
27
|
+
function onMetaChange() {
|
|
28
|
+
if (meta) {
|
|
29
|
+
path = metaToPath(meta);
|
|
30
|
+
validate(meta, path, kind);
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
|
-
|
|
28
|
-
return
|
|
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
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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) &&
|
|
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 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 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:
|
|
144
|
-
|
|
145
|
-
<
|
|
146
|
-
<
|
|
147
|
-
>
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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"> </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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
<div class="
|
|
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"
|