windmill-components 1.687.0 → 1.695.1
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/ArgInput.svelte +2 -0
- package/package/components/AutoscalingConfigEditor.svelte +18 -4
- package/package/components/CompareWorkspaces.svelte +206 -157
- package/package/components/DatatableSchemaDiff.svelte +2 -2
- package/package/components/Dev.svelte +401 -85
- package/package/components/EditableSchemaForm.svelte +4 -0
- package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
- package/package/components/FlowPreviewContent.svelte +32 -30
- package/package/components/FlowRestartButton.svelte +143 -61
- package/package/components/FlowRestartButton.svelte.d.ts +37 -0
- package/package/components/FlowStatusViewer.svelte +15 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
- package/package/components/FlowStatusViewerInner.svelte +1 -2
- package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
- package/package/components/ForkConflictModal.svelte +57 -0
- package/package/components/ForkConflictModal.svelte.d.ts +3 -0
- package/package/components/GitRepoViewer.svelte +251 -97
- package/package/components/InputTransformSchemaForm.svelte +1 -1
- package/package/components/InstanceSettings.svelte +36 -16
- package/package/components/Login.svelte +113 -28
- package/package/components/Login.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/RunsPage.svelte +2 -1
- package/package/components/S3FilePickerInner.svelte +89 -89
- package/package/components/ScriptEditor.svelte +18 -5
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
- package/package/components/apps/components/helpers/executeRunnable.js +2 -1
- package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
- package/package/components/apps/editor/appPolicy.js +2 -1
- package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
- package/package/components/apps/inputType.d.ts +1 -0
- package/package/components/apps/sharedTypes.d.ts +1 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
- package/package/components/copilot/chat/AIChatInput.svelte +56 -47
- package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
- package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
- package/package/components/copilot/chat/app/core.d.ts +12 -20
- package/package/components/copilot/chat/app/core.js +103 -160
- package/package/components/copilot/chat/app/core.test.js +234 -9
- package/package/components/copilot/chat/context.js +44 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
- package/package/components/copilot/chat/flow/core.d.ts +2 -1
- package/package/components/copilot/chat/flow/core.js +48 -21
- package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
- package/package/components/copilot/chat/flow/helperUtils.js +33 -1
- package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
- package/package/components/copilot/chat/flow/openFlow.json +1 -1
- package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
- package/package/components/copilot/chat/script/core.js +3 -0
- package/package/components/copilot/chat/shared.d.ts +6 -0
- package/package/components/copilot/chat/shared.js +22 -1
- package/package/components/copilot/chat/shared.test.d.ts +1 -0
- package/package/components/copilot/chat/shared.test.js +412 -0
- package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
- package/package/components/copilot/chat/workspaceTools.js +239 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
- package/package/components/copilot/lib.js +3 -1
- package/package/components/copilot/lib.test.d.ts +1 -0
- package/package/components/copilot/lib.test.js +19 -0
- package/package/components/copilot/modelConfig.d.ts +3 -0
- package/package/components/copilot/modelConfig.js +10 -0
- package/package/components/flows/FlowProgressBar.svelte +5 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
- package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
- package/package/components/flows/flowStateUtils.svelte.js +5 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
- package/package/components/graph/FlowGraphV2.svelte +7 -3
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
- package/package/components/home/deploy_ui.js +1 -1
- package/package/components/icons/AzureIcon.svelte +12 -25
- package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
- package/package/components/instanceSettings.js +24 -0
- package/package/components/mcp/McpScopeSelector.svelte +119 -9
- package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
- package/package/components/offboarding-utils.js +2 -0
- package/package/components/progressBar/ProgressBar.svelte +9 -5
- package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
- package/package/components/raw_apps/RawAppEditor.svelte +159 -102
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
- package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
- package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
- package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
- package/package/components/raw_apps/dataTableRefUtils.js +34 -0
- package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
- package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
- package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
- package/package/components/raw_apps/rawAppPolicy.js +17 -2
- package/package/components/resources/resourceTypesFilter.d.ts +19 -0
- package/package/components/resources/resourceTypesFilter.js +21 -0
- package/package/components/restartFromStepPath.d.ts +39 -0
- package/package/components/restartFromStepPath.js +89 -0
- package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
- package/package/components/runs/JobDetailFieldConfig.js +57 -10
- package/package/components/runs/JobDetailHeader.svelte +24 -3
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +30 -1
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/Select.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +48 -77
- package/package/components/settings/EditTokenScopesModal.svelte +57 -0
- package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
- package/package/components/settings/ScopesPicker.svelte +43 -0
- package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
- package/package/components/settings/TokensTable.svelte +51 -15
- package/package/components/sidebar/OperatorMenu.svelte +6 -0
- package/package/components/sidebar/SidebarContent.svelte +11 -1
- package/package/components/triggers/AddTriggersButton.svelte +6 -0
- package/package/components/triggers/CaptureWrapper.svelte +19 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerModeToggle.svelte +36 -7
- package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
- package/package/components/triggers/TriggersEditor.svelte +5 -1
- package/package/components/triggers/TriggersWrapper.svelte +10 -0
- package/package/components/triggers/azure/AzureCapture.svelte +41 -0
- package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
- package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
- package/package/components/triggers/azure/utils.js +56 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +23 -1
- package/package/components/triggers/utils.js +20 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
- package/package/components/triggers.d.ts +1 -1
- package/package/components/useNestedRestartState.svelte.d.ts +56 -0
- package/package/components/useNestedRestartState.svelte.js +320 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +294 -24
- package/package/gen/schemas.gen.js +297 -25
- package/package/gen/services.gen.d.ts +247 -4
- package/package/gen/services.gen.js +498 -7
- package/package/gen/types.gen.d.ts +990 -37
- package/package/hubPaths.json +2 -5
- package/package/infer.d.ts +1 -1
- package/package/infer.js +37 -51
- package/package/mcpEndpointTools.js +60 -4
- package/package/script_helpers.js +17 -0
- package/package/stores.d.ts +7 -0
- package/package/stores.js +6 -1
- package/package/system_prompts/index.d.ts +1 -0
- package/package/system_prompts/index.js +8 -0
- package/package/system_prompts/prompts.d.ts +16 -13
- package/package/system_prompts/prompts.js +653 -43
- package/package/templates/ci_test_bun.ts.template +8 -0
- package/package/templates/ci_test_python.py.template +8 -0
- package/package/utils/forkConflict.d.ts +26 -0
- package/package/utils/forkConflict.js +56 -0
- package/package/utils_deployable.d.ts +164 -121
- package/package/utils_deployable.js +61 -11
- package/package/utils_workspace_deploy.js +3 -1
- package/package.json +29 -5
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
- package/dist/sharedUtils/base.d.ts +0 -1
- package/dist/sharedUtils/cloud.d.ts +0 -1
- package/dist/sharedUtils/common.d.ts +0 -111
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
- package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
- package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
- package/dist/sharedUtils/components/apps/types.d.ts +0 -274
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
- package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
- package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
- package/dist/sharedUtils/components/common/index.d.ts +0 -24
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
- package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
- package/dist/sharedUtils/components/ducklake.d.ts +0 -1
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
- package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers.d.ts +0 -20
- package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
- package/dist/sharedUtils/gen/core/request.d.ts +0 -29
- package/dist/sharedUtils/gen/index.d.ts +0 -6
- package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
- package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
- package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
- package/dist/sharedUtils/history.svelte.d.ts +0 -9
- package/dist/sharedUtils/hub.d.ts +0 -49
- package/dist/sharedUtils/jsr.json +0 -6
- package/dist/sharedUtils/lib.d.ts +0 -5
- package/dist/sharedUtils/lib.es.js +0 -1588
- package/dist/sharedUtils/package.json +0 -12
- package/dist/sharedUtils/schema.d.ts +0 -3
- package/dist/sharedUtils/stores.d.ts +0 -97
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
- package/dist/sharedUtils/toast.d.ts +0 -8
- package/dist/sharedUtils/utils.d.ts +0 -265
- package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
- /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
|
@@ -7,7 +7,7 @@ import LogPanel from './scriptEditor/LogPanel.svelte';
|
|
|
7
7
|
import { JobService, OpenAPI, WorkspaceService } from '../gen';
|
|
8
8
|
import { inferArgs } from '../infer';
|
|
9
9
|
import { userStore, workspaceStore } from '../stores';
|
|
10
|
-
import { emptySchema, readFieldsRecursively, sendUserToast } from '../utils';
|
|
10
|
+
import { emptySchema, pluralize, readFieldsRecursively, sendUserToast } from '../utils';
|
|
11
11
|
import { Pane, Splitpanes } from 'svelte-splitpanes';
|
|
12
12
|
import { onDestroy, onMount, setContext, untrack } from 'svelte';
|
|
13
13
|
import DarkModeToggle from './sidebar/DarkModeToggle.svelte';
|
|
@@ -25,7 +25,16 @@ import { NoteEditor, setNoteEditorContext } from './graph/noteEditor.svelte';
|
|
|
25
25
|
import { GroupEditor, setGroupEditorContext } from './graph/groupEditor.svelte';
|
|
26
26
|
import { dfs } from './flows/dfs';
|
|
27
27
|
import { loadSchemaFromModule } from './flows/flowInfers';
|
|
28
|
-
import { CornerDownLeft, Play } from 'lucide-svelte';
|
|
28
|
+
import { CornerDownLeft, Play, Folder, FolderTree, User, Search, ChevronDown, ChevronUp, Code2, LayoutDashboard } from 'lucide-svelte';
|
|
29
|
+
import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
30
|
+
import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
|
|
31
|
+
import FlowIcon from './home/FlowIcon.svelte';
|
|
32
|
+
import { groupItems } from './home/treeViewUtils';
|
|
33
|
+
import SearchItems from './SearchItems.svelte';
|
|
34
|
+
import TextInput from './text_input/TextInput.svelte';
|
|
35
|
+
import Row from './common/table/Row.svelte';
|
|
36
|
+
import Alert from './common/alert/Alert.svelte';
|
|
37
|
+
import { HOME_SEARCH_PLACEHOLDER } from '../consts';
|
|
29
38
|
import Toggle from './Toggle.svelte';
|
|
30
39
|
import { setLicense } from '../enterpriseUtils';
|
|
31
40
|
import { approximateFindPythonRelativePath, isTypescriptRelativePath, parseTypescriptDeps } from '../relative_imports';
|
|
@@ -67,6 +76,9 @@ async function loadUser() {
|
|
|
67
76
|
}
|
|
68
77
|
let darkModeToggle = $state();
|
|
69
78
|
let darkMode = $state(document.documentElement.classList.contains('dark'));
|
|
79
|
+
let flowContainerWidth = $state(0);
|
|
80
|
+
let flowContainerHeight = $state(0);
|
|
81
|
+
let flowHorizontalSplit = $derived(flowContainerWidth < flowContainerHeight);
|
|
70
82
|
let modeInitialized = $state(false);
|
|
71
83
|
let paneWidth = $state(0);
|
|
72
84
|
let compactPreview = $derived(paneWidth < 800);
|
|
@@ -100,6 +112,43 @@ const href = window.location.href;
|
|
|
100
112
|
const indexQ = href.indexOf('?');
|
|
101
113
|
const searchParams = indexQ > -1 ? new URLSearchParams(href.substring(indexQ)) : undefined;
|
|
102
114
|
let relativePaths = $state([]);
|
|
115
|
+
// watchPath is (re)synced on initial load, on popstate, and on explicit
|
|
116
|
+
// pickPath assignments. We don't listen for generic pushState events —
|
|
117
|
+
// the only pushState callsite is pickPath itself, and it updates watchPath
|
|
118
|
+
// directly. If a third caller starts pushing to history, add a resync there.
|
|
119
|
+
function parseWatchPath() {
|
|
120
|
+
const i = window.location.href.indexOf('?');
|
|
121
|
+
if (i < 0)
|
|
122
|
+
return undefined;
|
|
123
|
+
return new URLSearchParams(window.location.href.substring(i)).get('path') ?? undefined;
|
|
124
|
+
}
|
|
125
|
+
const PATH_SUFFIX_RE = /(\.(flow|app|raw_app)|__(flow|app|raw_app))\/?$/;
|
|
126
|
+
let watchPath = $state(parseWatchPath()?.replace(PATH_SUFFIX_RE, ''));
|
|
127
|
+
let pickerItems = $state([]);
|
|
128
|
+
// Picker only makes sense on the local dev page — that's the only context
|
|
129
|
+
// with a wmill dev WebSocket capable of returning the workspace listing.
|
|
130
|
+
// The VS Code extension iframe omits ?local=true and drives the page via
|
|
131
|
+
// postMessage (replaceScript / replaceFlow), so it must skip the picker.
|
|
132
|
+
const isLocalDevPage = !!searchParams?.has('local');
|
|
133
|
+
const pickerMode = $derived(isLocalDevPage && !watchPath);
|
|
134
|
+
let wsState = $state('connecting');
|
|
135
|
+
let pickerFilter = $state('');
|
|
136
|
+
let pickerKind = $state('all');
|
|
137
|
+
// Shape pickerItems into the homepage's ItemType so we can reuse `groupItems`
|
|
138
|
+
// for the folder/user tree structure. `kind` ('script'|'flow'|'raw_app') maps 1:1
|
|
139
|
+
// onto ItemType['type']; missing fields (canWrite, edited_at, etc.) default to safe values.
|
|
140
|
+
const pickerTreeItems = $derived(pickerItems.map((item) => ({
|
|
141
|
+
path: item.path,
|
|
142
|
+
summary: item.summary ?? '',
|
|
143
|
+
type: item.kind,
|
|
144
|
+
canWrite: true,
|
|
145
|
+
extra_perms: {},
|
|
146
|
+
starred: false,
|
|
147
|
+
edited_at: ''
|
|
148
|
+
})));
|
|
149
|
+
const pickerKindFilteredItems = $derived(pickerKind === 'all' ? pickerTreeItems : pickerTreeItems.filter((i) => i.type === pickerKind));
|
|
150
|
+
let pickerFilteredItems = $state(undefined);
|
|
151
|
+
const pickerGroups = $derived(groupItems(pickerFilteredItems ?? pickerKindFilteredItems));
|
|
103
152
|
if (searchParams?.has('local')) {
|
|
104
153
|
connectWs();
|
|
105
154
|
}
|
|
@@ -241,12 +290,33 @@ async function testBundle(file, isTar, format) {
|
|
|
241
290
|
});
|
|
242
291
|
loadingCodebaseButton = false;
|
|
243
292
|
}
|
|
293
|
+
const onPopState = () => {
|
|
294
|
+
watchPath = parseWatchPath()?.replace(PATH_SUFFIX_RE, '');
|
|
295
|
+
if (watchPath && socket && socket.readyState === WebSocket.OPEN) {
|
|
296
|
+
socket.send(JSON.stringify({ type: 'loadWmPath', path: watchPath }));
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
onMount(() => {
|
|
300
|
+
window.addEventListener('popstate', onPopState);
|
|
301
|
+
});
|
|
244
302
|
onDestroy(() => {
|
|
245
303
|
window.removeEventListener('message', el);
|
|
304
|
+
window.removeEventListener('popstate', onPopState);
|
|
246
305
|
if (socket && socket.readyState === WebSocket.OPEN) {
|
|
247
306
|
socket?.close();
|
|
248
307
|
}
|
|
249
308
|
});
|
|
309
|
+
function pickPath(item) {
|
|
310
|
+
if (item.kind === 'raw_app') {
|
|
311
|
+
sendUserToast(`raw_apps aren't previewable here. Run \`wmill app dev\` from inside the app folder.`, false);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const url = new URL(window.location.href);
|
|
315
|
+
url.searchParams.set('path', item.path);
|
|
316
|
+
window.history.pushState({}, '', url.toString());
|
|
317
|
+
watchPath = item.path;
|
|
318
|
+
socket?.send(JSON.stringify({ type: 'loadWmPath', path: item.path }));
|
|
319
|
+
}
|
|
250
320
|
function connectWs() {
|
|
251
321
|
try {
|
|
252
322
|
if (socket) {
|
|
@@ -258,7 +328,26 @@ function connectWs() {
|
|
|
258
328
|
}
|
|
259
329
|
const port = searchParams?.get('port') || '3001';
|
|
260
330
|
try {
|
|
331
|
+
wsState = 'connecting';
|
|
261
332
|
socket = new WebSocket(`ws://localhost:${port}/ws`);
|
|
333
|
+
// On connect, request the watched path if any, otherwise ask for a list to render the picker
|
|
334
|
+
socket.addEventListener('open', () => {
|
|
335
|
+
if (!socket)
|
|
336
|
+
return;
|
|
337
|
+
wsState = 'open';
|
|
338
|
+
if (watchPath) {
|
|
339
|
+
socket.send(JSON.stringify({ type: 'loadWmPath', path: watchPath }));
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
socket.send(JSON.stringify({ type: 'listPaths' }));
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
socket.addEventListener('error', () => {
|
|
346
|
+
wsState = 'closed';
|
|
347
|
+
});
|
|
348
|
+
socket.addEventListener('close', () => {
|
|
349
|
+
wsState = 'closed';
|
|
350
|
+
});
|
|
262
351
|
// Listen for messages
|
|
263
352
|
socket.addEventListener('message', (event) => {
|
|
264
353
|
replaceData(event.data);
|
|
@@ -272,11 +361,31 @@ function connectWs() {
|
|
|
272
361
|
console.log('Received invalid JSON: ' + msg);
|
|
273
362
|
return;
|
|
274
363
|
}
|
|
275
|
-
if (data.type
|
|
276
|
-
|
|
364
|
+
if (data.type === 'paths') {
|
|
365
|
+
pickerItems = data.items ?? [];
|
|
366
|
+
return;
|
|
277
367
|
}
|
|
278
|
-
|
|
279
|
-
|
|
368
|
+
// Picker mode (URL has no path) — ignore live broadcasts so a random
|
|
369
|
+
// file change doesn't yank the page out of the picker. (When watchPath
|
|
370
|
+
// IS set the server gates broadcasts itself, so no further filter here.)
|
|
371
|
+
if (!watchPath)
|
|
372
|
+
return;
|
|
373
|
+
if (data.type == 'script' || data.type == 'flow') {
|
|
374
|
+
// Guard against the $effect on flowStore.val (re)serializing the
|
|
375
|
+
// just-received payload back over the same WS to handleFlowRoundTrip
|
|
376
|
+
// (which would re-run the orphan-file scan with the same content).
|
|
377
|
+
// Mirrors the postMessage handler above.
|
|
378
|
+
lockChanges = true;
|
|
379
|
+
if (data.type == 'script') {
|
|
380
|
+
replaceScript(data);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
replaceFlow(data);
|
|
384
|
+
}
|
|
385
|
+
timeout && clearTimeout(timeout);
|
|
386
|
+
timeout = window.setTimeout(() => {
|
|
387
|
+
lockChanges = false;
|
|
388
|
+
}, 500);
|
|
280
389
|
}
|
|
281
390
|
else {
|
|
282
391
|
sendUserToast(`Received invalid message type ${data.type}`, true);
|
|
@@ -463,14 +572,29 @@ const groupEditor = new GroupEditor(flowStore);
|
|
|
463
572
|
let canCreateGroup = $state({ val: false });
|
|
464
573
|
setGroupEditorContext(groupEditor, canCreateGroup);
|
|
465
574
|
let lastSent = undefined;
|
|
575
|
+
const isInIframe = window.parent !== window;
|
|
466
576
|
function updateFlow(flow) {
|
|
467
577
|
if (lockChanges) {
|
|
468
578
|
return;
|
|
469
579
|
}
|
|
470
|
-
if (
|
|
471
|
-
|
|
472
|
-
|
|
580
|
+
if (deepEqual(flow, lastSent)) {
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
const snapshot = $state.snapshot(flow);
|
|
584
|
+
// Prefer the WebSocket whenever a `wmill dev` session is connected — this covers
|
|
585
|
+
// both standalone browser tabs and Claude Code's iframe preview. The VS Code
|
|
586
|
+
// extension never opens this socket (its iframe URL omits `local=true`), so it
|
|
587
|
+
// falls through to the postMessage path it has always used.
|
|
588
|
+
if (socket && socket.readyState === WebSocket.OPEN) {
|
|
589
|
+
socket.send(JSON.stringify({ type: 'flow', flow: snapshot, uriPath: lastUriPath }));
|
|
590
|
+
lastSent = snapshot;
|
|
473
591
|
}
|
|
592
|
+
else if (isInIframe) {
|
|
593
|
+
window?.parent.postMessage({ type: 'flow', flow: snapshot, uriPath: lastUriPath }, '*');
|
|
594
|
+
lastSent = snapshot;
|
|
595
|
+
}
|
|
596
|
+
// Else: no channel available yet (WS still connecting, not in an iframe).
|
|
597
|
+
// Don't mark `lastSent` so the next change will retry instead of being silently swallowed.
|
|
474
598
|
}
|
|
475
599
|
let reload = $state(0);
|
|
476
600
|
async function inferModuleArgs(selectedIdStore) {
|
|
@@ -577,7 +701,7 @@ function resetModulesStates() {
|
|
|
577
701
|
const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
578
702
|
const selectedId = $derived(selectionManager.getSelectedId());
|
|
579
703
|
const selectedModule = $derived(selectedId && flowStore.val?.value
|
|
580
|
-
? findModuleInFlow(flowStore.val.value, selectedId) ?? undefined
|
|
704
|
+
? (findModuleInFlow(flowStore.val.value, selectedId) ?? undefined)
|
|
581
705
|
: undefined);
|
|
582
706
|
</script>
|
|
583
707
|
|
|
@@ -586,7 +710,185 @@ const selectedModule = $derived(selectedId && flowStore.val?.value
|
|
|
586
710
|
<JobLoader noCode={true} bind:this={jobLoader} bind:isLoading={testIsLoading} bind:job={testJob} />
|
|
587
711
|
|
|
588
712
|
<main class="h-screen w-full">
|
|
589
|
-
{#
|
|
713
|
+
{#snippet itemRow(item: ItemType & { marked?: string }, depth: number)}
|
|
714
|
+
{@const wmItem = pickerItems.find((p) => p.path === item.path)}
|
|
715
|
+
<button
|
|
716
|
+
type="button"
|
|
717
|
+
onclick={() => wmItem && pickPath(wmItem)}
|
|
718
|
+
class="block w-full text-left cursor-pointer border-b last:border-b-0"
|
|
719
|
+
>
|
|
720
|
+
<Row
|
|
721
|
+
marked={item.marked}
|
|
722
|
+
path={item.path}
|
|
723
|
+
summary={item.summary}
|
|
724
|
+
kind={item.type}
|
|
725
|
+
{depth}
|
|
726
|
+
workspaceId={$workspaceStore ?? ''}
|
|
727
|
+
canFavorite={false}
|
|
728
|
+
/>
|
|
729
|
+
</button>
|
|
730
|
+
{/snippet}
|
|
731
|
+
{#snippet treeNode(node: ItemType | FolderItem | UserItem, depth: number)}
|
|
732
|
+
{#if 'folderName' in node}
|
|
733
|
+
<details open class="group border-b last:border-b-0">
|
|
734
|
+
<summary
|
|
735
|
+
class="px-4 py-2 w-full flex flex-row items-center justify-between cursor-pointer list-none group-open:border-b"
|
|
736
|
+
>
|
|
737
|
+
<div
|
|
738
|
+
class="flex flex-row items-center gap-4 text-sm font-semibold"
|
|
739
|
+
style={depth > 0 ? `padding-left: ${depth * 16}px;` : ''}
|
|
740
|
+
>
|
|
741
|
+
<div class="flex justify-center items-center">
|
|
742
|
+
{#if depth === 0}
|
|
743
|
+
<Folder size={16} class="text-secondary" />
|
|
744
|
+
{:else}
|
|
745
|
+
<FolderTree size={16} class="text-secondary" />
|
|
746
|
+
{/if}
|
|
747
|
+
</div>
|
|
748
|
+
<div>
|
|
749
|
+
<span class="whitespace-nowrap text-xs text-emphasis font-semibold"
|
|
750
|
+
>{#if depth === 0}f/{/if}{node.folderName}</span
|
|
751
|
+
>
|
|
752
|
+
<div class="text-2xs font-normal text-secondary whitespace-nowrap">
|
|
753
|
+
({pluralize(node.items.length, 'item')})
|
|
754
|
+
</div>
|
|
755
|
+
</div>
|
|
756
|
+
</div>
|
|
757
|
+
<div class="w-full flex flex-row-reverse">
|
|
758
|
+
<ChevronUp size={16} class="hidden group-open:block" />
|
|
759
|
+
<ChevronDown size={16} class="block group-open:hidden" />
|
|
760
|
+
</div>
|
|
761
|
+
</summary>
|
|
762
|
+
{#each node.items as child ('folderName' in child ? `f__${child.folderName}` : 'username' in child ? `u__${child.username}` : `i__${child.type}__${child.path}`)}
|
|
763
|
+
{@render treeNode(child, depth + 1)}
|
|
764
|
+
{/each}
|
|
765
|
+
</details>
|
|
766
|
+
{:else if 'username' in node}
|
|
767
|
+
<details open class="group border-b last:border-b-0">
|
|
768
|
+
<summary
|
|
769
|
+
class="px-4 py-2 w-full flex flex-row items-center justify-between cursor-pointer list-none group-open:border-b"
|
|
770
|
+
>
|
|
771
|
+
<div
|
|
772
|
+
class="flex flex-row items-center gap-4 text-sm font-semibold"
|
|
773
|
+
style={depth > 0 ? `padding-left: ${depth * 16}px;` : ''}
|
|
774
|
+
>
|
|
775
|
+
<div class="flex justify-center items-center">
|
|
776
|
+
<User size={16} class="text-secondary" />
|
|
777
|
+
</div>
|
|
778
|
+
<div>
|
|
779
|
+
<span class="whitespace-nowrap text-xs text-emphasis font-semibold"
|
|
780
|
+
>u/{node.username}</span
|
|
781
|
+
>
|
|
782
|
+
<div class="text-2xs font-normal text-secondary whitespace-nowrap">
|
|
783
|
+
({pluralize(node.items.length, 'item')})
|
|
784
|
+
</div>
|
|
785
|
+
</div>
|
|
786
|
+
</div>
|
|
787
|
+
<div class="w-full flex flex-row-reverse">
|
|
788
|
+
<ChevronUp size={16} class="hidden group-open:block" />
|
|
789
|
+
<ChevronDown size={16} class="block group-open:hidden" />
|
|
790
|
+
</div>
|
|
791
|
+
</summary>
|
|
792
|
+
{#each node.items as child ('folderName' in child ? `f__${child.folderName}` : 'username' in child ? `u__${child.username}` : `i__${child.type}__${child.path}`)}
|
|
793
|
+
{@render treeNode(child, depth + 1)}
|
|
794
|
+
{/each}
|
|
795
|
+
</details>
|
|
796
|
+
{:else}
|
|
797
|
+
{@render itemRow(node as ItemType & { marked?: string }, depth)}
|
|
798
|
+
{/if}
|
|
799
|
+
{/snippet}
|
|
800
|
+
|
|
801
|
+
{#if pickerMode}
|
|
802
|
+
<div class="h-full w-full overflow-auto p-6">
|
|
803
|
+
<div class="absolute top-2 left-2">
|
|
804
|
+
<DarkModeToggle bind:darkMode bind:this={darkModeToggle} forcedDarkMode={false} />
|
|
805
|
+
</div>
|
|
806
|
+
<div class="absolute top-2 right-2 text-xs text-secondary">
|
|
807
|
+
{#if $userStore}
|
|
808
|
+
{$userStore?.username} on {$workspaceStore}
|
|
809
|
+
{:else}
|
|
810
|
+
<span class="text-red-600">Unable to login on {$workspaceStore}</span>
|
|
811
|
+
{/if}
|
|
812
|
+
</div>
|
|
813
|
+
<div class="max-w-3xl mx-auto pt-8">
|
|
814
|
+
<h1 class="text-2xl font-semibold text-primary mb-1">
|
|
815
|
+
{$workspaceStore}
|
|
816
|
+
<span class="font-normal text-secondary">(local)</span>
|
|
817
|
+
</h1>
|
|
818
|
+
<p class="text-sm text-secondary mb-4"> Click a flow or a script to preview it. </p>
|
|
819
|
+
|
|
820
|
+
<SearchItems
|
|
821
|
+
filter={pickerFilter}
|
|
822
|
+
items={pickerKindFilteredItems}
|
|
823
|
+
f={(item: ItemType) => `${item.path} ${item.summary ?? ''}`}
|
|
824
|
+
bind:filteredItems={pickerFilteredItems}
|
|
825
|
+
/>
|
|
826
|
+
|
|
827
|
+
{#if wsState !== 'closed'}
|
|
828
|
+
<div class="flex flex-row gap-2 items-center mb-3 w-full">
|
|
829
|
+
<ToggleButtonGroup bind:selected={pickerKind} class="w-fit">
|
|
830
|
+
{#snippet children({ item })}
|
|
831
|
+
<ToggleButton value="all" label="All" size="md" {item} />
|
|
832
|
+
<ToggleButton value="script" icon={Code2} label="Scripts" size="md" {item} />
|
|
833
|
+
<ToggleButton
|
|
834
|
+
value="flow"
|
|
835
|
+
label="Flows"
|
|
836
|
+
icon={FlowIcon}
|
|
837
|
+
selectedColor="#14b8a6"
|
|
838
|
+
size="md"
|
|
839
|
+
{item}
|
|
840
|
+
/>
|
|
841
|
+
<ToggleButton
|
|
842
|
+
value="raw_app"
|
|
843
|
+
label="Apps"
|
|
844
|
+
icon={LayoutDashboard}
|
|
845
|
+
selectedColor="#fb923c"
|
|
846
|
+
size="md"
|
|
847
|
+
{item}
|
|
848
|
+
/>
|
|
849
|
+
{/snippet}
|
|
850
|
+
</ToggleButtonGroup>
|
|
851
|
+
|
|
852
|
+
<div class="relative text-primary flex-1 min-w-[100px]">
|
|
853
|
+
<!-- svelte-ignore a11y_autofocus -->
|
|
854
|
+
<TextInput
|
|
855
|
+
inputProps={{
|
|
856
|
+
autofocus: true,
|
|
857
|
+
placeholder: HOME_SEARCH_PLACEHOLDER
|
|
858
|
+
}}
|
|
859
|
+
size="md"
|
|
860
|
+
bind:value={pickerFilter}
|
|
861
|
+
class="!pr-10"
|
|
862
|
+
/>
|
|
863
|
+
<div class="absolute right-0 top-0 mt-2 mr-4 text-secondary" aria-hidden="true">
|
|
864
|
+
<Search size={16} />
|
|
865
|
+
</div>
|
|
866
|
+
</div>
|
|
867
|
+
</div>
|
|
868
|
+
{/if}
|
|
869
|
+
|
|
870
|
+
{#if wsState === 'closed'}
|
|
871
|
+
<Alert type="warning" title="Dev server is not running">
|
|
872
|
+
Start it from your workspace root with
|
|
873
|
+
<code class="text-xs px-1 py-0.5 rounded bg-surface-secondary">wmill dev</code>
|
|
874
|
+
to preview your flows, scripts, and apps.
|
|
875
|
+
</Alert>
|
|
876
|
+
{:else if pickerItems.length === 0}
|
|
877
|
+
<div class="text-sm text-secondary"
|
|
878
|
+
>No flows, scripts, or apps detected in this workspace.</div
|
|
879
|
+
>
|
|
880
|
+
{:else if pickerGroups.length === 0}
|
|
881
|
+
<div class="text-sm text-secondary">No items match the search.</div>
|
|
882
|
+
{:else}
|
|
883
|
+
<div class="border rounded-md bg-surface-tertiary overflow-hidden">
|
|
884
|
+
{#each pickerGroups as group ('folderName' in group ? `f__${group.folderName}` : 'username' in group ? `u__${group.username}` : `i__${group.type}__${group.path}`)}
|
|
885
|
+
{@render treeNode(group, 0)}
|
|
886
|
+
{/each}
|
|
887
|
+
</div>
|
|
888
|
+
{/if}
|
|
889
|
+
</div>
|
|
890
|
+
</div>
|
|
891
|
+
{:else if mode == 'script'}
|
|
590
892
|
<div class="flex flex-col min-h-full min-h-screen overflow-auto">
|
|
591
893
|
<div class="absolute top-0 left-2">
|
|
592
894
|
<DarkModeToggle bind:darkMode bind:this={darkModeToggle} forcedDarkMode={false} />
|
|
@@ -729,7 +1031,11 @@ const selectedModule = $derived(selectedId && flowStore.val?.value
|
|
|
729
1031
|
</div>
|
|
730
1032
|
{:else}
|
|
731
1033
|
<!-- <div class="h-full w-full grid grid-cols-2"> -->
|
|
732
|
-
<div
|
|
1034
|
+
<div
|
|
1035
|
+
class="h-full w-full"
|
|
1036
|
+
bind:clientWidth={flowContainerWidth}
|
|
1037
|
+
bind:clientHeight={flowContainerHeight}
|
|
1038
|
+
>
|
|
733
1039
|
<div class="flex flex-col max-h-screen h-full relative" bind:clientWidth={paneWidth}>
|
|
734
1040
|
<div class="absolute top-0 left-2">
|
|
735
1041
|
<DarkModeToggle bind:darkMode bind:this={darkModeToggle} forcedDarkMode={false} />
|
|
@@ -740,83 +1046,93 @@ const selectedModule = $derived(selectedId && flowStore.val?.value
|
|
|
740
1046
|
{/if}
|
|
741
1047
|
</div>
|
|
742
1048
|
|
|
743
|
-
<
|
|
744
|
-
<FlowPreviewButtons
|
|
745
|
-
{suspendStatus}
|
|
746
|
-
bind:this={flowPreviewButtons}
|
|
747
|
-
{onJobDone}
|
|
748
|
-
bind:localModuleStates
|
|
749
|
-
onRunPreview={() => {
|
|
750
|
-
showJobStatus = true
|
|
751
|
-
}}
|
|
752
|
-
/>
|
|
753
|
-
</div>
|
|
754
|
-
<Splitpanes horizontal class="max-h-screen grow min-h-0">
|
|
1049
|
+
<Splitpanes horizontal={flowHorizontalSplit} class="min-h-0 max-h-screen grow">
|
|
755
1050
|
<Pane size={67}>
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
1051
|
+
<div class="relative h-full w-full">
|
|
1052
|
+
{#if flowStore.val?.value?.modules}
|
|
1053
|
+
<div id="flow-editor"></div>
|
|
1054
|
+
<div
|
|
1055
|
+
class="flex justify-center pt-1 z-50 absolute gap-2 {compactPreview
|
|
1056
|
+
? 'left-1/2 -translate-x-1/2 top-14'
|
|
1057
|
+
: 'right-2 top-2'}"
|
|
1058
|
+
>
|
|
1059
|
+
<FlowPreviewButtons
|
|
1060
|
+
{suspendStatus}
|
|
1061
|
+
bind:this={flowPreviewButtons}
|
|
1062
|
+
{onJobDone}
|
|
1063
|
+
bind:localModuleStates
|
|
1064
|
+
onRunPreview={() => {
|
|
1065
|
+
showJobStatus = true
|
|
1066
|
+
}}
|
|
1067
|
+
/>
|
|
1068
|
+
</div>
|
|
1069
|
+
<FlowModuleSchemaMap
|
|
1070
|
+
bind:this={flowModuleSchemaMap}
|
|
1071
|
+
disableAi
|
|
1072
|
+
disableTutorials
|
|
1073
|
+
smallErrorHandler={true}
|
|
1074
|
+
disableStaticInputs
|
|
1075
|
+
localModuleStates={showJobStatus ? localModuleStates : {}}
|
|
1076
|
+
onTestUpTo={flowPreviewButtons?.testUpTo}
|
|
1077
|
+
testModuleStates={modulesTestStates}
|
|
1078
|
+
isOwner={flowPreviewContent?.getIsOwner?.()}
|
|
1079
|
+
onTestFlow={flowPreviewButtons?.runPreview}
|
|
1080
|
+
isRunning={flowPreviewContent?.getIsRunning?.()}
|
|
1081
|
+
onCancelTestFlow={flowPreviewContent?.cancelTest}
|
|
1082
|
+
onOpenPreview={flowPreviewButtons?.openPreview}
|
|
1083
|
+
onHideJobStatus={resetModulesStates}
|
|
1084
|
+
flowJob={job}
|
|
1085
|
+
{showJobStatus}
|
|
1086
|
+
onDelete={(id) => {
|
|
1087
|
+
delete localModuleStates[id]
|
|
1088
|
+
delete modulesTestStates.states[id]
|
|
1089
|
+
}}
|
|
1090
|
+
{flowHasChanged}
|
|
1091
|
+
controlsPosition="bottom"
|
|
1092
|
+
/>
|
|
1093
|
+
{:else}
|
|
1094
|
+
<div class="text-red-400 mt-20">Missing flow modules</div>
|
|
1095
|
+
{/if}
|
|
1096
|
+
</div></Pane
|
|
1097
|
+
>
|
|
1098
|
+
|
|
785
1099
|
<Pane size={33}>
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
1100
|
+
<div class="h-full w-full pl-0.5">
|
|
1101
|
+
{#if selectedModule}
|
|
1102
|
+
<div
|
|
1103
|
+
class="flex items-center gap-2 px-3 py-1.5 border-b border-border bg-surface shrink-0"
|
|
1104
|
+
>
|
|
1105
|
+
<span class="text-xs text-secondary shrink-0">{selectedModule.id} summary</span>
|
|
1106
|
+
<TextInput
|
|
1107
|
+
inputProps={{ placeholder: 'Summary' }}
|
|
1108
|
+
bind:value={selectedModule.summary}
|
|
1109
|
+
/>
|
|
1110
|
+
</div>
|
|
1111
|
+
{/if}
|
|
1112
|
+
{#key reload}
|
|
1113
|
+
<FlowEditorPanel
|
|
1114
|
+
enableAi
|
|
1115
|
+
noEditor
|
|
1116
|
+
on:applyArgs={(ev) => {
|
|
1117
|
+
if (ev.detail.kind === 'preprocessor') {
|
|
1118
|
+
stepsInputArgs.setStepArgs('preprocessor', ev.detail.args ?? {})
|
|
1119
|
+
selectionManager.selectId('preprocessor')
|
|
1120
|
+
} else {
|
|
1121
|
+
previewArgsStore.val = ev.detail.args ?? {}
|
|
1122
|
+
flowPreviewButtons?.openPreview()
|
|
1123
|
+
}
|
|
1124
|
+
}}
|
|
1125
|
+
onTestFlow={flowPreviewButtons?.runPreview}
|
|
1126
|
+
{job}
|
|
1127
|
+
isOwner={flowPreviewContent?.getIsOwner()}
|
|
1128
|
+
{suspendStatus}
|
|
1129
|
+
onOpenDetails={flowPreviewButtons?.openPreview}
|
|
1130
|
+
previewOpen={flowPreviewButtons?.getPreviewOpen()}
|
|
1131
|
+
/>
|
|
1132
|
+
{/key}
|
|
1133
|
+
</div>
|
|
807
1134
|
</Pane>
|
|
808
1135
|
</Splitpanes>
|
|
809
|
-
{#if selectedModule}
|
|
810
|
-
<div class="flex items-center gap-2 px-3 py-1.5 border-t border-border bg-surface shrink-0">
|
|
811
|
-
<span class="text-xs text-secondary shrink-0">{selectedModule.id} summary</span>
|
|
812
|
-
<input
|
|
813
|
-
type="text"
|
|
814
|
-
class="text-xs w-full bg-transparent border border-border rounded px-2 py-1 focus:outline-none focus:border-blue-500"
|
|
815
|
-
placeholder="Summary"
|
|
816
|
-
bind:value={selectedModule.summary}
|
|
817
|
-
/>
|
|
818
|
-
</div>
|
|
819
|
-
{/if}
|
|
820
1136
|
</div>
|
|
821
1137
|
</div>
|
|
822
1138
|
{/if}
|
|
@@ -700,6 +700,10 @@ let dndType = $state(generateRandomString());
|
|
|
700
700
|
bind:properties={schema.properties[argName].properties}
|
|
701
701
|
bind:order={schema.properties[argName].order}
|
|
702
702
|
bind:requiredProperty={schema.properties[argName].required}
|
|
703
|
+
bind:hideCatalogPicker={
|
|
704
|
+
schema.properties[argName].hideCatalogPicker
|
|
705
|
+
}
|
|
706
|
+
bind:hideRawInput={schema.properties[argName].hideRawInput}
|
|
703
707
|
{displayWebhookWarning}
|
|
704
708
|
on:requiredChange={(event) => {
|
|
705
709
|
if (event.detail.required) {
|
|
@@ -58,7 +58,7 @@ let connectionTestJob = $state();
|
|
|
58
58
|
const EMAIL_RECIPIENTS_KEY = 'email_recipients';
|
|
59
59
|
const CHANNEL_KEY = 'channel';
|
|
60
60
|
async function loadSlackResources() {
|
|
61
|
-
const settings = await WorkspaceService.
|
|
61
|
+
const settings = await WorkspaceService.getPublicSettings({ workspace: $workspaceStore });
|
|
62
62
|
if (!emptyString(settings.slack_name) && !emptyString(settings.slack_team_id)) {
|
|
63
63
|
workspaceConnectedToSlack = true;
|
|
64
64
|
slack_team_name = settings.slack_name;
|
|
@@ -69,7 +69,7 @@ async function loadSlackResources() {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
async function loadTeamsResources() {
|
|
72
|
-
const settings = await WorkspaceService.
|
|
72
|
+
const settings = await WorkspaceService.getPublicSettings({ workspace: $workspaceStore });
|
|
73
73
|
if (!emptyString(settings.teams_team_name) && !emptyString(settings.teams_team_id)) {
|
|
74
74
|
workspaceConnectedToTeams = true;
|
|
75
75
|
}
|