windmill-components 1.613.5 → 1.623.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/cancelable-promise-utils.js +4 -2
- package/package/components/ApiConnectForm.svelte +6 -0
- package/package/components/AppConnectDrawer.svelte +1 -0
- package/package/components/AppConnectInner.svelte +1 -0
- package/package/components/AuthSettings.svelte +3 -1
- package/package/components/BedrockCredentialsCheck.svelte +241 -0
- package/package/components/BedrockCredentialsCheck.svelte.d.ts +3 -0
- package/package/components/CenteredPage.svelte +2 -1
- package/package/components/CenteredPage.svelte.d.ts +1 -0
- package/package/components/CompareWorkspaces.svelte +74 -16
- package/package/components/DBManager.svelte +35 -31
- package/package/components/DBManager.svelte.d.ts +13 -3
- package/package/components/DBManagerContent.svelte +23 -62
- package/package/components/DBManagerContent.svelte.d.ts +37 -3
- package/package/components/DBManagerDrawer.svelte +7 -9
- package/package/components/DBTable.svelte +1 -1
- package/package/components/DBTable.svelte.d.ts +3 -1
- package/package/components/DBTableEditor.svelte +66 -49
- package/package/components/DBTableEditor.svelte.d.ts +1 -1
- package/package/components/DateInput.svelte +29 -35
- package/package/components/DateInput.svelte.d.ts +10 -11
- package/package/components/DedicatedWorkersSelector.svelte +569 -0
- package/package/components/DedicatedWorkersSelector.svelte.d.ts +8 -0
- package/package/components/DeployWorkspace.svelte +106 -29
- package/package/components/DropdownV2.svelte +2 -1
- package/package/components/DropdownV2.svelte.d.ts +1 -0
- package/package/components/Editor.svelte +1 -10
- package/package/components/FlowGraphViewer.svelte +5 -2
- package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
- package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewerInner.svelte +6 -3
- package/package/components/ForkWorkspaceBanner.svelte +16 -0
- package/package/components/InfiniteList.svelte +27 -20
- package/package/components/InfiniteList.svelte.d.ts +2 -0
- package/package/components/JobLoader.svelte.d.ts +1 -1
- package/package/components/Login.svelte +6 -0
- package/package/components/NextcloudSetting.svelte +1 -1
- package/package/components/OAuthSetting.svelte +12 -23
- package/package/components/PocketIdSetting.svelte +82 -0
- package/package/components/PocketIdSetting.svelte.d.ts +6 -0
- package/package/components/ResourceEditor.svelte +4 -4
- package/package/components/ResourcePicker.svelte +1 -0
- package/package/components/RunForm.svelte +9 -17
- package/package/components/RunForm.svelte.d.ts +0 -1
- package/package/components/RunsPage.svelte +34 -0
- package/package/components/SavedInputsPicker.svelte +1 -1
- package/package/components/SavedInputsV2.svelte +35 -36
- package/package/components/Section.svelte +1 -1
- package/package/components/Star.svelte +8 -12
- package/package/components/Star.svelte.d.ts +6 -19
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/TimeAgo.svelte +49 -7
- package/package/components/TimeAgo.svelte.d.ts +1 -0
- package/package/components/Toast.svelte +5 -1
- package/package/components/WorkerGroup.svelte +35 -20
- package/package/components/WorkerGroup.svelte.d.ts +1 -0
- package/package/components/apps/components/display/InsertRowDrawerButton.svelte +1 -1
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +2 -1
- package/package/components/apps/components/display/dbtable/dbFeatures.d.ts +9 -0
- package/package/components/apps/components/display/dbtable/dbFeatures.js +32 -0
- package/package/components/apps/components/display/dbtable/metadata.d.ts +3 -3
- package/package/components/apps/components/display/dbtable/metadata.js +120 -130
- package/package/components/apps/components/display/dbtable/queries/alterTable.js +13 -5
- package/package/components/apps/components/display/dbtable/queries/alterTable.test.js +1 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.js +2 -0
- package/package/components/apps/components/display/dbtable/queries/relationalKeys.d.ts +1 -3
- package/package/components/apps/components/display/dbtable/queries/relationalKeys.js +41 -42
- package/package/components/apps/components/display/dbtable/tableEditor.js +18 -0
- package/package/components/apps/components/display/dbtable/utils.d.ts +1 -8
- package/package/components/apps/components/display/dbtable/utils.js +27 -34
- package/package/components/apps/components/display/table/AppAggridTable.svelte +8 -0
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +9 -9
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +1 -1
- package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +2 -4
- package/package/components/assets/AssetsDropdownButton.svelte +1 -1
- package/package/components/assets/AssetsUsageDrawer.svelte +98 -27
- package/package/components/assets/AssetsUsageDrawer.svelte.d.ts +5 -6
- package/package/components/assets/lib.d.ts +3 -2
- package/package/components/assets/lib.js +3 -1
- package/package/components/common/CloseButton.svelte +2 -1
- package/package/components/common/CloseButton.svelte.d.ts +1 -0
- package/package/components/common/badge/CountBadge.svelte +4 -3
- package/package/components/common/badge/CountBadge.svelte.d.ts +1 -0
- package/package/components/common/button/Button.svelte +1 -1
- package/package/components/common/confirmationModal/ConfirmationModal.svelte +2 -1
- package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +1 -0
- package/package/components/common/drawer/Drawer.svelte +4 -1
- package/package/components/common/drawer/DrawerContent.svelte +6 -3
- package/package/components/common/drawer/DrawerContent.svelte.d.ts +1 -0
- package/package/components/common/modal/Modal2.svelte +1 -0
- package/package/components/common/table/AppRow.svelte +4 -1
- package/package/components/common/table/FlowRow.svelte +4 -1
- package/package/components/common/table/RawAppRow.svelte +4 -1
- package/package/components/common/table/Row.svelte +11 -21
- package/package/components/common/table/Row.svelte.d.ts +4 -20
- package/package/components/common/table/RowIcon.svelte +6 -2
- package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
- package/package/components/common/table/ScriptRow.svelte +4 -1
- package/package/components/copilot/autocomplete/Autocompletor.d.ts +1 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +4 -4
- package/package/components/copilot/autocomplete/request.js +13 -9
- package/package/components/copilot/chat/script/core.js +5 -4
- package/package/components/copilot/lib.js +2 -9
- package/package/components/copilot/utils.d.ts +5 -0
- package/package/components/copilot/utils.js +8 -0
- package/package/components/dbOps.d.ts +1 -1
- package/package/components/dbOps.js +2 -2
- package/package/components/details/DetailPageHeader.svelte +21 -7
- package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
- package/package/components/details/DetailPageLayout.svelte +10 -1
- package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
- package/package/components/flows/conversations/FlowConversationsSidebar.svelte +79 -77
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/graph/FlowGraphV2.svelte +7 -1
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +41 -24
- package/package/components/home/ItemsList.svelte +2 -1
- package/package/components/home/treeViewUtils.js +1 -1
- package/package/components/icons/NextcloudIcon.svelte +3 -2
- package/package/components/icons/NextcloudIcon.svelte.d.ts +2 -0
- package/package/components/icons/PocketIdIcon.svelte +9 -0
- package/package/components/icons/PocketIdIcon.svelte.d.ts +9 -0
- package/package/components/icons/index.js +3 -1
- package/package/components/instanceSettings.d.ts +1 -1
- package/package/components/instanceSettings.js +1 -0
- package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -3
- package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
- package/package/components/schema/EditableSchemaWrapper.svelte +2 -2
- package/package/components/select/MultiSelect.svelte +1 -1
- package/package/components/select/SelectDropdown.svelte +15 -3
- package/package/components/settings/ChangeWorkspaceId.svelte +8 -7
- package/package/components/settings/CreateToken.svelte +3 -3
- package/package/components/settings/WorkspaceUserSettings.svelte +6 -5
- package/package/components/sidebar/MenuButton.svelte +13 -5
- package/package/components/sidebar/MultiplayerMenu.svelte +2 -2
- package/package/components/sidebar/SidebarContent.svelte +32 -4
- package/package/components/sidebar/UserMenu.svelte +2 -2
- package/package/components/table/DataTable.svelte +6 -2
- package/package/components/table/DataTable.svelte.d.ts +1 -0
- package/package/components/triggers/AddTriggersButton.svelte +17 -4
- package/package/components/triggers/TriggersEditor.svelte +4 -0
- package/package/components/triggers/TriggersWrapper.svelte +14 -0
- package/package/components/triggers/native/NativeTriggerEditor.svelte +379 -0
- package/package/components/triggers/native/NativeTriggerEditor.svelte.d.ts +26 -0
- package/package/components/triggers/native/NativeTriggerTable.svelte +155 -0
- package/package/components/triggers/native/NativeTriggerTable.svelte.d.ts +16 -0
- package/package/components/triggers/native/NativeTriggersPanel.svelte +40 -0
- package/package/components/triggers/native/NativeTriggersPanel.svelte.d.ts +15 -0
- package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte +104 -0
- package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte.d.ts +18 -0
- package/package/components/triggers/native/utils.d.ts +74 -0
- package/package/components/triggers/native/utils.js +152 -0
- package/package/components/triggers/triggers.svelte.d.ts +2 -1
- package/package/components/triggers/triggers.svelte.js +36 -8
- package/package/components/triggers/utils.js +18 -5
- package/package/components/triggers.d.ts +1 -1
- package/package/components/workspaceSettings/AISettings.svelte +2 -1
- package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +1 -0
- package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +3 -1
- package/package/components/workspaceSettings/DataTableSettings.svelte +2 -1
- package/package/components/workspaceSettings/DucklakeSettings.svelte +8 -3
- package/package/components/workspaceSettings/OAuthClientConfig.svelte +180 -0
- package/package/components/workspaceSettings/OAuthClientConfig.svelte.d.ts +14 -0
- package/package/components/workspaceSettings/StorageSettings.svelte +7 -2
- package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +302 -0
- package/package/components/workspaceSettings/WorkspaceIntegrations.svelte.d.ts +3 -0
- package/package/consts.js +0 -2
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +384 -3
- package/package/gen/schemas.gen.js +390 -3
- package/package/gen/services.gen.d.ts +200 -13
- package/package/gen/services.gen.js +383 -24
- package/package/gen/types.gen.d.ts +884 -94
- package/package/hub.js +2 -2
- package/package/hubPaths.json +1 -1
- package/package/refreshUser.d.ts +5 -1
- package/package/refreshUser.js +20 -30
- package/package/storeUtils.js +2 -0
- package/package/svelte5Utils.svelte.d.ts +61 -0
- package/package/svelte5Utils.svelte.js +170 -0
- package/package/utils.js +3 -0
- package/package.json +4 -6
- 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/kafka/utils.d.ts +0 -2
- 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
|
@@ -181,7 +181,7 @@ export function convertDucklakeSettingsToBackend(settings) {
|
|
|
181
181
|
</div>
|
|
182
182
|
{/if}
|
|
183
183
|
|
|
184
|
-
<DataTable>
|
|
184
|
+
<DataTable containerClass="ducklake-settings-table">
|
|
185
185
|
<Head>
|
|
186
186
|
<tr>
|
|
187
187
|
{#each tableHeadNames as name, i}
|
|
@@ -214,7 +214,11 @@ export function convertDucklakeSettingsToBackend(settings) {
|
|
|
214
214
|
<code class="px-1 py-0.5 border rounded-md">ATTACH 'ducklake' AS dl;</code> shorthand
|
|
215
215
|
</Tooltip>
|
|
216
216
|
{/if}
|
|
217
|
-
<TextInput
|
|
217
|
+
<TextInput
|
|
218
|
+
bind:value={ducklake.name}
|
|
219
|
+
inputProps={{ placeholder: 'Name' }}
|
|
220
|
+
class="ducklake-name"
|
|
221
|
+
/>
|
|
218
222
|
</Cell>
|
|
219
223
|
<Cell>
|
|
220
224
|
<div class="flex gap-2">
|
|
@@ -288,11 +292,12 @@ export function convertDucklakeSettingsToBackend(settings) {
|
|
|
288
292
|
else delete ducklake.storage.storage
|
|
289
293
|
}
|
|
290
294
|
}
|
|
291
|
-
class="w-48"
|
|
295
|
+
class="ducklake-workspace-storage-select w-48"
|
|
292
296
|
inputClass="!placeholder-secondary"
|
|
293
297
|
/>
|
|
294
298
|
<TextInput
|
|
295
299
|
inputProps={{ placeholder: 'Data path (defaults to /)' }}
|
|
300
|
+
class="ducklake-storage-data-path"
|
|
296
301
|
bind:value={ducklake.storage.path}
|
|
297
302
|
/>
|
|
298
303
|
</div>
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
<script lang="ts">import { sendUserToast } from '../../utils';
|
|
2
|
+
import { Button, Alert } from '../common';
|
|
3
|
+
import Label from '../Label.svelte';
|
|
4
|
+
import { Save, ExternalLink } from 'lucide-svelte';
|
|
5
|
+
import { workspaceStore } from '../../stores';
|
|
6
|
+
let { serviceName, serviceDisplayName, existingConfig, onConfigSaved, redirectUri = $bindable('') } = $props();
|
|
7
|
+
let saving = $state(false);
|
|
8
|
+
let clientId = $state('');
|
|
9
|
+
let clientSecret = $state('');
|
|
10
|
+
let baseUrl = $state('');
|
|
11
|
+
let workspace = $workspaceStore;
|
|
12
|
+
redirectUri = `${window.location.origin}/workspace_settings?tab=native_triggers&service=${serviceName}&workspace=${workspace}`;
|
|
13
|
+
$effect(() => {
|
|
14
|
+
if (existingConfig) {
|
|
15
|
+
clientId = existingConfig.client_id;
|
|
16
|
+
clientSecret = existingConfig.client_secret;
|
|
17
|
+
baseUrl = existingConfig.base_url;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
async function saveConfig() {
|
|
21
|
+
if (!clientId.trim() || !clientSecret.trim() || !baseUrl.trim()) {
|
|
22
|
+
sendUserToast('Please fill in all fields', true);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
saving = true;
|
|
26
|
+
try {
|
|
27
|
+
const oauthData = {
|
|
28
|
+
client_id: clientId.trim(),
|
|
29
|
+
client_secret: clientSecret.trim(),
|
|
30
|
+
base_url: baseUrl.trim().replace(/\/+$/, ''),
|
|
31
|
+
redirect_uri: redirectUri.trim()
|
|
32
|
+
};
|
|
33
|
+
await onConfigSaved(oauthData);
|
|
34
|
+
resetForm();
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
sendUserToast(`Failed to configure OAuth client: ${err.message}`, true);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
saving = false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function resetForm() {
|
|
44
|
+
clientId = '';
|
|
45
|
+
clientSecret = '';
|
|
46
|
+
}
|
|
47
|
+
function copyToClipboard(text, label) {
|
|
48
|
+
navigator.clipboard
|
|
49
|
+
.writeText(text)
|
|
50
|
+
.then(() => {
|
|
51
|
+
sendUserToast(`${label} copied to clipboard`);
|
|
52
|
+
})
|
|
53
|
+
.catch(() => {
|
|
54
|
+
sendUserToast(`Failed to copy ${label}`, true);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<div class="space-y-4">
|
|
60
|
+
<div class="flex justify-between items-center">
|
|
61
|
+
<h4 class="text-md font-medium text-primary">{serviceDisplayName} OAuth Client Configuration</h4
|
|
62
|
+
>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
{#if !existingConfig}
|
|
66
|
+
<Alert type="warning" title="OAuth client required">
|
|
67
|
+
<p class="text-sm mb-2">
|
|
68
|
+
Before you can connect to {serviceDisplayName}, you need to configure an OAuth client. This
|
|
69
|
+
requires:
|
|
70
|
+
</p>
|
|
71
|
+
<ol class="list-decimal list-inside space-y-1 text-sm">
|
|
72
|
+
<li
|
|
73
|
+
>Create an OAuth2 application in your {serviceDisplayName} instance (Administration settings
|
|
74
|
+
-> Security -> OAuth 2.0 clients)</li
|
|
75
|
+
>
|
|
76
|
+
<li
|
|
77
|
+
>Configure the redirect URI: <code
|
|
78
|
+
class="text-xs bg-gray-100 dark:bg-gray-800 px-1 rounded"
|
|
79
|
+
>{redirectUri ||
|
|
80
|
+
`${window.location.origin}/workspace_settings?tab=integrations&service=${serviceName}`}</code
|
|
81
|
+
></li
|
|
82
|
+
>
|
|
83
|
+
<li>Enter the client credentials below</li>
|
|
84
|
+
</ol>
|
|
85
|
+
</Alert>
|
|
86
|
+
{/if}
|
|
87
|
+
|
|
88
|
+
<div class="space-y-4">
|
|
89
|
+
<div class="space-y-4">
|
|
90
|
+
<div class="flex flex-col gap-1">
|
|
91
|
+
<Label label="Nextcloud base URL" />
|
|
92
|
+
<p class="text-xs font-normal text-secondary"
|
|
93
|
+
>The base URL of your Nextcloud instance (without trailing slash)</p
|
|
94
|
+
>
|
|
95
|
+
<input
|
|
96
|
+
type="url"
|
|
97
|
+
bind:value={baseUrl}
|
|
98
|
+
placeholder="https://your-nextcloud.example.com"
|
|
99
|
+
class="windmill-input"
|
|
100
|
+
disabled={saving}
|
|
101
|
+
/>
|
|
102
|
+
{#if baseUrl}
|
|
103
|
+
<Button
|
|
104
|
+
wrapperClasses="self-start"
|
|
105
|
+
href={`${baseUrl}/settings/admin/security`}
|
|
106
|
+
target="_blank"
|
|
107
|
+
startIcon={{ icon: ExternalLink }}
|
|
108
|
+
>
|
|
109
|
+
{serviceDisplayName} OAuth Settings
|
|
110
|
+
</Button>
|
|
111
|
+
{/if}
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="flex flex-col gap-1">
|
|
115
|
+
<Label label="Redirect URI" />
|
|
116
|
+
<p class="text-xs font-normal text-secondary"
|
|
117
|
+
>Use this URL when creating the OAuth app in {serviceDisplayName}</p
|
|
118
|
+
>
|
|
119
|
+
<div class="flex gap-2">
|
|
120
|
+
<input
|
|
121
|
+
type="url"
|
|
122
|
+
bind:value={redirectUri}
|
|
123
|
+
readonly
|
|
124
|
+
class="windmill-input flex-1 bg-gray-50 dark:bg-gray-900"
|
|
125
|
+
/>
|
|
126
|
+
<Button
|
|
127
|
+
size="xs"
|
|
128
|
+
color="light"
|
|
129
|
+
variant="border"
|
|
130
|
+
onclick={() => copyToClipboard(redirectUri, 'Redirect URI')}
|
|
131
|
+
>
|
|
132
|
+
Copy
|
|
133
|
+
</Button>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div class="flex flex-col gap-1">
|
|
138
|
+
<Label label="Client ID" />
|
|
139
|
+
<input
|
|
140
|
+
type="text"
|
|
141
|
+
bind:value={clientId}
|
|
142
|
+
placeholder="Generated by Nextcloud OAuth app"
|
|
143
|
+
class="windmill-input"
|
|
144
|
+
disabled={saving}
|
|
145
|
+
/>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div class="flex flex-col gap-1">
|
|
149
|
+
<Label label="Client secret" />
|
|
150
|
+
<input
|
|
151
|
+
type="password"
|
|
152
|
+
bind:value={clientSecret}
|
|
153
|
+
placeholder="Generated by Nextcloud OAuth app"
|
|
154
|
+
class="windmill-input"
|
|
155
|
+
disabled={saving}
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="flex gap-2">
|
|
160
|
+
<Button
|
|
161
|
+
color="blue"
|
|
162
|
+
onclick={saveConfig}
|
|
163
|
+
disabled={saving || !clientId.trim() || !clientSecret.trim() || !baseUrl.trim()}
|
|
164
|
+
startIcon={{ icon: Save }}
|
|
165
|
+
>
|
|
166
|
+
{saving ? 'Saving...' : 'Save configuration'}
|
|
167
|
+
</Button>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
{#if existingConfig}
|
|
173
|
+
<Alert type="success" title="OAuth client configured">
|
|
174
|
+
<p class="text-sm">
|
|
175
|
+
OAuth client is configured for {serviceDisplayName}. You can now connect this workspace to
|
|
176
|
+
your {serviceDisplayName} instance.
|
|
177
|
+
</p>
|
|
178
|
+
</Alert>
|
|
179
|
+
{/if}
|
|
180
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
serviceName: string;
|
|
3
|
+
serviceDisplayName: string;
|
|
4
|
+
existingConfig?: {
|
|
5
|
+
client_id: string;
|
|
6
|
+
client_secret: string;
|
|
7
|
+
base_url: string;
|
|
8
|
+
} | null;
|
|
9
|
+
redirectUri: string;
|
|
10
|
+
onConfigSaved: (oauthData: any) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
declare const OAuthClientConfig: import("svelte").Component<Props, {}, "redirectUri">;
|
|
13
|
+
type OAuthClientConfig = ReturnType<typeof OAuthClientConfig>;
|
|
14
|
+
export default OAuthClientConfig;
|
|
@@ -104,7 +104,7 @@ function isPermissionsNonDefault(storage) {
|
|
|
104
104
|
</Alert>
|
|
105
105
|
{/if}
|
|
106
106
|
{#if s3ResourceSettings}
|
|
107
|
-
<DataTable containerClass="mt-4">
|
|
107
|
+
<DataTable containerClass="storage-settings-table mt-4">
|
|
108
108
|
<Head>
|
|
109
109
|
<tr>
|
|
110
110
|
{#each tableHeadNames as name, i}
|
|
@@ -124,7 +124,11 @@ function isPermissionsNonDefault(storage) {
|
|
|
124
124
|
{#if tableRow[0] === null}
|
|
125
125
|
<TextInput inputProps={{ placeholder: 'Primary storage', disabled: true }} />
|
|
126
126
|
{:else}
|
|
127
|
-
<TextInput
|
|
127
|
+
<TextInput
|
|
128
|
+
bind:value={tableRow[0]}
|
|
129
|
+
inputProps={{ placeholder: 'Name' }}
|
|
130
|
+
class="secondary-storage-name-input"
|
|
131
|
+
/>
|
|
128
132
|
{/if}
|
|
129
133
|
</Cell>
|
|
130
134
|
<Cell>
|
|
@@ -139,6 +143,7 @@ function isPermissionsNonDefault(storage) {
|
|
|
139
143
|
{ value: 'gcloud_storage', label: 'Google Cloud Storage' }
|
|
140
144
|
]}
|
|
141
145
|
bind:value={tableRow[1].resourceType}
|
|
146
|
+
id="storage-resource-type-select"
|
|
142
147
|
class="w-40"
|
|
143
148
|
/>
|
|
144
149
|
</div>
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
<script lang="ts">import { workspaceStore } from '../../stores';
|
|
2
|
+
import { sendUserToast } from '../../utils';
|
|
3
|
+
import { Button, Alert } from '../common';
|
|
4
|
+
import Skeleton from '../common/skeleton/Skeleton.svelte';
|
|
5
|
+
import Description from '../Description.svelte';
|
|
6
|
+
import { Check, X, ExternalLink, Cog, Plug } from 'lucide-svelte';
|
|
7
|
+
import { NextcloudIcon } from '../icons';
|
|
8
|
+
import { WorkspaceIntegrationService } from '../../gen';
|
|
9
|
+
import OAuthClientConfig from './OAuthClientConfig.svelte';
|
|
10
|
+
import { page } from '$app/stores';
|
|
11
|
+
import { goto } from '$app/navigation';
|
|
12
|
+
const supportedServices = {
|
|
13
|
+
nextcloud: {
|
|
14
|
+
name: 'nextcloud',
|
|
15
|
+
displayName: 'Nextcloud',
|
|
16
|
+
description: 'Connect to Nextcloud for file operations and webhook triggers',
|
|
17
|
+
icon: NextcloudIcon,
|
|
18
|
+
docsUrl: 'https://www.windmill.dev/docs/integrations/nextcloud'
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
let integrations = $state([]);
|
|
22
|
+
let loading = $state(false);
|
|
23
|
+
let connecting = $state(null);
|
|
24
|
+
let showingConfig = $state(null);
|
|
25
|
+
let processingCallback = $state(false);
|
|
26
|
+
async function loadIntegrations() {
|
|
27
|
+
if (!$workspaceStore)
|
|
28
|
+
return;
|
|
29
|
+
loading = true;
|
|
30
|
+
try {
|
|
31
|
+
const response = await WorkspaceIntegrationService.listNativeTriggerServices({
|
|
32
|
+
workspace: $workspaceStore
|
|
33
|
+
});
|
|
34
|
+
integrations = response.map((item) => ({
|
|
35
|
+
service_name: item.service_name,
|
|
36
|
+
oauth_data: item.oauth_data || null
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error('Failed to load workspace integrations:', err);
|
|
41
|
+
sendUserToast(`Failed to load integrations: ${err.message}`, true);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
loading = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function deleteIntegration(serviceName) {
|
|
48
|
+
if (!$workspaceStore)
|
|
49
|
+
return;
|
|
50
|
+
try {
|
|
51
|
+
await WorkspaceIntegrationService.deleteNativeTriggerService({
|
|
52
|
+
workspace: $workspaceStore,
|
|
53
|
+
serviceName: serviceName
|
|
54
|
+
});
|
|
55
|
+
sendUserToast(`${supportedServices[serviceName]?.displayName} disconnected successfully`);
|
|
56
|
+
loadIntegrations();
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
sendUserToast(`Failed to disconnect ${supportedServices[serviceName]?.displayName}: ${err.message}`, true);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function connectService(serviceName, redirectUri) {
|
|
63
|
+
if (!$workspaceStore)
|
|
64
|
+
return;
|
|
65
|
+
connecting = serviceName;
|
|
66
|
+
try {
|
|
67
|
+
const auth_url = await WorkspaceIntegrationService.generateNativeTriggerServiceConnectUrl({
|
|
68
|
+
workspace: $workspaceStore,
|
|
69
|
+
serviceName: serviceName,
|
|
70
|
+
requestBody: { redirect_uri: redirectUri }
|
|
71
|
+
});
|
|
72
|
+
if (auth_url) {
|
|
73
|
+
window.location.href = auth_url;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
sendUserToast(`Failed to connect ${supportedServices[serviceName]?.displayName}: ${err.message}`, true);
|
|
78
|
+
connecting = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function createOrUpdateIntegration(serviceName, oauthData) {
|
|
82
|
+
if (!$workspaceStore)
|
|
83
|
+
return;
|
|
84
|
+
try {
|
|
85
|
+
await WorkspaceIntegrationService.createNativeTriggerService({
|
|
86
|
+
workspace: $workspaceStore,
|
|
87
|
+
serviceName: serviceName,
|
|
88
|
+
requestBody: oauthData
|
|
89
|
+
});
|
|
90
|
+
sendUserToast(`${supportedServices[serviceName]?.displayName} configuration saved successfully`);
|
|
91
|
+
loadIntegrations();
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
sendUserToast(`Failed to configure ${supportedServices[serviceName]?.displayName}: ${err.message}`, true);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function isConfigured(integration) {
|
|
98
|
+
return (integration.oauth_data !== null &&
|
|
99
|
+
!!integration.oauth_data.client_id &&
|
|
100
|
+
!!integration.oauth_data.client_secret &&
|
|
101
|
+
!!integration.oauth_data.base_url);
|
|
102
|
+
}
|
|
103
|
+
function isConnected(integration) {
|
|
104
|
+
return isConfigured(integration) && !!integration.oauth_data?.access_token;
|
|
105
|
+
}
|
|
106
|
+
function getIntegrationByService(serviceName) {
|
|
107
|
+
return integrations.find((integration) => integration.service_name === serviceName) || null;
|
|
108
|
+
}
|
|
109
|
+
async function handleOAuthCallback(workspace, serviceName, code, state) {
|
|
110
|
+
console.log({ workspace, serviceName, code, state });
|
|
111
|
+
processingCallback = true;
|
|
112
|
+
try {
|
|
113
|
+
if (serviceName) {
|
|
114
|
+
await WorkspaceIntegrationService.nativeTriggerServiceCallback({
|
|
115
|
+
serviceName,
|
|
116
|
+
workspace,
|
|
117
|
+
code,
|
|
118
|
+
state,
|
|
119
|
+
requestBody: { redirect_uri: $page.url.toString() }
|
|
120
|
+
});
|
|
121
|
+
sendUserToast(`${supportedServices[serviceName]?.displayName} connected successfully!`);
|
|
122
|
+
await loadIntegrations();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
sendUserToast(`Could not handle callback missing service query args`, true);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
sendUserToast(`Failed to complete OAuth connection: ${err.message}`, true);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
const url = new URL($page.url);
|
|
133
|
+
url.searchParams.delete('code');
|
|
134
|
+
url.searchParams.delete('state');
|
|
135
|
+
url.searchParams.delete('service');
|
|
136
|
+
url.searchParams.delete('workspace');
|
|
137
|
+
processingCallback = false;
|
|
138
|
+
goto(url.toString(), { replaceState: true, noScroll: true, keepFocus: true });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
$effect(() => {
|
|
142
|
+
if ($page.url.searchParams.has('code') &&
|
|
143
|
+
$page.url.searchParams.has('state') &&
|
|
144
|
+
$page.url.searchParams.has('workspace') &&
|
|
145
|
+
$page.url.searchParams.has('service')) {
|
|
146
|
+
const service = $page.url.searchParams.get('service');
|
|
147
|
+
const workspace = $page.url.searchParams.get('workspace');
|
|
148
|
+
const code = $page.url.searchParams.get('code');
|
|
149
|
+
const state = $page.url.searchParams.get('state');
|
|
150
|
+
handleOAuthCallback(workspace, service, code, state);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
let redirectUri = $state('');
|
|
154
|
+
$effect(() => {
|
|
155
|
+
if ($workspaceStore) {
|
|
156
|
+
loadIntegrations();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<div class="flex flex-col gap-6 my-8">
|
|
162
|
+
<div class="flex flex-col gap-1">
|
|
163
|
+
<div class="text-sm font-semibold text-emphasis">Native Triggers (Beta)</div>
|
|
164
|
+
<Description>
|
|
165
|
+
Connect your workspace to external services for native triggers and enhanced functionality.
|
|
166
|
+
These connections are shared across all workspace members and are required for native triggers
|
|
167
|
+
to work.
|
|
168
|
+
</Description>
|
|
169
|
+
<Description link="https://www.windmill.dev/docs/integrations/native-triggers">
|
|
170
|
+
Learn more about native triggers and workspace integrations.
|
|
171
|
+
</Description>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<Alert type="warning" title="Beta Feature">
|
|
175
|
+
<p>Native Triggers is currently in beta. Nextcloud integration requires:</p>
|
|
176
|
+
<ul class="list-disc pl-4 mt-2 space-y-1">
|
|
177
|
+
<li>
|
|
178
|
+
<a
|
|
179
|
+
href="https://docs.nextcloud.com/server/latest/admin_manual/installation/source_installation.html#pretty-urls"
|
|
180
|
+
target="_blank"
|
|
181
|
+
rel="noopener noreferrer"
|
|
182
|
+
class="underline hover:text-blue-600"
|
|
183
|
+
>
|
|
184
|
+
Pretty URLs
|
|
185
|
+
</a>
|
|
186
|
+
to be enabled on your Nextcloud instance.
|
|
187
|
+
</li>
|
|
188
|
+
<li>The Windmill integration app to be installed on your Nextcloud instance (not yet released).</li>
|
|
189
|
+
</ul>
|
|
190
|
+
</Alert>
|
|
191
|
+
|
|
192
|
+
{#if processingCallback}
|
|
193
|
+
<Alert type="info" title="Processing OAuth connection">
|
|
194
|
+
<p class="text-sm">Completing your OAuth connection, please wait...</p>
|
|
195
|
+
</Alert>
|
|
196
|
+
{:else if loading}
|
|
197
|
+
<div class="space-y-4">
|
|
198
|
+
{#each new Array(3) as _}
|
|
199
|
+
<Skeleton layout={[[6], 0.4]} />
|
|
200
|
+
{/each}
|
|
201
|
+
</div>
|
|
202
|
+
{:else}
|
|
203
|
+
<div class="space-y-4">
|
|
204
|
+
{#each Object.entries(supportedServices) as [serviceName, config]}
|
|
205
|
+
{@const integration = getIntegrationByService(serviceName)}
|
|
206
|
+
{@const isConnecting = connecting === serviceName}
|
|
207
|
+
{@const isOAuthConfigured = integration && isConfigured(integration)}
|
|
208
|
+
{@const isServiceConnected = integration && isConnected(integration)}
|
|
209
|
+
{@const isShowingConfig = showingConfig === serviceName}
|
|
210
|
+
|
|
211
|
+
<div class="border border-gray-200 dark:border-gray-700 rounded-lg p-4 bg-surface">
|
|
212
|
+
<div class="flex items-center justify-between">
|
|
213
|
+
<div class="flex items-center gap-3">
|
|
214
|
+
<div class="w-8 h-8 flex items-center justify-center">
|
|
215
|
+
<config.icon class="w-6 h-6" />
|
|
216
|
+
</div>
|
|
217
|
+
<div class="flex flex-col">
|
|
218
|
+
<div class="text-sm font-semibold text-emphasis">{config.displayName}</div>
|
|
219
|
+
<div class="text-xs font-normal text-primary">{config.description}</div>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
|
|
223
|
+
<div class="flex items-center gap-2">
|
|
224
|
+
{#if isServiceConnected}
|
|
225
|
+
<div class="flex items-center gap-1 text-green-600 text-xs">
|
|
226
|
+
<Check size={16} />
|
|
227
|
+
<span class="font-semibold">Connected</span>
|
|
228
|
+
</div>
|
|
229
|
+
<Button
|
|
230
|
+
onclick={() => connectService(serviceName, redirectUri)}
|
|
231
|
+
disabled={isConnecting}
|
|
232
|
+
startIcon={{ icon: Plug }}
|
|
233
|
+
>
|
|
234
|
+
{isConnecting ? 'Reconnecting...' : 'Reconnect'}
|
|
235
|
+
</Button>
|
|
236
|
+
<Button
|
|
237
|
+
destructive
|
|
238
|
+
onclick={() => deleteIntegration(serviceName)}
|
|
239
|
+
startIcon={{ icon: X }}
|
|
240
|
+
>
|
|
241
|
+
Delete
|
|
242
|
+
</Button>
|
|
243
|
+
{:else if isOAuthConfigured}
|
|
244
|
+
<Button
|
|
245
|
+
variant="accent"
|
|
246
|
+
onclick={() => connectService(serviceName, redirectUri)}
|
|
247
|
+
disabled={isConnecting}
|
|
248
|
+
startIcon={{ icon: Plug }}
|
|
249
|
+
>
|
|
250
|
+
{isConnecting ? 'Connecting...' : 'Connect'}
|
|
251
|
+
</Button>
|
|
252
|
+
<Button
|
|
253
|
+
destructive
|
|
254
|
+
onclick={() => deleteIntegration(serviceName)}
|
|
255
|
+
startIcon={{ icon: X }}
|
|
256
|
+
>
|
|
257
|
+
Delete
|
|
258
|
+
</Button>
|
|
259
|
+
{:else}
|
|
260
|
+
<Button
|
|
261
|
+
variant="accent"
|
|
262
|
+
onclick={() =>
|
|
263
|
+
(showingConfig = showingConfig === serviceName ? null : serviceName)}
|
|
264
|
+
startIcon={{ icon: Cog }}
|
|
265
|
+
>
|
|
266
|
+
Configure OAuth
|
|
267
|
+
</Button>
|
|
268
|
+
{/if}
|
|
269
|
+
|
|
270
|
+
{#if config.docsUrl}
|
|
271
|
+
<Button href={config.docsUrl} target="_blank" startIcon={{ icon: ExternalLink }}>
|
|
272
|
+
Docs
|
|
273
|
+
</Button>
|
|
274
|
+
{/if}
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
|
|
278
|
+
{#if isShowingConfig}
|
|
279
|
+
<div class="mt-3 pt-3 border-t border-gray-200 dark:border-gray-700">
|
|
280
|
+
<OAuthClientConfig
|
|
281
|
+
{serviceName}
|
|
282
|
+
bind:redirectUri
|
|
283
|
+
serviceDisplayName={config.displayName}
|
|
284
|
+
existingConfig={integration?.oauth_data}
|
|
285
|
+
onConfigSaved={async (oauthData) => {
|
|
286
|
+
await createOrUpdateIntegration(serviceName, oauthData)
|
|
287
|
+
showingConfig = null
|
|
288
|
+
}}
|
|
289
|
+
/>
|
|
290
|
+
</div>
|
|
291
|
+
{/if}
|
|
292
|
+
</div>
|
|
293
|
+
{/each}
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
{#if integrations.length === 0}
|
|
297
|
+
<Alert type="warning" title="No Integrations Connected">
|
|
298
|
+
Connect to external services above to enable native triggers for your workspace.
|
|
299
|
+
</Alert>
|
|
300
|
+
{/if}
|
|
301
|
+
{/if}
|
|
302
|
+
</div>
|
package/package/consts.js
CHANGED