windmill-components 1.511.0 → 1.522.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +56 -18
  3. package/package/components/ArgInput.svelte.d.ts +2 -10
  4. package/package/components/AssignableTagsInner.svelte +5 -0
  5. package/package/components/AuthSettings.svelte +4 -2
  6. package/package/components/AuthSettings.svelte.d.ts +1 -0
  7. package/package/components/DBManagerDrawer.svelte +154 -151
  8. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  9. package/package/components/DBTable.svelte +3 -3
  10. package/package/components/DBTable.svelte.d.ts +1 -0
  11. package/package/components/DBTableEditor.svelte +7 -7
  12. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  13. package/package/components/DeployWorkspace.svelte +1 -1
  14. package/package/components/DisplayResult.svelte +34 -8
  15. package/package/components/DisplayResult.svelte.d.ts +4 -1
  16. package/package/components/DynSelect.svelte +58 -34
  17. package/package/components/DynSelect.svelte.d.ts +3 -11
  18. package/package/components/EditableSchemaForm.svelte +126 -6
  19. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  20. package/package/components/Editor.svelte +1 -1
  21. package/package/components/EditorBar.svelte +82 -4
  22. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  23. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  24. package/package/components/ExploreAssetButton.svelte +14 -4
  25. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  26. package/package/components/FlowJobResult.svelte +3 -3
  27. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  28. package/package/components/FlowPreviewContent.svelte +9 -0
  29. package/package/components/FlowPreviewContent.svelte.d.ts +3 -0
  30. package/package/components/FlowPreviewResult.svelte +4 -1
  31. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  32. package/package/components/FlowStatusViewer.svelte +2 -1
  33. package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
  34. package/package/components/FlowStatusViewerInner.svelte +23 -3
  35. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -1
  36. package/package/components/FolderEditor.svelte +1 -1
  37. package/package/components/GitDiffPreview.svelte +14 -18
  38. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  39. package/package/components/GitHubAppIntegration.svelte +3 -1
  40. package/package/components/IdEditorInput.svelte +25 -22
  41. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  42. package/package/components/InstanceSetting.svelte +7 -2
  43. package/package/components/InstanceSettings.svelte +1 -0
  44. package/package/components/JobLoader.svelte +48 -5
  45. package/package/components/JobLoader.svelte.d.ts +7 -2
  46. package/package/components/Login.svelte +8 -2
  47. package/package/components/MemoryFootprintViewer.svelte +1 -1
  48. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  49. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  50. package/package/components/NextcloudSetting.svelte +84 -0
  51. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  52. package/package/components/ObjectResourceInput.svelte +3 -2
  53. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  54. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  55. package/package/components/ResourceEditor.svelte +1 -1
  56. package/package/components/ResourcePicker.svelte +8 -1
  57. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  58. package/package/components/ResultStreamDisplay.svelte +5 -0
  59. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  60. package/package/components/RunForm.svelte +9 -1
  61. package/package/components/SchemaForm.svelte +2 -2
  62. package/package/components/SchemaForm.svelte.d.ts +2 -10
  63. package/package/components/ScriptBuilder.svelte +13 -8
  64. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  65. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  66. package/package/components/ScriptWrapper.svelte +1 -1
  67. package/package/components/ShareModal.svelte.d.ts +1 -1
  68. package/package/components/SimpleAgTable.svelte +2 -0
  69. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  70. package/package/components/SqlRepl.svelte +21 -7
  71. package/package/components/SqlRepl.svelte.d.ts +2 -2
  72. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  73. package/package/components/WorkerTagSelect.svelte +70 -1
  74. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  75. package/package/components/apps/components/display/AppText.svelte +2 -2
  76. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  77. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  78. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  79. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  80. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  81. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  82. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  83. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  84. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  85. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  86. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  87. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  88. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  89. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  90. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  91. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  92. package/package/components/apps/components/display/table/utils.js +7 -4
  93. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  94. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  95. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  96. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  97. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  98. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  99. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  100. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  101. package/package/components/apps/editor/GridViewer.svelte +1 -0
  102. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  103. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  104. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  105. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  106. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  107. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  108. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  109. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  110. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  111. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  112. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  113. package/package/components/assets/lib.js +4 -0
  114. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  115. package/package/components/common/button/Button.svelte +4 -3
  116. package/package/components/common/button/Button.svelte.d.ts +1 -0
  117. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  118. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  119. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  120. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  121. package/package/components/common/modal/Modal.svelte +2 -5
  122. package/package/components/common/tabs/TabsV2.svelte +2 -1
  123. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  124. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  125. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  126. package/package/components/copilot/chat/script/core.js +28 -29
  127. package/package/components/copilot/chat/shared.d.ts +1 -1
  128. package/package/components/copilot/chat/shared.js +8 -2
  129. package/package/components/custom_ui.d.ts +3 -0
  130. package/package/components/dbOps.d.ts +20 -8
  131. package/package/components/dbOps.js +85 -40
  132. package/package/components/details/DetailPageHeader.svelte +0 -2
  133. package/package/components/flows/content/FlowInput.svelte +5 -0
  134. package/package/components/flows/content/FlowModuleComponent.svelte +1 -0
  135. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  136. package/package/components/flows/idUtils.js +2 -1
  137. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  138. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  139. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  140. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  141. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  142. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  143. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  144. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  145. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  146. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  147. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  148. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  149. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  151. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  152. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  153. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  154. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  155. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  156. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  157. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  158. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  159. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  160. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  161. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  162. package/package/components/graph/FlowGraphV2.svelte +5 -1
  163. package/package/components/graph/graphBuilder.svelte.js +1 -1
  164. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  165. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  166. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  167. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  168. package/package/components/icons/DucklakeIcon.svelte +18 -0
  169. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  170. package/package/components/instanceSettings.js +11 -3
  171. package/package/components/runs/JobPreview.svelte +2 -2
  172. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  173. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  174. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  175. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  176. package/package/components/schema/PropertyEditor.svelte +0 -2
  177. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  178. package/package/components/schema/SchemaFormDND.svelte +2 -1
  179. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  180. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  181. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  182. package/package/components/select/Select.svelte +7 -4
  183. package/package/components/select/Select.svelte.d.ts +5 -0
  184. package/package/components/select/SelectDropdown.svelte +2 -1
  185. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  186. package/package/components/sidebar/changelogs.js +5 -0
  187. package/package/components/table/AutoDataTable.svelte +6 -4
  188. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  189. package/package/components/table/DataTable.svelte +12 -10
  190. package/package/components/table/DataTable.svelte.d.ts +1 -0
  191. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  192. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  193. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  194. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  195. package/package/components/triggers/gcp/utils.js +1 -0
  196. package/package/components/triggers/http/utils.js +1 -1
  197. package/package/components/triggers/kafka/utils.js +1 -1
  198. package/package/components/triggers/mqtt/utils.js +1 -1
  199. package/package/components/triggers/nats/utils.js +1 -1
  200. package/package/components/triggers/postgres/utils.js +1 -1
  201. package/package/components/triggers/sqs/utils.js +1 -1
  202. package/package/components/triggers/utils.js +2 -1
  203. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  204. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  205. package/package/components/triggers/websocket/utils.js +1 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  207. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  208. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  211. package/package/consts.js +2 -1
  212. package/package/gen/core/OpenAPI.js +1 -1
  213. package/package/gen/schemas.gen.d.ts +33 -24
  214. package/package/gen/schemas.gen.js +36 -27
  215. package/package/gen/services.gen.d.ts +19 -1
  216. package/package/gen/services.gen.js +38 -0
  217. package/package/gen/types.gen.d.ts +103 -9
  218. package/package/git-sync.d.ts +36 -0
  219. package/package/git-sync.js +1 -0
  220. package/package/hub.d.ts +1 -0
  221. package/package/hubPaths.json +5 -2
  222. package/package/infer.js +3 -2
  223. package/package/script_helpers.d.ts +2 -2
  224. package/package/script_helpers.js +29 -11
  225. package/package/services/JobManager.d.ts +28 -0
  226. package/package/services/JobManager.js +114 -0
  227. package/package/stores.d.ts +1 -1
  228. package/package/utils.d.ts +18 -1
  229. package/package/utils.js +55 -2
  230. package/package.json +13 -12
  231. package/package/components/InitGitRepoPopover.svelte +0 -410
  232. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  233. package/package/components/PullGitRepoPopover.svelte +0 -355
  234. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  235. package/package/inferArgSig.d.ts +0 -35
  236. package/package/inferArgSig.js +0 -191
@@ -9,7 +9,7 @@ import { sendUserToast } from '../toast';
9
9
  import Select from './select/Select.svelte';
10
10
  import DbManagerDrawer from './DBManagerDrawer.svelte';
11
11
  import ExploreAssetButton, { assetCanBeExplored } from './ExploreAssetButton.svelte';
12
- let { initialValue = $bindable(undefined), value = $bindable(undefined), valueType = $bindable(undefined), resourceType = undefined, disabled = false, disablePortal = false, showSchemaExplorer = false, selectFirst = false, expressOAuthSetup = false, defaultValues = undefined, placeholder = undefined, onClear = undefined } = $props();
12
+ let { initialValue = $bindable(undefined), value = $bindable(undefined), valueType = $bindable(undefined), resourceType = undefined, disabled = false, disablePortal = false, showSchemaExplorer = false, selectFirst = false, expressOAuthSetup = false, defaultValues = undefined, placeholder = undefined, onClear = undefined, excludedValues = undefined } = $props();
13
13
  if (initialValue && value == undefined) {
14
14
  console.log('initialValue', initialValue);
15
15
  value = initialValue;
@@ -62,6 +62,7 @@ async function loadResources(resourceType) {
62
62
  const nc = resources
63
63
  .flat()
64
64
  .filter((x) => x.resource_type != 'state' && x.resource_type != 'cache')
65
+ .filter((x) => !excludedValues || !excludedValues.includes(x.path))
65
66
  .map((x) => ({
66
67
  value: x.path,
67
68
  label: x.path,
@@ -95,6 +96,12 @@ $effect(() => {
95
96
  });
96
97
  untrack(() => loadResources(resourceType));
97
98
  });
99
+ $effect(() => {
100
+ excludedValues;
101
+ if ($workspaceStore && resourceType && !disabled) {
102
+ untrack(() => loadResources(resourceType));
103
+ }
104
+ });
98
105
  let appConnect = $state();
99
106
  let resourceEditor = $state();
100
107
  let dbManagerDrawer = $state();
@@ -11,6 +11,7 @@ interface Props {
11
11
  defaultValues?: Record<string, any> | undefined;
12
12
  placeholder?: string | undefined;
13
13
  onClear?: () => void;
14
+ excludedValues?: string[];
14
15
  }
15
16
  declare const ResourcePicker: import("svelte").Component<Props, {
16
17
  askNewResource: () => Promise<void>;
@@ -0,0 +1,5 @@
1
+ <script lang="ts">"use strict";
2
+ let { result_stream } = $props();
3
+ </script>
4
+
5
+ <pre class="text-xs">{result_stream}</pre>
@@ -0,0 +1,5 @@
1
+ declare const ResultStreamDisplay: import("svelte").Component<{
2
+ result_stream: any;
3
+ }, {}, "">;
4
+ type ResultStreamDisplay = ReturnType<typeof ResultStreamDisplay>;
5
+ export default ResultStreamDisplay;
@@ -12,6 +12,7 @@ import JsonInputs from './JsonInputs.svelte';
12
12
  import { triggerableByAI } from '../actions/triggerableByAI.svelte';
13
13
  import InputSelectedBadge from './schema/InputSelectedBadge.svelte';
14
14
  import { untrack } from 'svelte';
15
+ import {} from '../gen';
15
16
  let reloadArgs = $state(0);
16
17
  let jsonEditor = $state(undefined);
17
18
  let schemaHeight = $state(0);
@@ -190,7 +191,14 @@ $effect(() => {
190
191
  type: 'hash',
191
192
  hash: runnable.hash
192
193
  }
193
- : undefined}
194
+ : runnable.schema?.['x-windmill-dyn-select-code'] &&
195
+ runnable.schema?.['x-windmill-dyn-select-lang']
196
+ ? {
197
+ type: 'inline',
198
+ code: runnable.schema['x-windmill-dyn-select-code'] as string,
199
+ lang: runnable.schema['x-windmill-dyn-select-lang'] as ScriptLang
200
+ }
201
+ : undefined}
194
202
  prettifyHeader
195
203
  {noVariablePicker}
196
204
  {autofocus}
@@ -203,7 +203,7 @@ const actions_render = $derived(actions);
203
203
  title={formerProperty?.title}
204
204
  placeholder={formerProperty?.placeholder}
205
205
  orderEditable={dndConfig != undefined}
206
- otherArgs={args}
206
+ otherArgs={{ ...args, [argName]: undefined }}
207
207
  {helperScript}
208
208
  {lightHeader}
209
209
  hideNested={typeof diff[argName].diff === 'object'}
@@ -276,7 +276,7 @@ const actions_render = $derived(actions);
276
276
  title={schema.properties[argName].title}
277
277
  placeholder={schema.properties[argName].placeholder}
278
278
  orderEditable={dndConfig != undefined}
279
- otherArgs={args}
279
+ otherArgs={{ ...args, [argName]: undefined }}
280
280
  {helperScript}
281
281
  {lightHeader}
282
282
  diffStatus={diff[argName] ?? undefined}
@@ -1,5 +1,5 @@
1
1
  import type { Schema } from '../common';
2
- import { type Script } from '../gen';
2
+ import { type DynamicSelect } from '../utils';
3
3
  import { type Options as DndOptions } from '@windmill-labs/svelte-dnd-action';
4
4
  import type { SchemaDiff } from './schema/schemaUtils.svelte';
5
5
  import type { ComponentCustomCSS } from './apps/types';
@@ -30,15 +30,7 @@ interface Props {
30
30
  id: string;
31
31
  value: string;
32
32
  }[] | undefined;
33
- helperScript?: {
34
- type: 'inline';
35
- path?: string;
36
- lang: Script['language'];
37
- code: string;
38
- } | {
39
- type: 'hash';
40
- hash: string;
41
- } | undefined;
33
+ helperScript?: DynamicSelect.HelperScript;
42
34
  lightHeader?: boolean;
43
35
  diff?: Record<string, SchemaDiff>;
44
36
  nestedParent?: {
@@ -5,7 +5,7 @@ import { inferArgs } from '../infer';
5
5
  import { initialCode } from '../script_helpers';
6
6
  import AIFormSettings from './copilot/AIFormSettings.svelte';
7
7
  import { defaultScripts, enterpriseLicense, usedTriggerKinds, userStore, workerTags, workspaceStore } from '../stores';
8
- import { cleanValueProperties, emptySchema, emptyString, encodeState, generateRandomString, orderedJsonStringify, replaceFalseWithUndefined } from '../utils';
8
+ import { cleanValueProperties, emptySchema, emptyString, encodeState, generateRandomString, orderedJsonStringify, readFieldsRecursively, replaceFalseWithUndefined } from '../utils';
9
9
  import Path from './Path.svelte';
10
10
  import ScriptEditor from './ScriptEditor.svelte';
11
11
  import { Alert, Badge, Button, Drawer, SecondsInput, Tab, TabContent, Tabs } from './common';
@@ -41,7 +41,7 @@ import { deployTriggers, filterDraftTriggers, handleSelectTriggerFromKind } from
41
41
  import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte';
42
42
  import { Triggers } from './triggers/triggers.svelte';
43
43
  import WorkerTagSelect from './WorkerTagSelect.svelte';
44
- let { script, fullyLoaded = true, initialPath = $bindable(''), template = $bindable('script'), initialArgs = {}, lockedLanguage = false, showMeta = false, neverShowMeta = false, diffDrawer = undefined, savedScript = $bindable(undefined), searchParams = new URLSearchParams(), disableHistoryChange = false, replaceStateFn = (url) => window.history.replaceState(null, '', url), customUi = {}, savedPrimarySchedule = undefined, functionExports = undefined, children, onDeploy, onDeployError, onSaveInitial, onSeeDetails, onSaveDraftError, onSaveDraft, disableAi } = $props();
44
+ let { script = $bindable(), fullyLoaded = true, initialPath = $bindable(''), template = $bindable('script'), initialArgs = {}, lockedLanguage = false, showMeta = false, neverShowMeta = false, diffDrawer = undefined, savedScript = $bindable(undefined), searchParams = new URLSearchParams(), disableHistoryChange = false, replaceStateFn = (url) => window.history.replaceState(null, '', url), customUi = {}, savedPrimarySchedule = undefined, functionExports = undefined, children, onDeploy, onDeployError, onSaveInitial, onSeeDetails, onSaveDraftError, onSaveDraft, disableAi } = $props();
45
45
  export function getInitialAndModifiedValues() {
46
46
  return {
47
47
  savedValue: savedScript,
@@ -186,12 +186,16 @@ const scriptKindOptions = [
186
186
  let pathError = $state('');
187
187
  let loadingSave = $state(false);
188
188
  let loadingDraft = $state(false);
189
+ let timeout2 = undefined;
189
190
  function encodeScriptState(script) {
190
- replaceStateFn('#' +
191
- encodeState({
192
- ...script,
193
- draft_triggers: structuredClone(triggersState.getDraftTriggersSnapshot())
194
- }));
191
+ untrack(() => timeout2 && clearTimeout(timeout2));
192
+ timeout2 = setTimeout(() => {
193
+ replaceStateFn('#' +
194
+ encodeState({
195
+ ...script,
196
+ draft_triggers: structuredClone(triggersState.getDraftTriggersSnapshot())
197
+ }));
198
+ }, 500);
195
199
  }
196
200
  let timeout = undefined;
197
201
  function saveSessionDraft() {
@@ -715,7 +719,8 @@ $effect(() => {
715
719
  });
716
720
  });
717
721
  $effect(() => {
718
- !disableHistoryChange && untrack(() => encodeScriptState(script));
722
+ readFieldsRecursively(script);
723
+ !disableHistoryChange && encodeScriptState(script);
719
724
  });
720
725
  loadWorkerTags();
721
726
  async function loadWorkerTags() {
@@ -7,6 +7,6 @@ declare const ScriptBuilder: import("svelte").Component<ScriptBuilderProps, {
7
7
  setPrimarySchedule: (schedule: ScheduleTrigger | undefined | false) => void;
8
8
  setDraftTriggers: (triggers: Trigger[] | undefined) => void;
9
9
  setCode: (code: string) => void;
10
- }, "template" | "initialPath" | "savedScript">;
10
+ }, "script" | "template" | "initialPath" | "savedScript">;
11
11
  type ScriptBuilder = ReturnType<typeof ScriptBuilder>;
12
12
  export default ScriptBuilder;
@@ -74,6 +74,6 @@ declare const ScriptEditor: $$__sveltets_2_IsomorphicComponent<Props, {
74
74
  setCollaborationMode: () => Promise<void>;
75
75
  disableCollaboration: () => void;
76
76
  updateArgs: (newArgs: Record<string, any>) => Promise<void>;
77
- }, "args" | "code" | "assets" | "schema" | "editor" | "selectedTab" | "diffEditor" | "hasPreprocessor" | "captureTable">;
77
+ }, "args" | "code" | "assets" | "schema" | "selectedTab" | "editor" | "diffEditor" | "hasPreprocessor" | "captureTable">;
78
78
  type ScriptEditor = InstanceType<typeof ScriptEditor>;
79
79
  export default ScriptEditor;
@@ -5,5 +5,5 @@ let script = $state(oldScript);
5
5
  </script>
6
6
 
7
7
  <AiChatLayout noPadding {disableAi}>
8
- <ScriptBuilder {script} {disableAi} {...props} />
8
+ <ScriptBuilder bind:script {disableAi} {...props} />
9
9
  </AiChatLayout>
@@ -16,7 +16,7 @@ declare const ShareModal: $$__sveltets_2_IsomorphicComponent<Record<string, neve
16
16
  } & {
17
17
  [evt: string]: CustomEvent<any>;
18
18
  }, {}, {
19
- openDrawer: (newPath: string, kind_l: "resource" | "script" | "flow" | "schedule" | "app" | "variable" | "group_" | "raw_app" | "http_trigger" | "websocket_trigger" | "kafka_trigger" | "nats_trigger" | "postgres_trigger" | "mqtt_trigger" | "gcp_trigger" | "sqs_trigger") => Promise<void>;
19
+ openDrawer: (newPath: string, kind_l: "resource" | "script" | "flow" | "app" | "variable" | "schedule" | "group_" | "raw_app" | "http_trigger" | "websocket_trigger" | "kafka_trigger" | "nats_trigger" | "postgres_trigger" | "mqtt_trigger" | "gcp_trigger" | "sqs_trigger") => Promise<void>;
20
20
  }, "">;
21
21
  type ShareModal = InstanceType<typeof ShareModal>;
22
22
  export default ShareModal;
@@ -1,4 +1,6 @@
1
1
  <script lang="ts">import { sendUserToast } from '../toast';
2
+ import 'ag-grid-community/styles/ag-grid.css';
3
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
2
4
  import { createGrid } from 'ag-grid-community';
3
5
  import DarkModeObserver from './DarkModeObserver.svelte';
4
6
  import { untrack } from 'svelte';
@@ -1,3 +1,5 @@
1
+ import 'ag-grid-community/styles/ag-grid.css';
2
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
1
3
  type Props = {
2
4
  data: Record<string, any>[];
3
5
  class?: string;
@@ -33,6 +33,12 @@ function splitSqlStatements(code) {
33
33
  }
34
34
  return statements;
35
35
  }
36
+ function pruneComments(code) {
37
+ return code
38
+ .replace(/--.*?(\r?\n|$)/g, '')
39
+ .replace(/\/\*[\s\S]*?\*\//g, '')
40
+ .trim();
41
+ }
36
42
  </script>
37
43
 
38
44
  <script lang="ts">import { CornerDownLeft, Loader2 } from 'lucide-svelte';
@@ -44,7 +50,9 @@ import { untrack } from 'svelte';
44
50
  import { getLanguageByResourceType } from './apps/components/display/dbtable/utils';
45
51
  import StepHistory, {} from './flows/propPicker/StepHistory.svelte';
46
52
  import { Pane, Splitpanes } from 'svelte-splitpanes';
47
- let { resourcePath, resourceType, onData, placeholderTableName } = $props();
53
+ import { getDbType, wrapDucklakeQuery } from './dbOps';
54
+ let { input, onData, placeholderTableName } = $props();
55
+ let dbType = $derived(getDbType(input));
48
56
  const DEFAULT_SQL = 'SELECT * FROM _';
49
57
  let code = $state(DEFAULT_SQL);
50
58
  $effect(() => {
@@ -60,7 +68,11 @@ async function run({ doPostgresRowToJsonFix } = {}) {
60
68
  return;
61
69
  isRunning = true;
62
70
  try {
63
- const statements = splitSqlStatements(code);
71
+ const statements = splitSqlStatements(pruneComments(code));
72
+ if (statements.length === 0) {
73
+ sendUserToast('Nothing to run', true);
74
+ return;
75
+ }
64
76
  // Transform all to JSON in case of select. This fixes the issue of
65
77
  // custom postgres enum type failing to convert to a rust type in the backend.
66
78
  // We don't always put the fix by default for row ordering concerns
@@ -75,14 +87,16 @@ async function run({ doPostgresRowToJsonFix } = {}) {
75
87
  })
76
88
  .join(';');
77
89
  }
90
+ const dbArg = input?.type === 'database' ? { database: '$res:' + input.resourcePath } : {};
91
+ if (input?.type === 'ducklake') {
92
+ transformedCode = wrapDucklakeQuery(transformedCode, input.ducklake);
93
+ }
78
94
  let { job, result } = (await runScriptAndPollResult({
79
95
  workspace: $workspaceStore,
80
96
  requestBody: {
81
- language: getLanguageByResourceType(resourceType),
97
+ language: getLanguageByResourceType(dbType),
82
98
  content: transformedCode,
83
- args: {
84
- database: '$res:' + resourcePath
85
- }
99
+ args: dbArg
86
100
  }
87
101
  }, { withJobData: true }));
88
102
  if (statements.length > 1) {
@@ -113,7 +127,7 @@ async function run({ doPostgresRowToJsonFix } = {}) {
113
127
  }
114
128
  catch (e) {
115
129
  console.error(e);
116
- if (resourceType === 'postgresql' && !doPostgresRowToJsonFix) {
130
+ if (dbType === 'postgresql' && !doPostgresRowToJsonFix) {
117
131
  console.error('Error running query, trying with row_to_json fix');
118
132
  isRunning = false;
119
133
  return await run({ doPostgresRowToJsonFix: true });
@@ -1,6 +1,6 @@
1
+ import { type DbInput } from './dbOps';
1
2
  type Props = {
2
- resourceType: string;
3
- resourcePath: string;
3
+ input: DbInput;
4
4
  onData: (data: Record<string, any>[]) => void;
5
5
  placeholderTableName?: string;
6
6
  };
@@ -15,6 +15,6 @@ interface Props {
15
15
  overrideAllowKindChange?: boolean;
16
16
  originalType?: string | undefined;
17
17
  }
18
- declare const StringTypeNarrowing: import("svelte").Component<Props, {}, "password" | "disableCreate" | "pattern" | "format" | "contentEncoding" | "customErrorMessage" | "dateFormat" | "enum_" | "enumLabels" | "minRows" | "disableVariablePicker">;
18
+ declare const StringTypeNarrowing: import("svelte").Component<Props, {}, "password" | "disableCreate" | "pattern" | "format" | "enum_" | "enumLabels" | "contentEncoding" | "customErrorMessage" | "dateFormat" | "minRows" | "disableVariablePicker">;
19
19
  type StringTypeNarrowing = ReturnType<typeof StringTypeNarrowing>;
20
20
  export default StringTypeNarrowing;
@@ -1,13 +1,26 @@
1
1
  <script lang="ts">import { workerTags, workspaceStore } from '../stores';
2
2
  import { WorkerService } from '../gen';
3
- import { createEventDispatcher } from 'svelte';
3
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
4
4
  import Select from './select/Select.svelte';
5
5
  import { safeSelectItems } from './select/utils.svelte';
6
6
  import { Button } from './common';
7
7
  import { RotateCw } from 'lucide-svelte';
8
8
  import { sendUserToast } from '../toast';
9
+ import Popover from './Popover.svelte';
9
10
  let { tag = $bindable(), noLabel = false, nullTag = undefined, disabled = false, placeholder, inputClass } = $props();
10
11
  let loading = $state(false);
12
+ let visible = $state(false);
13
+ let timeout = undefined;
14
+ let tagsToWorkerExists = $state(undefined);
15
+ onMount(() => {
16
+ visible = true;
17
+ });
18
+ onDestroy(() => {
19
+ visible = false;
20
+ if (timeout) {
21
+ clearTimeout(timeout);
22
+ }
23
+ });
11
24
  loadWorkerGroups();
12
25
  const dispatch = createEventDispatcher();
13
26
  async function loadWorkerGroups(force = false) {
@@ -28,9 +41,64 @@ let items = $derived([
28
41
  ...(tag && tag != '' && !($workerTags ?? []).includes(tag) ? [tag] : []),
29
42
  ...($workerTags ?? [])
30
43
  ]);
44
+ let lastCheck = undefined;
45
+ async function loadTagsToWorkerExists(tags) {
46
+ if (lastCheck && Date.now() - lastCheck < 5000) {
47
+ return;
48
+ }
49
+ if (timeout) {
50
+ clearTimeout(timeout);
51
+ }
52
+ if (open) {
53
+ tagsToWorkerExists = await WorkerService.existsWorkersWithTags({ tags: tags.join(',') });
54
+ lastCheck = Date.now();
55
+ if (visible) {
56
+ timeout = setTimeout(() => {
57
+ loadTagsToWorkerExists(tags);
58
+ }, 5000);
59
+ }
60
+ }
61
+ }
62
+ // let finalItems = $derived(
63
+ // items.map((item) => {
64
+ // if (tagsToWorkerExists) {
65
+ // return {
66
+ // value: item,
67
+ // __select_group: tagsToWorkerExists[item]
68
+ // ? `${placeholder ?? 'Worker'}s available`
69
+ // : `No ${placeholder ?? 'Worker'}s`
70
+ // }
71
+ // }
72
+ // return item
73
+ // })
74
+ // )
75
+ $effect(() => {
76
+ if ($workerTags && open) {
77
+ loadTagsToWorkerExists($workerTags);
78
+ }
79
+ });
31
80
  let open = $state(false);
32
81
  </script>
33
82
 
83
+ {#snippet startSnippet({ item })}
84
+ {#if tagsToWorkerExists}
85
+ {#if tagsToWorkerExists[item.value]}
86
+ <Popover>
87
+ {#snippet text()}
88
+ At least one worker with this tag exists and is running.
89
+ {/snippet}
90
+ <div class="rounded-full inline-block bg-green-500 text-white text-xs w-2 h-2 mr-1"></div>
91
+ </Popover>
92
+ {:else}
93
+ <Popover>
94
+ {#snippet text()}
95
+ No workers with this tag exist or is running.
96
+ {/snippet}
97
+ <div class="rounded-full inline-block bg-red-500 text-white text-xs w-2 h-2 mr-1"></div>
98
+ </Popover>
99
+ {/if}
100
+ {/if}
101
+ {/snippet}
34
102
  <div class="flex gap-1 items-center relative">
35
103
  {#if !noLabel}
36
104
  <div class="text-tertiary text-2xs">{placeholder ?? 'tag'}</div>
@@ -44,6 +112,7 @@ let open = $state(false);
44
112
  placeholder={nullTag ? nullTag : (placeholder ?? 'lang default')}
45
113
  items={safeSelectItems(items)}
46
114
  bind:value={() => tag, (value) => ((tag = value), dispatch('change', value))}
115
+ {startSnippet}
47
116
  />
48
117
  {#if open}
49
118
  <div class="absolute top-0 -right-12">
@@ -9,6 +9,7 @@ import ResolveStyle from '../helpers/ResolveStyle.svelte';
9
9
  import { components } from '../../editor/component';
10
10
  import ResolveConfig from '../helpers/ResolveConfig.svelte';
11
11
  import { userStore } from '../../../../stores';
12
+ let result_stream = $state(undefined);
12
13
  let { id, componentInput, initializing = $bindable(undefined), customCss = undefined, render, configuration } = $props();
13
14
  const requireHtmlApproval = getContext(IS_APP_PUBLIC_CONTEXT_KEY);
14
15
  const { app, worldStore, componentControl, workspace, appPath } = getContext('AppViewerContext');
@@ -24,6 +25,7 @@ const outputs = initOutput($worldStore, id, {
24
25
  loading: false
25
26
  });
26
27
  let css = $state(initCss($app.css?.displaycomponent, customCss));
28
+ let loading = $state(false);
27
29
  </script>
28
30
 
29
31
  {#each Object.keys(components['displaycomponent'].initialData.configuration) as key (key)}
@@ -45,7 +47,15 @@ let css = $state(initCss($app.css?.displaycomponent, customCss));
45
47
  />
46
48
  {/each}
47
49
 
48
- <RunnableWrapper {outputs} {render} {componentInput} {id} bind:initializing bind:result>
50
+ <RunnableWrapper
51
+ {outputs}
52
+ {render}
53
+ {componentInput}
54
+ {id}
55
+ bind:initializing
56
+ bind:result
57
+ bind:loading
58
+ >
49
59
  <div class="flex flex-col w-full h-full component-wrapper">
50
60
  <div
51
61
  class={twMerge(
@@ -70,8 +80,10 @@ let css = $state(initCss($app.css?.displaycomponent, customCss));
70
80
  )}
71
81
  >
72
82
  <DisplayResult
83
+ {loading}
73
84
  workspaceId={workspace}
74
85
  {result}
86
+ {result_stream}
75
87
  {requireHtmlApproval}
76
88
  disableExpand={resolvedConfig?.hideDetails}
77
89
  appPath={$userStore ? undefined : $appPath}
@@ -2,7 +2,7 @@
2
2
  const bubble = createBubbler();
3
3
  import Tooltip from '../../../Tooltip.svelte';
4
4
  import { Clipboard } from 'lucide-svelte';
5
- import { getContext } from 'svelte';
5
+ import { getContext, untrack } from 'svelte';
6
6
  import { twMerge } from 'tailwind-merge';
7
7
  import { copyToClipboard, isCodeInjection } from '../../../../utils';
8
8
  import Button from '../../../common/button/Button.svelte';
@@ -34,7 +34,7 @@ $componentControl[id] = {
34
34
  }
35
35
  };
36
36
  const outputs = initOutput($worldStore, id, {
37
- result,
37
+ result: untrack(() => result),
38
38
  loading: initializing
39
39
  });
40
40
  function getComponent() {
@@ -18,6 +18,7 @@ import { CancelablePromise } from '../../../../../gen';
18
18
  import RefreshButton from '../../helpers/RefreshButton.svelte';
19
19
  import RunnableWrapper from '../../helpers/RunnableWrapper.svelte';
20
20
  import InsertRowDrawerButton from '../InsertRowDrawerButton.svelte';
21
+ import { assert } from '../../../../../utils';
21
22
  let { id, configuration, customCss = undefined, render, initializing = $bindable(undefined), actions = [] } = $props();
22
23
  $effect.pre(() => {
23
24
  if (initializing === undefined) {
@@ -224,7 +225,13 @@ async function listColumnsIfAvailable() {
224
225
  gridItem.data.configuration.columnDefs.loading = true;
225
226
  gridItem.data = gridItem.data;
226
227
  $app = $app;
227
- let tableMetadata = await loadTableMetaData(resolvedConfig.type.configuration[selected].resource, $workspaceStore, resolvedConfig.type.configuration[selected].table, selected);
228
+ let resource = resolvedConfig.type.configuration[selected].resource;
229
+ assert('resource starts with $res:', resource?.startsWith('$res:'), resource);
230
+ let tableMetadata = await loadTableMetaData({
231
+ type: 'database',
232
+ resourcePath: resource.substring(5),
233
+ resourceType: selected
234
+ }, $workspaceStore, resolvedConfig.type.configuration[selected].table);
228
235
  if (!tableMetadata)
229
236
  return;
230
237
  let old = columnDefs?.value ?? [];
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">import { ColumnIdentity } from './utils';
2
- import init, { parse_sql, parse_mysql, parse_bigquery, parse_snowflake, parse_mssql } from 'windmill-sql-datatype-parser-wasm';
2
+ import init, { parse_sql, parse_mysql, parse_bigquery, parse_snowflake, parse_mssql, parse_duckdb } from 'windmill-sql-datatype-parser-wasm';
3
3
  import wasmUrl from 'windmill-sql-datatype-parser-wasm/windmill_sql_datatype_parser_wasm_bg.wasm?url';
4
4
  init(wasmUrl);
5
- import { argSigToJsonSchemaType } from '../../../../../inferArgSig';
5
+ import { argSigToJsonSchemaType } from 'windmill-utils-internal';
6
6
  import SchemaForm from '../../../../SchemaForm.svelte';
7
7
  import { untrack } from 'svelte';
8
8
  let schema = $state(undefined);
@@ -24,8 +24,9 @@ function parseSQLArgs(field, dbType) {
24
24
  case 'ms_sql_server':
25
25
  rawType = parse_mssql(field);
26
26
  break;
27
- default:
28
- throw new Error('Language not supported');
27
+ case 'duckdb':
28
+ rawType = parse_duckdb(field);
29
+ break;
29
30
  }
30
31
  return rawType;
31
32
  }
@@ -77,6 +77,15 @@ export function makeCountQuery(dbType, table, whereClause = undefined, columnDef
77
77
  query += `SELECT COUNT(*) as count FROM \`${table}\``;
78
78
  break;
79
79
  }
80
+ case 'duckdb':
81
+ if (filteredColumns.length > 0) {
82
+ quicksearchCondition += ` ($quicksearch = '' OR CONCAT(' ', ${filteredColumns.join(', ')}) LIKE CONCAT('%', $quicksearch, '%'))`;
83
+ }
84
+ else {
85
+ quicksearchCondition += ` ($quicksearch = '' OR 1 = 1)`;
86
+ }
87
+ query += `SELECT COUNT(*) as count FROM ${table}`;
88
+ break;
80
89
  default:
81
90
  throw new Error('Unsupported database type:' + dbType);
82
91
  }
@@ -91,7 +100,8 @@ export function makeCountQuery(dbType, table, whereClause = undefined, columnDef
91
100
  (dbType === 'mysql' ||
92
101
  dbType === 'postgresql' ||
93
102
  dbType === 'snowflake' ||
94
- dbType === 'bigquery')) {
103
+ dbType === 'bigquery' ||
104
+ dbType === 'duckdb')) {
95
105
  query = query.replace(`${andCondition}`, wherePrefix);
96
106
  }
97
107
  return query;
@@ -20,6 +20,6 @@ type CreateTableValuesColumn = {
20
20
  not_null?: boolean;
21
21
  datatype_length?: number;
22
22
  };
23
- export declare function makeCreateTableQuery(values: CreateTableValues, resourceType: DbType, schema?: string): string;
23
+ export declare function makeCreateTableQuery(values: CreateTableValues, dbType: DbType, schema?: string): string;
24
24
  export declare function datatypeDefaultLength(datatype: string): number;
25
25
  export {};
@@ -1,9 +1,9 @@
1
1
  import { dbSupportsSchemas } from '../utils';
2
- export function makeCreateTableQuery(values, resourceType, schema) {
2
+ export function makeCreateTableQuery(values, dbType, schema) {
3
3
  const pkCount = values.columns.reduce((p, c) => p + (c.primaryKey ? 1 : 0), 0);
4
4
  function transformColumn(c) {
5
5
  const datatype = c.datatype_length ? `${c.datatype}(${c.datatype_length})` : c.datatype;
6
- const defValue = c.defaultValue && formatDefaultValue(c.defaultValue, datatype, resourceType);
6
+ const defValue = c.defaultValue && formatDefaultValue(c.defaultValue, datatype, dbType);
7
7
  let str = ` ${c.name} ${datatype}`;
8
8
  if (c.not_null)
9
9
  str += ' NOT NULL';
@@ -26,7 +26,7 @@ export function makeCreateTableQuery(values, resourceType, schema) {
26
26
  l += ` ON UPDATE ${fk.onUpdate}`;
27
27
  return l;
28
28
  }
29
- const useSchema = dbSupportsSchemas(resourceType);
29
+ const useSchema = dbSupportsSchemas(dbType);
30
30
  const lines = values.columns.map(transformColumn);
31
31
  lines.push(...values.foreignKeys.map(transformFk));
32
32
  if (pkCount > 1) {
@@ -37,6 +37,13 @@ export function makeDeleteQuery(table, columns, dbType) {
37
37
  query += `\nDELETE FROM ${table} \nWHERE ${conditions}`;
38
38
  return query;
39
39
  }
40
+ case 'duckdb': {
41
+ const conditions = columns
42
+ .map((c) => `($${c.field} IS NULL AND ${c.field} IS NULL OR ${c.field} = $${c.field})`)
43
+ .join('\n AND ');
44
+ query += `\nDELETE FROM ${table} \nWHERE ${conditions}`;
45
+ return query;
46
+ }
40
47
  default:
41
48
  throw new Error('Unsupported database type');
42
49
  }
@@ -12,6 +12,8 @@ function formatInsertValues(columns, dbType, startIndex = 1) {
12
12
  return columns.map(() => `?`).join(', ');
13
13
  case 'bigquery':
14
14
  return columns.map((c) => `@${c.field}`).join(', ');
15
+ case 'duckdb':
16
+ return columns.map((c) => `$${c.field}`).join(', ');
15
17
  default:
16
18
  throw new Error('Unsupported database type');
17
19
  }
@@ -155,6 +155,20 @@ CASE WHEN :order_by = '${column.field}' AND :is_desc IS true THEN \`${column.fie
155
155
  query += ` LIMIT @limit OFFSET @offset`;
156
156
  break;
157
157
  }
158
+ case 'duckdb': {
159
+ const orderBy = `
160
+ ${columnDefs
161
+ .map((column) => `
162
+ (CASE WHEN $order_by = '${column.field}' AND $is_desc IS false THEN "${column.field}"::text END),
163
+ (CASE WHEN $order_by = '${column.field}' AND $is_desc IS true THEN "${column.field}"::text END) DESC`)
164
+ .join(',\n')}`;
165
+ quicksearchCondition = `($quicksearch = '' OR CONCAT(${filteredColumns.join(', ')}) ILIKE '%' || $quicksearch || '%')`;
166
+ query += `SELECT ${filteredColumns.join(', ')} FROM ${table}\n`;
167
+ query += ` WHERE ${whereClause ? `${whereClause} AND` : ''} ${quicksearchCondition}\n`;
168
+ query += ` ORDER BY ${orderBy}\n`;
169
+ query += ` LIMIT $limit::INT OFFSET $offset::INT`;
170
+ break;
171
+ }
158
172
  default:
159
173
  throw new Error('Unsupported database type');
160
174
  }
@@ -41,6 +41,13 @@ export function makeUpdateQuery(table, column, columns, dbType) {
41
41
  query += `\nUPDATE ${table} SET ${column.field} = @value_to_update \nWHERE ${conditions}`;
42
42
  return query;
43
43
  }
44
+ case 'duckdb': {
45
+ const conditions = columns
46
+ .map((c) => `($${c.field} IS NULL AND ${c.field} IS NULL OR ${c.field} = $${c.field})`)
47
+ .join('\n AND ');
48
+ query += `\nUPDATE ${table} SET ${column.field} = $value_to_update \nWHERE ${conditions}`;
49
+ return query;
50
+ }
44
51
  default:
45
52
  throw new Error('Unsupported database type');
46
53
  }