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
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type DBSchema } from '../stores';
|
|
2
|
-
import { type ColumnDef
|
|
2
|
+
import { type ColumnDef } from './apps/components/display/dbtable/utils';
|
|
3
3
|
import type { IDbSchemaOps, IDbTableOps } from './dbOps';
|
|
4
4
|
import type { DbType } from './dbTypes';
|
|
5
5
|
import type { Snippet } from 'svelte';
|
|
6
|
+
import type { DbFeatures } from './apps/components/display/dbtable/dbFeatures';
|
|
6
7
|
/** Represents a selected table with its schema */
|
|
7
8
|
export interface SelectedTable {
|
|
8
9
|
schema: string;
|
|
@@ -12,7 +13,7 @@ type Props = {
|
|
|
12
13
|
dbType: DbType;
|
|
13
14
|
dbSchema: DBSchema;
|
|
14
15
|
dbSupportsSchemas: boolean;
|
|
15
|
-
|
|
16
|
+
colDefs: Record<string, ColumnDef[]> | undefined;
|
|
16
17
|
dbTableOpsFactory: (params: {
|
|
17
18
|
colDefs: ColumnDef[];
|
|
18
19
|
tableKey: string;
|
|
@@ -32,6 +33,15 @@ type Props = {
|
|
|
32
33
|
disabledTables?: SelectedTable[];
|
|
33
34
|
features?: DbFeatures;
|
|
34
35
|
};
|
|
35
|
-
declare const DBManager: import("svelte").Component<Props, {
|
|
36
|
+
declare const DBManager: import("svelte").Component<Props, {
|
|
37
|
+
dbTable: () => ({
|
|
38
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
39
|
+
$set?(props: Partial<{
|
|
40
|
+
dbTableOps: IDbTableOps;
|
|
41
|
+
}>): void;
|
|
42
|
+
} & {
|
|
43
|
+
refresh: () => number;
|
|
44
|
+
}) | undefined;
|
|
45
|
+
}, "selectedSchemaKey" | "selectedTableKey" | "selectedTables">;
|
|
36
46
|
type DBManager = ReturnType<typeof DBManager>;
|
|
37
47
|
export default DBManager;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
<script lang="ts">import { dbSchemas, workspaceStore } from '../stores';
|
|
2
2
|
import { sendUserToast, sortArray } from '../utils';
|
|
3
3
|
import { Loader2 } from 'lucide-svelte';
|
|
4
|
-
import { dbSupportsSchemas
|
|
4
|
+
import { dbSupportsSchemas } from './apps/components/display/dbtable/utils';
|
|
5
5
|
import DbManager from './DBManager.svelte';
|
|
6
6
|
import { dbSchemaOpsWithPreviewScripts, dbTableOpsWithPreviewScripts, getDbType, getDucklakeSchema } from './dbOps';
|
|
7
7
|
import { Pane, Splitpanes } from 'svelte-splitpanes';
|
|
8
8
|
import SqlRepl from './SqlRepl.svelte';
|
|
9
9
|
import SimpleAgTable from './SimpleAgTable.svelte';
|
|
10
|
-
import {
|
|
11
|
-
import { getDbSchemas, loadAllTablesMetaData
|
|
12
|
-
|
|
10
|
+
import {} from 'svelte';
|
|
11
|
+
import { getDbSchemas, loadAllTablesMetaData } from './apps/components/display/dbtable/metadata';
|
|
12
|
+
import { getDbFeatures } from './apps/components/display/dbtable/dbFeatures';
|
|
13
|
+
import { resource } from 'runed';
|
|
14
|
+
let { input, showRepl = true, hasReplResult = $bindable(false), selectedSchemaKey = $bindable(undefined), selectedTableKey = $bindable(undefined), dbSelector, multiSelectMode = false, selectedTables = $bindable([]), disabledTables = [] } = $props();
|
|
13
15
|
let dbSchema = $derived(input && $dbSchemas[getDbSchemasPath(input)]);
|
|
14
16
|
function getDbSchemasPath(input) {
|
|
15
17
|
switch (input.type) {
|
|
@@ -19,39 +21,17 @@ function getDbSchemasPath(input) {
|
|
|
19
21
|
return 'ducklake://' + input.ducklake;
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
untrack(() => (refreshCount += 1));
|
|
27
|
-
});
|
|
28
|
-
let refreshing = $state(false);
|
|
29
|
-
$effect(() => {
|
|
30
|
-
if (refreshing)
|
|
31
|
-
getSchema();
|
|
32
|
-
});
|
|
33
|
-
// Sync refreshing state with bindable prop
|
|
34
|
-
$effect(() => {
|
|
35
|
-
isRefreshing = refreshing;
|
|
36
|
-
});
|
|
37
|
-
export const refresh = () => !refreshing && (refreshing = true);
|
|
38
|
-
// Initial schema load
|
|
39
|
-
$effect(() => {
|
|
40
|
-
if (input) {
|
|
41
|
-
untrack(() => getSchema());
|
|
42
|
-
}
|
|
24
|
+
let colDefs = resource(() => [input], async () => {
|
|
25
|
+
if (!input)
|
|
26
|
+
return;
|
|
27
|
+
return await loadAllTablesMetaData($workspaceStore, input);
|
|
43
28
|
});
|
|
44
|
-
|
|
29
|
+
let dbSchemasPromise = resource(() => [input], async () => {
|
|
45
30
|
if (!input)
|
|
46
31
|
return;
|
|
47
32
|
const dbSchemasPath = getDbSchemasPath(input);
|
|
48
|
-
if ($dbSchemas[dbSchemasPath] && !refreshing)
|
|
49
|
-
return;
|
|
50
|
-
const oldDbSchema = $dbSchemas[dbSchemasPath];
|
|
51
33
|
if (input.type == 'database') {
|
|
52
|
-
await getDbSchemas(input.resourceType, input.resourcePath, $workspaceStore,
|
|
53
|
-
sendUserToast(message, true);
|
|
54
|
-
});
|
|
34
|
+
$dbSchemas[dbSchemasPath] = await getDbSchemas(input.resourceType, input.resourcePath, $workspaceStore, (message) => sendUserToast(message, true));
|
|
55
35
|
}
|
|
56
36
|
else if (input.type == 'ducklake') {
|
|
57
37
|
$dbSchemas[dbSchemasPath] = await getDucklakeSchema({
|
|
@@ -59,11 +39,13 @@ async function getSchema() {
|
|
|
59
39
|
ducklake: input.ducklake
|
|
60
40
|
});
|
|
61
41
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
42
|
+
});
|
|
43
|
+
export const refresh = () => {
|
|
44
|
+
colDefs.refetch();
|
|
45
|
+
dbSchemasPromise.refetch();
|
|
46
|
+
};
|
|
47
|
+
export function isLoading() {
|
|
48
|
+
return colDefs.loading || dbSchemasPromise.loading;
|
|
67
49
|
}
|
|
68
50
|
let replPanelSize = $state(36);
|
|
69
51
|
const REPL_MIN_SIZE = 1.5;
|
|
@@ -72,34 +54,12 @@ let replResultData = $state(undefined);
|
|
|
72
54
|
$effect(() => {
|
|
73
55
|
hasReplResult = !!replResultData;
|
|
74
56
|
});
|
|
75
|
-
let cachedColDefs = {};
|
|
76
|
-
let cachedLastRefreshCount = 0;
|
|
77
|
-
async function getColDefs(tableKey) {
|
|
78
|
-
if (cachedLastRefreshCount !== refreshCount)
|
|
79
|
-
cachedColDefs = {};
|
|
80
|
-
cachedLastRefreshCount = refreshCount;
|
|
81
|
-
if (cachedColDefs[tableKey])
|
|
82
|
-
return cachedColDefs[tableKey];
|
|
83
|
-
if (!input)
|
|
84
|
-
return [];
|
|
85
|
-
try {
|
|
86
|
-
cachedColDefs = (await loadAllTablesMetaData($workspaceStore, input)) ?? cachedColDefs;
|
|
87
|
-
return cachedColDefs[tableKey];
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
if (input?.type == 'ducklake')
|
|
91
|
-
throw 'Impossible that loadAllTablesMetaData fails for Ducklake';
|
|
92
|
-
// Query is not implemented for all dbs, need a fallback
|
|
93
|
-
const result = await loadTableMetaData(input, $workspaceStore, tableKey);
|
|
94
|
-
if (result)
|
|
95
|
-
cachedColDefs[tableKey] = result;
|
|
96
|
-
return result ?? [];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
57
|
// Export for parent components
|
|
100
58
|
export function clearReplResult() {
|
|
101
59
|
replResultData = undefined;
|
|
102
60
|
}
|
|
61
|
+
let _dbManager = $state();
|
|
62
|
+
export const dbManager = () => _dbManager;
|
|
103
63
|
</script>
|
|
104
64
|
|
|
105
65
|
<svelte:window
|
|
@@ -140,7 +100,7 @@ export function clearReplResult() {
|
|
|
140
100
|
<DbManager
|
|
141
101
|
dbSupportsSchemas={input?.type == 'database' && dbSupportsSchemas(input.resourceType)}
|
|
142
102
|
{dbSchema}
|
|
143
|
-
{
|
|
103
|
+
colDefs={colDefs.current}
|
|
144
104
|
dbTableOpsFactory={({ colDefs, tableKey }) =>
|
|
145
105
|
dbTableOpsWithPreviewScripts({
|
|
146
106
|
colDefs,
|
|
@@ -161,6 +121,7 @@ export function clearReplResult() {
|
|
|
161
121
|
bind:selectedTableKey
|
|
162
122
|
{multiSelectMode}
|
|
163
123
|
bind:selectedTables
|
|
124
|
+
bind:this={_dbManager}
|
|
164
125
|
{disabledTables}
|
|
165
126
|
features={getDbFeatures(input)}
|
|
166
127
|
/>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DBSchema } from '../stores';
|
|
1
2
|
import { type Snippet } from 'svelte';
|
|
2
3
|
import type { DbInput } from './dbTypes';
|
|
3
4
|
import type { SelectedTable } from './DBManager.svelte';
|
|
@@ -5,7 +6,6 @@ interface Props {
|
|
|
5
6
|
input?: DbInput;
|
|
6
7
|
showRepl?: boolean;
|
|
7
8
|
hasReplResult?: boolean;
|
|
8
|
-
isRefreshing?: boolean;
|
|
9
9
|
selectedSchemaKey?: string | undefined;
|
|
10
10
|
selectedTableKey?: string | undefined;
|
|
11
11
|
dbSelector?: Snippet<[]>;
|
|
@@ -17,8 +17,42 @@ interface Props {
|
|
|
17
17
|
disabledTables?: SelectedTable[];
|
|
18
18
|
}
|
|
19
19
|
declare const DBManagerContent: import("svelte").Component<Props, {
|
|
20
|
-
refresh: () =>
|
|
20
|
+
refresh: () => void;
|
|
21
|
+
isLoading: () => boolean;
|
|
21
22
|
clearReplResult: () => void;
|
|
22
|
-
|
|
23
|
+
dbManager: () => ({
|
|
24
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
25
|
+
$set?(props: Partial<{
|
|
26
|
+
dbType: import("./dbTypes").DbType;
|
|
27
|
+
dbSchema: DBSchema;
|
|
28
|
+
dbSupportsSchemas: boolean;
|
|
29
|
+
colDefs: Record<string, import("./apps/components/display/dbtable/utils").ColumnDef[]> | undefined;
|
|
30
|
+
dbTableOpsFactory: (params: {
|
|
31
|
+
colDefs: import("./apps/components/display/dbtable/utils").ColumnDef[];
|
|
32
|
+
tableKey: string;
|
|
33
|
+
}) => import("./dbOps").IDbTableOps;
|
|
34
|
+
dbSchemaOps: import("./dbOps").IDbSchemaOps;
|
|
35
|
+
refresh?: () => void;
|
|
36
|
+
initialSchemaKey?: string;
|
|
37
|
+
initialTableKey?: string;
|
|
38
|
+
selectedSchemaKey?: string | undefined;
|
|
39
|
+
selectedTableKey?: string | undefined;
|
|
40
|
+
dbSelector?: Snippet<[]>;
|
|
41
|
+
multiSelectMode?: boolean;
|
|
42
|
+
selectedTables?: SelectedTable[];
|
|
43
|
+
disabledTables?: SelectedTable[];
|
|
44
|
+
features?: import("./apps/components/display/dbtable/dbFeatures").DbFeatures;
|
|
45
|
+
}>): void;
|
|
46
|
+
} & {
|
|
47
|
+
dbTable: () => ({
|
|
48
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
49
|
+
$set?(props: Partial<{
|
|
50
|
+
dbTableOps: import("./dbOps").IDbTableOps;
|
|
51
|
+
}>): void;
|
|
52
|
+
} & {
|
|
53
|
+
refresh: () => number;
|
|
54
|
+
}) | undefined;
|
|
55
|
+
}) | undefined;
|
|
56
|
+
}, "selectedSchemaKey" | "selectedTableKey" | "selectedTables" | "hasReplResult">;
|
|
23
57
|
type DBManagerContent = ReturnType<typeof DBManagerContent>;
|
|
24
58
|
export default DBManagerContent;
|
|
@@ -68,7 +68,6 @@ $effect(() => {
|
|
|
68
68
|
});
|
|
69
69
|
let dbManagerContent = $state();
|
|
70
70
|
let hasReplResult = $state(false);
|
|
71
|
-
let isRefreshing = $state(false);
|
|
72
71
|
</script>
|
|
73
72
|
|
|
74
73
|
<svelte:window bind:innerWidth={windowWidth} />
|
|
@@ -91,15 +90,11 @@ let isRefreshing = $state(false);
|
|
|
91
90
|
}}
|
|
92
91
|
CloseIcon={hasReplResult ? ArrowLeft : undefined}
|
|
93
92
|
noPadding
|
|
93
|
+
id="db-manager-drawer"
|
|
94
94
|
>
|
|
95
95
|
{#if effectiveInput && $workspaceStore}
|
|
96
96
|
{#key selectedDatatable}
|
|
97
|
-
<DBManagerContent
|
|
98
|
-
bind:this={dbManagerContent}
|
|
99
|
-
input={effectiveInput}
|
|
100
|
-
bind:hasReplResult
|
|
101
|
-
bind:isRefreshing
|
|
102
|
-
>
|
|
97
|
+
<DBManagerContent bind:this={dbManagerContent} input={effectiveInput} bind:hasReplResult>
|
|
103
98
|
{#snippet dbSelector()}
|
|
104
99
|
{#if isDatatableInput}
|
|
105
100
|
{#if datatables.loading}
|
|
@@ -123,8 +118,11 @@ let isRefreshing = $state(false);
|
|
|
123
118
|
{/if}
|
|
124
119
|
{#snippet actions()}
|
|
125
120
|
<Button
|
|
126
|
-
loading={
|
|
127
|
-
on:click={() =>
|
|
121
|
+
loading={dbManagerContent?.isLoading() ?? false}
|
|
122
|
+
on:click={() => {
|
|
123
|
+
dbManagerContent?.refresh()
|
|
124
|
+
dbManagerContent?.dbManager()?.dbTable()?.refresh()
|
|
125
|
+
}}
|
|
128
126
|
startIcon={{ icon: RefreshCcw }}
|
|
129
127
|
size="xs"
|
|
130
128
|
color="light"
|
|
@@ -37,7 +37,7 @@ let datasource = {
|
|
|
37
37
|
};
|
|
38
38
|
let rowCount = $state(0);
|
|
39
39
|
let refreshCount = $state(0);
|
|
40
|
-
const refresh = () => (refreshCount += 1);
|
|
40
|
+
export const refresh = () => (refreshCount += 1);
|
|
41
41
|
$effect(() => eGui && untrack(() => mountGrid()));
|
|
42
42
|
function mountGrid() {
|
|
43
43
|
if (eGui && !api) {
|
|
@@ -5,6 +5,8 @@ import './apps/components/display/table/theme/windmill-theme.css';
|
|
|
5
5
|
type Props = {
|
|
6
6
|
dbTableOps: IDbTableOps;
|
|
7
7
|
};
|
|
8
|
-
declare const DBTable: import("svelte").Component<Props, {
|
|
8
|
+
declare const DBTable: import("svelte").Component<Props, {
|
|
9
|
+
refresh: () => number;
|
|
10
|
+
}, "">;
|
|
9
11
|
type DBTable = ReturnType<typeof DBTable>;
|
|
10
12
|
export default DBTable;
|
|
@@ -28,15 +28,14 @@ function validate(values, dbSchema) {
|
|
|
28
28
|
}
|
|
29
29
|
</script>
|
|
30
30
|
|
|
31
|
-
<script lang="ts">import { ArrowRight, ClipboardCopy,
|
|
31
|
+
<script lang="ts">import { ArrowRight, ClipboardCopy, Plus, Settings, X } from 'lucide-svelte';
|
|
32
32
|
import { Button } from './common';
|
|
33
33
|
import { Cell } from './table';
|
|
34
34
|
import DataTable from './table/DataTable.svelte';
|
|
35
35
|
import Head from './table/Head.svelte';
|
|
36
|
-
import { datatypeHasLength
|
|
36
|
+
import { datatypeHasLength } from './apps/components/display/dbtable/utils';
|
|
37
37
|
import { DB_TYPES } from '../consts';
|
|
38
38
|
import Popover from './meltComponents/Popover.svelte';
|
|
39
|
-
import Tooltip from './meltComponents/Tooltip.svelte';
|
|
40
39
|
import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte';
|
|
41
40
|
import { sendUserToast } from '../toast';
|
|
42
41
|
import { copyToClipboard } from '../utils';
|
|
@@ -50,6 +49,7 @@ import Portal from './Portal.svelte';
|
|
|
50
49
|
import { Debounced } from 'runed';
|
|
51
50
|
import { datatypeDefaultLength } from './apps/components/display/dbtable/tableEditor';
|
|
52
51
|
import Alert from './common/alert/Alert.svelte';
|
|
52
|
+
import Label from './Label.svelte';
|
|
53
53
|
const { dbType, dbSchema, currentSchema, initialValues, features, onConfirm, computeBtnProps, computePreview } = $props();
|
|
54
54
|
const columnTypes = DB_TYPES[dbType];
|
|
55
55
|
const defaultColumnType = {
|
|
@@ -72,8 +72,7 @@ function addColumn({ name, primaryKey }) {
|
|
|
72
72
|
...(datatypeHasLength(defaultColumnType) && {
|
|
73
73
|
datatype_length: datatypeDefaultLength(defaultColumnType)
|
|
74
74
|
}),
|
|
75
|
-
...(primaryKey && { primaryKey })
|
|
76
|
-
...(!features?.defaultToNotNull && { nullable: true })
|
|
75
|
+
...(primaryKey && { primaryKey })
|
|
77
76
|
});
|
|
78
77
|
}
|
|
79
78
|
if (!initialValues) {
|
|
@@ -98,7 +97,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
98
97
|
/>
|
|
99
98
|
</label>
|
|
100
99
|
|
|
101
|
-
<div class="flex flex-col">
|
|
100
|
+
<div class="flex flex-col" id="columns-section">
|
|
102
101
|
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
103
102
|
<label>Columns</label>
|
|
104
103
|
<DataTable>
|
|
@@ -162,11 +161,19 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
162
161
|
</Cell>
|
|
163
162
|
<Cell last class="flex items-center mt-1.5">
|
|
164
163
|
{#if features?.primaryKeys}
|
|
165
|
-
<input
|
|
164
|
+
<input
|
|
165
|
+
type="checkbox"
|
|
166
|
+
class="!w-4 !h-4 primary-key-checkbox"
|
|
167
|
+
bind:checked={column.primaryKey}
|
|
168
|
+
/>
|
|
166
169
|
{/if}
|
|
167
|
-
<Popover
|
|
170
|
+
<Popover
|
|
171
|
+
class="ml-8"
|
|
172
|
+
contentClasses="py-3 px-5 flex flex-col gap-6"
|
|
173
|
+
enableFlyTransition
|
|
174
|
+
>
|
|
168
175
|
{#snippet trigger()}
|
|
169
|
-
<Settings size={18} />
|
|
176
|
+
<Settings size={18} class="settings-menu-btn" />
|
|
170
177
|
{/snippet}
|
|
171
178
|
{#snippet content()}
|
|
172
179
|
{#if datatypeHasLength(column.datatype)}
|
|
@@ -176,27 +183,26 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
176
183
|
</label>
|
|
177
184
|
{/if}
|
|
178
185
|
{#if features?.defaultValues}
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
{/snippet}
|
|
192
|
-
</Tooltip>
|
|
193
|
-
</span>
|
|
194
|
-
<input type="text" placeholder="NULL" bind:value={column.defaultValue} />
|
|
195
|
-
</label>
|
|
186
|
+
<Label
|
|
187
|
+
class="flex gap-1 mb-1"
|
|
188
|
+
label="Default Value"
|
|
189
|
+
tooltip="Parsed as literal by default. Use curly brackets for expressions (e.g. {'{NOW()}'} )."
|
|
190
|
+
>
|
|
191
|
+
<input
|
|
192
|
+
class="default-value"
|
|
193
|
+
type="text"
|
|
194
|
+
placeholder="NULL"
|
|
195
|
+
bind:value={column.defaultValue}
|
|
196
|
+
/>
|
|
197
|
+
</Label>
|
|
196
198
|
{/if}
|
|
197
199
|
{#if !column.primaryKey}
|
|
198
200
|
<label class="flex gap-2 items-center text-xs">
|
|
199
|
-
<input
|
|
201
|
+
<input
|
|
202
|
+
type="checkbox"
|
|
203
|
+
class="nullable-checkbox !w-4 !h-4"
|
|
204
|
+
bind:checked={column.nullable}
|
|
205
|
+
/>
|
|
200
206
|
Nullable
|
|
201
207
|
</label>
|
|
202
208
|
{/if}
|
|
@@ -206,7 +212,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
206
212
|
color="light"
|
|
207
213
|
startIcon={{ icon: X }}
|
|
208
214
|
wrapperClasses="w-fit ml-2"
|
|
209
|
-
btnClasses="p-0"
|
|
215
|
+
btnClasses="delete-column-btn p-0"
|
|
210
216
|
on:click={() => values.columns.splice(i, 1)}
|
|
211
217
|
/>
|
|
212
218
|
</Cell>
|
|
@@ -228,7 +234,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
228
234
|
</DataTable>
|
|
229
235
|
</div>
|
|
230
236
|
{#if features?.foreignKeys}
|
|
231
|
-
<div class="flex flex-col">
|
|
237
|
+
<div class="flex flex-col" id="foreign-keys-section">
|
|
232
238
|
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
233
239
|
<label>Foreign Keys</label>
|
|
234
240
|
<DataTable>
|
|
@@ -244,14 +250,15 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
244
250
|
<tr>
|
|
245
251
|
<Cell first class="flex">
|
|
246
252
|
<Select
|
|
247
|
-
inputClass={twMerge('!w-48')}
|
|
253
|
+
inputClass={twMerge('fk-table-select !w-48')}
|
|
248
254
|
error={fkErrors?.emptyTarget}
|
|
249
255
|
placeholder=""
|
|
250
256
|
bind:value={foreignKey.targetTable}
|
|
251
257
|
items={getFlatTableNamesFromSchema(dbSchema).map((o) => ({
|
|
252
258
|
value: o,
|
|
253
259
|
label:
|
|
254
|
-
|
|
260
|
+
!features?.schemas ||
|
|
261
|
+
(currentSchema && o.toLowerCase().startsWith(currentSchema.toLowerCase()))
|
|
255
262
|
? o.split('.')[1]
|
|
256
263
|
: o
|
|
257
264
|
}))}
|
|
@@ -266,7 +273,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
266
273
|
from x-overflowing -->
|
|
267
274
|
<div class="grow h-[2rem] relative">
|
|
268
275
|
<Select
|
|
269
|
-
class="!absolute inset-0"
|
|
276
|
+
class="fk-source-col-select !absolute inset-0"
|
|
270
277
|
error={fkErrors?.nonExistingSourceColumns.includes(
|
|
271
278
|
column.sourceColumn
|
|
272
279
|
)}
|
|
@@ -281,7 +288,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
281
288
|
<ArrowRight size={16} class="h-fit shrink-0" />
|
|
282
289
|
<div class="grow h-[2rem] relative">
|
|
283
290
|
<Select
|
|
284
|
-
class="!absolute inset-0"
|
|
291
|
+
class="fk-target-col-select !absolute inset-0"
|
|
285
292
|
error={fkErrors?.nonExistingTargetColumns.includes(
|
|
286
293
|
column.targetColumn
|
|
287
294
|
)}
|
|
@@ -297,26 +304,35 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
297
304
|
</div>
|
|
298
305
|
</div>
|
|
299
306
|
<div class="ml-auto flex">
|
|
300
|
-
{#if columnIndex === 0}
|
|
301
|
-
<Popover
|
|
307
|
+
{#if columnIndex === 0 && features.enforcedForeignKeys}
|
|
308
|
+
<Popover
|
|
309
|
+
contentClasses="py-3 px-5 w-52 flex flex-col gap-4"
|
|
310
|
+
enableFlyTransition
|
|
311
|
+
>
|
|
302
312
|
{#snippet trigger()}
|
|
303
|
-
<Settings size={18} />
|
|
313
|
+
<Settings class="fk-settings-btn" size={18} />
|
|
304
314
|
{/snippet}
|
|
305
315
|
{#snippet content()}
|
|
306
|
-
<
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
316
|
+
<Label label="On delete">
|
|
317
|
+
<select
|
|
318
|
+
class="fk-on-delete-select"
|
|
319
|
+
bind:value={foreignKey.onDelete}
|
|
320
|
+
>
|
|
321
|
+
<option value="NO ACTION" selected>No action</option>
|
|
322
|
+
<option value="CASCADE" selected>Cascade</option>
|
|
323
|
+
<option value="SET NULL" selected>Set null</option>
|
|
311
324
|
</select>
|
|
312
|
-
</
|
|
313
|
-
<
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
325
|
+
</Label>
|
|
326
|
+
<Label label="On update">
|
|
327
|
+
<select
|
|
328
|
+
class="fk-on-update-select"
|
|
329
|
+
bind:value={foreignKey.onUpdate}
|
|
330
|
+
>
|
|
331
|
+
<option value="NO ACTION" selected>No action</option>
|
|
332
|
+
<option value="CASCADE" selected>Cascade</option>
|
|
333
|
+
<option value="SET NULL" selected>Set null</option>
|
|
318
334
|
</select>
|
|
319
|
-
</
|
|
335
|
+
</Label>
|
|
320
336
|
{/snippet}
|
|
321
337
|
</Popover>
|
|
322
338
|
{/if}
|
|
@@ -324,7 +340,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
324
340
|
color="light"
|
|
325
341
|
startIcon={{ icon: X }}
|
|
326
342
|
wrapperClasses="w-fit ml-2"
|
|
327
|
-
btnClasses="p-0"
|
|
343
|
+
btnClasses="fk-delete-btn p-0"
|
|
328
344
|
on:click={foreignKey.columns.length > 1
|
|
329
345
|
? () => foreignKey.columns.splice(columnIndex, 1)
|
|
330
346
|
: () => values.foreignKeys.splice(foreignKeyIndex, 1)}
|
|
@@ -394,6 +410,7 @@ let btnProps = new Debounced(() => computeBtnProps({ values }), 500);
|
|
|
394
410
|
|
|
395
411
|
<Portal>
|
|
396
412
|
<ConfirmationModal
|
|
413
|
+
id="db-table-editor-confirmation-modal"
|
|
397
414
|
{...askingForConfirmation ?? { confirmationText: '', title: '' }}
|
|
398
415
|
on:canceled={() => (askingForConfirmation = undefined)}
|
|
399
416
|
on:confirmed={askingForConfirmation?.onConfirm ?? (() => {})}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type DbFeatures } from './apps/components/display/dbtable/utils';
|
|
2
1
|
import { type DBSchema } from '../stores';
|
|
3
2
|
import type { DbType } from './dbTypes';
|
|
4
3
|
import { type TableEditorValues } from './apps/components/display/dbtable/tableEditor';
|
|
4
|
+
import type { DbFeatures } from './apps/components/display/dbtable/dbFeatures';
|
|
5
5
|
type Props = {
|
|
6
6
|
dbType: DbType;
|
|
7
7
|
dbSchema?: DBSchema;
|
|
@@ -1,33 +1,27 @@
|
|
|
1
1
|
<script lang="ts">import { createEventDispatcher } from 'svelte';
|
|
2
2
|
import { format, isValid, parse } from 'date-fns';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export let minDate = undefined;
|
|
7
|
-
export let maxDate = undefined;
|
|
8
|
-
export let dateFormat = 'dd-MM-yyyy';
|
|
9
|
-
export let disabled = false;
|
|
3
|
+
import { createBubbler } from 'svelte/legacy';
|
|
4
|
+
const bubble = createBubbler();
|
|
5
|
+
let { value = $bindable(undefined), autofocus = false, minDate = undefined, maxDate = undefined, dateFormat = 'dd-MM-yyyy', disabled = false } = $props();
|
|
10
6
|
const defaultDateFormat = 'dd-MM-yyyy';
|
|
11
7
|
const defaultHtmlDateFormat = 'yyyy-MM-dd';
|
|
12
|
-
|
|
8
|
+
// Ensure we always have a valid format (prop can be undefined or empty string)
|
|
9
|
+
function getFormat() {
|
|
10
|
+
return dateFormat && dateFormat.length > 0 ? dateFormat : defaultDateFormat;
|
|
11
|
+
}
|
|
13
12
|
const dispatch = createEventDispatcher();
|
|
14
|
-
function computeDate(
|
|
15
|
-
if (
|
|
16
|
-
dateFormat = defaultDateFormat;
|
|
17
|
-
}
|
|
18
|
-
if (value && value.length > 0) {
|
|
13
|
+
function computeDate(v, formatStr) {
|
|
14
|
+
if (v && v.length > 0) {
|
|
19
15
|
try {
|
|
20
|
-
let
|
|
21
|
-
if (
|
|
16
|
+
let parsedDate = parse(v, formatStr, new Date());
|
|
17
|
+
if (parsedDate.toString() === 'Invalid Date') {
|
|
22
18
|
console.debug('falling back to default html date format');
|
|
23
|
-
|
|
19
|
+
parsedDate = parse(v, defaultHtmlDateFormat, new Date());
|
|
24
20
|
}
|
|
25
|
-
|
|
26
|
-
return res;
|
|
21
|
+
return format(parsedDate, defaultHtmlDateFormat);
|
|
27
22
|
}
|
|
28
23
|
catch (error) {
|
|
29
|
-
|
|
30
|
-
console.error(`Failed to parse date: ${value}`, error);
|
|
24
|
+
console.error(`Failed to parse date: ${v} with format ${formatStr}`, error);
|
|
31
25
|
return undefined;
|
|
32
26
|
}
|
|
33
27
|
}
|
|
@@ -35,42 +29,42 @@ function computeDate(value) {
|
|
|
35
29
|
return undefined;
|
|
36
30
|
}
|
|
37
31
|
}
|
|
32
|
+
let date = $derived(computeDate(value, getFormat()));
|
|
38
33
|
function updateValue(newDate) {
|
|
39
34
|
if (newDate && isValid(new Date(newDate))) {
|
|
40
|
-
if (dateFormat === undefined) {
|
|
41
|
-
dateFormat = defaultDateFormat;
|
|
42
|
-
}
|
|
43
35
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const parsedDate = format(dateFromValue, dateFormat);
|
|
36
|
+
const dateFromValue = new Date(newDate + 'T00:00:00');
|
|
37
|
+
const parsedDate = format(dateFromValue, getFormat());
|
|
49
38
|
value = parsedDate;
|
|
50
39
|
dispatch('change', value);
|
|
51
40
|
}
|
|
52
41
|
catch (error) {
|
|
53
42
|
console.error('Failed to parse date:', error);
|
|
54
|
-
return;
|
|
55
43
|
}
|
|
56
44
|
}
|
|
57
45
|
}
|
|
58
46
|
let randomId = 'datetarget-' + Math.random().toString(36).substring(7);
|
|
59
47
|
</script>
|
|
60
48
|
|
|
61
|
-
<div
|
|
62
|
-
|
|
49
|
+
<div
|
|
50
|
+
class="flex flex-row gap-1 items-center w-full"
|
|
51
|
+
id={randomId}
|
|
52
|
+
onpointerdown={bubble('pointerdown')}
|
|
53
|
+
onfocus={bubble('focus')}
|
|
54
|
+
>
|
|
55
|
+
<!-- svelte-ignore a11y_autofocus -->
|
|
63
56
|
<input
|
|
64
57
|
{disabled}
|
|
65
58
|
type="date"
|
|
66
|
-
|
|
59
|
+
value={date}
|
|
67
60
|
{autofocus}
|
|
68
61
|
class="!w-full app-editor-input"
|
|
69
62
|
min={minDate}
|
|
70
63
|
max={maxDate}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
onchange={(e) => {
|
|
65
|
+
const newDate = e.currentTarget.value
|
|
66
|
+
if (newDate) {
|
|
67
|
+
updateValue(newDate)
|
|
74
68
|
} else {
|
|
75
69
|
value = null
|
|
76
70
|
dispatch('change', value)
|