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.
Files changed (254) hide show
  1. package/package/cancelable-promise-utils.js +4 -2
  2. package/package/components/ApiConnectForm.svelte +6 -0
  3. package/package/components/AppConnectDrawer.svelte +1 -0
  4. package/package/components/AppConnectInner.svelte +1 -0
  5. package/package/components/AuthSettings.svelte +3 -1
  6. package/package/components/BedrockCredentialsCheck.svelte +241 -0
  7. package/package/components/BedrockCredentialsCheck.svelte.d.ts +3 -0
  8. package/package/components/CenteredPage.svelte +2 -1
  9. package/package/components/CenteredPage.svelte.d.ts +1 -0
  10. package/package/components/CompareWorkspaces.svelte +74 -16
  11. package/package/components/DBManager.svelte +35 -31
  12. package/package/components/DBManager.svelte.d.ts +13 -3
  13. package/package/components/DBManagerContent.svelte +23 -62
  14. package/package/components/DBManagerContent.svelte.d.ts +37 -3
  15. package/package/components/DBManagerDrawer.svelte +7 -9
  16. package/package/components/DBTable.svelte +1 -1
  17. package/package/components/DBTable.svelte.d.ts +3 -1
  18. package/package/components/DBTableEditor.svelte +66 -49
  19. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  20. package/package/components/DateInput.svelte +29 -35
  21. package/package/components/DateInput.svelte.d.ts +10 -11
  22. package/package/components/DedicatedWorkersSelector.svelte +569 -0
  23. package/package/components/DedicatedWorkersSelector.svelte.d.ts +8 -0
  24. package/package/components/DeployWorkspace.svelte +106 -29
  25. package/package/components/DropdownV2.svelte +2 -1
  26. package/package/components/DropdownV2.svelte.d.ts +1 -0
  27. package/package/components/Editor.svelte +1 -10
  28. package/package/components/FlowGraphViewer.svelte +5 -2
  29. package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
  30. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  31. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  32. package/package/components/FlowStatusViewerInner.svelte +6 -3
  33. package/package/components/ForkWorkspaceBanner.svelte +16 -0
  34. package/package/components/InfiniteList.svelte +27 -20
  35. package/package/components/InfiniteList.svelte.d.ts +2 -0
  36. package/package/components/JobLoader.svelte.d.ts +1 -1
  37. package/package/components/Login.svelte +6 -0
  38. package/package/components/NextcloudSetting.svelte +1 -1
  39. package/package/components/OAuthSetting.svelte +12 -23
  40. package/package/components/PocketIdSetting.svelte +82 -0
  41. package/package/components/PocketIdSetting.svelte.d.ts +6 -0
  42. package/package/components/ResourceEditor.svelte +4 -4
  43. package/package/components/ResourcePicker.svelte +1 -0
  44. package/package/components/RunForm.svelte +9 -17
  45. package/package/components/RunForm.svelte.d.ts +0 -1
  46. package/package/components/RunsPage.svelte +34 -0
  47. package/package/components/SavedInputsPicker.svelte +1 -1
  48. package/package/components/SavedInputsV2.svelte +35 -36
  49. package/package/components/Section.svelte +1 -1
  50. package/package/components/Star.svelte +8 -12
  51. package/package/components/Star.svelte.d.ts +6 -19
  52. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  53. package/package/components/TimeAgo.svelte +49 -7
  54. package/package/components/TimeAgo.svelte.d.ts +1 -0
  55. package/package/components/Toast.svelte +5 -1
  56. package/package/components/WorkerGroup.svelte +35 -20
  57. package/package/components/WorkerGroup.svelte.d.ts +1 -0
  58. package/package/components/apps/components/display/InsertRowDrawerButton.svelte +1 -1
  59. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +2 -1
  60. package/package/components/apps/components/display/dbtable/dbFeatures.d.ts +9 -0
  61. package/package/components/apps/components/display/dbtable/dbFeatures.js +32 -0
  62. package/package/components/apps/components/display/dbtable/metadata.d.ts +3 -3
  63. package/package/components/apps/components/display/dbtable/metadata.js +120 -130
  64. package/package/components/apps/components/display/dbtable/queries/alterTable.js +13 -5
  65. package/package/components/apps/components/display/dbtable/queries/alterTable.test.js +1 -1
  66. package/package/components/apps/components/display/dbtable/queries/createTable.js +2 -0
  67. package/package/components/apps/components/display/dbtable/queries/relationalKeys.d.ts +1 -3
  68. package/package/components/apps/components/display/dbtable/queries/relationalKeys.js +41 -42
  69. package/package/components/apps/components/display/dbtable/tableEditor.js +18 -0
  70. package/package/components/apps/components/display/dbtable/utils.d.ts +1 -8
  71. package/package/components/apps/components/display/dbtable/utils.js +27 -34
  72. package/package/components/apps/components/display/table/AppAggridTable.svelte +8 -0
  73. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +9 -9
  74. package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +1 -1
  75. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +2 -4
  76. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  77. package/package/components/assets/AssetsUsageDrawer.svelte +98 -27
  78. package/package/components/assets/AssetsUsageDrawer.svelte.d.ts +5 -6
  79. package/package/components/assets/lib.d.ts +3 -2
  80. package/package/components/assets/lib.js +3 -1
  81. package/package/components/common/CloseButton.svelte +2 -1
  82. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  83. package/package/components/common/badge/CountBadge.svelte +4 -3
  84. package/package/components/common/badge/CountBadge.svelte.d.ts +1 -0
  85. package/package/components/common/button/Button.svelte +1 -1
  86. package/package/components/common/confirmationModal/ConfirmationModal.svelte +2 -1
  87. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +1 -0
  88. package/package/components/common/drawer/Drawer.svelte +4 -1
  89. package/package/components/common/drawer/DrawerContent.svelte +6 -3
  90. package/package/components/common/drawer/DrawerContent.svelte.d.ts +1 -0
  91. package/package/components/common/modal/Modal2.svelte +1 -0
  92. package/package/components/common/table/AppRow.svelte +4 -1
  93. package/package/components/common/table/FlowRow.svelte +4 -1
  94. package/package/components/common/table/RawAppRow.svelte +4 -1
  95. package/package/components/common/table/Row.svelte +11 -21
  96. package/package/components/common/table/Row.svelte.d.ts +4 -20
  97. package/package/components/common/table/RowIcon.svelte +6 -2
  98. package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
  99. package/package/components/common/table/ScriptRow.svelte +4 -1
  100. package/package/components/copilot/autocomplete/Autocompletor.d.ts +1 -1
  101. package/package/components/copilot/autocomplete/Autocompletor.js +4 -4
  102. package/package/components/copilot/autocomplete/request.js +13 -9
  103. package/package/components/copilot/chat/script/core.js +5 -4
  104. package/package/components/copilot/lib.js +2 -9
  105. package/package/components/copilot/utils.d.ts +5 -0
  106. package/package/components/copilot/utils.js +8 -0
  107. package/package/components/dbOps.d.ts +1 -1
  108. package/package/components/dbOps.js +2 -2
  109. package/package/components/details/DetailPageHeader.svelte +21 -7
  110. package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
  111. package/package/components/details/DetailPageLayout.svelte +10 -1
  112. package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
  113. package/package/components/flows/conversations/FlowConversationsSidebar.svelte +79 -77
  114. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  115. package/package/components/graph/FlowGraphV2.svelte +7 -1
  116. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +41 -24
  117. package/package/components/home/ItemsList.svelte +2 -1
  118. package/package/components/home/treeViewUtils.js +1 -1
  119. package/package/components/icons/NextcloudIcon.svelte +3 -2
  120. package/package/components/icons/NextcloudIcon.svelte.d.ts +2 -0
  121. package/package/components/icons/PocketIdIcon.svelte +9 -0
  122. package/package/components/icons/PocketIdIcon.svelte.d.ts +9 -0
  123. package/package/components/icons/index.js +3 -1
  124. package/package/components/instanceSettings.d.ts +1 -1
  125. package/package/components/instanceSettings.js +1 -0
  126. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -3
  127. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  128. package/package/components/schema/EditableSchemaWrapper.svelte +2 -2
  129. package/package/components/select/MultiSelect.svelte +1 -1
  130. package/package/components/select/SelectDropdown.svelte +15 -3
  131. package/package/components/settings/ChangeWorkspaceId.svelte +8 -7
  132. package/package/components/settings/CreateToken.svelte +3 -3
  133. package/package/components/settings/WorkspaceUserSettings.svelte +6 -5
  134. package/package/components/sidebar/MenuButton.svelte +13 -5
  135. package/package/components/sidebar/MultiplayerMenu.svelte +2 -2
  136. package/package/components/sidebar/SidebarContent.svelte +32 -4
  137. package/package/components/sidebar/UserMenu.svelte +2 -2
  138. package/package/components/table/DataTable.svelte +6 -2
  139. package/package/components/table/DataTable.svelte.d.ts +1 -0
  140. package/package/components/triggers/AddTriggersButton.svelte +17 -4
  141. package/package/components/triggers/TriggersEditor.svelte +4 -0
  142. package/package/components/triggers/TriggersWrapper.svelte +14 -0
  143. package/package/components/triggers/native/NativeTriggerEditor.svelte +379 -0
  144. package/package/components/triggers/native/NativeTriggerEditor.svelte.d.ts +26 -0
  145. package/package/components/triggers/native/NativeTriggerTable.svelte +155 -0
  146. package/package/components/triggers/native/NativeTriggerTable.svelte.d.ts +16 -0
  147. package/package/components/triggers/native/NativeTriggersPanel.svelte +40 -0
  148. package/package/components/triggers/native/NativeTriggersPanel.svelte.d.ts +15 -0
  149. package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte +104 -0
  150. package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte.d.ts +18 -0
  151. package/package/components/triggers/native/utils.d.ts +74 -0
  152. package/package/components/triggers/native/utils.js +152 -0
  153. package/package/components/triggers/triggers.svelte.d.ts +2 -1
  154. package/package/components/triggers/triggers.svelte.js +36 -8
  155. package/package/components/triggers/utils.js +18 -5
  156. package/package/components/triggers.d.ts +1 -1
  157. package/package/components/workspaceSettings/AISettings.svelte +2 -1
  158. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +1 -0
  159. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +3 -1
  160. package/package/components/workspaceSettings/DataTableSettings.svelte +2 -1
  161. package/package/components/workspaceSettings/DucklakeSettings.svelte +8 -3
  162. package/package/components/workspaceSettings/OAuthClientConfig.svelte +180 -0
  163. package/package/components/workspaceSettings/OAuthClientConfig.svelte.d.ts +14 -0
  164. package/package/components/workspaceSettings/StorageSettings.svelte +7 -2
  165. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +302 -0
  166. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte.d.ts +3 -0
  167. package/package/consts.js +0 -2
  168. package/package/gen/core/OpenAPI.js +1 -1
  169. package/package/gen/schemas.gen.d.ts +384 -3
  170. package/package/gen/schemas.gen.js +390 -3
  171. package/package/gen/services.gen.d.ts +200 -13
  172. package/package/gen/services.gen.js +383 -24
  173. package/package/gen/types.gen.d.ts +884 -94
  174. package/package/hub.js +2 -2
  175. package/package/hubPaths.json +1 -1
  176. package/package/refreshUser.d.ts +5 -1
  177. package/package/refreshUser.js +20 -30
  178. package/package/storeUtils.js +2 -0
  179. package/package/svelte5Utils.svelte.d.ts +61 -0
  180. package/package/svelte5Utils.svelte.js +170 -0
  181. package/package/utils.js +3 -0
  182. package/package.json +4 -6
  183. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  184. package/dist/sharedUtils/base.d.ts +0 -1
  185. package/dist/sharedUtils/cloud.d.ts +0 -1
  186. package/dist/sharedUtils/common.d.ts +0 -111
  187. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  188. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  189. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  190. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  191. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  192. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  193. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  194. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  195. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  196. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  197. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  198. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  199. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  200. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  201. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  202. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  203. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  204. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  205. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  206. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  207. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  208. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  209. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  210. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  211. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  212. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  213. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  214. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  215. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  216. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  217. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  218. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  219. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  220. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  221. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  222. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  223. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  224. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  225. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +0 -2
  226. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  227. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  228. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  229. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  230. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  231. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  232. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  233. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  234. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  235. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  236. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  237. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  238. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  239. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  240. package/dist/sharedUtils/gen/index.d.ts +0 -6
  241. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  242. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  243. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  244. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  245. package/dist/sharedUtils/hub.d.ts +0 -49
  246. package/dist/sharedUtils/jsr.json +0 -6
  247. package/dist/sharedUtils/lib.d.ts +0 -5
  248. package/dist/sharedUtils/lib.es.js +0 -1588
  249. package/dist/sharedUtils/package.json +0 -12
  250. package/dist/sharedUtils/schema.d.ts +0 -3
  251. package/dist/sharedUtils/stores.d.ts +0 -97
  252. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  253. package/dist/sharedUtils/toast.d.ts +0 -8
  254. package/dist/sharedUtils/utils.d.ts +0 -265
@@ -1,8 +1,9 @@
1
1
  import { type DBSchema } from '../stores';
2
- import { type ColumnDef, type DbFeatures } from './apps/components/display/dbtable/utils';
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
- getColDefs: (tableKey: string) => Promise<ColumnDef[]>;
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, {}, "selectedSchemaKey" | "selectedTableKey" | "selectedTables">;
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, getDbFeatures } from './apps/components/display/dbtable/utils';
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 { untrack } from 'svelte';
11
- import { getDbSchemas, loadAllTablesMetaData, loadTableMetaData } from './apps/components/display/dbtable/metadata';
12
- let { input, showRepl = true, hasReplResult = $bindable(false), isRefreshing = $bindable(false), selectedSchemaKey = $bindable(undefined), selectedTableKey = $bindable(undefined), dbSelector, multiSelectMode = false, selectedTables = $bindable([]), disabledTables = [] } = $props();
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
- // `refreshCount` is a derived state. `refreshing` is the source of truth
23
- let refreshCount = $state(0);
24
- $effect(() => {
25
- if (refreshing)
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
- async function getSchema() {
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, $dbSchemas, (message) => {
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
- // avoid infinite loop on error due to the way getDbSchemas is implemented
63
- // and relying on an assignement side effect
64
- if (oldDbSchema !== $dbSchemas[dbSchemasPath])
65
- $dbSchemas = $dbSchemas;
66
- refreshing = false;
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
- {getColDefs}
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: () => boolean;
20
+ refresh: () => void;
21
+ isLoading: () => boolean;
21
22
  clearReplResult: () => void;
22
- }, "selectedSchemaKey" | "selectedTableKey" | "selectedTables" | "hasReplResult" | "isRefreshing">;
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={isRefreshing}
127
- on:click={() => dbManagerContent?.refresh()}
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, Info, Plus, Settings, X } from 'lucide-svelte';
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, dbSupportsSchemas } from './apps/components/display/dbtable/utils';
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 type="checkbox" class="!w-4 !h-4" bind:checked={column.primaryKey} />
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 class="ml-8" contentClasses="py-3 px-5 flex flex-col gap-6">
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
- <label class="text-xs">
180
- <span class="flex gap-1 mb-1">
181
- Default value
182
- <Tooltip>
183
- <Info size={14} />
184
- {#snippet text()}
185
- Surround your expressions with curly brackets:
186
- <code>
187
- {'{NOW()}'}
188
- </code>.
189
- <br />
190
- By default, it will be parsed as a literal
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 type="checkbox" class="!w-4 !h-4" bind:checked={column.nullable} />
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
- (currentSchema && o.startsWith(currentSchema)) || !dbSupportsSchemas(dbType)
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 contentClasses="py-3 px-5 w-52 flex flex-col gap-6">
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
- <span>
307
- ON DELETE <select bind:value={foreignKey.onDelete}>
308
- <option value="NO ACTION" selected>NO ACTION</option>
309
- <option value="CASCADE" selected>CASCADE</option>
310
- <option value="SET NULL" selected>SET NULL</option>
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
- </span>
313
- <span>
314
- ON UPDATE <select bind:value={foreignKey.onUpdate}>
315
- <option value="NO ACTION" selected>NO ACTION</option>
316
- <option value="CASCADE" selected>CASCADE</option>
317
- <option value="SET NULL" selected>SET NULL</option>
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
- </span>
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 { sendUserToast } from '../toast';
4
- export let value = undefined;
5
- export let autofocus = false;
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
- let date = computeDate(value);
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(value) {
15
- if (dateFormat === undefined) {
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 date = parse(value, dateFormat, new Date());
21
- if (date.toString() === 'Invalid Date') {
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
- date = parse(value, defaultHtmlDateFormat, new Date());
19
+ parsedDate = parse(v, defaultHtmlDateFormat, new Date());
24
20
  }
25
- const res = format(date, defaultHtmlDateFormat);
26
- return res;
21
+ return format(parsedDate, defaultHtmlDateFormat);
27
22
  }
28
23
  catch (error) {
29
- sendUserToast(`Failed to parse date: ${value} with format ${dateFormat} and ${defaultHtmlDateFormat}`, true);
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
- let dateFromValue = newDate ? new Date(newDate + 'T00:00:00') : undefined;
45
- if (dateFromValue === undefined) {
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 class="flex flex-row gap-1 items-center w-full" id={randomId} on:pointerdown on:focus>
62
- <!-- svelte-ignore a11y-autofocus -->
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
- bind:value={date}
59
+ value={date}
67
60
  {autofocus}
68
61
  class="!w-full app-editor-input"
69
62
  min={minDate}
70
63
  max={maxDate}
71
- on:change={() => {
72
- if (date) {
73
- updateValue(date)
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)