windmill-components 1.511.1 → 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 (232) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +42 -14
  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 -1
  29. package/package/components/FlowPreviewResult.svelte +4 -1
  30. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  31. package/package/components/FlowStatusViewerInner.svelte +21 -3
  32. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -1
  33. package/package/components/FolderEditor.svelte +1 -1
  34. package/package/components/GitDiffPreview.svelte +14 -18
  35. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  36. package/package/components/GitHubAppIntegration.svelte +3 -1
  37. package/package/components/IdEditorInput.svelte +25 -22
  38. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  39. package/package/components/InstanceSetting.svelte +7 -2
  40. package/package/components/InstanceSettings.svelte +1 -0
  41. package/package/components/JobLoader.svelte +48 -5
  42. package/package/components/JobLoader.svelte.d.ts +7 -2
  43. package/package/components/Login.svelte +8 -2
  44. package/package/components/MemoryFootprintViewer.svelte +1 -1
  45. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  46. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  47. package/package/components/NextcloudSetting.svelte +84 -0
  48. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  49. package/package/components/ObjectResourceInput.svelte +3 -2
  50. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  51. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  52. package/package/components/ResourceEditor.svelte +1 -1
  53. package/package/components/ResourcePicker.svelte +8 -1
  54. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  55. package/package/components/ResultStreamDisplay.svelte +5 -0
  56. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  57. package/package/components/RunForm.svelte +9 -1
  58. package/package/components/SchemaForm.svelte +2 -2
  59. package/package/components/SchemaForm.svelte.d.ts +2 -10
  60. package/package/components/ScriptBuilder.svelte +13 -8
  61. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ScriptWrapper.svelte +1 -1
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SimpleAgTable.svelte +2 -0
  66. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  67. package/package/components/SqlRepl.svelte +21 -7
  68. package/package/components/SqlRepl.svelte.d.ts +2 -2
  69. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  70. package/package/components/WorkerTagSelect.svelte +70 -1
  71. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  72. package/package/components/apps/components/display/AppText.svelte +2 -2
  73. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  74. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  75. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  76. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  77. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  78. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  79. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  80. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  81. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  82. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  83. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  84. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  85. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  86. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  87. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  88. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  89. package/package/components/apps/components/display/table/utils.js +7 -4
  90. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  91. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  92. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  93. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  94. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  95. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  96. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  97. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  98. package/package/components/apps/editor/GridViewer.svelte +1 -0
  99. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  100. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  101. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  102. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  103. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  104. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  105. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  106. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  107. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  108. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  109. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  110. package/package/components/assets/lib.js +4 -0
  111. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  112. package/package/components/common/button/Button.svelte +4 -3
  113. package/package/components/common/button/Button.svelte.d.ts +1 -0
  114. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  115. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  116. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  117. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  118. package/package/components/common/modal/Modal.svelte +2 -5
  119. package/package/components/common/tabs/TabsV2.svelte +2 -1
  120. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  121. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  122. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  123. package/package/components/copilot/chat/script/core.js +28 -29
  124. package/package/components/copilot/chat/shared.d.ts +1 -1
  125. package/package/components/copilot/chat/shared.js +8 -2
  126. package/package/components/custom_ui.d.ts +2 -0
  127. package/package/components/dbOps.d.ts +20 -8
  128. package/package/components/dbOps.js +85 -40
  129. package/package/components/details/DetailPageHeader.svelte +0 -2
  130. package/package/components/flows/content/FlowInput.svelte +5 -0
  131. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  132. package/package/components/flows/idUtils.js +2 -1
  133. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  134. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  135. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  136. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  137. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  138. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  139. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  140. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  141. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  142. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  143. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  144. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  145. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  146. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  148. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  149. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  151. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  152. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  153. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  154. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  155. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  156. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  157. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  158. package/package/components/graph/FlowGraphV2.svelte +5 -1
  159. package/package/components/graph/graphBuilder.svelte.js +1 -1
  160. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  161. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  162. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  163. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  164. package/package/components/icons/DucklakeIcon.svelte +18 -0
  165. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  166. package/package/components/instanceSettings.js +11 -3
  167. package/package/components/runs/JobPreview.svelte +2 -2
  168. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  169. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  170. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  171. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  172. package/package/components/schema/PropertyEditor.svelte +0 -2
  173. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  174. package/package/components/schema/SchemaFormDND.svelte +2 -1
  175. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  176. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  177. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  178. package/package/components/select/Select.svelte +7 -4
  179. package/package/components/select/Select.svelte.d.ts +5 -0
  180. package/package/components/select/SelectDropdown.svelte +2 -1
  181. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  182. package/package/components/sidebar/changelogs.js +5 -0
  183. package/package/components/table/AutoDataTable.svelte +6 -4
  184. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  185. package/package/components/table/DataTable.svelte +12 -10
  186. package/package/components/table/DataTable.svelte.d.ts +1 -0
  187. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  188. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  189. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  190. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  191. package/package/components/triggers/gcp/utils.js +1 -0
  192. package/package/components/triggers/http/utils.js +1 -1
  193. package/package/components/triggers/kafka/utils.js +1 -1
  194. package/package/components/triggers/mqtt/utils.js +1 -1
  195. package/package/components/triggers/nats/utils.js +1 -1
  196. package/package/components/triggers/postgres/utils.js +1 -1
  197. package/package/components/triggers/sqs/utils.js +1 -1
  198. package/package/components/triggers/utils.js +2 -1
  199. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  200. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  201. package/package/components/triggers/websocket/utils.js +1 -1
  202. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  203. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  204. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  205. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  206. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  207. package/package/consts.js +2 -1
  208. package/package/gen/core/OpenAPI.js +1 -1
  209. package/package/gen/schemas.gen.d.ts +7 -6
  210. package/package/gen/schemas.gen.js +7 -6
  211. package/package/gen/services.gen.d.ts +19 -1
  212. package/package/gen/services.gen.js +38 -0
  213. package/package/gen/types.gen.d.ts +78 -3
  214. package/package/git-sync.d.ts +36 -0
  215. package/package/git-sync.js +1 -0
  216. package/package/hub.d.ts +1 -0
  217. package/package/hubPaths.json +5 -2
  218. package/package/infer.js +3 -2
  219. package/package/script_helpers.d.ts +2 -2
  220. package/package/script_helpers.js +29 -11
  221. package/package/services/JobManager.d.ts +28 -0
  222. package/package/services/JobManager.js +114 -0
  223. package/package/stores.d.ts +1 -1
  224. package/package/utils.d.ts +18 -1
  225. package/package/utils.js +55 -2
  226. package/package.json +5 -4
  227. package/package/components/InitGitRepoPopover.svelte +0 -410
  228. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  229. package/package/components/PullGitRepoPopover.svelte +0 -355
  230. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  231. package/package/inferArgSig.d.ts +0 -42
  232. package/package/inferArgSig.js +0 -198
@@ -30,6 +30,6 @@ declare const AppConnectInner: $$__sveltets_2_IsomorphicComponent<Props, {
30
30
  loadResourceTypes: () => Promise<void>;
31
31
  next: () => Promise<void>;
32
32
  back: () => Promise<void>;
33
- }, "step" | "disabled" | "resourceType" | "manual" | "isGoogleSignin">;
33
+ }, "step" | "disabled" | "manual" | "resourceType" | "isGoogleSignin">;
34
34
  type AppConnectInner = InstanceType<typeof AppConnectInner>;
35
35
  export default AppConnectInner;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">import { preventDefault, stopPropagation, createBubbler } from 'svelte/legacy';
2
2
  const bubble = createBubbler();
3
3
  import { setInputCat as computeInputCat, debounce, emptyString, getSchemaFromProperties } from '../utils';
4
- import { DollarSign, Plus, X, Check, Loader2 } from 'lucide-svelte';
4
+ import { DollarSign, Plus, X, Check, Loader2, ExternalLink } from 'lucide-svelte';
5
5
  import { createEventDispatcher, onDestroy, onMount, tick, untrack } from 'svelte';
6
6
  import { fade } from 'svelte/transition';
7
7
  import { Button, SecondsInput } from './common';
@@ -27,6 +27,7 @@ import DynSelect from './DynSelect.svelte';
27
27
  import MultiSelect from './select/MultiSelect.svelte';
28
28
  import { safeSelectItems } from './select/utils.svelte';
29
29
  import S3ArgInput from './common/fileUpload/S3ArgInput.svelte';
30
+ import { base } from '../base';
30
31
  let { label = '', value = $bindable(), defaultValue = $bindable(undefined), description = $bindable(undefined), format = $bindable(undefined), contentEncoding = undefined, type = undefined, oneOf = $bindable(undefined), required = false, pattern = $bindable(undefined), valid = $bindable(undefined), enum_ = $bindable(undefined), disabled = false, itemsType = $bindable(undefined), displayHeader = true, properties = $bindable(undefined), nestedRequired = undefined, autofocus = null, compact = false, password = false, pickForField = $bindable(undefined), variableEditor = undefined, itemPicker = undefined, noMargin = false, extra = {}, minW = true, prettifyHeader = false, resourceTypes, disablePortal = false, showSchemaExplorer = false, simpleTooltip = undefined, customErrorMessage = undefined, onlyMaskPassword = false, nullable = false, title = $bindable(undefined), placeholder = $bindable(undefined), order = $bindable(undefined), editor = $bindable(undefined), orderEditable = false, shouldDispatchChanges = false, noDefaultOnSelectFirst = false, helperScript = undefined, otherArgs = {}, lightHeader = false, diffStatus = undefined, hideNested = false, nestedParent = undefined, nestedClasses = '', displayType = true, css = undefined, appPath = undefined, computeS3ForceViewerPolicies = undefined, workspace = undefined, actions } = $props();
31
32
  $effect(() => {
32
33
  if (description == undefined) {
@@ -156,7 +157,7 @@ function evalValueToRaw() {
156
157
  }
157
158
  const newRawValue = value == undefined || value == null
158
159
  ? ''
159
- : isObjectCat(inputCat)
160
+ : isObjectCat(inputCat) || (inputCat == 'list' && isListJson)
160
161
  ? JSON.stringify(value, null, 2)
161
162
  : isRawStringEditor(inputCat)
162
163
  ? typeof value == 'string'
@@ -323,6 +324,32 @@ onDestroy(() => {
323
324
  });
324
325
  </script>
325
326
 
327
+ {#snippet variableInput()}
328
+ {#if variableEditor}
329
+ <div class="text-sm text-tertiary">
330
+ {#if value && typeof value == 'string' && value?.startsWith('$var:')}
331
+ Linked to variable <button
332
+ class="text-blue-500 underline"
333
+ onclick={() => variableEditor?.editVariable?.(value.slice(5))}>{value.slice(5)}</button
334
+ >
335
+ {/if}
336
+ </div>
337
+ {/if}
338
+ {/snippet}
339
+ {#snippet resourceInput()}
340
+ {#if variableEditor}
341
+ <div class="text-sm text-tertiary">
342
+ {#if value && typeof value == 'string' && value?.startsWith('$res:')}
343
+ Linked to resource <a
344
+ target="_blank"
345
+ href="{base}/resources#/resource/{value.slice(5)}"
346
+ class="text-blue-500 underline"
347
+ >{value.slice(5)} <span class="inline-block -mb-0.5"><ExternalLink size={14} /></span></a
348
+ >
349
+ {/if}
350
+ </div>
351
+ {/if}
352
+ {/snippet}
326
353
  <!-- svelte-ignore a11y_autofocus -->
327
354
  <div
328
355
  class={twMerge(
@@ -597,6 +624,15 @@ onDestroy(() => {
597
624
  >{itemsLimit}/{value.length}: Load 50 more...</button
598
625
  >
599
626
  {/if}
627
+ {:else if typeof value === 'string'}
628
+ {#if value.startsWith('$res:')}
629
+ {@render resourceInput()}
630
+ {:else}
631
+ <div class="text-red-500">
632
+ Invalid string value: "{value}", expected array. Click add item to turn it
633
+ into an array.
634
+ </div>
635
+ {/if}
600
636
  {/if}
601
637
  {/key}
602
638
  </div>
@@ -657,7 +693,7 @@ onDestroy(() => {
657
693
  {:else if inputCat == 'dynselect'}
658
694
  <DynSelect
659
695
  name={label}
660
- args={otherArgs}
696
+ {otherArgs}
661
697
  {helperScript}
662
698
  bind:value
663
699
  entrypoint={format?.substring('dynselect_'.length) ?? ''}
@@ -667,6 +703,7 @@ onDestroy(() => {
667
703
  {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format && format?.split('-').length > 1 && resourceTypes.includes(format?.substring('resource-'.length))))}
668
704
  <!-- {JSON.stringify(value)} -->
669
705
  <ObjectResourceInput
706
+ {disabled}
670
707
  {defaultValue}
671
708
  selectFirst={!noDefaultOnSelectFirst}
672
709
  {disablePortal}
@@ -1067,17 +1104,8 @@ onDestroy(() => {
1067
1104
  {/if}
1068
1105
  {/if}
1069
1106
  </div>
1070
- {#if variableEditor}
1071
- <div class="text-sm text-tertiary">
1072
- {#if value && typeof value == 'string' && value?.startsWith('$var:')}
1073
- Linked to variable <button
1074
- class="text-blue-500 underline"
1075
- onclick={() => variableEditor?.editVariable?.(value.slice(5))}
1076
- >{value.slice(5)}</button
1077
- >
1078
- {/if}
1079
- </div>
1080
- {/if}
1107
+ {@render variableInput()}
1108
+ {@render resourceInput()}
1081
1109
  </div>
1082
1110
  {/if}
1083
1111
  {@render actions?.()}
@@ -1,8 +1,8 @@
1
1
  import type { EnumType, SchemaProperty } from '../common';
2
+ import { type DynamicSelect } from '../utils';
2
3
  import type ItemPicker from './ItemPicker.svelte';
3
4
  import type SimpleEditor from './SimpleEditor.svelte';
4
5
  import type VariableEditor from './VariableEditor.svelte';
5
- import type { Script } from '../gen';
6
6
  import type { SchemaDiff } from './schema/schemaUtils.svelte';
7
7
  import type { ComponentCustomCSS } from './apps/types';
8
8
  interface Props {
@@ -58,15 +58,7 @@ interface Props {
58
58
  orderEditable?: boolean;
59
59
  shouldDispatchChanges?: boolean;
60
60
  noDefaultOnSelectFirst?: boolean;
61
- helperScript?: {
62
- type: 'inline';
63
- path?: string;
64
- lang: Script['language'];
65
- code: string;
66
- } | {
67
- type: 'hash';
68
- hash: string;
69
- } | undefined;
61
+ helperScript?: DynamicSelect.HelperScript;
70
62
  otherArgs?: Record<string, any>;
71
63
  lightHeader?: boolean;
72
64
  diffStatus?: SchemaDiff | undefined;
@@ -86,6 +86,11 @@ loadCustomTags();
86
86
  >For tags specific to some workspaces, use <pre class="inline">tag(workspace1+workspace2)</pre
87
87
  ></span
88
88
  >
89
+ <span class="text-2xs text-tertiary"
90
+ >To exclude 'workspace1' and 'workspace2' from a tag, use <pre
91
+ class="inline">tag(^workspace1^workspace2)</pre
92
+ ></span
93
+ >
89
94
  <span class="text-2xs text-tertiary"
90
95
  >For dynamic tags based on the workspace, use <pre class="inline">$workspace</pre>, e.g:
91
96
  <pre class="inline">tag-$workspace</pre></span
@@ -10,13 +10,14 @@ import AuthentikSetting from './AuthentikSetting.svelte';
10
10
  import AutheliaSetting from './AutheliaSetting.svelte';
11
11
  import KanidmSetting from './KanidmSetting.svelte';
12
12
  import ZitadelSetting from './ZitadelSetting.svelte';
13
+ import NextcloudSetting from './NextcloudSetting.svelte';
13
14
  import CustomOauth from './CustomOauth.svelte';
14
15
  import { capitalize } from '../utils';
15
16
  import Toggle from './Toggle.svelte';
16
17
  import { ExternalLink, Plus } from 'lucide-svelte';
17
18
  import AzureOauthSettings from './AzureOauthSettings.svelte';
18
19
  import Tooltip from './Tooltip.svelte';
19
- let { snowflakeAccountIdentifier = $bindable(), oauths = $bindable(), requirePreexistingUserForOauth = $bindable(), scim } = $props();
20
+ let { snowflakeAccountIdentifier = $bindable(), oauths = $bindable(), requirePreexistingUserForOauth = $bindable(), baseUrl, scim } = $props();
20
21
  $effect(() => {
21
22
  if (snowflakeAccountIdentifier == undefined) {
22
23
  snowflakeAccountIdentifier = '';
@@ -97,8 +98,9 @@ let tab = $state('sso');
97
98
  <AutheliaSetting bind:value={oauths['authelia']} />
98
99
  <KanidmSetting bind:value={oauths['kanidm']} />
99
100
  <ZitadelSetting bind:value={oauths['zitadel']} />
101
+ <NextcloudSetting bind:value={oauths['nextcloud']} {baseUrl} />
100
102
  {#each Object.keys(oauths) as k}
101
- {#if !['authelia', 'authentik', 'google', 'microsoft', 'github', 'gitlab', 'jumpcloud', 'okta', 'auth0', 'keycloak', 'slack', 'kanidm', 'zitadel'].includes(k) && 'login_config' in oauths[k]}
103
+ {#if !['authelia', 'authentik', 'google', 'microsoft', 'github', 'gitlab', 'jumpcloud', 'okta', 'auth0', 'keycloak', 'slack', 'kanidm', 'zitadel', 'nextcloud'].includes(k) && 'login_config' in oauths[k]}
102
104
  {#if oauths[k]}
103
105
  <div class="flex flex-col gap-2 pb-4">
104
106
  <div class="flex flex-row items-center gap-2">
@@ -2,6 +2,7 @@ interface Props {
2
2
  snowflakeAccountIdentifier?: string;
3
3
  oauths?: Record<string, any>;
4
4
  requirePreexistingUserForOauth?: boolean;
5
+ baseUrl?: string;
5
6
  scim?: import('svelte').Snippet;
6
7
  }
7
8
  declare const AuthSettings: import("svelte").Component<Props, {}, "snowflakeAccountIdentifier" | "oauths" | "requirePreexistingUserForOauth">;
@@ -6,28 +6,33 @@ import { sendUserToast, sortArray } from '../utils';
6
6
  import { ArrowLeft, Expand, Loader2, Minimize, RefreshCcw } from 'lucide-svelte';
7
7
  import { dbSupportsSchemas, getDbSchemas, getLanguageByResourceType, loadAllTablesMetaData, loadTableMetaData } from './apps/components/display/dbtable/utils';
8
8
  import DbManager from './DBManager.svelte';
9
- import { dbDeleteTableActionWithPreviewScript, dbTableOpsWithPreviewScripts } from './dbOps';
9
+ import { dbDeleteTableActionWithPreviewScript, dbTableOpsWithPreviewScripts, getDucklakeSchema, wrapDucklakeQuery } from './dbOps';
10
10
  import { makeCreateTableQuery } from './apps/components/display/dbtable/queries/createTable';
11
11
  import { runScriptAndPollResult } from './jobs/utils';
12
12
  import { Pane, Splitpanes } from 'svelte-splitpanes';
13
13
  import SqlRepl from './SqlRepl.svelte';
14
14
  import SimpleAgTable from './SimpleAgTable.svelte';
15
15
  import { untrack } from 'svelte';
16
- let resourceType = $state(undefined);
17
- let resourcePath = $state(undefined);
18
- let open = $derived(resourcePath && resourceType);
19
- export function openDrawer(_resourceType, _resourcePath) {
20
- resourceType = _resourceType;
21
- resourcePath = _resourcePath;
16
+ let input = $state();
17
+ let open = $derived(!!input);
18
+ export function openDrawer(nInput) {
19
+ input = nInput;
22
20
  getSchema();
23
21
  }
24
22
  export function closeDrawer() {
25
- resourceType = undefined;
26
- resourcePath = undefined;
23
+ input = undefined;
27
24
  refreshCount = 0;
28
25
  refreshing = false;
29
26
  }
30
- let dbSchema = $derived(resourcePath && resourcePath in $dbSchemas ? $dbSchemas[resourcePath] : undefined);
27
+ let dbSchema = $derived(input && $dbSchemas[getDbSchemasPath(input)]);
28
+ function getDbSchemasPath(input) {
29
+ switch (input.type) {
30
+ case 'database':
31
+ return input.resourcePath;
32
+ case 'ducklake':
33
+ return 'ducklake://' + input.ducklake;
34
+ }
35
+ }
31
36
  // `refreshCount` is a derived state. `refreshing` is the source of truth
32
37
  let refreshCount = $state(0);
33
38
  $effect(() => {
@@ -46,25 +51,29 @@ $effect(() => {
46
51
  expand = false;
47
52
  });
48
53
  async function getSchema() {
49
- if (!resourcePath || !resourceType || ($dbSchemas[resourcePath] && !refreshing))
54
+ if (!input)
50
55
  return;
51
- try {
52
- const oldDbSchema = $dbSchemas[resourcePath];
53
- await getDbSchemas(resourceType, resourcePath, $workspaceStore, $dbSchemas, (message) => {
56
+ const dbSchemasPath = getDbSchemasPath(input);
57
+ if ($dbSchemas[dbSchemasPath] && !refreshing)
58
+ return;
59
+ const oldDbSchema = $dbSchemas[dbSchemasPath];
60
+ if (input.type == 'database') {
61
+ await getDbSchemas(input.resourceType, input.resourcePath, $workspaceStore, $dbSchemas, (message) => {
54
62
  if (open)
55
63
  sendUserToast(message, true);
56
64
  });
57
- // avoid infinite loop on error due to the way getDbSchemas is implemented
58
- // and relying on an assignement side effect
59
- if (oldDbSchema !== $dbSchemas[resourcePath])
60
- $dbSchemas = $dbSchemas;
61
65
  }
62
- catch (e) {
63
- console.error(e);
64
- }
65
- finally {
66
- refreshing = false;
66
+ else if (input.type == 'ducklake') {
67
+ $dbSchemas[dbSchemasPath] = await getDucklakeSchema({
68
+ workspace: $workspaceStore,
69
+ ducklake: input.ducklake
70
+ });
67
71
  }
72
+ // avoid infinite loop on error due to the way getDbSchemas is implemented
73
+ // and relying on an assignement side effect
74
+ if (oldDbSchema !== $dbSchemas[dbSchemasPath])
75
+ $dbSchemas = $dbSchemas;
76
+ refreshing = false;
68
77
  }
69
78
  let windowWidth = $state(window.innerWidth);
70
79
  let replPanelSize = $state(36);
@@ -73,22 +82,22 @@ let replResultData = $state(undefined);
73
82
  let cachedColDefs = {};
74
83
  let cachedLastRefreshCount = 0;
75
84
  async function getColDefs(tableKey) {
76
- if (!resourcePath || !resourceType)
77
- return [];
78
85
  if (cachedLastRefreshCount !== refreshCount)
79
86
  cachedColDefs = {};
80
87
  cachedLastRefreshCount = refreshCount;
81
- if (cachedColDefs[tableKey]) {
88
+ if (cachedColDefs[tableKey])
82
89
  return cachedColDefs[tableKey];
83
- }
90
+ if (!input)
91
+ return [];
84
92
  try {
85
- cachedColDefs =
86
- (await loadAllTablesMetaData('$res:' + resourcePath, $workspaceStore, resourceType)) ??
87
- cachedColDefs;
93
+ cachedColDefs = (await loadAllTablesMetaData($workspaceStore, input)) ?? cachedColDefs;
88
94
  return cachedColDefs[tableKey];
89
95
  }
90
96
  catch (e) {
91
- const result = await loadTableMetaData('$res:' + resourcePath, $workspaceStore, tableKey, resourceType);
97
+ if (input?.type == 'ducklake')
98
+ throw 'Impossible that loadAllTablesMetaData fails for Ducklake';
99
+ // Query is not implemented for all dbs, need a fallback
100
+ const result = await loadTableMetaData(input, $workspaceStore, tableKey);
92
101
  if (result)
93
102
  cachedColDefs[tableKey] = result;
94
103
  return result ?? [];
@@ -113,126 +122,120 @@ async function getColDefs(tableKey) {
113
122
  preventEscape
114
123
  on:close={closeDrawer}
115
124
  >
116
- {#key [resourceType, resourcePath, dbSchema]}
117
- <DrawerContent
118
- title={replResultData ? 'Query Result' : 'Database Manager'}
119
- on:close={() => {
120
- if (replResultData) {
121
- replResultData = undefined
122
- } else {
123
- closeDrawer()
124
- }
125
- }}
126
- CloseIcon={replResultData ? ArrowLeft : undefined}
127
- noPadding
128
- >
129
- {#if dbSchema && $workspaceStore && resourceType && resourcePath}
130
- <Splitpanes horizontal>
131
- <Pane class="relative">
132
- <!-- svelte-ignore a11y_click_events_have_key_events -->
133
- <!-- svelte-ignore a11y_no_static_element_interactions -->
134
- <div
135
- class={'absolute inset-0 z-10 p-8 ' +
136
- (replResultData
137
- ? 'bg-surface/90'
138
- : 'transition-colors bg-transparent pointer-events-none select-none')}
139
- onclick={(e) => {
140
- // Only proceed if the click is directly on this div and not on the child elements
141
- if (e.target === e.currentTarget) {
142
- replResultData = undefined
143
- }
144
- }}
145
- >
146
- {#if replResultData}
147
- {#key replResultData}
148
- <SimpleAgTable data={replResultData} class="animate-zoom-in" />
149
- {/key}
150
- {/if}
151
- </div>
152
- <DbManager
153
- dbSupportsSchemas={dbSupportsSchemas(resourceType)}
154
- {dbSchema}
155
- {getColDefs}
156
- dbTableOpsFactory={({ colDefs, tableKey }) =>
157
- dbTableOpsWithPreviewScripts({
158
- colDefs,
159
- tableKey,
160
- resourcePath: resourcePath!,
161
- resourceType: resourceType!,
162
- workspace: $workspaceStore
163
- })}
164
- dbTableActionsFactory={[
165
- dbDeleteTableActionWithPreviewScript({
166
- resourcePath,
167
- resourceType,
168
- workspace: $workspaceStore
169
- })
170
- ]}
171
- {refresh}
172
- dbTableEditorPropsFactory={({ selectedSchemaKey }) => ({
173
- resourceType: resourceType!,
174
- previewSql: (values) =>
175
- makeCreateTableQuery(values, resourceType!, selectedSchemaKey),
176
- async onConfirm(values) {
177
- await runScriptAndPollResult({
178
- workspace: $workspaceStore,
179
- requestBody: {
180
- args: { database: '$res:' + resourcePath },
181
- content: makeCreateTableQuery(values, resourceType!, selectedSchemaKey),
182
- language: getLanguageByResourceType(resourceType!)
183
- }
184
- })
185
- refresh()
186
- }
125
+ <DrawerContent
126
+ title={replResultData ? 'Query Result' : 'Database Manager'}
127
+ on:close={() => {
128
+ if (replResultData) {
129
+ replResultData = undefined
130
+ } else {
131
+ closeDrawer()
132
+ }
133
+ }}
134
+ CloseIcon={replResultData ? ArrowLeft : undefined}
135
+ noPadding
136
+ >
137
+ {#if dbSchema && $workspaceStore && input}
138
+ {@const _input = input}
139
+ {@const dbType = input.type == 'database' ? input.resourceType : 'duckdb'}
140
+ <Splitpanes horizontal>
141
+ <Pane class="relative">
142
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
143
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
144
+ <div
145
+ class={'absolute inset-0 z-10 p-8 ' +
146
+ (replResultData
147
+ ? 'bg-surface/90'
148
+ : 'transition-colors bg-transparent pointer-events-none select-none')}
149
+ onclick={(e) => {
150
+ // Only proceed if the click is directly on this div and not on the child elements
151
+ if (e.target === e.currentTarget) {
152
+ replResultData = undefined
153
+ }
154
+ }}
155
+ >
156
+ {#if replResultData}
157
+ {#key replResultData}
158
+ <SimpleAgTable data={replResultData} class="animate-zoom-in" />
159
+ {/key}
160
+ {/if}
161
+ </div>
162
+ <DbManager
163
+ dbSupportsSchemas={input.type == 'database' && dbSupportsSchemas(input.resourceType)}
164
+ {dbSchema}
165
+ {getColDefs}
166
+ dbTableOpsFactory={({ colDefs, tableKey }) =>
167
+ dbTableOpsWithPreviewScripts({
168
+ colDefs,
169
+ tableKey,
170
+ input: _input,
171
+ workspace: $workspaceStore
187
172
  })}
188
- />
189
- </Pane>
190
- <Pane bind:size={replPanelSize} minSize={REPL_MIN_SIZE} class="relative">
191
- <SqlRepl
192
- {resourcePath}
193
- {resourceType}
194
- onData={(data) => {
195
- replResultData = data
196
- }}
197
- placeholderTableName={sortArray(
198
- Object.keys(
199
- dbSchema?.schema[
200
- 'public' in dbSchema?.schema
201
- ? 'public'
202
- : 'dbo' in dbSchema?.schema
203
- ? 'dbo'
204
- : Object.keys(dbSchema?.schema)?.[0]
205
- ]
206
- )
207
- )?.[0]}
208
- />
209
- </Pane>
210
- </Splitpanes>
211
- {:else}
212
- <Splitpanes>
213
- <Pane class="relative flex justify-center items-center">
214
- <Loader2 class="animate-spin" size={32} />
215
- </Pane>
216
- </Splitpanes>
217
- {/if}
218
- {#snippet actions()}
219
- <Button
220
- loading={refreshing}
221
- on:click={() => refresh()}
222
- startIcon={{ icon: RefreshCcw }}
223
- size="xs"
224
- color="light"
225
- >
226
- Refresh
227
- </Button>
173
+ dbTableActionsFactory={[
174
+ dbDeleteTableActionWithPreviewScript({ input: _input, workspace: $workspaceStore })
175
+ ]}
176
+ {refresh}
177
+ dbTableEditorPropsFactory={({ selectedSchemaKey }) => ({
178
+ dbType,
179
+ previewSql: (values) => makeCreateTableQuery(values, dbType, selectedSchemaKey),
180
+ async onConfirm(values) {
181
+ const dbArg =
182
+ input?.type === 'database' ? { database: '$res:' + input.resourcePath } : {}
183
+ const language = getLanguageByResourceType(dbType)
184
+ let query = makeCreateTableQuery(values, dbType, selectedSchemaKey)
185
+ if (input?.type === 'ducklake') query = wrapDucklakeQuery(query, input.ducklake)
186
+ await runScriptAndPollResult({
187
+ workspace: $workspaceStore,
188
+ requestBody: { args: dbArg, content: query, language }
189
+ })
190
+ refresh()
191
+ }
192
+ })}
193
+ />
194
+ </Pane>
195
+ <Pane bind:size={replPanelSize} minSize={REPL_MIN_SIZE} class="relative">
196
+ <SqlRepl
197
+ {input}
198
+ onData={(data) => {
199
+ replResultData = data
200
+ }}
201
+ placeholderTableName={sortArray(
202
+ Object.keys(
203
+ dbSchema?.schema[
204
+ 'public' in dbSchema?.schema
205
+ ? 'public'
206
+ : 'dbo' in dbSchema?.schema
207
+ ? 'dbo'
208
+ : Object.keys(dbSchema?.schema)?.[0]
209
+ ]
210
+ )
211
+ )?.[0]}
212
+ />
213
+ </Pane>
214
+ </Splitpanes>
215
+ {:else}
216
+ <Splitpanes>
217
+ <Pane class="relative flex justify-center items-center">
218
+ <Loader2 class="animate-spin" size={32} />
219
+ </Pane>
220
+ </Splitpanes>
221
+ {/if}
222
+ {#snippet actions()}
223
+ <Button
224
+ loading={refreshing}
225
+ on:click={() => refresh()}
226
+ startIcon={{ icon: RefreshCcw }}
227
+ size="xs"
228
+ color="light"
229
+ >
230
+ Refresh
231
+ </Button>
228
232
 
229
- <Button
230
- on:click={() => (expand = !expand)}
231
- startIcon={{ icon: expand ? Minimize : Expand }}
232
- size="xs"
233
- color="light"
234
- />
235
- {/snippet}
236
- </DrawerContent>
237
- {/key}
233
+ <Button
234
+ on:click={() => (expand = !expand)}
235
+ startIcon={{ icon: expand ? Minimize : Expand }}
236
+ size="xs"
237
+ color="light"
238
+ />
239
+ {/snippet}
240
+ </DrawerContent>
238
241
  </Drawer>
@@ -1,6 +1,6 @@
1
- import { type DbType } from './apps/components/display/dbtable/utils';
1
+ import { type DbInput } from './dbOps';
2
2
  declare const DbManagerDrawer: import("svelte").Component<Record<string, never>, {
3
- openDrawer: (_resourceType: DbType, _resourcePath: string) => void;
3
+ openDrawer: (nInput: DbInput) => void;
4
4
  closeDrawer: () => void;
5
5
  }, "">;
6
6
  type DbManagerDrawer = ReturnType<typeof DbManagerDrawer>;
@@ -10,6 +10,7 @@ import DebouncedInput from './apps/components/helpers/DebouncedInput.svelte';
10
10
  import InsertRowDrawerButton from './apps/components/display/InsertRowDrawerButton.svelte';
11
11
  import { deepEqual } from 'fast-equals';
12
12
  import 'ag-grid-community/styles/ag-grid.css';
13
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
13
14
  import './apps/components/display/table/theme/windmill-theme.css';
14
15
  import { untrack } from 'svelte';
15
16
  let { dbTableOps } = $props();
@@ -46,7 +47,7 @@ function mountGrid() {
46
47
  ...(dbTableOps.onUpdate && {
47
48
  defaultColDef: {
48
49
  flex: 1,
49
- minWidth: 160,
50
+ minWidth: 150,
50
51
  editable: true,
51
52
  onCellValueChanged: (e) => {
52
53
  if (!$workspaceStore)
@@ -65,7 +66,6 @@ function mountGrid() {
65
66
  }
66
67
  }),
67
68
  onViewportChanged: (e) => ([firstRow, lastRow] = [e.firstRow, e.lastRow]),
68
- infiniteInitialRowCount: 100,
69
69
  cacheBlockSize: 100,
70
70
  cacheOverflowSize: 10,
71
71
  maxBlocksInCache: 20,
@@ -130,7 +130,7 @@ function updateGrid() {
130
130
  {#if dbTableOps.onInsert}
131
131
  <InsertRowDrawerButton
132
132
  columnDefs={dbTableOps.colDefs ?? []}
133
- dbType={dbTableOps.resourceType}
133
+ dbType={dbTableOps.dbType}
134
134
  onInsert={(values) => {
135
135
  if (!$workspaceStore) return
136
136
  dbTableOps.onInsert?.({ values }).then((result) => {
@@ -1,5 +1,6 @@
1
1
  import type { IDbTableOps } from './dbOps';
2
2
  import 'ag-grid-community/styles/ag-grid.css';
3
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
3
4
  import './apps/components/display/table/theme/windmill-theme.css';
4
5
  type Props = {
5
6
  dbTableOps: IDbTableOps;
@@ -46,15 +46,16 @@ import { twMerge } from 'tailwind-merge';
46
46
  import DarkModeObserver from './DarkModeObserver.svelte';
47
47
  import Select from './select/Select.svelte';
48
48
  import { safeSelectItems } from './select/utils.svelte';
49
- const { onConfirm, resourceType, previewSql, dbSchema, currentSchema } = $props();
50
- const columnTypes = DB_TYPES[resourceType];
49
+ const { onConfirm, dbType, previewSql, dbSchema, currentSchema } = $props();
50
+ const columnTypes = DB_TYPES[dbType];
51
51
  const defaultColumnType = {
52
52
  postgresql: 'VARCHAR',
53
53
  snowflake: 'varchar',
54
54
  ms_sql_server: 'varchar',
55
55
  bigquery: 'string',
56
- mysql: 'varchar'
57
- }[resourceType];
56
+ mysql: 'varchar',
57
+ duckdb: 'string'
58
+ }[dbType];
58
59
  const values = $state({
59
60
  name: '',
60
61
  columns: [],
@@ -70,7 +71,7 @@ function addColumn({ name, primaryKey }) {
70
71
  ...(primaryKey && { primaryKey })
71
72
  });
72
73
  }
73
- addColumn({ name: 'id', primaryKey: true });
74
+ addColumn({ name: 'id', primaryKey: dbType !== 'duckdb' });
74
75
  const errors = $derived(validate(values, dbSchema));
75
76
  let askingForConfirmation = $state();
76
77
  let darkMode = $state(false);
@@ -219,8 +220,7 @@ let darkMode = $state(false);
219
220
  items={getFlatTableNamesFromSchema(dbSchema).map((o) => ({
220
221
  value: o,
221
222
  label:
222
- (currentSchema && o.startsWith(currentSchema)) ||
223
- !dbSupportsSchemas(resourceType)
223
+ (currentSchema && o.startsWith(currentSchema)) || !dbSupportsSchemas(dbType)
224
224
  ? o.split('.')[1]
225
225
  : o
226
226
  }))}
@@ -1,7 +1,7 @@
1
1
  export type DBTableEditorProps = {
2
2
  onConfirm: (values: CreateTableValues) => void | Promise<void>;
3
3
  previewSql?: (values: CreateTableValues) => string;
4
- resourceType: DbType;
4
+ dbType: DbType;
5
5
  dbSchema?: DBSchema;
6
6
  currentSchema?: string;
7
7
  };