windmill-components 1.537.1 → 1.542.5

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 (275) hide show
  1. package/package/components/AIProviderPicker.svelte +181 -0
  2. package/package/components/AIProviderPicker.svelte.d.ts +15 -0
  3. package/package/components/ArgInfo.svelte +2 -2
  4. package/package/components/ArgInput.svelte +35 -9
  5. package/package/components/ArgInput.svelte.d.ts +3 -3
  6. package/package/components/AssignableTagsInner.svelte +89 -3
  7. package/package/components/ConcurrentJobsChart.svelte +36 -48
  8. package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
  9. package/package/components/CustomPopover.svelte.d.ts +1 -1
  10. package/package/components/DropdownSelect.svelte +26 -0
  11. package/package/components/DropdownSelect.svelte.d.ts +11 -0
  12. package/package/components/DropdownV2Inner.svelte +1 -1
  13. package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
  14. package/package/components/DynamicInput.svelte.d.ts +11 -0
  15. package/package/components/EditableSchemaForm.svelte +119 -95
  16. package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
  17. package/package/components/Editor.svelte +86 -93
  18. package/package/components/Editor.svelte.d.ts +4 -3
  19. package/package/components/EditorBar.svelte +2 -5
  20. package/package/components/EditorSettings.svelte +11 -9
  21. package/package/components/FlowBuilder.svelte +3 -3
  22. package/package/components/FlowLogRow.svelte +64 -0
  23. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  24. package/package/components/FlowLogViewer.svelte +406 -373
  25. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  26. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  27. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  28. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  29. package/package/components/FlowStatusViewerInner.svelte +34 -3
  30. package/package/components/FolderPicker.svelte +1 -1
  31. package/package/components/InputTransformForm.svelte +20 -10
  32. package/package/components/JobArgs.svelte +1 -1
  33. package/package/components/JobLoader.svelte.d.ts +1 -1
  34. package/package/components/JobStatus.svelte +2 -0
  35. package/package/components/LogSnippetViewer.svelte +3 -3
  36. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  37. package/package/components/LogViewer.svelte +87 -71
  38. package/package/components/LogViewer.svelte.d.ts +1 -0
  39. package/package/components/Path.svelte +7 -1
  40. package/package/components/Path.svelte.d.ts +1 -1
  41. package/package/components/PrefixedInput.svelte +120 -0
  42. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  43. package/package/components/QueuePosition.svelte +81 -0
  44. package/package/components/QueuePosition.svelte.d.ts +8 -0
  45. package/package/components/ResourceNarrowing.svelte +13 -0
  46. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  47. package/package/components/ResourceTypePicker.svelte +49 -74
  48. package/package/components/RunChart.svelte +74 -89
  49. package/package/components/RunChart.svelte.d.ts +10 -22
  50. package/package/components/S3FilePicker.svelte +1 -1
  51. package/package/components/SchemaForm.svelte.d.ts +2 -2
  52. package/package/components/ScriptBuilder.svelte +2 -1
  53. package/package/components/ScriptEditor.svelte +4 -3
  54. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  55. package/package/components/ServiceLogsInner.svelte +1 -1
  56. package/package/components/ShareModal.svelte.d.ts +1 -1
  57. package/package/components/SimpleEditor.svelte +4 -67
  58. package/package/components/StringTypeNarrowing.svelte +5 -10
  59. package/package/components/TemplateEditor.svelte +2 -16
  60. package/package/components/TimeAgo.svelte +1 -1
  61. package/package/components/TimeAgo.svelte.d.ts +1 -0
  62. package/package/components/Toggle.svelte +2 -1
  63. package/package/components/Toggle.svelte.d.ts +2 -1
  64. package/package/components/WorkerRepl.svelte +1 -1
  65. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  66. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  69. package/package/components/apps/components/display/table/utils.js +36 -5
  70. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  71. package/package/components/apps/editor/AppEditor.svelte +4 -3
  72. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  73. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  74. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  75. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  78. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  79. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
  80. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  81. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  82. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  83. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  84. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  85. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  86. package/package/components/common/OnChange.svelte.d.ts +11 -4
  87. package/package/components/common/badge/Badge.svelte +9 -2
  88. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  89. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  90. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  91. package/package/components/common/drawer/Disposable.svelte +9 -11
  92. package/package/components/common/drawer/Drawer.svelte +3 -4
  93. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  94. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  95. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  96. package/package/components/common/tabs/TabContent.svelte +2 -7
  97. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  98. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  99. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  100. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  101. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  102. package/package/components/copilot/MetadataGen.svelte +1 -1
  103. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
  104. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  105. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  106. package/package/components/copilot/chat/anthropic.js +208 -0
  107. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  108. package/package/components/copilot/chat/api/apiTools.js +10 -7
  109. package/package/components/copilot/chat/api/core.d.ts +1 -1
  110. package/package/components/copilot/chat/api/core.js +7 -2
  111. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  112. package/package/components/copilot/chat/ask/core.js +7 -2
  113. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  114. package/package/components/copilot/chat/flow/core.js +14 -4
  115. package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
  116. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  117. package/package/components/copilot/chat/navigator/core.js +7 -2
  118. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  119. package/package/components/copilot/chat/script/core.d.ts +5 -4
  120. package/package/components/copilot/chat/script/core.js +131 -19
  121. package/package/components/copilot/chat/shared.d.ts +7 -7
  122. package/package/components/copilot/lib.d.ts +29 -8
  123. package/package/components/copilot/lib.js +199 -24
  124. package/package/components/custom_ui.d.ts +1 -0
  125. package/package/components/flows/content/FlowInput.svelte +5 -5
  126. package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
  127. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  128. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  129. package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
  130. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  131. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  132. package/package/components/flows/content/FlowRetries.svelte +108 -3
  133. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  134. package/package/components/flows/flowInfers.js +8 -35
  135. package/package/components/flows/flowStore.d.ts +45 -1
  136. package/package/components/flows/flowStore.js +1 -1
  137. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  138. package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
  139. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  140. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  141. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  142. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  143. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  144. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  145. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  146. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  148. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  149. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  151. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  152. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  153. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  154. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  155. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  156. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  157. package/package/components/home/ItemsList.svelte +17 -13
  158. package/package/components/home/TreeView.svelte +21 -27
  159. package/package/components/home/TreeView.svelte.d.ts +2 -29
  160. package/package/components/home/TreeViewRoot.svelte +11 -23
  161. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  162. package/package/components/icons/GitIcon.svelte +10 -2
  163. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  164. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  165. package/package/components/meltComponents/Popover.svelte +23 -3
  166. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  167. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  168. package/package/components/monacoLanguagesOptions.js +109 -0
  169. package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
  170. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  171. package/package/components/propertyPicker/utils.js +14 -7
  172. package/package/components/runs/JobRunsPreview.svelte +212 -177
  173. package/package/components/runs/JobsLoader.svelte +2 -2
  174. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  175. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  176. package/package/components/runs/RunBadges.svelte +100 -0
  177. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  178. package/package/components/runs/RunLabels.svelte +86 -0
  179. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  180. package/package/components/runs/RunOption.svelte +20 -0
  181. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  182. package/package/components/runs/RunRow.svelte +239 -151
  183. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  184. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  185. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  186. package/package/components/runs/RunsFilter.svelte +369 -243
  187. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  188. package/package/components/runs/RunsQueue.svelte +96 -25
  189. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  190. package/package/components/runs/RunsTable.svelte +62 -71
  191. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  192. package/package/components/runs/runs-grid.css +95 -0
  193. package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
  194. package/package/components/schema/FlowPropertyEditor.svelte +197 -206
  195. package/package/components/schema/PropertyEditor.svelte +33 -35
  196. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
  197. package/package/components/search/GlobalSearchModal.svelte +8 -1
  198. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  199. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  200. package/package/components/select/Select.svelte +2 -1
  201. package/package/components/select/Select.svelte.d.ts +25 -13
  202. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  203. package/package/components/settings/TokenDisplay.svelte +1 -1
  204. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  205. package/package/components/sidebar/SidebarContent.svelte +48 -2
  206. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  207. package/package/components/toast.js +6 -3
  208. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  209. package/package/components/triggers/CaptureWrapper.svelte +19 -3
  210. package/package/components/triggers/TriggerLabel.svelte +8 -0
  211. package/package/components/triggers/TriggerTokens.svelte +1 -1
  212. package/package/components/triggers/TriggersEditor.svelte +9 -5
  213. package/package/components/triggers/TriggersTable.svelte +2 -2
  214. package/package/components/triggers/TriggersWrapper.svelte +16 -5
  215. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  216. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  217. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  218. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  219. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  220. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  221. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  222. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  223. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  224. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  225. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  226. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  227. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  228. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  229. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  230. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  231. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  232. package/package/components/triggers/email/utils.d.ts +4 -0
  233. package/package/components/triggers/email/utils.js +52 -0
  234. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  235. package/package/components/triggers/http/utils.js +1 -1
  236. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  237. package/package/components/triggers/triggers.svelte.js +24 -2
  238. package/package/components/triggers/utils.js +19 -5
  239. package/package/components/triggers.d.ts +1 -1
  240. package/package/components/triggers.js +2 -0
  241. package/package/components/wizards/AgGridWizard.svelte +85 -80
  242. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  243. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  244. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  245. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  246. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  247. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  248. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  249. package/package/gen/core/OpenAPI.js +1 -1
  250. package/package/gen/schemas.gen.d.ts +142 -3
  251. package/package/gen/schemas.gen.js +144 -3
  252. package/package/gen/services.gen.d.ts +129 -1
  253. package/package/gen/services.gen.js +267 -1
  254. package/package/gen/types.gen.d.ts +434 -8
  255. package/package/hubPaths.json +4 -2
  256. package/package/infer.js +1 -1
  257. package/package/keyboardChain.d.ts +5 -0
  258. package/package/keyboardChain.js +40 -0
  259. package/package/services/JobManager.js +2 -2
  260. package/package/stores.d.ts +3 -1
  261. package/package/stores.js +8 -5
  262. package/package/utils/workspaceHierarchy.d.ts +27 -0
  263. package/package/utils/workspaceHierarchy.js +101 -0
  264. package/package/utils.d.ts +6 -3
  265. package/package/utils.js +30 -15
  266. package/package/workspace_settings.js +2 -3
  267. package/package.json +9 -11
  268. package/package/components/DynSelect.svelte.d.ts +0 -11
  269. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  270. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  271. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  272. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  273. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  274. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  275. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -0,0 +1,11 @@
1
+ import type { Item } from '../utils';
2
+ interface Props {
3
+ items?: Item[];
4
+ extraLabel?: import('svelte').Snippet;
5
+ selected: string;
6
+ selectedDisplayName?: string;
7
+ btnClasses?: string;
8
+ }
9
+ declare const DropdownSelect: import("svelte").Component<Props, {}, "">;
10
+ type DropdownSelect = ReturnType<typeof DropdownSelect>;
11
+ export default DropdownSelect;
@@ -36,7 +36,7 @@ computeItems();
36
36
  aiDescription={item.displayName}
37
37
  >
38
38
  {#if item.icon}
39
- <item.icon size={14} color={item.iconColor} />
39
+ <item.icon size={14} color={item.iconColor} class="shrink-0" />
40
40
  {/if}
41
41
  <p title={item.displayName} class="truncate grow min-w-0 whitespace-nowrap text-left">
42
42
  {item.displayName}
@@ -17,12 +17,20 @@ function validSelectObject(x) {
17
17
  <script lang="ts">import { usePromise } from '../svelte5Utils.svelte';
18
18
  import JobLoader, {} from './JobLoader.svelte';
19
19
  import Select from './select/Select.svelte';
20
+ import MultiSelect from './select/MultiSelect.svelte';
21
+ import { safeSelectItems } from './select/utils.svelte';
20
22
  import Tooltip from './Tooltip.svelte';
21
23
  import { Loader2 } from 'lucide-svelte';
22
24
  import {} from '../utils';
23
25
  import { deepEqual } from 'fast-equals';
24
26
  import { untrack } from 'svelte';
25
- let { value = $bindable(), helperScript, entrypoint, otherArgs: otherArgs } = $props();
27
+ let { value = $bindable(), helperScript, format, otherArgs: otherArgs } = $props();
28
+ const [inputType, entrypoint] = format.includes('-') ? format.split('-', 2) : [format, ''];
29
+ const isMultiple = inputType === 'dynmultiselect';
30
+ const isSelect = inputType === 'dynselect' || inputType === 'dynmultiselect';
31
+ if (isMultiple && value === undefined) {
32
+ value = [];
33
+ }
26
34
  let resultJobLoader = $state();
27
35
  let _items = usePromise(getItemsFromOptions, { clearValueOnRefresh: false });
28
36
  let items = $derived(_items.value);
@@ -34,7 +42,7 @@ async function getItemsFromOptions() {
34
42
  doneResult({ result }) {
35
43
  if (!result || !Array.isArray(result)) {
36
44
  if (result?.error?.message && result?.error?.name) {
37
- reject('Error in DynSelect function execution: ' +
45
+ reject(`Error in ${inputType} function execution: ` +
38
46
  result?.error?.name +
39
47
  ' - ' +
40
48
  result?.error?.message);
@@ -67,9 +75,18 @@ async function getItemsFromOptions() {
67
75
  }
68
76
  let neverLoaded = $state(true);
69
77
  $effect(() => {
70
- if (_items.value && value) {
71
- if (!_items.value.find((x) => x.value == value)) {
72
- value = undefined;
78
+ if (_items.value && value !== undefined && isSelect) {
79
+ if (isMultiple && Array.isArray(value)) {
80
+ const availableValues = new Set(_items.value.map((x) => x.value));
81
+ const filteredValue = value.filter((v) => availableValues.has(v));
82
+ if (filteredValue.length !== value.length) {
83
+ value = filteredValue;
84
+ }
85
+ }
86
+ else if (!isMultiple && value !== undefined) {
87
+ if (!_items.value.find((x) => x.value == value)) {
88
+ value = undefined;
89
+ }
73
90
  }
74
91
  }
75
92
  });
@@ -98,15 +115,30 @@ $effect(() => {
98
115
  <JobLoader onlyResult bind:this={resultJobLoader} />
99
116
 
100
117
  <div class="w-full flex-col flex">
101
- <Select
102
- bind:value
103
- bind:open
104
- {items}
105
- bind:filterText
106
- loading={!open && _items.status === 'loading'}
107
- clearable
108
- noItemsMsg={_items.status === 'loading' ? 'Loading...' : 'No items found'}
109
- />
118
+ {#if inputType === 'dynmultiselect'}
119
+ <MultiSelect
120
+ bind:value
121
+ items={safeSelectItems(items || [])}
122
+ placeholder="Select items"
123
+ noItemsMsg={_items.status === 'loading' ? 'Loading...' : 'No items found'}
124
+ disabled={_items.status === 'loading'}
125
+ />
126
+ {:else if inputType === 'dynselect'}
127
+ <Select
128
+ bind:value
129
+ bind:open
130
+ {items}
131
+ bind:filterText
132
+ loading={!open && _items.status === 'loading'}
133
+ clearable
134
+ noItemsMsg={_items.status === 'loading' ? 'Loading...' : 'No items found'}
135
+ />
136
+ {:else}
137
+ <!-- Future dynamic input types can be added here -->
138
+ <div class="text-red-400 text-sm">
139
+ Unsupported dynamic input type: {inputType}
140
+ </div>
141
+ {/if}
110
142
  {#if _items.error}
111
143
  <div class="text-red-400 text-2xs">
112
144
  error: <Tooltip>{_items.error}</Tooltip>
@@ -116,7 +148,7 @@ $effect(() => {
116
148
  {:else}
117
149
  <div class="flex flex-col gap-1 w-full">
118
150
  <div class="text-xs text-tertiary"
119
- >Dynamic Select is not available in this mode, write value directly</div
151
+ >Dynamic input ({inputType}) is not available in this mode, write value directly</div
120
152
  >
121
153
  {#await import('./JsonEditor.svelte')}
122
154
  <Loader2 class="animate-spin" />
@@ -0,0 +1,11 @@
1
+ import { type DynamicInput } from '../utils';
2
+ interface Props {
3
+ value?: any;
4
+ helperScript?: DynamicInput.HelperScript;
5
+ format: string;
6
+ otherArgs?: Record<string, any>;
7
+ name: string;
8
+ }
9
+ declare const DynamicInput: import("svelte").Component<Props, {}, "value">;
10
+ type DynamicInput = ReturnType<typeof DynamicInput>;
11
+ export default DynamicInput;
@@ -17,7 +17,7 @@ import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte
17
17
  import Label from './Label.svelte';
18
18
  import { sendUserToast } from '../toast';
19
19
  import Toggle from './Toggle.svelte';
20
- import { DynamicSelect, emptyString, generateRandomString, readFieldsRecursively } from '../utils';
20
+ import { DynamicInput, emptyString, generateRandomString, readFieldsRecursively } from '../utils';
21
21
  import Popover from './meltComponents/Popover.svelte';
22
22
  import SchemaFormDnd from './schema/SchemaFormDND.svelte';
23
23
  import { deepEqual } from 'fast-equals';
@@ -27,16 +27,16 @@ import Editor from './Editor.svelte';
27
27
  import AddPropertyV2 from './schema/AddPropertyV2.svelte';
28
28
  // export let openEditTab: () => void = () => {}
29
29
  const dispatch = createEventDispatcher();
30
- let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, displayWebhookWarning = false, onlyMaskPassword = false, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynSelectCode = $bindable(), dynSelectLang = $bindable(), showDynSelectOpt = false, addPropertyInEditorTab = false, openEditTab, addProperty, runButton, extraTab, schemaFormClassName = undefined, onChange = undefined } = $props();
30
+ let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, displayWebhookWarning = false, onlyMaskPassword = false, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynCode = $bindable(), dynLang = $bindable(), showDynOpt = false, addPropertyInEditorTab = false, openEditTab, addProperty, runButton, extraTab, schemaFormClassName = undefined, onChange = undefined } = $props();
31
31
  $effect.pre(() => {
32
32
  if (args == undefined) {
33
33
  args = {};
34
34
  }
35
- if (dynSelectLang === undefined) {
36
- dynSelectLang = schema?.['x-windmill-dyn-select-lang'] || 'bun';
35
+ if (dynLang === undefined) {
36
+ dynLang = schema?.['x-windmill-dyn-select-lang'] || 'bun';
37
37
  }
38
- if (dynSelectCode === undefined) {
39
- dynSelectCode = schema?.['x-windmill-dyn-select-code'] || '';
38
+ if (dynCode === undefined) {
39
+ dynCode = schema?.['x-windmill-dyn-select-code'] || '';
40
40
  }
41
41
  });
42
42
  $effect(() => {
@@ -46,10 +46,10 @@ $effect(() => {
46
46
  }
47
47
  });
48
48
  $effect(() => {
49
- if (schema && dynSelectCode !== undefined && dynSelectLang !== undefined) {
50
- if (dynSelectCode && dynSelectCode.trim()) {
51
- schema['x-windmill-dyn-select-code'] = dynSelectCode.trim();
52
- schema['x-windmill-dyn-select-lang'] = dynSelectLang;
49
+ if (schema && dynCode !== undefined && dynLang !== undefined) {
50
+ if (dynCode && dynCode.trim()) {
51
+ schema['x-windmill-dyn-select-code'] = dynCode.trim();
52
+ schema['x-windmill-dyn-select-lang'] = dynLang;
53
53
  }
54
54
  else {
55
55
  delete schema['x-windmill-dyn-select-code'];
@@ -113,15 +113,19 @@ let opened = $state(untrack(() => keys[0]));
113
113
  function computeSelected(property) {
114
114
  if (!opened)
115
115
  return '';
116
- return property.type !== 'object'
117
- ? property.type
118
- : property.format === 'resource-s3_object'
119
- ? 'S3'
120
- : property.format?.startsWith('dynselect-')
121
- ? 'dynselect'
122
- : property.oneOf && property.oneOf.length >= 2
123
- ? 'oneOf'
124
- : 'object';
116
+ if (property.type !== 'object')
117
+ return property.type;
118
+ if (property.format === 'resource-s3_object')
119
+ return 'S3';
120
+ if (property.format?.startsWith('dynselect-'))
121
+ return 'dynselect';
122
+ if (property.format?.startsWith('dynmultiselect-'))
123
+ return 'dynmultiselect';
124
+ if (property.oneOf && property.oneOf.length >= 2)
125
+ return 'oneOf';
126
+ if (property.format?.startsWith('resource-'))
127
+ return 'resource';
128
+ return 'object';
125
129
  }
126
130
  export function openField(key) {
127
131
  opened = key;
@@ -216,36 +220,35 @@ $effect(() => {
216
220
  $effect(() => {
217
221
  !!editTab ? openEditTabFn() : closeEditTab();
218
222
  });
219
- let dynSelectFunctions = $derived(Object.entries(schema?.properties ?? {})
223
+ let dynamicFunctions = $derived(Object.entries(schema?.properties ?? {})
220
224
  .filter(([_, property]) => {
221
225
  const props = property;
222
- return (props.type === 'object' &&
223
- (props.format?.startsWith('dynselect-') || props.format?.startsWith('dynselect_')));
226
+ return props.type === 'object' && DynamicInput.isDynInputFormat(props.format);
224
227
  })
225
228
  .map(([fieldName, _]) => fieldName.replace(/\s+/g, '_')));
226
- let typeOptions = [
229
+ const DYNAMIC_OPTIONS = [
230
+ ['DynSelect', 'dynselect'],
231
+ ['DynMultiselect', 'dynmultiselect']
232
+ ];
233
+ let typeOptions = $state([
227
234
  ['String', 'string'],
228
235
  ['Number', 'number'],
229
236
  ['Integer', 'integer'],
230
237
  ['Object', 'object'],
238
+ ['Resource', 'resource'],
231
239
  ['OneOf', 'oneOf'],
232
240
  ['Array', 'array'],
233
241
  ['Boolean', 'boolean'],
234
- ['S3 Object', 'S3']
235
- ];
236
- if (showDynSelectOpt) {
237
- typeOptions.push(['DynSelect', 'dynselect']);
238
- }
239
- function initDynSelectFn(lang) {
240
- const generateFn = DynamicSelect.getGenerateTemplateFn(lang);
241
- return Object.entries(schema?.properties ?? {})
242
- .map(([functionName]) => generateFn(functionName))
243
- .join('');
242
+ ['S3', 'S3']
243
+ ]);
244
+ function initDynFn(lang) {
245
+ const generateFn = DynamicInput.getGenerateTemplateFn(lang);
246
+ return dynamicFunctions.map((functionName) => generateFn(functionName)).join('');
244
247
  }
245
- function updateDynSelectCode(functionName, lang = 'bun') {
246
- const generateFn = DynamicSelect.getGenerateTemplateFn(lang);
248
+ function updateDynCode(functionName, lang = 'bun') {
249
+ const generateFn = DynamicInput.getGenerateTemplateFn(lang);
247
250
  const code = generateFn(functionName);
248
- dynSelectCode = dynSelectCode ? dynSelectCode.concat(code) : code;
251
+ dynCode = dynCode ? dynCode.concat(code) : code;
249
252
  }
250
253
  let dndType = $state(generateRandomString());
251
254
  </script>
@@ -313,8 +316,8 @@ let dndType = $state(generateRandomString());
313
316
  }}
314
317
  helperScript={{
315
318
  type: 'inline',
316
- code: dynSelectCode!,
317
- lang: dynSelectLang!
319
+ code: dynCode!,
320
+ lang: dynLang!
318
321
  }}
319
322
  prettifyHeader={isAppInput}
320
323
  disabled={!!previewSchema}
@@ -328,55 +331,53 @@ let dndType = $state(generateRandomString());
328
331
 
329
332
  {@render runButton?.()}
330
333
 
331
- {#if dynSelectFunctions.length > 0}
332
- <div class="grow">
333
- <Section
334
- label="Dynamic select functions"
335
- collapsable={true}
336
- collapsed={false}
337
- class="text-sm"
338
- >
339
- <div class="flex flex-col gap-2 h-full">
340
- {#if dynSelectFunctions.length > 0}
341
- <div class="bg-blue-50 dark:bg-blue-900/20 p-3 rounded-md">
342
- <div class="text-sm font-medium text-blue-800 dark:text-blue-200 mb-2">
343
- Expected Functions for Dynamic Select Fields:
344
- </div>
345
- <ul class="text-xs text-blue-700 dark:text-blue-300 space-y-1">
346
- {#each dynSelectFunctions as functionName}
347
- <li class="font-mono bg-blue-100 dark:bg-blue-800/30 px-2 py-1 rounded">
348
- {functionName}()
349
- </li>
350
- {/each}
351
- </ul>
352
- </div>
353
- {/if}
354
- <ToggleButtonGroup
355
- bind:selected={dynSelectLang}
356
- on:selected={({ detail }) => {
357
- dynSelectCode = initDynSelectFn(detail)
358
- }}
359
- >
360
- {#snippet children({ item })}
361
- <ToggleButton value="bun" label="Typescript (Bun)" {item} />
362
- <ToggleButton value="python3" label="Python" {item} />
363
- {/snippet}
364
- </ToggleButtonGroup>
365
- {#key dynSelectLang}
366
- <div class="border w-full h-full">
367
- <Editor
368
- bind:this={dynamicSelectEditor}
369
- class="flex flex-1 grow h-80 w-full"
370
- scriptLang={dynSelectLang}
371
- useWebsockets={false}
372
- automaticLayout
373
- bind:code={dynSelectCode}
374
- />
334
+ {#if dynamicFunctions.length > 0}
335
+ <Section
336
+ label="Dynamic input functions"
337
+ collapsable={true}
338
+ collapsed={false}
339
+ class="text-sm"
340
+ >
341
+ <div class="flex flex-col gap-2 h-full">
342
+ {#if dynamicFunctions.length > 0}
343
+ <div class="bg-blue-50 dark:bg-blue-900/20 p-3 rounded-md">
344
+ <div class="text-sm font-medium text-blue-800 dark:text-blue-200 mb-2">
345
+ Expected Functions for Dynamic Input Fields:
375
346
  </div>
376
- {/key}
377
- </div>
378
- </Section>
379
- </div>
347
+ <ul class="text-xs text-blue-700 dark:text-blue-300 space-y-1">
348
+ {#each dynamicFunctions as functionName}
349
+ <li class="font-mono bg-blue-100 dark:bg-blue-800/30 px-2 py-1 rounded">
350
+ {functionName}()
351
+ </li>
352
+ {/each}
353
+ </ul>
354
+ </div>
355
+ {/if}
356
+ <ToggleButtonGroup
357
+ bind:selected={dynLang}
358
+ on:selected={({ detail }) => {
359
+ dynCode = initDynFn(detail)
360
+ }}
361
+ >
362
+ {#snippet children({ item })}
363
+ <ToggleButton value="bun" label="Typescript (Bun)" {item} />
364
+ <ToggleButton value="python3" label="Python" {item} />
365
+ {/snippet}
366
+ </ToggleButtonGroup>
367
+ {#key dynLang}
368
+ <div class="border w-full h-full">
369
+ <Editor
370
+ bind:this={dynamicSelectEditor}
371
+ class="flex flex-1 grow h-80 w-full"
372
+ scriptLang={dynLang}
373
+ useWebsockets={false}
374
+ automaticLayout
375
+ bind:code={dynCode}
376
+ />
377
+ </div>
378
+ {/key}
379
+ </div>
380
+ </Section>
380
381
  {/if}
381
382
  </div>
382
383
  </div>
@@ -396,7 +397,12 @@ let dndType = $state(generateRandomString());
396
397
  {#if jsonEnabled && customUi?.jsonOnly != true}
397
398
  <div class="w-full p-3 flex gap-4 justify-end items-center">
398
399
  {#if addPropertyInEditorTab}
399
- <AddPropertyV2 bind:schema>
400
+ <AddPropertyV2
401
+ bind:schema
402
+ onAddNew={(propertyName) => {
403
+ openField(propertyName)
404
+ }}
405
+ >
400
406
  {#snippet trigger()}
401
407
  <Button color="light" size="xs" iconOnly startIcon={{ icon: Plus }} />
402
408
  {/snippet}
@@ -413,9 +419,13 @@ let dndType = $state(generateRandomString());
413
419
  'Arguments can be edited either using the wizard, or by editing their JSON Schema.'
414
420
  }}
415
421
  lightMode
416
- on:change={() => {
417
- schemaString = JSON.stringify(schema, null, '\t')
418
- editor?.setCode(schemaString)
422
+ on:change={(e) => {
423
+ if (e.detail) {
424
+ schemaString = JSON.stringify(schema, null, '\t')
425
+ editor?.setCode(schemaString)
426
+ } else {
427
+ schema = JSON.parse(schemaString)
428
+ }
419
429
  }}
420
430
  />
421
431
  </div>
@@ -542,9 +552,11 @@ let dndType = $state(generateRandomString());
542
552
  bind:selected={
543
553
  () => computeSelected(schema.properties[opened ?? '']),
544
554
  (v) => {
555
+ const isResource = v == 'resource'
545
556
  const isS3 = v == 'S3'
546
557
  const isOneOf = v == 'oneOf'
547
558
  const isDynSelect = v == 'dynselect'
559
+ const isDynMultiselect = v == 'dynmultiselect'
548
560
  const emptyProperty = {
549
561
  contentEncoding: undefined,
550
562
  enum_: undefined,
@@ -562,22 +574,29 @@ let dndType = $state(generateRandomString());
562
574
  nullable: undefined,
563
575
  required: undefined
564
576
  }
565
-
566
577
  if (isS3) {
567
578
  schema.properties[argName] = {
568
579
  ...emptyProperty,
569
580
  type: 'object',
570
581
  format: 'resource-s3_object'
571
582
  }
572
- } else if (isDynSelect) {
583
+ } else if (isResource) {
584
+ schema.properties[argName] = {
585
+ ...emptyProperty,
586
+ type: 'object',
587
+ format: 'resource-'
588
+ }
589
+ } else if (isDynSelect || isDynMultiselect) {
573
590
  const functionName = argName.replace(/\s+/g, '_')
574
591
  schema.properties[argName] = {
575
592
  ...emptyProperty,
576
593
  type: 'object',
577
- format: 'dynselect-' + functionName
594
+ format:
595
+ (isDynSelect ? 'dynselect-' : 'dynmultiselect-') +
596
+ functionName
578
597
  }
579
- updateDynSelectCode(argName, dynSelectLang)
580
- dynamicSelectEditor?.setCode(dynSelectCode || '')
598
+ updateDynCode(argName, dynLang)
599
+ dynamicSelectEditor?.setCode(dynCode || '')
581
600
  } else if (isOneOf) {
582
601
  schema.properties[argName] = {
583
602
  ...emptyProperty,
@@ -628,6 +647,11 @@ let dndType = $state(generateRandomString());
628
647
  {#each typeOptions as x}
629
648
  <ToggleButton value={x[1]} label={x[0]} {item} />
630
649
  {/each}
650
+ {#if showDynOpt}
651
+ {#each DYNAMIC_OPTIONS as x}
652
+ <ToggleButton value={x[1]} label={x[0]} {item} />
653
+ {/each}
654
+ {/if}
631
655
  {/snippet}
632
656
  </ToggleButtonGroup>
633
657
  </Label>
@@ -27,9 +27,9 @@ interface Props {
27
27
  customUi?: EditableSchemaFormUi | undefined;
28
28
  pannelExtraButtonWidth?: number;
29
29
  class?: string;
30
- dynSelectCode?: string | undefined;
31
- dynSelectLang?: ScriptLang | undefined;
32
- showDynSelectOpt?: boolean;
30
+ dynCode?: string | undefined;
31
+ dynLang?: ScriptLang | undefined;
32
+ showDynOpt?: boolean;
33
33
  addPropertyInEditorTab?: boolean;
34
34
  openEditTab?: import('svelte').Snippet;
35
35
  addProperty?: import('svelte').Snippet;
@@ -63,6 +63,6 @@ declare const EditableSchemaForm: $$__sveltets_2_IsomorphicComponent<Props, {
63
63
  openField: (key: string) => void;
64
64
  deleteField: (key: string) => void;
65
65
  updateJson: () => void;
66
- }, "args" | "schema" | "isValid" | "editPanelSize" | "dynSelectCode" | "dynSelectLang">;
66
+ }, "args" | "schema" | "isValid" | "editPanelSize" | "dynCode" | "dynLang">;
67
67
  type EditableSchemaForm = InstanceType<typeof EditableSchemaForm>;
68
68
  export default EditableSchemaForm;