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
@@ -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(
@@ -510,7 +537,7 @@ onDestroy(() => {
510
537
  onchange={(x) => fileChanged(x, (val) => (value[i] = val))}
511
538
  multiple={false}
512
539
  />
513
- {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined && itemsType?.properties === undefined}
540
+ {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined && itemsType?.properties === undefined && !(format?.startsWith('resource-') && resourceTypes?.includes(format.split('-')[1]))}
514
541
  {#await import('./JsonEditor.svelte')}
515
542
  <Loader2 class="animate-spin" />
516
543
  {:then Module}
@@ -536,10 +563,16 @@ onDestroy(() => {
536
563
  enum_={itemsType?.enum ?? []}
537
564
  enumLabels={extra['enumLabels']}
538
565
  />
539
- {:else if itemsType?.type == 'resource' && itemsType?.resourceType && resourceTypes?.includes(itemsType.resourceType)}
566
+ {:else if (itemsType?.type == 'resource' && itemsType?.resourceType && resourceTypes?.includes(itemsType.resourceType)) || (format?.startsWith('resource-') && resourceTypes?.includes(format.split('-')[1]))}
567
+ {@const resourceFormat =
568
+ itemsType?.type == 'resource' &&
569
+ itemsType.resourceType &&
570
+ resourceTypes.includes(itemsType.resourceType)
571
+ ? `resource-${itemsType.resourceType}`
572
+ : format!}
540
573
  <ObjectResourceInput
541
574
  bind:value={value[i]}
542
- format={'resource-' + itemsType?.resourceType}
575
+ format={resourceFormat}
543
576
  defaultValue={undefined}
544
577
  />
545
578
  {:else if itemsType?.type == 'resource'}
@@ -591,6 +624,15 @@ onDestroy(() => {
591
624
  >{itemsLimit}/{value.length}: Load 50 more...</button
592
625
  >
593
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}
594
636
  {/if}
595
637
  {/key}
596
638
  </div>
@@ -607,7 +649,11 @@ onDestroy(() => {
607
649
  if (itemsType?.type == 'number') {
608
650
  value = value.concat(0)
609
651
  } else if (
610
- itemsType?.type == 'object' ||
652
+ (itemsType?.type == 'object' &&
653
+ !(
654
+ format?.startsWith('resource-') &&
655
+ resourceTypes?.includes(format.split('-')[1])
656
+ )) ||
611
657
  (itemsType?.type == 'resource' &&
612
658
  !(
613
659
  itemsType?.resourceType && resourceTypes?.includes(itemsType?.resourceType)
@@ -647,7 +693,7 @@ onDestroy(() => {
647
693
  {:else if inputCat == 'dynselect'}
648
694
  <DynSelect
649
695
  name={label}
650
- args={otherArgs}
696
+ {otherArgs}
651
697
  {helperScript}
652
698
  bind:value
653
699
  entrypoint={format?.substring('dynselect_'.length) ?? ''}
@@ -657,6 +703,7 @@ onDestroy(() => {
657
703
  {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format && format?.split('-').length > 1 && resourceTypes.includes(format?.substring('resource-'.length))))}
658
704
  <!-- {JSON.stringify(value)} -->
659
705
  <ObjectResourceInput
706
+ {disabled}
660
707
  {defaultValue}
661
708
  selectFirst={!noDefaultOnSelectFirst}
662
709
  {disablePortal}
@@ -1057,17 +1104,8 @@ onDestroy(() => {
1057
1104
  {/if}
1058
1105
  {/if}
1059
1106
  </div>
1060
- {#if variableEditor}
1061
- <div class="text-sm text-tertiary">
1062
- {#if value && typeof value == 'string' && value?.startsWith('$var:')}
1063
- Linked to variable <button
1064
- class="text-blue-500 underline"
1065
- onclick={() => variableEditor?.editVariable?.(value.slice(5))}
1066
- >{value.slice(5)}</button
1067
- >
1068
- {/if}
1069
- </div>
1070
- {/if}
1107
+ {@render variableInput()}
1108
+ {@render resourceInput()}
1071
1109
  </div>
1072
1110
  {/if}
1073
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;