windmill-components 1.522.0 → 1.531.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/components/AIAgentLogViewer.svelte +123 -0
- package/package/components/AIAgentLogViewer.svelte.d.ts +13 -0
- package/package/components/AppConnectInner.svelte +10 -10
- package/package/components/AutoscalingConfigEditor.svelte +76 -2
- package/package/components/Dev.svelte +12 -28
- package/package/components/DiffEditor.svelte +6 -3
- package/package/components/DiffEditor.svelte.d.ts +1 -0
- package/package/components/DisplayResult.svelte +16 -10
- package/package/components/DisplayResult.svelte.d.ts +1 -0
- package/package/components/EditableSchemaForm.svelte +5 -2
- package/package/components/Editor.svelte +26 -8
- package/package/components/Editor.svelte.d.ts +1 -1
- package/package/components/EditorBar.svelte +25 -5
- package/package/components/EditorSettings.svelte +6 -0
- package/package/components/FirstStepInputs.svelte +2 -2
- package/package/components/FlowBuilder.svelte +18 -36
- package/package/components/FlowGraphViewerStep.svelte +7 -0
- package/package/components/FlowJobResult.svelte +15 -63
- package/package/components/FlowJobResult.svelte.d.ts +10 -4
- package/package/components/FlowLogViewer.svelte +660 -0
- package/package/components/FlowLogViewer.svelte.d.ts +34 -0
- package/package/components/FlowLogViewerWrapper.svelte +52 -0
- package/package/components/FlowLogViewerWrapper.svelte.d.ts +21 -0
- package/package/components/FlowLoopIterationPreview.svelte +3 -3
- package/package/components/FlowPreviewContent.svelte +4 -5
- package/package/components/FlowPreviewContent.svelte.d.ts +7 -7
- package/package/components/FlowPreviewResult.svelte +4 -5
- package/package/components/FlowPreviewResult.svelte.d.ts +3 -5
- package/package/components/FlowStatusViewer.svelte +28 -16
- package/package/components/FlowStatusViewer.svelte.d.ts +19 -27
- package/package/components/FlowStatusViewerInner.svelte +483 -296
- package/package/components/FlowStatusViewerInner.svelte.d.ts +27 -33
- package/package/components/FlowTimeline.svelte +11 -13
- package/package/components/FlowTimeline.svelte.d.ts +6 -5
- package/package/components/HighlightCode.svelte +4 -1
- package/package/components/IconedResourceType.svelte +9 -5
- package/package/components/JobLoader.svelte +61 -8
- package/package/components/JobLoader.svelte.d.ts +9 -1
- package/package/components/LogViewer.svelte +8 -2
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/LogViewerHeader.svelte +32 -0
- package/package/components/LogViewerHeader.svelte.d.ts +8 -0
- package/package/components/ModulePreviewForm.svelte +10 -6
- package/package/components/ModulePreviewResultViewer.svelte +16 -0
- package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -1
- package/package/components/ModuleTest.svelte +59 -16
- package/package/components/RelativeLineNumbers.svelte +16 -0
- package/package/components/RelativeLineNumbers.svelte.d.ts +18 -0
- package/package/components/ResourceEditor.svelte +9 -4
- package/package/components/ScriptBuilder.svelte +13 -11
- package/package/components/ScriptEditor.svelte +2 -2
- package/package/components/SimpleEditor.svelte +10 -4
- package/package/components/SimpleEditor.svelte.d.ts +1 -0
- package/package/components/TemplateEditor.svelte +1 -1
- package/package/components/UserSettings.svelte +4 -4
- package/package/components/apps/components/display/AppAccordionList.svelte +1 -1
- package/package/components/apps/components/display/AppCarouselList.svelte +10 -8
- package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +3 -3
- package/package/components/apps/components/display/table/AppAggridTable.svelte +2 -2
- package/package/components/apps/components/helpers/HiddenComponent.svelte +0 -1
- package/package/components/apps/components/helpers/InputValue.svelte +6 -1
- package/package/components/apps/components/helpers/NonRunnableComponent.svelte +8 -4
- package/package/components/apps/components/helpers/NonRunnableComponent.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte +7 -8
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableWrapper.svelte +12 -3
- package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -1
- package/package/components/apps/components/inputs/AppCodeInputComponent.svelte +0 -5
- package/package/components/apps/components/layout/AppConditionalWrapper.svelte +1 -1
- package/package/components/apps/components/layout/AppContainer.svelte +1 -1
- package/package/components/apps/components/layout/AppDecisionTree.svelte +31 -20
- package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
- package/package/components/apps/components/layout/AppList.svelte +9 -8
- package/package/components/apps/components/layout/AppModal.svelte +1 -1
- package/package/components/apps/components/layout/AppSplitpanes.svelte +5 -2
- package/package/components/apps/components/layout/AppStepper.svelte +9 -5
- package/package/components/apps/components/layout/AppTabs.svelte +2 -2
- package/package/components/apps/editor/AppJobsDrawer.svelte +2 -2
- package/package/components/apps/editor/GridEditor.svelte +24 -19
- package/package/components/apps/editor/GridEditor.svelte.d.ts +4 -1
- package/package/components/apps/editor/GridViewer.svelte +1 -1
- package/package/components/apps/editor/SubGridEditor.svelte +7 -11
- package/package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -19
- package/package/components/apps/editor/appUtils.js +17 -68
- package/package/components/apps/editor/component/ComponentInner.svelte +845 -694
- package/package/components/apps/editor/component/componentCallbacks.svelte.js +8 -1
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +9 -46
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +29 -43
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -1
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +2 -2
- package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/Grid.svelte +23 -25
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +21 -9
- package/package/components/apps/svelte-grid/MoveResize.svelte +13 -15
- package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +17 -24
- package/package/components/apps/utils.d.ts +2 -0
- package/package/components/apps/utils.js +22 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
- package/package/components/common/fileDownload/FileDownload.svelte +1 -3
- package/package/components/common/fileDownload/FileDownload.svelte.d.ts +4 -18
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/copilot/FlowInlineScriptAIButton.svelte +58 -0
- package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +3 -0
- package/package/components/copilot/MetadataGen.svelte +19 -1
- package/package/components/copilot/MetadataGen.svelte.d.ts +1 -1
- package/package/components/copilot/ScriptGen.svelte +23 -31
- package/package/components/copilot/ScriptGen.svelte.d.ts +0 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +4 -4
- package/package/components/copilot/chat/AIChatInput.svelte +29 -6
- package/package/components/copilot/chat/AIChatManager.svelte.js +110 -26
- package/package/components/copilot/chat/AIChatMessage.svelte +3 -0
- package/package/components/copilot/chat/ToolContentDisplay.svelte +84 -0
- package/package/components/copilot/chat/ToolContentDisplay.svelte.d.ts +11 -0
- package/package/components/copilot/chat/ToolExecutionDisplay.svelte +105 -0
- package/package/components/copilot/chat/ToolExecutionDisplay.svelte.d.ts +7 -0
- package/package/components/copilot/chat/api/apiTools.d.ts +7 -0
- package/package/components/copilot/chat/api/apiTools.js +192 -0
- package/package/components/copilot/chat/api/core.d.ts +7 -0
- package/package/components/copilot/chat/api/core.js +61 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -6
- package/package/components/copilot/chat/flow/core.js +213 -42
- package/package/components/copilot/chat/flow/utils.js +3 -0
- package/package/components/copilot/chat/monaco-adapter.d.ts +1 -1
- package/package/components/copilot/chat/monaco-adapter.js +10 -4
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +20 -22
- package/package/components/copilot/chat/script/core.d.ts +11 -3
- package/package/components/copilot/chat/script/core.js +92 -15
- package/package/components/copilot/chat/shared.d.ts +30 -3
- package/package/components/copilot/chat/shared.js +228 -9
- package/package/components/copilot/lib.d.ts +1 -1
- package/package/components/copilot/lib.js +15 -6
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/details/DetailPageLayout.svelte +34 -33
- package/package/components/flow_builder.d.ts +1 -2
- package/package/components/flows/FlowEditor.svelte +3 -3
- package/package/components/flows/FlowEditor.svelte.d.ts +7 -6
- package/package/components/flows/common/FlowCard.svelte +2 -2
- package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
- package/package/components/flows/common/FlowCardHeader.svelte +13 -4
- package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
- package/package/components/flows/content/BranchPredicateEditor.svelte +4 -7
- package/package/components/flows/content/BranchPredicateEditor.svelte.d.ts +12 -11
- package/package/components/flows/content/FlowConstants.svelte +3 -3
- package/package/components/flows/content/FlowEditorPanel.svelte +3 -3
- package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +2 -4
- package/package/components/flows/content/FlowInputsQuick.svelte +2 -1
- package/package/components/flows/content/FlowLoop.svelte +2 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +130 -108
- package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +2 -2
- package/package/components/flows/content/FlowModuleSkip.svelte +1 -1
- package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
- package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
- package/package/components/flows/content/FlowModuleWrapper.svelte +15 -5
- package/package/components/flows/content/FlowModuleWrapper.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowResult.svelte +2 -3
- package/package/components/flows/content/FlowResult.svelte.d.ts +2 -4
- package/package/components/flows/content/FlowWhileLoop.svelte +1 -1
- package/package/components/flows/dfs.d.ts +3 -1
- package/package/components/flows/dfs.js +5 -1
- package/package/components/flows/flowInfers.js +78 -0
- package/package/components/flows/flowState.d.ts +2 -3
- package/package/components/flows/flowState.js +2 -2
- package/package/components/flows/flowStateUtils.svelte.d.ts +4 -4
- package/package/components/flows/flowStateUtils.svelte.js +14 -13
- package/package/components/flows/flowStore.d.ts +3 -4
- package/package/components/flows/header/FlowPreviewButtons.svelte +2 -1
- package/package/components/flows/header/FlowYamlEditor.svelte +10 -1
- package/package/components/flows/map/FlowGraphPreviewButton.svelte +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +7 -3
- package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -0
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -12
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +26 -19
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +6 -4
- package/package/components/flows/map/InsertModuleInner.svelte +9 -1
- package/package/components/flows/map/InsertModuleInner.svelte.d.ts +1 -0
- package/package/components/flows/map/MapItem.svelte +4 -2
- package/package/components/flows/pickers/TopLevelNode.svelte +4 -1
- package/package/components/flows/propPicker/InputPickerInner.svelte +5 -4
- package/package/components/flows/propPicker/OutputBadge.svelte +11 -9
- package/package/components/flows/propPicker/OutputPickerInner.svelte +10 -1
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/flows/testSteps.svelte.d.ts +3 -2
- package/package/components/flows/testSteps.svelte.js +26 -23
- package/package/components/flows/types.d.ts +1 -1
- package/package/components/flows/utils.d.ts +3 -5
- package/package/components/flows/utils.js +3 -4
- package/package/components/git_sync/GitSyncContext.svelte.js +2 -1
- package/package/components/graph/FlowGraphV2.svelte +44 -24
- package/package/components/graph/FlowGraphV2.svelte.d.ts +5 -2
- package/package/components/graph/graphBuilder.svelte.d.ts +49 -17
- package/package/components/graph/graphBuilder.svelte.js +30 -14
- package/package/components/graph/model.d.ts +9 -6
- package/package/components/graph/renderers/edges/BaseEdge.svelte +3 -3
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +2 -3
- package/package/components/graph/renderers/nodes/AIToolNode.svelte +234 -0
- package/package/components/graph/renderers/nodes/AIToolNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/nodes/AssetNode.svelte +15 -10
- package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +18 -1
- package/package/components/graph/renderers/nodes/BranchAllEndNode.svelte +1 -1
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +2 -2
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +1 -1
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +21 -21
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +64 -0
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte.d.ts +7 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +1 -1
- package/package/components/icons/RubyIcon.svelte +656 -0
- package/package/components/icons/RubyIcon.svelte.d.ts +7 -0
- package/package/components/instanceSettings.js +9 -0
- package/package/components/modulesTest.svelte.d.ts +6 -3
- package/package/components/modulesTest.svelte.js +32 -0
- package/package/components/preview/FlowPreviewStatus.svelte +3 -1
- package/package/components/raw_apps/RawAppEditor.svelte +27 -26
- package/package/components/raw_apps/RawAppEditor.svelte.d.ts +17 -17
- package/package/components/runs/{JobPreview.svelte → JobRunsPreview.svelte} +1 -4
- package/package/components/runs/{JobPreview.svelte.d.ts → JobRunsPreview.svelte.d.ts} +3 -3
- package/package/components/runs/RunRow.svelte +5 -1
- package/package/components/schema/AddProperty.svelte +41 -36
- package/package/components/schema/AddProperty.svelte.d.ts +2 -2
- package/package/components/schema/AddPropertyV2.svelte +41 -37
- package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +8 -6
- package/package/components/search/RunsSearch.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +132 -12
- package/package/components/settings/CreateToken.svelte.d.ts +3 -20
- package/package/components/settings/TokenDisplay.svelte +18 -42
- package/package/components/settings/TokenDisplay.svelte.d.ts +0 -1
- package/package/components/settings/TokensTable.svelte +2 -4
- package/package/components/settings/TokensTable.svelte.d.ts +3 -19
- package/package/components/settings/WorkspaceUserSettings.svelte +428 -69
- package/package/components/sidebar/MenuButton.svelte +12 -10
- package/package/components/stepHistoryLoader.svelte.d.ts +2 -2
- package/package/components/stepHistoryLoader.svelte.js +7 -12
- package/package/components/triggers/http/OpenAPISpecGenerator.svelte +2 -2
- package/package/components/tutorials/FlowBuilderTutorialBranchOne.svelte +1 -1
- package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +4 -4
- package/package/components/tutorials/utils.js +3 -0
- package/package/components/worker_group.d.ts +4 -1
- package/package/components/worker_group.js +3 -2
- package/package/editorLangUtils.d.ts +1 -1
- package/package/editorLangUtils.js +2 -0
- package/package/editorUtils.d.ts +2 -1
- package/package/editorUtils.js +2 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +296 -8
- package/package/gen/schemas.gen.js +364 -70
- package/package/gen/services.gen.d.ts +118 -16
- package/package/gen/services.gen.js +226 -19
- package/package/gen/types.gen.d.ts +660 -16
- package/package/hubPaths.json +7 -4
- package/package/infer.js +10 -1
- package/package/monaco_workers/graphql.worker.bundle.js +144 -110
- package/package/script_helpers.d.ts +3 -0
- package/package/script_helpers.js +58 -3
- package/package/scripts.d.ts +1 -1
- package/package/scripts.js +3 -2
- package/package/stores.d.ts +2 -0
- package/package/stores.js +2 -0
- package/package/svelte5Utils.svelte.d.ts +16 -0
- package/package/svelte5Utils.svelte.js +26 -0
- package/package/utils.d.ts +1 -1
- package/package.json +20 -19
- package/package/components/AllFlowLogs.svelte +0 -31
- package/package/components/AllFlowLogs.svelte.d.ts +0 -8
- package/package/components/copilot/chat/navigator/apiTools.d.ts +0 -68
- package/package/components/copilot/chat/navigator/apiTools.js +0 -258
|
@@ -10,10 +10,11 @@ import DataTable from '../table/DataTable.svelte';
|
|
|
10
10
|
import Head from '../table/Head.svelte';
|
|
11
11
|
import Toggle from '../Toggle.svelte';
|
|
12
12
|
import Tooltip from '../Tooltip.svelte';
|
|
13
|
-
import { UserService, WorkspaceService } from '../../gen';
|
|
13
|
+
import { UserService, WorkspaceService, GroupService } from '../../gen';
|
|
14
14
|
import { userStore, workspaceStore } from '../../stores';
|
|
15
15
|
import { sendUserToast } from '../../toast';
|
|
16
|
-
import { Loader2, Mails, Search } from 'lucide-svelte';
|
|
16
|
+
import { Loader2, Mails, Search, Plus } from 'lucide-svelte';
|
|
17
|
+
import Select from '../select/Select.svelte';
|
|
17
18
|
import SearchItems from '../SearchItems.svelte';
|
|
18
19
|
import Cell from '../table/Cell.svelte';
|
|
19
20
|
import Row from '../table/Row.svelte';
|
|
@@ -29,11 +30,37 @@ let auto_invite_domain = $state();
|
|
|
29
30
|
let operatorOnly = $state(undefined);
|
|
30
31
|
let autoAdd = $state(undefined);
|
|
31
32
|
let nbDisplayed = $state(30);
|
|
33
|
+
// Instance group auto-add settings
|
|
34
|
+
let instanceGroups = $state([]);
|
|
35
|
+
let autoAddInstanceGroups = $state([]);
|
|
36
|
+
let autoAddInstanceGroupsRoles = $state({});
|
|
37
|
+
// Add new instance group form state
|
|
38
|
+
let selectedNewInstanceGroup = $state(undefined);
|
|
39
|
+
let selectedNewRole = $state('developer');
|
|
40
|
+
// Available groups for dropdowns - filter out already configured groups
|
|
41
|
+
let availableGroupItems = $derived(instanceGroups
|
|
42
|
+
.filter(group => !autoAddInstanceGroups.includes(group.name))
|
|
43
|
+
.map(group => ({
|
|
44
|
+
value: group.name,
|
|
45
|
+
label: group.name + (group.summary ? ` - ${group.summary}` : '')
|
|
46
|
+
})));
|
|
47
|
+
// Sort users so manual users come first, then instance group users
|
|
48
|
+
let sortedUsers = $derived(() => {
|
|
49
|
+
const userList = (filteredUsers || users || []).slice();
|
|
50
|
+
return userList.sort((a, b) => {
|
|
51
|
+
const aIsInstanceGroup = a.added_via?.source === 'instance_group' ? 1 : 0;
|
|
52
|
+
const bIsInstanceGroup = b.added_via?.source === 'instance_group' ? 1 : 0;
|
|
53
|
+
return aIsInstanceGroup - bIsInstanceGroup;
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
let hasNonManualUsers = $derived((filteredUsers || users || []).some((user) => user.added_via?.source === 'instance_group' || user.added_via?.source === 'domain'));
|
|
32
57
|
async function loadSettings() {
|
|
33
58
|
const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore });
|
|
34
59
|
auto_invite_domain = settings.auto_invite_domain;
|
|
35
60
|
operatorOnly = settings.auto_invite_operator;
|
|
36
61
|
autoAdd = settings.auto_add;
|
|
62
|
+
autoAddInstanceGroups = settings.auto_add_instance_groups || [];
|
|
63
|
+
autoAddInstanceGroupsRoles = settings.auto_add_instance_groups_roles || {};
|
|
37
64
|
}
|
|
38
65
|
let getUsagePromise = undefined;
|
|
39
66
|
let usage = $state(undefined);
|
|
@@ -62,6 +89,82 @@ let allowedAutoDomain = $state(false);
|
|
|
62
89
|
async function getDisallowedAutoDomain() {
|
|
63
90
|
allowedAutoDomain = await WorkspaceService.isDomainAllowed();
|
|
64
91
|
}
|
|
92
|
+
async function loadInstanceGroups() {
|
|
93
|
+
try {
|
|
94
|
+
instanceGroups = await GroupService.listInstanceGroups();
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
console.warn('Failed to load instance groups:', e);
|
|
98
|
+
instanceGroups = [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function saveInstanceGroupSettings() {
|
|
102
|
+
try {
|
|
103
|
+
await WorkspaceService.editInstanceGroups({
|
|
104
|
+
workspace: $workspaceStore ?? '',
|
|
105
|
+
requestBody: {
|
|
106
|
+
groups: autoAddInstanceGroups,
|
|
107
|
+
roles: autoAddInstanceGroupsRoles
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
sendUserToast('Instance group settings saved');
|
|
111
|
+
// Refresh user list to show newly auto-added users
|
|
112
|
+
listUsers();
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error('Failed to save instance group settings:', e);
|
|
116
|
+
sendUserToast('Failed to save settings', true);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function addInstanceGroup() {
|
|
120
|
+
if (!selectedNewInstanceGroup || !selectedNewRole)
|
|
121
|
+
return;
|
|
122
|
+
const groupToAdd = selectedNewInstanceGroup;
|
|
123
|
+
const roleToAdd = selectedNewRole;
|
|
124
|
+
try {
|
|
125
|
+
autoAddInstanceGroups = [...autoAddInstanceGroups, groupToAdd];
|
|
126
|
+
autoAddInstanceGroupsRoles[groupToAdd] = roleToAdd;
|
|
127
|
+
// Reset form
|
|
128
|
+
selectedNewInstanceGroup = undefined;
|
|
129
|
+
selectedNewRole = 'developer';
|
|
130
|
+
await saveInstanceGroupSettings();
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
// Rollback on error
|
|
134
|
+
autoAddInstanceGroups = autoAddInstanceGroups.filter(g => g !== groupToAdd);
|
|
135
|
+
delete autoAddInstanceGroupsRoles[groupToAdd];
|
|
136
|
+
sendUserToast('Failed to add instance group', true);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function removeInstanceGroup(groupName) {
|
|
140
|
+
const previousGroups = [...autoAddInstanceGroups];
|
|
141
|
+
const previousRole = autoAddInstanceGroupsRoles[groupName];
|
|
142
|
+
try {
|
|
143
|
+
autoAddInstanceGroups = autoAddInstanceGroups.filter(g => g !== groupName);
|
|
144
|
+
delete autoAddInstanceGroupsRoles[groupName];
|
|
145
|
+
await saveInstanceGroupSettings();
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
// Rollback on error
|
|
149
|
+
autoAddInstanceGroups = previousGroups;
|
|
150
|
+
if (previousRole) {
|
|
151
|
+
autoAddInstanceGroupsRoles[groupName] = previousRole;
|
|
152
|
+
}
|
|
153
|
+
sendUserToast('Failed to remove instance group', true);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function updateGroupRole(groupName, role) {
|
|
157
|
+
const previousRole = autoAddInstanceGroupsRoles[groupName];
|
|
158
|
+
try {
|
|
159
|
+
autoAddInstanceGroupsRoles[groupName] = role;
|
|
160
|
+
await saveInstanceGroupSettings();
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
// Rollback on error
|
|
164
|
+
autoAddInstanceGroupsRoles[groupName] = previousRole;
|
|
165
|
+
sendUserToast('Failed to update role', true);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
65
168
|
let domain = $derived($userStore?.email.split('@')[1]);
|
|
66
169
|
$effect(() => {
|
|
67
170
|
if ($workspaceStore) {
|
|
@@ -71,6 +174,7 @@ $effect(() => {
|
|
|
71
174
|
getUsage();
|
|
72
175
|
listInvites();
|
|
73
176
|
loadSettings();
|
|
177
|
+
loadInstanceGroups();
|
|
74
178
|
});
|
|
75
179
|
}
|
|
76
180
|
});
|
|
@@ -83,6 +187,7 @@ onDestroy(() => {
|
|
|
83
187
|
}
|
|
84
188
|
});
|
|
85
189
|
let deleteConfirmedCallback = $state(undefined);
|
|
190
|
+
let removeInstanceGroupConfirmedCallback = $state(undefined);
|
|
86
191
|
async function removeAllInvitesFromDomain() {
|
|
87
192
|
await Promise.all(invites
|
|
88
193
|
.filter((x) => isCloudHosted() ? x.email.endsWith('@' + (auto_invite_domain ?? '')) : true)
|
|
@@ -248,7 +353,10 @@ $effect(() => {
|
|
|
248
353
|
invite_all: !isCloudHosted(),
|
|
249
354
|
auto_add: showInvites ? (autoAdd ?? false) : true
|
|
250
355
|
}
|
|
251
|
-
: {
|
|
356
|
+
: {
|
|
357
|
+
operator: undefined,
|
|
358
|
+
auto_add: undefined
|
|
359
|
+
}
|
|
252
360
|
})
|
|
253
361
|
loadSettings()
|
|
254
362
|
listInvites()
|
|
@@ -266,6 +374,179 @@ $effect(() => {
|
|
|
266
374
|
</div>
|
|
267
375
|
{/snippet}
|
|
268
376
|
</Popover>
|
|
377
|
+
|
|
378
|
+
{#if instanceGroups.length > 0}
|
|
379
|
+
<Popover
|
|
380
|
+
floatingConfig={{ strategy: 'absolute', placement: 'bottom-end' }}
|
|
381
|
+
usePointerDownOutside
|
|
382
|
+
floatingClass="!z-20"
|
|
383
|
+
>
|
|
384
|
+
{#snippet trigger()}
|
|
385
|
+
<Button
|
|
386
|
+
color={autoAddInstanceGroups.length > 0 ? 'green' : 'gray'}
|
|
387
|
+
variant="border"
|
|
388
|
+
size="xs"
|
|
389
|
+
nonCaptureEvent={true}
|
|
390
|
+
startIcon={{ icon: Mails }}
|
|
391
|
+
>Instance groups: {autoAddInstanceGroups.length}
|
|
392
|
+
</Button>
|
|
393
|
+
{/snippet}
|
|
394
|
+
{#snippet content()}
|
|
395
|
+
<div class="flex flex-col p-4 min-w-[500px]">
|
|
396
|
+
<div class="flex flex-col gap-4">
|
|
397
|
+
<span class="text-sm leading-6 font-semibold">
|
|
398
|
+
Auto-add instance groups
|
|
399
|
+
</span>
|
|
400
|
+
|
|
401
|
+
<!-- Add new instance group form -->
|
|
402
|
+
{#if availableGroupItems.length > 0}
|
|
403
|
+
<div class="flex w-full mt-1 gap-2 items-end justify-between">
|
|
404
|
+
<div class="flex gap-2 items-end">
|
|
405
|
+
<div class="flex flex-col gap-1">
|
|
406
|
+
<span class="text-xs text-tertiary">Instance group</span>
|
|
407
|
+
<Select
|
|
408
|
+
items={availableGroupItems}
|
|
409
|
+
placeholder="Select group"
|
|
410
|
+
bind:value={selectedNewInstanceGroup}
|
|
411
|
+
class="max-w-[160px]"
|
|
412
|
+
disablePortal={true}
|
|
413
|
+
/>
|
|
414
|
+
</div>
|
|
415
|
+
|
|
416
|
+
<div class="flex flex-col gap-1">
|
|
417
|
+
<span class="text-xs text-tertiary">Role</span>
|
|
418
|
+
<ToggleButtonGroup
|
|
419
|
+
selected={selectedNewRole}
|
|
420
|
+
on:selected={(e) => {
|
|
421
|
+
selectedNewRole = e.detail
|
|
422
|
+
}}
|
|
423
|
+
>
|
|
424
|
+
{#snippet children({ item })}
|
|
425
|
+
<ToggleButton
|
|
426
|
+
value="operator"
|
|
427
|
+
label="Operator"
|
|
428
|
+
tooltip="An operator can only execute and view scripts/flows/apps from your workspace, and only those that he has visibility on."
|
|
429
|
+
{item}
|
|
430
|
+
/>
|
|
431
|
+
<ToggleButton
|
|
432
|
+
value="developer"
|
|
433
|
+
label="Developer"
|
|
434
|
+
tooltip="A Developer can execute and view scripts/flows/apps, but they can also create new ones and edit those they are allowed to by their path (either u/ or Writer or Admin of their folder found at /f)."
|
|
435
|
+
{item}
|
|
436
|
+
/>
|
|
437
|
+
<ToggleButton
|
|
438
|
+
value="admin"
|
|
439
|
+
label="Admin"
|
|
440
|
+
tooltip="An admin has full control over a specific Windmill workspace, including the ability to manage users, edit entities, and control permissions within the workspace."
|
|
441
|
+
{item}
|
|
442
|
+
/>
|
|
443
|
+
{/snippet}
|
|
444
|
+
</ToggleButtonGroup>
|
|
445
|
+
</div>
|
|
446
|
+
</div>
|
|
447
|
+
|
|
448
|
+
<Button
|
|
449
|
+
color="blue"
|
|
450
|
+
size="xs"
|
|
451
|
+
startIcon={{ icon: Plus }}
|
|
452
|
+
disabled={!selectedNewInstanceGroup || !selectedNewRole}
|
|
453
|
+
onclick={addInstanceGroup}
|
|
454
|
+
>
|
|
455
|
+
Add
|
|
456
|
+
</Button>
|
|
457
|
+
</div>
|
|
458
|
+
{/if}
|
|
459
|
+
|
|
460
|
+
<!-- Configured groups table -->
|
|
461
|
+
{#if autoAddInstanceGroups.length > 0}
|
|
462
|
+
<div class="flex flex-col gap-2">
|
|
463
|
+
<p class="text-sm font-medium text-secondary">Configured groups:</p>
|
|
464
|
+
<div class="flex flex-col gap-1">
|
|
465
|
+
<table class="w-full text-sm">
|
|
466
|
+
<thead>
|
|
467
|
+
<tr class="text-left text-xs text-tertiary">
|
|
468
|
+
<th class="pb-2 w-1/2">Group</th>
|
|
469
|
+
<th class="pb-2 w-1/4">Role</th>
|
|
470
|
+
<th class="pb-2 w-1/4"></th>
|
|
471
|
+
</tr>
|
|
472
|
+
</thead>
|
|
473
|
+
<tbody>
|
|
474
|
+
{#each autoAddInstanceGroups as groupName (groupName)}
|
|
475
|
+
{@const group = instanceGroups.find(g => g.name === groupName)}
|
|
476
|
+
<tr class="border-t border-gray-200 dark:border-gray-700">
|
|
477
|
+
<td class="py-2">
|
|
478
|
+
<div class="font-medium">{groupName}</div>
|
|
479
|
+
{#if group?.summary}
|
|
480
|
+
<div class="text-xs text-tertiary">{group.summary}</div>
|
|
481
|
+
{/if}
|
|
482
|
+
</td>
|
|
483
|
+
<td class="py-2">
|
|
484
|
+
<div>
|
|
485
|
+
<ToggleButtonGroup
|
|
486
|
+
selected={autoAddInstanceGroupsRoles[groupName] || 'developer'}
|
|
487
|
+
on:selected={async (e) => {
|
|
488
|
+
autoAddInstanceGroupsRoles[groupName] = e.detail
|
|
489
|
+
await updateGroupRole(groupName, e.detail)
|
|
490
|
+
}}
|
|
491
|
+
>
|
|
492
|
+
{#snippet children({ item })}
|
|
493
|
+
<ToggleButton
|
|
494
|
+
value="operator"
|
|
495
|
+
label="Operator"
|
|
496
|
+
tooltip="An operator can only execute and view scripts/flows/apps from your workspace, and only those that he has visibility on."
|
|
497
|
+
{item}
|
|
498
|
+
/>
|
|
499
|
+
<ToggleButton
|
|
500
|
+
value="developer"
|
|
501
|
+
label="Developer"
|
|
502
|
+
tooltip="A Developer can execute and view scripts/flows/apps, but they can also create new ones and edit those they are allowed to by their path (either u/ or Writer or Admin of their folder found at /f)."
|
|
503
|
+
{item}
|
|
504
|
+
/>
|
|
505
|
+
<ToggleButton
|
|
506
|
+
value="admin"
|
|
507
|
+
label="Admin"
|
|
508
|
+
tooltip="An admin has full control over a specific Windmill workspace, including the ability to manage users, edit entities, and control permissions within the workspace."
|
|
509
|
+
{item}
|
|
510
|
+
/>
|
|
511
|
+
{/snippet}
|
|
512
|
+
</ToggleButtonGroup>
|
|
513
|
+
</div>
|
|
514
|
+
</td>
|
|
515
|
+
<td class="py-2">
|
|
516
|
+
<div class="flex justify-end">
|
|
517
|
+
<Button
|
|
518
|
+
color="light"
|
|
519
|
+
variant="contained"
|
|
520
|
+
btnClasses="text-red-500"
|
|
521
|
+
size="xs"
|
|
522
|
+
spacingSize="xs2"
|
|
523
|
+
onclick={() => {
|
|
524
|
+
removeInstanceGroupConfirmedCallback = async () => {
|
|
525
|
+
await removeInstanceGroup(groupName)
|
|
526
|
+
}
|
|
527
|
+
}}
|
|
528
|
+
>
|
|
529
|
+
Remove
|
|
530
|
+
</Button>
|
|
531
|
+
</div>
|
|
532
|
+
</td>
|
|
533
|
+
</tr>
|
|
534
|
+
{/each}
|
|
535
|
+
</tbody>
|
|
536
|
+
</table>
|
|
537
|
+
</div>
|
|
538
|
+
</div>
|
|
539
|
+
{:else}
|
|
540
|
+
<div class="text-center text-tertiary text-sm py-4">
|
|
541
|
+
No instance groups configured for auto-add
|
|
542
|
+
</div>
|
|
543
|
+
{/if}
|
|
544
|
+
</div>
|
|
545
|
+
</div>
|
|
546
|
+
{/snippet}
|
|
547
|
+
</Popover>
|
|
548
|
+
{/if}
|
|
549
|
+
|
|
269
550
|
<AddUser
|
|
270
551
|
on:new={() => {
|
|
271
552
|
listUsers()
|
|
@@ -287,6 +568,14 @@ $effect(() => {
|
|
|
287
568
|
<tr>
|
|
288
569
|
<Cell head first>Email</Cell>
|
|
289
570
|
<Cell head>Username</Cell>
|
|
571
|
+
{#if hasNonManualUsers}
|
|
572
|
+
<Cell head>
|
|
573
|
+
Added via
|
|
574
|
+
<Tooltip>
|
|
575
|
+
Shows how the user was added to the workspace: manually, via domain auto-invite, or through an instance group.
|
|
576
|
+
</Tooltip>
|
|
577
|
+
</Cell>
|
|
578
|
+
{/if}
|
|
290
579
|
|
|
291
580
|
<Cell head>
|
|
292
581
|
Executions (<abbr title="past 1w">1w</abbr>)
|
|
@@ -304,10 +593,34 @@ $effect(() => {
|
|
|
304
593
|
</Head>
|
|
305
594
|
<tbody class="divide-y bg-surface">
|
|
306
595
|
{#if filteredUsers}
|
|
307
|
-
{#each
|
|
596
|
+
{#each sortedUsers().slice(0, nbDisplayed) as { email, username, is_admin, operator, disabled, added_via }, index (email)}
|
|
597
|
+
<!-- Add separator between manual users and instance group users -->
|
|
598
|
+
{#if hasNonManualUsers && index > 0 && sortedUsers()[index - 1]?.added_via?.source !== 'instance_group' && added_via?.source === 'instance_group'}
|
|
599
|
+
<tr class="bg-surface-secondary">
|
|
600
|
+
<td colspan={hasNonManualUsers ? 8 : 7} class="px-4 py-2">
|
|
601
|
+
<div class="text-xs text-tertiary font-bold">
|
|
602
|
+
Instance group users
|
|
603
|
+
</div>
|
|
604
|
+
</td>
|
|
605
|
+
</tr>
|
|
606
|
+
{/if}
|
|
308
607
|
<tr class="!hover:bg-surface-hover">
|
|
309
608
|
<Cell first><a href="mailto:{email}">{truncate(email, 20)}</a></Cell>
|
|
310
609
|
<Cell>{truncate(username, 30)}</Cell>
|
|
610
|
+
{#if hasNonManualUsers}
|
|
611
|
+
<Cell>
|
|
612
|
+
<div class="flex items-center gap-2">
|
|
613
|
+
{#if added_via?.source === 'instance_group'}
|
|
614
|
+
<Badge color="blue">Group</Badge>
|
|
615
|
+
<span>{truncate(added_via.group || 'Unknown', 20)}</span>
|
|
616
|
+
{:else if added_via?.source === 'domain'}
|
|
617
|
+
<Badge color="blue">Auto-add</Badge>
|
|
618
|
+
{:else}
|
|
619
|
+
<Badge color="blue">Manual</Badge>
|
|
620
|
+
{/if}
|
|
621
|
+
</div>
|
|
622
|
+
</Cell>
|
|
623
|
+
{/if}
|
|
311
624
|
<Cell
|
|
312
625
|
>{#if usage?.[email] != undefined}{usage?.[email]}{:else}<Loader2
|
|
313
626
|
size={14}
|
|
@@ -325,55 +638,64 @@ $effect(() => {
|
|
|
325
638
|
</Cell>
|
|
326
639
|
<Cell>
|
|
327
640
|
<div>
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
641
|
+
{#if added_via?.source === 'instance_group'}
|
|
642
|
+
<div class="flex items-center gap-1">
|
|
643
|
+
<span class="rounded-md text-xs px-2 py-1 bg-surface shadow-md font-bold">
|
|
644
|
+
{is_admin ? 'Admin' : operator ? 'Operator' : 'Developer'}
|
|
645
|
+
</span>
|
|
646
|
+
<Tooltip>Role is managed through instance group configuration above.</Tooltip>
|
|
647
|
+
</div>
|
|
648
|
+
{:else}
|
|
649
|
+
<ToggleButtonGroup
|
|
650
|
+
selected={is_admin ? 'admin' : operator ? 'operator' : 'developer'}
|
|
651
|
+
on:selected={async (e) => {
|
|
652
|
+
if (is_admin && email == $userStore?.email && e.detail != 'admin') {
|
|
653
|
+
sendUserToast(
|
|
654
|
+
'Admins cannot be demoted by themselves, ask another admin to demote you',
|
|
655
|
+
true
|
|
656
|
+
)
|
|
657
|
+
e.preventDefault()
|
|
658
|
+
listUsers()
|
|
659
|
+
return
|
|
660
|
+
}
|
|
661
|
+
const body =
|
|
662
|
+
e.detail == 'admin'
|
|
663
|
+
? { is_admin: true, operator: false }
|
|
664
|
+
: e.detail == 'operator'
|
|
665
|
+
? { is_admin: false, operator: true }
|
|
666
|
+
: { is_admin: false, operator: false }
|
|
667
|
+
await UserService.updateUser({
|
|
668
|
+
workspace: $workspaceStore ?? '',
|
|
669
|
+
username,
|
|
670
|
+
requestBody: body
|
|
671
|
+
})
|
|
337
672
|
listUsers()
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
workspace: $workspaceStore ?? '',
|
|
348
|
-
username,
|
|
349
|
-
requestBody: body
|
|
350
|
-
})
|
|
351
|
-
listUsers()
|
|
352
|
-
}}
|
|
353
|
-
>
|
|
354
|
-
{#snippet children({ item })}
|
|
355
|
-
<ToggleButton
|
|
356
|
-
value="operator"
|
|
357
|
-
label="Operator"
|
|
358
|
-
tooltip="An operator can only execute and view scripts/flows/apps from your workspace, and only those that he has visibility on."
|
|
359
|
-
{item}
|
|
360
|
-
/>
|
|
673
|
+
}}
|
|
674
|
+
>
|
|
675
|
+
{#snippet children({ item })}
|
|
676
|
+
<ToggleButton
|
|
677
|
+
value="operator"
|
|
678
|
+
label="Operator"
|
|
679
|
+
tooltip="An operator can only execute and view scripts/flows/apps from your workspace, and only those that he has visibility on."
|
|
680
|
+
{item}
|
|
681
|
+
/>
|
|
361
682
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
683
|
+
<ToggleButton
|
|
684
|
+
value="developer"
|
|
685
|
+
label="Developer"
|
|
686
|
+
tooltip="A Developer can execute and view scripts/flows/apps, but they can also create new ones and edit those they are allowed to by their path (either u/ or Writer or Admin of their folder found at /f)."
|
|
687
|
+
{item}
|
|
688
|
+
/>
|
|
368
689
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
690
|
+
<ToggleButton
|
|
691
|
+
value="admin"
|
|
692
|
+
label="Admin"
|
|
693
|
+
tooltip="An admin has full control over a specific Windmill workspace, including the ability to manage users, edit entities, and control permissions within the workspace."
|
|
694
|
+
{item}
|
|
695
|
+
/>
|
|
696
|
+
{/snippet}
|
|
697
|
+
</ToggleButtonGroup>
|
|
698
|
+
{/if}
|
|
377
699
|
</div>
|
|
378
700
|
</Cell>
|
|
379
701
|
<Cell>
|
|
@@ -397,25 +719,41 @@ $effect(() => {
|
|
|
397
719
|
{disabled ? 'Enable' : 'Disable'}
|
|
398
720
|
</Button>
|
|
399
721
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
722
|
+
{#if added_via?.source === 'instance_group'}
|
|
723
|
+
<div class="flex items-center gap-1">
|
|
724
|
+
<Button
|
|
725
|
+
color="light"
|
|
726
|
+
variant="contained"
|
|
727
|
+
btnClasses="text-gray-400"
|
|
728
|
+
size="xs"
|
|
729
|
+
spacingSize="xs2"
|
|
730
|
+
disabled={true}
|
|
731
|
+
>
|
|
732
|
+
Remove
|
|
733
|
+
</Button>
|
|
734
|
+
<Tooltip>Cannot remove users synced from instance groups. Either disable the user or remove them from the SCIM group.</Tooltip>
|
|
735
|
+
</div>
|
|
736
|
+
{:else}
|
|
737
|
+
<Button
|
|
738
|
+
color="light"
|
|
739
|
+
variant="contained"
|
|
740
|
+
btnClasses="text-red-500"
|
|
741
|
+
size="xs"
|
|
742
|
+
spacingSize="xs2"
|
|
743
|
+
on:click={() => {
|
|
744
|
+
deleteConfirmedCallback = async () => {
|
|
745
|
+
await UserService.deleteUser({
|
|
746
|
+
workspace: $workspaceStore ?? '',
|
|
747
|
+
username
|
|
748
|
+
})
|
|
749
|
+
sendUserToast('User removed')
|
|
750
|
+
listUsers()
|
|
751
|
+
}
|
|
752
|
+
}}
|
|
753
|
+
>
|
|
754
|
+
Remove
|
|
755
|
+
</Button>
|
|
756
|
+
{/if}
|
|
419
757
|
</div>
|
|
420
758
|
</Cell>
|
|
421
759
|
</tr>
|
|
@@ -563,3 +901,24 @@ $effect(() => {
|
|
|
563
901
|
<span>Are you sure you want to remove ?</span>
|
|
564
902
|
</div>
|
|
565
903
|
</ConfirmationModal>
|
|
904
|
+
|
|
905
|
+
<div class="[&>div]:!z-[5002]">
|
|
906
|
+
<ConfirmationModal
|
|
907
|
+
open={Boolean(removeInstanceGroupConfirmedCallback)}
|
|
908
|
+
title="Remove instance group"
|
|
909
|
+
confirmationText="Remove"
|
|
910
|
+
on:canceled={() => {
|
|
911
|
+
removeInstanceGroupConfirmedCallback = undefined
|
|
912
|
+
}}
|
|
913
|
+
on:confirmed={() => {
|
|
914
|
+
if (removeInstanceGroupConfirmedCallback) {
|
|
915
|
+
removeInstanceGroupConfirmedCallback()
|
|
916
|
+
}
|
|
917
|
+
removeInstanceGroupConfirmedCallback = undefined
|
|
918
|
+
}}
|
|
919
|
+
>
|
|
920
|
+
<div class="flex flex-col w-full space-y-4">
|
|
921
|
+
<span>Are you sure you want to remove this instance group from auto-add? This will not remove users already added from this group.</span>
|
|
922
|
+
</div>
|
|
923
|
+
</ConfirmationModal>
|
|
924
|
+
</div>
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import Popover from '../Popover.svelte';
|
|
3
3
|
import { createEventDispatcher } from 'svelte';
|
|
4
4
|
import SideBarNotification from './SideBarNotification.svelte';
|
|
5
|
-
import { goto } from '$app/navigation';
|
|
6
5
|
import { conditionalMelt } from '../../utils';
|
|
7
6
|
import { triggerableByAI } from '../../actions/triggerableByAI.svelte';
|
|
8
7
|
let { aiId = undefined, aiDescription = undefined, label = undefined, icon = undefined, iconClasses = null, iconProps = null, isCollapsed, disabled = false, lightMode = false, stopPropagationOnClick = false, shortcut = '', notificationsCount = 0, color = null, trigger = undefined, href = undefined, class: classNames = undefined } = $props();
|
|
9
8
|
let buttonRef = $state(undefined);
|
|
10
9
|
let dispatch = createEventDispatcher();
|
|
10
|
+
// Dynamic component based on whether href is provided
|
|
11
|
+
const Element = href ? 'a' : 'button';
|
|
11
12
|
</script>
|
|
12
13
|
|
|
13
14
|
{#if !disabled}
|
|
@@ -18,7 +19,8 @@ let dispatch = createEventDispatcher();
|
|
|
18
19
|
disablePopup={!isCollapsed}
|
|
19
20
|
placement="right"
|
|
20
21
|
>
|
|
21
|
-
<
|
|
22
|
+
<svelte:element
|
|
23
|
+
this={Element}
|
|
22
24
|
bind:this={buttonRef}
|
|
23
25
|
use:triggerableByAI={{
|
|
24
26
|
id: aiId,
|
|
@@ -29,13 +31,13 @@ let dispatch = createEventDispatcher();
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
}}
|
|
32
|
-
onclick={
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
34
|
+
onclick={href
|
|
35
|
+
? undefined
|
|
36
|
+
: (e) => {
|
|
37
|
+
if (stopPropagationOnClick) e.preventDefault()
|
|
38
|
+
dispatch('click')
|
|
39
|
+
}}
|
|
40
|
+
{href}
|
|
39
41
|
class={twMerge(
|
|
40
42
|
'group flex items-center px-2 py-2 font-light rounded-md h-8 gap-3 w-full',
|
|
41
43
|
lightMode
|
|
@@ -91,7 +93,7 @@ let dispatch = createEventDispatcher();
|
|
|
91
93
|
<SideBarNotification notificationCount={notificationsCount} small={false} />
|
|
92
94
|
</div>
|
|
93
95
|
{/if}
|
|
94
|
-
</
|
|
96
|
+
</svelte:element>
|
|
95
97
|
|
|
96
98
|
{#snippet text()}
|
|
97
99
|
{#if label}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type Writable } from 'svelte/store';
|
|
2
1
|
import type { FlowState } from './flows/flowState';
|
|
3
2
|
import { type Flow } from '../gen';
|
|
3
|
+
import type { StateStore } from '../utils';
|
|
4
4
|
export type stepState = {
|
|
5
5
|
initial?: boolean;
|
|
6
6
|
loadingJobs?: boolean;
|
|
@@ -13,7 +13,7 @@ export declare class StepHistoryLoader {
|
|
|
13
13
|
setFlowJobInitial(value: boolean | undefined): void;
|
|
14
14
|
constructor(stepStates: Record<string, stepState>, flowJobInitial?: boolean, saveCb?: () => void, noInitial?: boolean);
|
|
15
15
|
resetInitial(stepId: string | undefined): void;
|
|
16
|
-
loadIndividualStepsStates(flow: Flow, flowStateStore:
|
|
16
|
+
loadIndividualStepsStates(flow: Flow, flowStateStore: StateStore<FlowState>, workspaceId: string, initialPath: string, path: string): Promise<void>;
|
|
17
17
|
}
|
|
18
18
|
export declare function getStepHistoryLoaderContext(): StepHistoryLoader;
|
|
19
19
|
export declare function setStepHistoryLoaderContext(stepHistoryLoader: StepHistoryLoader): void;
|