windmill-components 1.550.0 → 1.555.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/aiStore.d.ts +13 -0
- package/package/aiStore.js +70 -0
- package/package/common.d.ts +2 -1
- package/package/components/AIProviderPicker.svelte +25 -8
- package/package/components/ArgEnum.svelte +3 -2
- package/package/components/ArgEnum.svelte.d.ts +1 -0
- package/package/components/ArgInput.svelte +235 -174
- package/package/components/ArgInput.svelte.d.ts +4 -1
- package/package/components/ArrayTypeNarrowing.svelte +38 -32
- package/package/components/AutoscalingEvents.svelte +21 -5
- package/package/components/AutoscalingEvents.svelte.d.ts +4 -18
- package/package/components/DateTimeInput.svelte +8 -6
- package/package/components/DeployButton.svelte +1 -1
- package/package/components/Dev.svelte +6 -4
- package/package/components/EditableSchemaForm.svelte +7 -6
- package/package/components/Editor.svelte +2 -1
- package/package/components/EditorSettings.svelte +5 -5
- package/package/components/EditorSettings.svelte.d.ts +4 -18
- package/package/components/FakeMonacoPlaceHolder.svelte +4 -2
- package/package/components/FakeMonacoPlaceHolder.svelte.d.ts +1 -0
- package/package/components/FieldHeader.svelte +5 -7
- package/package/components/FirstStepInputs.svelte +1 -1
- package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
- package/package/components/FlowPlugConnect.svelte +8 -2
- package/package/components/FlowPlugConnect.svelte.d.ts +1 -0
- package/package/components/FlowPreviewContent.svelte +113 -92
- package/package/components/FlowPreviewContent.svelte.d.ts +3 -3
- package/package/components/FlowStatusViewer.svelte +3 -2
- package/package/components/FlowStatusViewerInner.svelte +1 -1
- package/package/components/FolderEditor.svelte +6 -7
- package/package/components/GroupEditor.svelte +148 -141
- package/package/components/GroupEditor.svelte.d.ts +5 -4
- package/package/components/InputTransformForm.svelte +88 -82
- package/package/components/InputTransformSchemaForm.svelte +5 -4
- package/package/components/InstanceSetting.svelte +17 -9
- package/package/components/JsonEditor.svelte +18 -9
- package/package/components/JsonEditor.svelte.d.ts +1 -1
- package/package/components/JsonInputs.svelte +1 -1
- package/package/components/ModulePreviewForm.svelte +23 -19
- package/package/components/NumberTypeNarrowing.svelte +32 -16
- package/package/components/ObjectStoreConfigSettings.svelte +27 -19
- package/package/components/Path.svelte +2 -8
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/ResourceEditor.svelte +3 -10
- package/package/components/ResourcePicker.svelte +85 -72
- package/package/components/ResourcePicker.svelte.d.ts +2 -0
- package/package/components/RunChart.svelte +1 -1
- package/package/components/RunForm.svelte +11 -7
- package/package/components/S3ArrayHelperButton.svelte +12 -6
- package/package/components/S3ArrayHelperButton.svelte.d.ts +1 -0
- package/package/components/S3FilePicker.svelte +1 -1
- package/package/components/SchemaForm.svelte +18 -10
- package/package/components/SchemaForm.svelte.d.ts +7 -1
- package/package/components/SchemaFormWithArgPicker.svelte +1 -1
- package/package/components/ScriptBuilder.svelte +2 -2
- package/package/components/ScriptEditor.svelte +4 -3
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ShareModal.svelte +4 -4
- package/package/components/SimpleEditor.svelte +6 -2
- package/package/components/SimpleEditor.svelte.d.ts +3 -0
- package/package/components/StringTypeNarrowing.svelte +5 -1
- package/package/components/SuperadminSettingsInner.svelte +3 -3
- package/package/components/TemplateEditor.svelte +18 -9
- package/package/components/Toast.svelte +2 -7
- package/package/components/Toast.svelte.d.ts +4 -18
- package/package/components/Toggle.svelte +17 -7
- package/package/components/ToggleHubWorkspaceQuick.svelte +3 -3
- package/package/components/WorkerGroup.svelte +2 -14
- package/package/components/apps/components/buttons/AppButton.svelte +57 -39
- package/package/components/apps/components/display/dbtable/InsertRow.svelte +32 -2
- package/package/components/apps/components/display/dbtable/queries/insert.js +2 -1
- package/package/components/apps/components/display/dbtable/utils.d.ts +8 -8
- package/package/components/apps/components/display/table/utils.js +13 -3
- package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -3
- package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +2 -1
- package/package/components/apps/editor/AppEditorHeader.svelte +33 -271
- package/package/components/apps/editor/AppEditorHeaderDeploy.svelte +233 -0
- package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +18 -0
- package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte +47 -0
- package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte.d.ts +8 -0
- package/package/components/apps/editor/GridEditor.svelte +7 -2
- package/package/components/apps/editor/appDeploy.svelte.d.ts +1 -0
- package/package/components/apps/editor/appDeploy.svelte.js +6 -0
- package/package/components/apps/editor/appUtils.d.ts +1 -0
- package/package/components/apps/editor/appUtils.js +30 -1
- package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -1
- package/package/components/apps/editor/component/components.d.ts +3 -3
- package/package/components/apps/editor/component/components.js +1 -1
- package/package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +6 -4
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +58 -8
- package/package/components/auditLogs/AuditLogsFilters.svelte +1 -1
- package/package/components/common/ResizeTransitionWrapper.svelte +39 -0
- package/package/components/common/ResizeTransitionWrapper.svelte.d.ts +12 -0
- package/package/components/common/badge/CountBadge.svelte +29 -0
- package/package/components/common/badge/CountBadge.svelte.d.ts +8 -0
- package/package/components/common/button/Button.svelte +1 -0
- package/package/components/common/button/ConnectionButton.svelte +6 -1
- package/package/components/common/button/ConnectionButton.svelte.d.ts +2 -0
- package/package/components/common/button/RefreshButton.svelte +8 -4
- package/package/components/common/button/RefreshButton.svelte.d.ts +3 -0
- package/package/components/common/calendarPicker/CalendarPicker.svelte +1 -1
- package/package/components/common/fileInput/FileInput.svelte +7 -6
- package/package/components/common/fileUpload/S3ArgInput.svelte +11 -9
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +1 -0
- package/package/components/common/popup/PopupV2.svelte +6 -0
- package/package/components/common/toggleButton-v2/ToggleButton.svelte +17 -26
- package/package/components/common/toggleButton-v2/ToggleButton.svelte.d.ts +16 -30
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +1 -1
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +3 -3
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
- package/package/components/copilot/CodeCompletionStatus.svelte +2 -1
- package/package/components/copilot/CronGen.svelte +1 -1
- package/package/components/copilot/FlowInlineScriptAIButton.svelte +2 -2
- package/package/components/copilot/IteratorGen.svelte +30 -25
- package/package/components/copilot/IteratorGen.svelte.d.ts +8 -7
- package/package/components/copilot/MetadataGen.svelte +4 -3
- package/package/components/copilot/PredicateGen.svelte +15 -12
- package/package/components/copilot/PredicateGen.svelte.d.ts +5 -4
- package/package/components/copilot/RegexGen.svelte +1 -1
- package/package/components/copilot/ScriptFix.svelte +1 -1
- package/package/components/copilot/ScriptGen.svelte +2 -1
- package/package/components/copilot/StepGenQuick.svelte +15 -16
- package/package/components/copilot/StepGenQuick.svelte.d.ts +14 -13
- package/package/components/copilot/StepInputGen.svelte +50 -36
- package/package/components/copilot/StepInputGen.svelte.d.ts +13 -10
- package/package/components/copilot/StepInputsGen.svelte +18 -19
- package/package/components/copilot/StepInputsGen.svelte.d.ts +4 -18
- package/package/components/copilot/autocomplete/Autocompletor.js +1 -1
- package/package/components/copilot/autocomplete/request.js +1 -1
- package/package/components/copilot/chat/AIChat.svelte +2 -1
- package/package/components/copilot/chat/AIChatManager.svelte.js +2 -1
- package/package/components/copilot/chat/AiChatLayout.svelte +2 -1
- package/package/components/copilot/chat/ProviderModelSelector.svelte +10 -9
- package/package/components/copilot/chat/ProviderModelSelector.svelte.d.ts +2 -17
- package/package/components/copilot/chat/flow/FlowAIButton.svelte +1 -1
- package/package/components/copilot/chat/script/core.js +2 -1
- package/package/components/copilot/chat/shared.js +2 -1
- package/package/components/copilot/lib.js +2 -1
- package/package/components/details/DetailPageLayout.svelte +3 -2
- package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
- package/package/components/flows/CreateActionsFlow.svelte +1 -1
- package/package/components/flows/FlowChatInterface.svelte +404 -0
- package/package/components/flows/FlowChatInterface.svelte.d.ts +19 -0
- package/package/components/flows/FlowChatMessage.svelte +41 -0
- package/package/components/flows/FlowChatMessage.svelte.d.ts +9 -0
- package/package/components/flows/FlowConversationsSidebar.svelte +213 -0
- package/package/components/flows/FlowConversationsSidebar.svelte.d.ts +15 -0
- package/package/components/flows/FlowEditor.svelte.d.ts +1 -1
- package/package/components/flows/FlowModuleIcon.svelte +10 -10
- package/package/components/flows/common/FlowCard.svelte +10 -2
- package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
- package/package/components/flows/common/FlowCardHeader.svelte +2 -1
- package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
- package/package/components/flows/content/DynamicInputHelpBox.svelte +4 -4
- package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -1
- package/package/components/flows/content/FlowInput.svelte +381 -259
- package/package/components/flows/content/FlowInput.svelte.d.ts +1 -1
- package/package/components/flows/content/FlowInputsQuick.svelte +55 -34
- package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +2 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +5 -10
- package/package/components/flows/flowInfers.d.ts +60 -0
- package/package/components/flows/flowInfers.js +72 -66
- package/package/components/flows/{flowStore.d.ts → flowStore.svelte.d.ts} +1 -0
- package/package/components/flows/header/FlowPreviewButtons.svelte +1 -1
- package/package/components/flows/map/FlowErrorHandlerItem.svelte +4 -2
- package/package/components/flows/map/FlowErrorHandlerItem.svelte.d.ts +1 -0
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -2
- package/package/components/flows/map/FlowStickyNode.svelte +2 -2
- package/package/components/flows/map/FlowStickyNode.svelte.d.ts +1 -0
- package/package/components/flows/map/InsertModuleButton.svelte +5 -2
- package/package/components/flows/map/InsertModuleButton.svelte.d.ts +4 -3
- package/package/components/flows/map/InsertModuleInner.svelte +3 -1
- package/package/components/flows/map/InsertModuleInner.svelte.d.ts +2 -2
- package/package/components/flows/map/VirtualItem.svelte +1 -2
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +8 -3
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +15 -12
- package/package/components/flows/propPicker/PropPickerWrapper.svelte +1 -15
- package/package/components/graph/FlowGraphV2.svelte +2 -1
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/graphBuilder.svelte.d.ts +2 -0
- package/package/components/graph/graphBuilder.svelte.js +1 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte +1 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte +13 -2
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +2 -27
- package/package/components/instanceSettings.js +17 -0
- package/package/components/progressBar/ProgressBar.svelte +1 -1
- package/package/components/raw_apps/FileEditorIcon.svelte +1 -1
- package/package/components/raw_apps/FileEditorIcon.svelte.d.ts +4 -18
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte +2 -8
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte.d.ts +4 -18
- package/package/components/raw_apps/RawAppEditor.svelte +6 -7
- package/package/components/raw_apps/RawAppEditorHeader.svelte +48 -301
- package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +18 -19
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +10 -16
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +13 -13
- package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte +8 -11
- package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte.d.ts +1 -2
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +0 -1
- package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte +7 -13
- package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte.d.ts +8 -8
- package/package/components/raw_apps/RawAppPreview.svelte +3 -7
- package/package/components/raw_apps/RawAppPreview.svelte.d.ts +5 -19
- package/package/components/raw_apps/utils.d.ts +1 -1
- package/package/components/raw_apps/utils.js +3 -3
- package/package/components/runs/RunOption.svelte +2 -2
- package/package/components/runs/RunsFilter.svelte +15 -12
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
- package/package/components/schema/EditableSchemaDrawer.svelte +19 -18
- package/package/components/schema/FlowPropertyEditor.svelte +9 -2
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
- package/package/components/schema/PropertyEditor.svelte +22 -26
- package/package/components/schema/SchemaFormDND.svelte +3 -2
- package/package/components/schema/SchemaFormDND.svelte.d.ts +1 -0
- package/package/components/select/DraggableTags.svelte +2 -2
- package/package/components/select/MultiSelect.svelte +14 -8
- package/package/components/select/Select.svelte +12 -5
- package/package/components/select/Select.svelte.d.ts +11 -0
- package/package/components/select/SelectDropdown.svelte +98 -46
- package/package/components/select/SelectDropdown.svelte.d.ts +10 -0
- package/package/components/select/utils.svelte.js +2 -0
- package/package/components/settings/CreateToken.svelte +76 -49
- package/package/components/settings/WorkspaceUserSettings.svelte +20 -17
- package/package/components/sidebar/CriticalAlertTable.svelte +2 -1
- package/package/components/sidebar/Linkify.svelte +14 -0
- package/package/components/sidebar/Linkify.svelte.d.ts +5 -0
- package/package/components/sidebar/WorkspaceMenu.svelte +8 -3
- package/package/components/table/tableUtils.js +1 -1
- package/package/components/text_input/TextInput.svelte +30 -0
- package/package/components/text_input/TextInput.svelte.d.ts +17 -0
- package/package/components/triggers/TriggersEditor.svelte +11 -1
- package/package/components/triggers/triggers.svelte.d.ts +1 -1
- package/package/components/triggers/triggers.svelte.js +8 -4
- package/package/components/tutorials/FlowBuilderTutorialErrorHandler.svelte +2 -2
- package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +3 -0
- package/package/components/tutorials/FlowBuilderTutorialSimpleFlow.svelte +49 -17
- package/package/components/tutorials/Tutorial.svelte +9 -0
- package/package/components/tutorials/Tutorial.svelte.d.ts +1 -0
- package/package/components/tutorials/app/AppTutorial.svelte +41 -57
- package/package/components/tutorials/app/BackgroundRunnablesTutorial.svelte +3 -5
- package/package/components/tutorials/app/ConnectionTutorial.svelte +2 -2
- package/package/components/tutorials/utils.js +2 -154
- package/package/components/vscode.js +16 -8
- package/package/components/workspaceSettings/AISettings.svelte +4 -3
- package/package/components/workspaceSettings/CreateWorkspace.svelte +2 -2
- package/package/components/workspaceSettings/DucklakeSettings.svelte +64 -7
- package/package/components/workspaceSettings/StorageSettings.svelte +24 -26
- package/package/editorUtils.d.ts +1 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +82 -1
- package/package/gen/schemas.gen.js +82 -1
- package/package/gen/services.gen.d.ts +175 -1
- package/package/gen/services.gen.js +345 -2
- package/package/gen/types.gen.d.ts +1324 -549
- package/package/script_helpers.js +5 -5
- package/package/services/JobManager.js +4 -2
- package/package/stores.d.ts +4 -13
- package/package/stores.js +5 -68
- package/package/toast.js +2 -1
- package/package/utils.d.ts +1 -0
- package/package/utils.js +3 -0
- package/package.json +3 -3
- /package/package/components/flows/{flowStore.js → flowStore.svelte.js} +0 -0
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
<script lang="ts">import {
|
|
2
|
-
const bubble = createBubbler();
|
|
3
|
-
import { Alert, Drawer, DrawerContent, UndoRedo } from '../../common';
|
|
1
|
+
<script lang="ts">import { Drawer, DrawerContent, UndoRedo } from '../../common';
|
|
4
2
|
import Button from '../../common/button/Button.svelte';
|
|
5
|
-
import Path from '../../Path.svelte';
|
|
6
3
|
import Toggle from '../../Toggle.svelte';
|
|
7
|
-
import { AppService, DraftService
|
|
4
|
+
import { AppService, DraftService } from '../../../gen';
|
|
8
5
|
import { redo, undo } from '../../../history.svelte';
|
|
9
6
|
import { enterpriseLicense, userStore, workspaceStore } from '../../../stores';
|
|
10
|
-
import { AlignHorizontalSpaceAround, BellOff, Bug, DiffIcon, Expand, FileJson, FileUp, FormInput, History, Laptop2,
|
|
7
|
+
import { AlignHorizontalSpaceAround, BellOff, Bug, DiffIcon, Expand, FileJson, FileUp, FormInput, History, Laptop2, Save, Smartphone, FileClock, Sun, Moon, SunMoon, Zap, Globe } from 'lucide-svelte';
|
|
11
8
|
import { getContext, untrack } from 'svelte';
|
|
12
9
|
import { cleanValueProperties, orderedJsonStringify, replaceFalseWithUndefined } from '../../../utils';
|
|
13
10
|
import { BG_PREFIX, allItems, toStatic } from '../utils';
|
|
@@ -16,7 +13,6 @@ import AppInputs from './AppInputs.svelte';
|
|
|
16
13
|
import PreviewToggle from './PreviewToggle.svelte';
|
|
17
14
|
import ToggleButtonGroup from '../../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
18
15
|
import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
|
|
19
|
-
import Tooltip from '../../Tooltip.svelte';
|
|
20
16
|
import { sendUserToast } from '../../../toast';
|
|
21
17
|
import DeploymentHistory from './DeploymentHistory.svelte';
|
|
22
18
|
import Awareness from '../../Awareness.svelte';
|
|
@@ -36,13 +32,13 @@ import Summary from '../../Summary.svelte';
|
|
|
36
32
|
import HideButton from './settingsPanel/HideButton.svelte';
|
|
37
33
|
import DeployOverrideConfirmationModal from '../../common/confirmationModal/DeployOverrideConfirmationModal.svelte';
|
|
38
34
|
import { computeS3FileInputPolicy, computeWorkspaceS3FileInputPolicy, computeS3ImageViewerPolicy } from './appUtilsS3';
|
|
39
|
-
import { isCloudHosted } from '../../../cloud';
|
|
40
|
-
import { base } from '../../../base';
|
|
41
|
-
import ClipboardPanel from '../../details/ClipboardPanel.svelte';
|
|
42
35
|
import AppJobsDrawer from './AppJobsDrawer.svelte';
|
|
43
36
|
import { collectStaticFields } from './commonAppUtils';
|
|
44
37
|
import LazyModePanel from './contextPanel/LazyModePanel.svelte';
|
|
45
38
|
import { Sha256 } from '@aws-crypto/sha256-js';
|
|
39
|
+
import AppEditorHeaderDeploy from './AppEditorHeaderDeploy.svelte';
|
|
40
|
+
import AppEditorHeaderDeployInitialDraft from './AppEditorHeaderDeployInitialDraft.svelte';
|
|
41
|
+
import { computeSecretUrl } from './appDeploy.svelte';
|
|
46
42
|
async function hash(message) {
|
|
47
43
|
try {
|
|
48
44
|
const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array
|
|
@@ -66,6 +62,7 @@ let deployedValue = $state(undefined); // Value to diff against
|
|
|
66
62
|
let deployedBy = $state(undefined); // Author
|
|
67
63
|
let confirmCallback = $state(() => { }); // What happens when user clicks `override` in warning
|
|
68
64
|
let open = $state(false); // Is confirmation modal open
|
|
65
|
+
let customPathError = $state('');
|
|
69
66
|
const { app, summary, breakpoint, appPath, jobs, jobsById, staticExporter, errorByComponent, openDebugRun, mode, darkMode } = getContext('AppViewerContext');
|
|
70
67
|
const { history, jobsDrawerOpen, refreshComponents } = getContext('AppEditorContext');
|
|
71
68
|
const loading = $state({
|
|
@@ -74,7 +71,7 @@ const loading = $state({
|
|
|
74
71
|
saveDraft: false
|
|
75
72
|
});
|
|
76
73
|
let selectedJobId = $state(undefined);
|
|
77
|
-
let pathError = $state(
|
|
74
|
+
let pathError = $state('');
|
|
78
75
|
let appExport = $state();
|
|
79
76
|
let draftDrawerOpen = $state(false);
|
|
80
77
|
let saveDrawerOpen = $state(false);
|
|
@@ -82,7 +79,7 @@ let inputsDrawerOpen = $state(fromHub);
|
|
|
82
79
|
let historyBrowserDrawerOpen = $state(false);
|
|
83
80
|
let debugAppDrawerOpen = $state(false);
|
|
84
81
|
let lazyDrawerOpen = $state(false);
|
|
85
|
-
let deploymentMsg = $state(
|
|
82
|
+
let deploymentMsg = $state('');
|
|
86
83
|
function closeSaveDrawer() {
|
|
87
84
|
saveDrawerOpen = false;
|
|
88
85
|
}
|
|
@@ -366,13 +363,6 @@ async function updateApp(npath) {
|
|
|
366
363
|
onSavedNewAppPath?.(npath);
|
|
367
364
|
}
|
|
368
365
|
}
|
|
369
|
-
let secretUrl = $state(undefined);
|
|
370
|
-
async function getSecretUrl() {
|
|
371
|
-
secretUrl = await AppService.getPublicSecretOfApp({
|
|
372
|
-
workspace: $workspaceStore,
|
|
373
|
-
path: $appPath
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
366
|
async function setPublishState() {
|
|
377
367
|
await computeTriggerables();
|
|
378
368
|
await AppService.updateApp({
|
|
@@ -614,11 +604,6 @@ function onKeyDown(event) {
|
|
|
614
604
|
}
|
|
615
605
|
lock = false;
|
|
616
606
|
}
|
|
617
|
-
let dirtyPath = $state(false);
|
|
618
|
-
let path = $state(undefined);
|
|
619
|
-
let secretUrlHref = $derived(secretUrl
|
|
620
|
-
? `${window.location.origin}${base}/public/${$workspaceStore}/${secretUrl}`
|
|
621
|
-
: undefined);
|
|
622
607
|
let moreItems = $derived([
|
|
623
608
|
{
|
|
624
609
|
displayName: 'Deployment history',
|
|
@@ -638,9 +623,13 @@ let moreItems = $derived([
|
|
|
638
623
|
{
|
|
639
624
|
displayName: 'Public URL',
|
|
640
625
|
icon: Globe,
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
626
|
+
action: async () => {
|
|
627
|
+
const secretUrl = await AppService.getPublicSecretOfApp({
|
|
628
|
+
workspace: $workspaceStore,
|
|
629
|
+
path: $appPath
|
|
630
|
+
});
|
|
631
|
+
window.open(computeSecretUrl(secretUrl), '_blank');
|
|
632
|
+
}
|
|
644
633
|
},
|
|
645
634
|
// {
|
|
646
635
|
// displayName: 'Publish to Hub',
|
|
@@ -736,43 +725,6 @@ function setTheme(newDarkMode) {
|
|
|
736
725
|
let priorDarkMode = document.documentElement.classList.contains('dark');
|
|
737
726
|
setTheme($app?.darkMode);
|
|
738
727
|
let customPath = $state(savedApp?.custom_path);
|
|
739
|
-
let dirtyCustomPath = $state(false);
|
|
740
|
-
let customPathError = $state('');
|
|
741
|
-
let globalWorkspacedRoute = $state(false);
|
|
742
|
-
async function loadGlobalWorkspacedRouteSetting() {
|
|
743
|
-
try {
|
|
744
|
-
const setting = await SettingService.getGlobal({ key: 'app_workspaced_route' });
|
|
745
|
-
globalWorkspacedRoute = setting ?? false;
|
|
746
|
-
}
|
|
747
|
-
catch (error) {
|
|
748
|
-
globalWorkspacedRoute = false;
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
async function appExists(customPath) {
|
|
752
|
-
return await AppService.customPathExists({
|
|
753
|
-
workspace: $workspaceStore,
|
|
754
|
-
customPath
|
|
755
|
-
});
|
|
756
|
-
}
|
|
757
|
-
let validateTimeout = undefined;
|
|
758
|
-
async function validateCustomPath(customPath) {
|
|
759
|
-
customPathError = '';
|
|
760
|
-
if (validateTimeout) {
|
|
761
|
-
clearTimeout(validateTimeout);
|
|
762
|
-
}
|
|
763
|
-
validateTimeout = setTimeout(async () => {
|
|
764
|
-
if (!/^[\w-]+(\/[\w-]+)*$/.test(customPath)) {
|
|
765
|
-
customPathError = 'Invalid path';
|
|
766
|
-
}
|
|
767
|
-
else if (customPath !== savedApp?.custom_path && (await appExists(customPath))) {
|
|
768
|
-
customPathError = 'Path already taken';
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
customPathError = '';
|
|
772
|
-
}
|
|
773
|
-
validateTimeout = undefined;
|
|
774
|
-
}, 500);
|
|
775
|
-
}
|
|
776
728
|
$effect(() => {
|
|
777
729
|
if ($openDebugRun == undefined) {
|
|
778
730
|
$openDebugRun = (jobId) => {
|
|
@@ -781,20 +733,10 @@ $effect(() => {
|
|
|
781
733
|
};
|
|
782
734
|
}
|
|
783
735
|
});
|
|
784
|
-
$effect(() => {
|
|
785
|
-
$appPath && $appPath != '' && secretUrl == undefined && untrack(() => getSecretUrl());
|
|
786
|
-
});
|
|
787
736
|
$effect(() => {
|
|
788
737
|
saveDrawerOpen && untrack(() => compareVersions());
|
|
789
738
|
});
|
|
790
739
|
let hasErrors = $derived(Object.keys($errorByComponent).length > 0);
|
|
791
|
-
let fullCustomUrl = $derived(`${window.location.origin}${base}/a/${isCloudHosted() || globalWorkspacedRoute ? $workspaceStore + '/' : ''}${customPath}`);
|
|
792
|
-
$effect(() => {
|
|
793
|
-
;
|
|
794
|
-
[customPath];
|
|
795
|
-
untrack(() => customPath !== undefined && validateCustomPath(customPath));
|
|
796
|
-
});
|
|
797
|
-
loadGlobalWorkspacedRouteSetting();
|
|
798
740
|
</script>
|
|
799
741
|
|
|
800
742
|
<svelte:window onkeydown={onKeyDown} />
|
|
@@ -835,45 +777,6 @@ loadGlobalWorkspacedRouteSetting();
|
|
|
835
777
|
{#if $appPath == ''}
|
|
836
778
|
<Drawer bind:open={draftDrawerOpen} size="800px">
|
|
837
779
|
<DrawerContent title="Initial draft save" on:close={() => closeDraftDrawer()}>
|
|
838
|
-
<Alert bgClass="mb-4" title="Require path" type="info">
|
|
839
|
-
Choose a path to save the initial draft of the app.
|
|
840
|
-
</Alert>
|
|
841
|
-
<h3>Summary</h3>
|
|
842
|
-
<div class="w-full pt-2">
|
|
843
|
-
<!-- svelte-ignore a11y_autofocus -->
|
|
844
|
-
<input
|
|
845
|
-
autofocus
|
|
846
|
-
type="text"
|
|
847
|
-
placeholder="App summary"
|
|
848
|
-
class="text-sm w-full font-semibold"
|
|
849
|
-
onkeydown={stopPropagation(bubble('keydown'))}
|
|
850
|
-
bind:value={$summary}
|
|
851
|
-
onkeyup={() => {
|
|
852
|
-
if ($appPath == '' && $summary?.length > 0 && !dirtyPath) {
|
|
853
|
-
path?.setName(
|
|
854
|
-
$summary
|
|
855
|
-
.toLowerCase()
|
|
856
|
-
.replace(/[^a-z0-9_]/g, '_')
|
|
857
|
-
.replace(/-+/g, '_')
|
|
858
|
-
.replace(/^-|-$/g, '')
|
|
859
|
-
)
|
|
860
|
-
}
|
|
861
|
-
}}
|
|
862
|
-
/>
|
|
863
|
-
</div>
|
|
864
|
-
<div class="py-2"></div>
|
|
865
|
-
<Path
|
|
866
|
-
autofocus={false}
|
|
867
|
-
bind:this={path}
|
|
868
|
-
bind:error={pathError}
|
|
869
|
-
bind:path={newEditedPath}
|
|
870
|
-
bind:dirty={dirtyPath}
|
|
871
|
-
initialPath=""
|
|
872
|
-
namePlaceholder="app"
|
|
873
|
-
kind="app"
|
|
874
|
-
/>
|
|
875
|
-
<div class="py-4"></div>
|
|
876
|
-
|
|
877
780
|
{#snippet actions()}
|
|
878
781
|
<div>
|
|
879
782
|
<Button
|
|
@@ -885,6 +788,8 @@ loadGlobalWorkspacedRouteSetting();
|
|
|
885
788
|
</Button>
|
|
886
789
|
</div>
|
|
887
790
|
{/snippet}
|
|
791
|
+
|
|
792
|
+
<AppEditorHeaderDeployInitialDraft {summary} {appPath} bind:pathError bind:newEditedPath />
|
|
888
793
|
</DrawerContent>
|
|
889
794
|
</Drawer>
|
|
890
795
|
{/if}
|
|
@@ -907,59 +812,6 @@ loadGlobalWorkspacedRouteSetting();
|
|
|
907
812
|
/>
|
|
908
813
|
<Drawer bind:open={saveDrawerOpen} size="800px">
|
|
909
814
|
<DrawerContent title="Deploy" on:close={() => closeSaveDrawer()}>
|
|
910
|
-
{#if !onLatest}
|
|
911
|
-
<Alert title="You're not on the latest app version. " type="warning">
|
|
912
|
-
By deploying, you may overwrite changes made by other users. Press 'Deploy' to see diff.
|
|
913
|
-
</Alert>
|
|
914
|
-
<div class="py-2"></div>
|
|
915
|
-
{/if}
|
|
916
|
-
<span class="text-secondary text-sm font-bold">Summary</span>
|
|
917
|
-
<div class="w-full pt-2">
|
|
918
|
-
<!-- svelte-ignore a11y_autofocus -->
|
|
919
|
-
<input
|
|
920
|
-
autofocus
|
|
921
|
-
type="text"
|
|
922
|
-
placeholder="App summary"
|
|
923
|
-
class="text-sm w-full"
|
|
924
|
-
bind:value={$summary}
|
|
925
|
-
onkeydown={stopPropagation(bubble('keydown'))}
|
|
926
|
-
onkeyup={() => {
|
|
927
|
-
if ($appPath == '' && $summary?.length > 0 && !dirtyPath) {
|
|
928
|
-
path?.setName(
|
|
929
|
-
$summary
|
|
930
|
-
.toLowerCase()
|
|
931
|
-
.replace(/[^a-z0-9_]/g, '_')
|
|
932
|
-
.replace(/-+/g, '_')
|
|
933
|
-
.replace(/^-|-$/g, '')
|
|
934
|
-
)
|
|
935
|
-
}
|
|
936
|
-
}}
|
|
937
|
-
/>
|
|
938
|
-
</div>
|
|
939
|
-
<div class="py-4"></div>
|
|
940
|
-
<span class="text-secondary text-sm font-bold">Deployment message</span>
|
|
941
|
-
<div class="w-full pt-2">
|
|
942
|
-
<!-- svelte-ignore a11y_autofocus -->
|
|
943
|
-
<input
|
|
944
|
-
type="text"
|
|
945
|
-
placeholder="Optional deployment message"
|
|
946
|
-
class="text-sm w-full"
|
|
947
|
-
bind:value={deploymentMsg}
|
|
948
|
-
/>
|
|
949
|
-
</div>
|
|
950
|
-
<div class="py-4"></div>
|
|
951
|
-
<span class="text-secondary text-sm font-bold">Path</span>
|
|
952
|
-
<Path
|
|
953
|
-
bind:this={path}
|
|
954
|
-
bind:dirty={dirtyPath}
|
|
955
|
-
bind:error={pathError}
|
|
956
|
-
bind:path={newEditedPath}
|
|
957
|
-
initialPath={newPath}
|
|
958
|
-
namePlaceholder="app"
|
|
959
|
-
kind="app"
|
|
960
|
-
autofocus={false}
|
|
961
|
-
/>
|
|
962
|
-
|
|
963
815
|
{#snippet actions()}
|
|
964
816
|
<div class="flex flex-row gap-4">
|
|
965
817
|
<Button
|
|
@@ -1019,111 +871,21 @@ loadGlobalWorkspacedRouteSetting();
|
|
|
1019
871
|
</Button>
|
|
1020
872
|
</div>
|
|
1021
873
|
{/snippet}
|
|
1022
|
-
<
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
<h2>Public URL</h2>
|
|
1038
|
-
|
|
1039
|
-
<div class="my-6">
|
|
1040
|
-
<div class="flex gap-2 items-center mb-2">
|
|
1041
|
-
<Toggle
|
|
1042
|
-
options={{
|
|
1043
|
-
left: `Require login and read-access`,
|
|
1044
|
-
right: `No login required`
|
|
1045
|
-
}}
|
|
1046
|
-
checked={policy.execution_mode == 'anonymous'}
|
|
1047
|
-
on:change={(e) => {
|
|
1048
|
-
policy.execution_mode = e.detail ? 'anonymous' : 'publisher'
|
|
1049
|
-
setPublishState()
|
|
1050
|
-
}}
|
|
1051
|
-
disabled={$appPath == ''}
|
|
1052
|
-
/>
|
|
1053
|
-
</div>
|
|
1054
|
-
{#if $appPath == ''}
|
|
1055
|
-
<ClipboardPanel content={`Save this app once to get the public secret URL`} size="md" />
|
|
1056
|
-
{:else if secretUrlHref}
|
|
1057
|
-
<ClipboardPanel content={secretUrlHref} size="md" />
|
|
1058
|
-
{:else}<Loader2 class="animate-spin" />
|
|
1059
|
-
{/if}
|
|
1060
|
-
<div class="text-xs text-secondary mt-1">
|
|
1061
|
-
Share this url directly or embed it using an iframe (if requiring login, top-level domain of
|
|
1062
|
-
embedding app must be the same as the one of Windmill)
|
|
1063
|
-
</div>
|
|
1064
|
-
|
|
1065
|
-
<div class="mt-4">
|
|
1066
|
-
{#if !($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
1067
|
-
<Alert type="warning" title="Admin only" size="xs">
|
|
1068
|
-
Custom path can only be set by workspace admins
|
|
1069
|
-
</Alert>
|
|
1070
|
-
<div class="mb-2"></div>
|
|
1071
|
-
{/if}
|
|
1072
|
-
{#if !$enterpriseLicense}
|
|
1073
|
-
<div class="flex text-xs items-center gap-1 text-yellow-500 whitespace-nowrap mb-2">
|
|
1074
|
-
<AlertTriangle size={16} />
|
|
1075
|
-
EE only <Tooltip>Enterprise Edition only feature</Tooltip>
|
|
1076
|
-
</div>
|
|
1077
|
-
{/if}
|
|
1078
|
-
<Toggle
|
|
1079
|
-
on:change={({ detail }) => {
|
|
1080
|
-
customPath = detail ? '' : undefined
|
|
1081
|
-
if (customPath === undefined) {
|
|
1082
|
-
customPathError = ''
|
|
1083
|
-
}
|
|
1084
|
-
}}
|
|
1085
|
-
checked={customPath !== undefined}
|
|
1086
|
-
options={{
|
|
1087
|
-
right: 'Use a custom URL'
|
|
1088
|
-
}}
|
|
1089
|
-
disabled={!$enterpriseLicense || !($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
1090
|
-
/>
|
|
1091
|
-
|
|
1092
|
-
{#if customPath !== undefined}
|
|
1093
|
-
<div class="text-secondary text-sm flex items-center gap-1 w-full justify-between">
|
|
1094
|
-
<div>Custom path</div>
|
|
1095
|
-
</div>
|
|
1096
|
-
<input
|
|
1097
|
-
disabled={!($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
1098
|
-
type="text"
|
|
1099
|
-
autocomplete="off"
|
|
1100
|
-
bind:value={customPath}
|
|
1101
|
-
class={customPathError === ''
|
|
1102
|
-
? ''
|
|
1103
|
-
: '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'}
|
|
1104
|
-
oninput={() => {
|
|
1105
|
-
dirtyCustomPath = true
|
|
1106
|
-
}}
|
|
1107
|
-
/>
|
|
1108
|
-
<div class="text-secondary text-sm flex items-center gap-1 mt-2 w-full justify-between">
|
|
1109
|
-
<div>Custom public URL</div>
|
|
1110
|
-
</div>
|
|
1111
|
-
<ClipboardPanel content={fullCustomUrl} size="md" />
|
|
1112
|
-
|
|
1113
|
-
<div class="text-red-600 dark:text-red-400 text-2xs mt-1.5"
|
|
1114
|
-
>{dirtyCustomPath ? customPathError : ''}
|
|
1115
|
-
</div>
|
|
1116
|
-
{/if}
|
|
1117
|
-
</div>
|
|
1118
|
-
</div>
|
|
1119
|
-
<Alert type="info" title="Only latest deployed app is publicly available">
|
|
1120
|
-
You will still need to deploy the app to make visible the latest changes
|
|
1121
|
-
</Alert>
|
|
1122
|
-
|
|
1123
|
-
<a
|
|
1124
|
-
href="https://www.windmill.dev/docs/advanced/external_auth_with_jwt#embed-public-apps-using-your-own-authentification"
|
|
1125
|
-
class="mt-4 text-2xs">Embed this app in your own product to be used by your own users</a
|
|
1126
|
-
>
|
|
874
|
+
<AppEditorHeaderDeploy
|
|
875
|
+
{newPath}
|
|
876
|
+
{policy}
|
|
877
|
+
{setPublishState}
|
|
878
|
+
appPath={$appPath}
|
|
879
|
+
{onLatest}
|
|
880
|
+
{savedApp}
|
|
881
|
+
bind:summary={$summary}
|
|
882
|
+
bind:customPath
|
|
883
|
+
bind:deploymentMsg
|
|
884
|
+
bind:customPathError
|
|
885
|
+
bind:pathError
|
|
886
|
+
bind:newEditedPath
|
|
887
|
+
hideSecretUrl={false}
|
|
888
|
+
/>
|
|
1127
889
|
</DrawerContent>
|
|
1128
890
|
</Drawer>
|
|
1129
891
|
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
<script lang="ts">import { Alert } from '../../common';
|
|
2
|
+
import Toggle from '../../Toggle.svelte';
|
|
3
|
+
import { enterpriseLicense, userStore, workspaceStore } from '../../../stores';
|
|
4
|
+
import { Loader2, AlertTriangle } from 'lucide-svelte';
|
|
5
|
+
import Tooltip from '../../Tooltip.svelte';
|
|
6
|
+
import ClipboardPanel from '../../details/ClipboardPanel.svelte';
|
|
7
|
+
import { untrack } from 'svelte';
|
|
8
|
+
import { AppService, SettingService } from '../../../gen';
|
|
9
|
+
import Path from '../../Path.svelte';
|
|
10
|
+
import { computeSecretUrl } from './appDeploy.svelte';
|
|
11
|
+
import { base } from '../../../base';
|
|
12
|
+
import { isCloudHosted } from '../../../cloud';
|
|
13
|
+
let { policy, setPublishState, appPath, customPath = $bindable(), onLatest, savedApp, summary = $bindable(), deploymentMsg = $bindable(), customPathError = $bindable(), pathError = $bindable(), newEditedPath = $bindable(), newPath, hideSecretUrl = false } = $props();
|
|
14
|
+
let dirtyCustomPath = $state(false);
|
|
15
|
+
let path = $state(undefined);
|
|
16
|
+
let dirtyPath = $state(false);
|
|
17
|
+
async function appExists(customPath) {
|
|
18
|
+
return await AppService.customPathExists({
|
|
19
|
+
workspace: $workspaceStore,
|
|
20
|
+
customPath
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
let globalWorkspacedRoute = $state(false);
|
|
24
|
+
async function loadGlobalWorkspacedRouteSetting() {
|
|
25
|
+
try {
|
|
26
|
+
const setting = await SettingService.getGlobal({ key: 'app_workspaced_route' });
|
|
27
|
+
globalWorkspacedRoute = setting ?? false;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
globalWorkspacedRoute = false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
loadGlobalWorkspacedRouteSetting();
|
|
34
|
+
let secretUrl = $state(undefined);
|
|
35
|
+
let secretUrlHref = $derived(secretUrl ? computeSecretUrl(secretUrl) : undefined);
|
|
36
|
+
let fullCustomUrl = $derived(`${window.location.origin}${base}/a/${isCloudHosted() || globalWorkspacedRoute ? $workspaceStore + '/' : ''}${customPath}`);
|
|
37
|
+
async function getSecretUrl() {
|
|
38
|
+
secretUrl = await AppService.getPublicSecretOfApp({
|
|
39
|
+
workspace: $workspaceStore,
|
|
40
|
+
path: appPath
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
let validateTimeout = undefined;
|
|
44
|
+
async function validateCustomPath(customPath) {
|
|
45
|
+
customPathError = '';
|
|
46
|
+
if (validateTimeout) {
|
|
47
|
+
clearTimeout(validateTimeout);
|
|
48
|
+
}
|
|
49
|
+
validateTimeout = setTimeout(async () => {
|
|
50
|
+
if (!/^[\w-]+(\/[\w-]+)*$/.test(customPath)) {
|
|
51
|
+
customPathError = 'Invalid path';
|
|
52
|
+
}
|
|
53
|
+
else if (customPath !== savedApp?.custom_path && (await appExists(customPath))) {
|
|
54
|
+
customPathError = 'Path already taken';
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
customPathError = '';
|
|
58
|
+
}
|
|
59
|
+
validateTimeout = undefined;
|
|
60
|
+
}, 500);
|
|
61
|
+
}
|
|
62
|
+
$effect(() => {
|
|
63
|
+
;
|
|
64
|
+
[customPath];
|
|
65
|
+
untrack(() => customPath !== undefined && validateCustomPath(customPath));
|
|
66
|
+
});
|
|
67
|
+
$effect(() => {
|
|
68
|
+
appPath && appPath != '' && secretUrl == undefined && untrack(() => getSecretUrl());
|
|
69
|
+
});
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
{#if !onLatest}
|
|
73
|
+
<Alert title="You're not on the latest app version. " type="warning">
|
|
74
|
+
By deploying, you may overwrite changes made by other users. Press 'Deploy' to see diff.
|
|
75
|
+
</Alert>
|
|
76
|
+
<div class="py-2"></div>
|
|
77
|
+
{/if}
|
|
78
|
+
<span class="text-secondary text-sm font-bold">Summary</span>
|
|
79
|
+
<div class="w-full pt-2">
|
|
80
|
+
<!-- svelte-ignore a11y_autofocus -->
|
|
81
|
+
<input
|
|
82
|
+
autofocus
|
|
83
|
+
type="text"
|
|
84
|
+
placeholder="App summary"
|
|
85
|
+
class="text-sm w-full"
|
|
86
|
+
bind:value={summary}
|
|
87
|
+
onkeydown={(e) => {
|
|
88
|
+
e.stopPropagation()
|
|
89
|
+
}}
|
|
90
|
+
onkeyup={() => {
|
|
91
|
+
if (appPath == '' && summary?.length > 0 && !dirtyPath) {
|
|
92
|
+
path?.setName(
|
|
93
|
+
summary
|
|
94
|
+
.toLowerCase()
|
|
95
|
+
.replace(/[^a-z0-9_]/g, '_')
|
|
96
|
+
.replace(/-+/g, '_')
|
|
97
|
+
.replace(/^-|-$/g, '')
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="py-4"></div>
|
|
104
|
+
<span class="text-secondary text-sm font-bold">Deployment message</span>
|
|
105
|
+
<div class="w-full pt-2">
|
|
106
|
+
<!-- svelte-ignore a11y_autofocus -->
|
|
107
|
+
<input
|
|
108
|
+
type="text"
|
|
109
|
+
placeholder="Optional deployment message"
|
|
110
|
+
class="text-sm w-full"
|
|
111
|
+
bind:value={deploymentMsg}
|
|
112
|
+
/>
|
|
113
|
+
</div>
|
|
114
|
+
<div class="py-4"></div>
|
|
115
|
+
<span class="text-secondary text-sm font-bold">Path</span>
|
|
116
|
+
<Path
|
|
117
|
+
bind:this={path}
|
|
118
|
+
bind:dirty={dirtyPath}
|
|
119
|
+
bind:error={pathError}
|
|
120
|
+
bind:path={newEditedPath}
|
|
121
|
+
initialPath={newPath}
|
|
122
|
+
namePlaceholder="app"
|
|
123
|
+
kind="app"
|
|
124
|
+
autofocus={false}
|
|
125
|
+
/>
|
|
126
|
+
|
|
127
|
+
<div class="py-2"></div>
|
|
128
|
+
<Alert title="App executed on behalf of you">
|
|
129
|
+
A viewer of the app will execute the runnables of the app on behalf of the publisher (you)
|
|
130
|
+
<Tooltip>
|
|
131
|
+
It ensures that all required resources/runnable visible for publisher but not for viewer at time
|
|
132
|
+
of creating the app would prevent the execution of the app. To guarantee tight security, a
|
|
133
|
+
policy is computed at time of deployment of the app which only allow the scripts/flows referred
|
|
134
|
+
to in the app to be called on behalf of. Furthermore, static parameters are not overridable.
|
|
135
|
+
Hence, users will only be able to use the app as intended by the publisher without risk for
|
|
136
|
+
leaking resources not used in the app.
|
|
137
|
+
</Tooltip>
|
|
138
|
+
</Alert>
|
|
139
|
+
|
|
140
|
+
<div class="mt-10"></div>
|
|
141
|
+
|
|
142
|
+
{#if !hideSecretUrl}
|
|
143
|
+
<h2>Public URL</h2>
|
|
144
|
+
|
|
145
|
+
<div class="my-6">
|
|
146
|
+
<div class="flex gap-2 items-center mb-2">
|
|
147
|
+
<Toggle
|
|
148
|
+
options={{
|
|
149
|
+
left: `Require login and read-access`,
|
|
150
|
+
right: `No login required`
|
|
151
|
+
}}
|
|
152
|
+
checked={policy.execution_mode == 'anonymous'}
|
|
153
|
+
on:change={(e) => {
|
|
154
|
+
policy.execution_mode = e.detail ? 'anonymous' : 'publisher'
|
|
155
|
+
setPublishState()
|
|
156
|
+
}}
|
|
157
|
+
disabled={appPath == ''}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
{#if appPath == ''}
|
|
161
|
+
<ClipboardPanel content={`Save this app once to get the public secret URL`} size="md" />
|
|
162
|
+
{:else if secretUrlHref}
|
|
163
|
+
<ClipboardPanel content={secretUrlHref} size="md" />
|
|
164
|
+
{:else}<Loader2 class="animate-spin" />
|
|
165
|
+
{/if}
|
|
166
|
+
<div class="text-xs text-secondary mt-1">
|
|
167
|
+
Share this url directly or embed it using an iframe (if requiring login, top-level domain of
|
|
168
|
+
embedding app must be the same as the one of Windmill)
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<div class="mt-4">
|
|
172
|
+
{#if !($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
173
|
+
<Alert type="warning" title="Admin only" size="xs">
|
|
174
|
+
Custom path can only be set by workspace admins
|
|
175
|
+
</Alert>
|
|
176
|
+
<div class="mb-2"></div>
|
|
177
|
+
{/if}
|
|
178
|
+
{#if !$enterpriseLicense}
|
|
179
|
+
<div class="flex text-xs items-center gap-1 text-yellow-500 whitespace-nowrap mb-2">
|
|
180
|
+
<AlertTriangle size={16} />
|
|
181
|
+
EE only <Tooltip>Enterprise Edition only feature</Tooltip>
|
|
182
|
+
</div>
|
|
183
|
+
{/if}
|
|
184
|
+
<Toggle
|
|
185
|
+
on:change={({ detail }) => {
|
|
186
|
+
customPath = detail ? '' : undefined
|
|
187
|
+
if (customPath === undefined) {
|
|
188
|
+
customPathError = ''
|
|
189
|
+
}
|
|
190
|
+
}}
|
|
191
|
+
checked={customPath !== undefined}
|
|
192
|
+
options={{
|
|
193
|
+
right: 'Use a custom URL'
|
|
194
|
+
}}
|
|
195
|
+
disabled={!$enterpriseLicense || !($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
196
|
+
/>
|
|
197
|
+
|
|
198
|
+
{#if customPath !== undefined}
|
|
199
|
+
<div class="text-secondary text-sm flex items-center gap-1 w-full justify-between">
|
|
200
|
+
<div>Custom path</div>
|
|
201
|
+
</div>
|
|
202
|
+
<input
|
|
203
|
+
disabled={!($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
204
|
+
type="text"
|
|
205
|
+
autocomplete="off"
|
|
206
|
+
bind:value={customPath}
|
|
207
|
+
class={customPathError === ''
|
|
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
|
+
oninput={() => {
|
|
211
|
+
dirtyCustomPath = true
|
|
212
|
+
}}
|
|
213
|
+
/>
|
|
214
|
+
<div class="text-secondary text-sm flex items-center gap-1 mt-2 w-full justify-between">
|
|
215
|
+
<div>Custom public URL</div>
|
|
216
|
+
</div>
|
|
217
|
+
<ClipboardPanel content={fullCustomUrl} size="md" />
|
|
218
|
+
|
|
219
|
+
<div class="text-red-600 dark:text-red-400 text-2xs mt-1.5"
|
|
220
|
+
>{dirtyCustomPath ? customPathError : ''}
|
|
221
|
+
</div>
|
|
222
|
+
{/if}
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
<Alert type="info" title="Only latest deployed app is publicly available">
|
|
226
|
+
You will still need to deploy the app to make visible the latest changes
|
|
227
|
+
</Alert>
|
|
228
|
+
|
|
229
|
+
<a
|
|
230
|
+
href="https://www.windmill.dev/docs/advanced/external_auth_with_jwt#embed-public-apps-using-your-own-authentification"
|
|
231
|
+
class="mt-4 text-2xs">Embed this app in your own product to be used by your own users</a
|
|
232
|
+
>
|
|
233
|
+
{/if}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
policy: any;
|
|
3
|
+
setPublishState: () => void;
|
|
4
|
+
appPath: string;
|
|
5
|
+
customPath: string | undefined;
|
|
6
|
+
onLatest: boolean;
|
|
7
|
+
savedApp: any;
|
|
8
|
+
summary: string;
|
|
9
|
+
deploymentMsg: string | undefined;
|
|
10
|
+
customPathError: string;
|
|
11
|
+
pathError: string;
|
|
12
|
+
newEditedPath: string;
|
|
13
|
+
newPath: string;
|
|
14
|
+
hideSecretUrl: boolean;
|
|
15
|
+
};
|
|
16
|
+
declare const AppEditorHeaderDeploy: import("svelte").Component<$$ComponentProps, {}, "summary" | "customPath" | "deploymentMsg" | "customPathError" | "pathError" | "newEditedPath">;
|
|
17
|
+
type AppEditorHeaderDeploy = ReturnType<typeof AppEditorHeaderDeploy>;
|
|
18
|
+
export default AppEditorHeaderDeploy;
|