windmill-components 1.537.1 → 1.542.4

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 (273) 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/FlowBuilder.svelte +3 -3
  21. package/package/components/FlowLogRow.svelte +64 -0
  22. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  23. package/package/components/FlowLogViewer.svelte +406 -373
  24. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  25. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  26. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  27. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  28. package/package/components/FlowStatusViewerInner.svelte +34 -3
  29. package/package/components/FolderPicker.svelte +1 -1
  30. package/package/components/InputTransformForm.svelte +20 -10
  31. package/package/components/JobArgs.svelte +1 -1
  32. package/package/components/JobLoader.svelte.d.ts +1 -1
  33. package/package/components/JobStatus.svelte +2 -0
  34. package/package/components/LogSnippetViewer.svelte +3 -3
  35. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  36. package/package/components/LogViewer.svelte +87 -71
  37. package/package/components/LogViewer.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +7 -1
  39. package/package/components/Path.svelte.d.ts +1 -1
  40. package/package/components/PrefixedInput.svelte +120 -0
  41. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  42. package/package/components/QueuePosition.svelte +81 -0
  43. package/package/components/QueuePosition.svelte.d.ts +8 -0
  44. package/package/components/ResourceNarrowing.svelte +13 -0
  45. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  46. package/package/components/ResourceTypePicker.svelte +49 -74
  47. package/package/components/RunChart.svelte +74 -89
  48. package/package/components/RunChart.svelte.d.ts +10 -22
  49. package/package/components/S3FilePicker.svelte +1 -1
  50. package/package/components/SchemaForm.svelte.d.ts +2 -2
  51. package/package/components/ScriptBuilder.svelte +2 -1
  52. package/package/components/ScriptEditor.svelte +4 -3
  53. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  54. package/package/components/ServiceLogsInner.svelte +1 -1
  55. package/package/components/ShareModal.svelte.d.ts +1 -1
  56. package/package/components/SimpleEditor.svelte +4 -67
  57. package/package/components/StringTypeNarrowing.svelte +5 -10
  58. package/package/components/TemplateEditor.svelte +2 -16
  59. package/package/components/TimeAgo.svelte +1 -1
  60. package/package/components/TimeAgo.svelte.d.ts +1 -0
  61. package/package/components/Toggle.svelte +2 -1
  62. package/package/components/Toggle.svelte.d.ts +2 -1
  63. package/package/components/WorkerRepl.svelte +1 -1
  64. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  65. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  66. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  68. package/package/components/apps/components/display/table/utils.js +36 -5
  69. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  70. package/package/components/apps/editor/AppEditor.svelte +4 -3
  71. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  72. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  73. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  74. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  75. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  78. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
  79. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  80. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  81. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  82. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  83. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  84. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  85. package/package/components/common/OnChange.svelte.d.ts +11 -4
  86. package/package/components/common/badge/Badge.svelte +9 -2
  87. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  88. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  89. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  90. package/package/components/common/drawer/Disposable.svelte +9 -11
  91. package/package/components/common/drawer/Drawer.svelte +3 -4
  92. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  93. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  94. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  95. package/package/components/common/tabs/TabContent.svelte +2 -7
  96. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  97. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  98. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  99. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  100. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  101. package/package/components/copilot/MetadataGen.svelte +1 -1
  102. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
  103. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  104. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  105. package/package/components/copilot/chat/anthropic.js +208 -0
  106. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  107. package/package/components/copilot/chat/api/apiTools.js +10 -7
  108. package/package/components/copilot/chat/api/core.d.ts +1 -1
  109. package/package/components/copilot/chat/api/core.js +7 -2
  110. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  111. package/package/components/copilot/chat/ask/core.js +7 -2
  112. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  113. package/package/components/copilot/chat/flow/core.js +14 -4
  114. package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
  115. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  116. package/package/components/copilot/chat/navigator/core.js +7 -2
  117. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  118. package/package/components/copilot/chat/script/core.d.ts +5 -4
  119. package/package/components/copilot/chat/script/core.js +131 -19
  120. package/package/components/copilot/chat/shared.d.ts +7 -7
  121. package/package/components/copilot/lib.d.ts +29 -8
  122. package/package/components/copilot/lib.js +199 -24
  123. package/package/components/flows/content/FlowInput.svelte +5 -5
  124. package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
  125. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  126. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  127. package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
  128. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  129. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  130. package/package/components/flows/content/FlowRetries.svelte +108 -3
  131. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  132. package/package/components/flows/flowInfers.js +8 -35
  133. package/package/components/flows/flowStore.d.ts +45 -1
  134. package/package/components/flows/flowStore.js +1 -1
  135. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  136. package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
  137. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  138. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  139. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  140. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  141. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  142. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  143. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  144. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  145. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  146. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  147. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  148. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  149. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  150. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  151. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  152. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  153. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  154. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  155. package/package/components/home/ItemsList.svelte +17 -13
  156. package/package/components/home/TreeView.svelte +21 -27
  157. package/package/components/home/TreeView.svelte.d.ts +2 -29
  158. package/package/components/home/TreeViewRoot.svelte +11 -23
  159. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  160. package/package/components/icons/GitIcon.svelte +10 -2
  161. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  162. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  163. package/package/components/meltComponents/Popover.svelte +23 -3
  164. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  165. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  166. package/package/components/monacoLanguagesOptions.js +109 -0
  167. package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
  168. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  169. package/package/components/propertyPicker/utils.js +14 -7
  170. package/package/components/runs/JobRunsPreview.svelte +212 -177
  171. package/package/components/runs/JobsLoader.svelte +2 -2
  172. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  173. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  174. package/package/components/runs/RunBadges.svelte +100 -0
  175. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  176. package/package/components/runs/RunLabels.svelte +86 -0
  177. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  178. package/package/components/runs/RunOption.svelte +20 -0
  179. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  180. package/package/components/runs/RunRow.svelte +239 -151
  181. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  182. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  183. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  184. package/package/components/runs/RunsFilter.svelte +369 -243
  185. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  186. package/package/components/runs/RunsQueue.svelte +96 -25
  187. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  188. package/package/components/runs/RunsTable.svelte +62 -71
  189. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  190. package/package/components/runs/runs-grid.css +95 -0
  191. package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
  192. package/package/components/schema/FlowPropertyEditor.svelte +197 -206
  193. package/package/components/schema/PropertyEditor.svelte +33 -35
  194. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
  195. package/package/components/search/GlobalSearchModal.svelte +8 -1
  196. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  197. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  198. package/package/components/select/Select.svelte +2 -1
  199. package/package/components/select/Select.svelte.d.ts +25 -13
  200. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  201. package/package/components/settings/TokenDisplay.svelte +1 -1
  202. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  203. package/package/components/sidebar/SidebarContent.svelte +48 -2
  204. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  205. package/package/components/toast.js +6 -3
  206. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  207. package/package/components/triggers/CaptureWrapper.svelte +19 -3
  208. package/package/components/triggers/TriggerLabel.svelte +8 -0
  209. package/package/components/triggers/TriggerTokens.svelte +1 -1
  210. package/package/components/triggers/TriggersEditor.svelte +9 -5
  211. package/package/components/triggers/TriggersTable.svelte +2 -2
  212. package/package/components/triggers/TriggersWrapper.svelte +16 -5
  213. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  214. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  215. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  216. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  217. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  218. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  219. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  220. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  221. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  222. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  223. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  224. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  225. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  226. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  227. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  228. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  229. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  230. package/package/components/triggers/email/utils.d.ts +4 -0
  231. package/package/components/triggers/email/utils.js +52 -0
  232. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  233. package/package/components/triggers/http/utils.js +1 -1
  234. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  235. package/package/components/triggers/triggers.svelte.js +24 -2
  236. package/package/components/triggers/utils.js +19 -5
  237. package/package/components/triggers.d.ts +1 -1
  238. package/package/components/triggers.js +2 -0
  239. package/package/components/wizards/AgGridWizard.svelte +85 -80
  240. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  241. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  242. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  243. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  244. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  245. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  246. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  247. package/package/gen/core/OpenAPI.js +1 -1
  248. package/package/gen/schemas.gen.d.ts +142 -3
  249. package/package/gen/schemas.gen.js +144 -3
  250. package/package/gen/services.gen.d.ts +129 -1
  251. package/package/gen/services.gen.js +267 -1
  252. package/package/gen/types.gen.d.ts +434 -8
  253. package/package/hubPaths.json +4 -2
  254. package/package/infer.js +1 -1
  255. package/package/keyboardChain.d.ts +5 -0
  256. package/package/keyboardChain.js +40 -0
  257. package/package/services/JobManager.js +2 -2
  258. package/package/stores.d.ts +3 -1
  259. package/package/stores.js +8 -5
  260. package/package/utils/workspaceHierarchy.d.ts +27 -0
  261. package/package/utils/workspaceHierarchy.js +101 -0
  262. package/package/utils.d.ts +6 -3
  263. package/package/utils.js +30 -15
  264. package/package/workspace_settings.js +2 -3
  265. package/package.json +9 -11
  266. package/package/components/DynSelect.svelte.d.ts +0 -11
  267. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  268. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  269. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  270. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  271. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  272. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  273. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -0,0 +1,181 @@
1
+ <script lang="ts">import {} from 'svelte';
2
+ import Select from './select/Select.svelte';
3
+ import { fetchAvailableModels, AI_PROVIDERS } from './copilot/lib';
4
+ import { workspaceStore } from '../stores';
5
+ import { get } from 'svelte/store';
6
+ import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
7
+ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
8
+ import ResourcePicker from './ResourcePicker.svelte';
9
+ let { value = $bindable(), disabled = false, actions } = $props();
10
+ // Initialize value if undefined
11
+ if (!value) {
12
+ const providers = Object.keys(AI_PROVIDERS);
13
+ value = {
14
+ kind: providers.length > 0 ? providers[0] : undefined,
15
+ resource: undefined,
16
+ model: undefined
17
+ };
18
+ }
19
+ let loading = $state(false);
20
+ let availableModels = $state([]);
21
+ let filterText = $state('');
22
+ let modelsCache = new Map();
23
+ // Reactive items for the Select component
24
+ let items = $derived.by(() => {
25
+ const r = availableModels.map((model) => ({
26
+ label: model,
27
+ value: model
28
+ }));
29
+ if (value?.model && !availableModels.find((model) => model === value.model)) {
30
+ r.push({
31
+ label: value.model,
32
+ value: value.model
33
+ });
34
+ }
35
+ return r;
36
+ });
37
+ // Provider options for the toggle button group
38
+ const providerOptions = Object.entries(AI_PROVIDERS).map(([key, details]) => ({
39
+ value: key,
40
+ label: details.label
41
+ }));
42
+ async function loadModels(signal) {
43
+ const provider = value?.kind;
44
+ const resourceValue = value?.resource;
45
+ const resourcePath = resourceValueToPath(resourceValue);
46
+ if (!provider || !resourcePath) {
47
+ return;
48
+ }
49
+ loading = true;
50
+ if (modelsCache.has(provider)) {
51
+ availableModels = modelsCache.get(provider) || [];
52
+ loading = false;
53
+ return;
54
+ }
55
+ try {
56
+ const workspace = get(workspaceStore) || '';
57
+ const models = await fetchAvailableModels(resourcePath, workspace, provider, signal);
58
+ if (signal?.aborted) {
59
+ return;
60
+ }
61
+ availableModels = models;
62
+ modelsCache.set(provider, models);
63
+ }
64
+ catch (e) {
65
+ if (signal?.aborted) {
66
+ return;
67
+ }
68
+ // Fall back to default models for this provider
69
+ const defaultModels = AI_PROVIDERS[provider]?.defaultModels || [];
70
+ availableModels = defaultModels;
71
+ }
72
+ finally {
73
+ if (!signal?.aborted) {
74
+ loading = false;
75
+ }
76
+ }
77
+ }
78
+ // Reload models when provider or resourcePath changes
79
+ $effect(() => {
80
+ const abortController = new AbortController();
81
+ const provider = value?.kind;
82
+ const resourceValue = value?.resource;
83
+ const resourcePath = resourceValueToPath(resourceValue);
84
+ filterText = '';
85
+ if (provider && resourcePath) {
86
+ loadModels(abortController.signal);
87
+ }
88
+ else {
89
+ const defaultModels = provider ? AI_PROVIDERS[provider]?.defaultModels || [] : [];
90
+ availableModels = defaultModels;
91
+ loading = false;
92
+ }
93
+ return () => {
94
+ abortController.abort();
95
+ };
96
+ });
97
+ // Handle provider selection
98
+ function onProviderChange(selectedProvider) {
99
+ if (value) {
100
+ value.kind = selectedProvider;
101
+ value.resource = undefined;
102
+ value.model = undefined;
103
+ }
104
+ }
105
+ // Helper functions to handle $res: prefix like ObjectResourceInput does
106
+ function isResource(resourceValue) {
107
+ return (typeof resourceValue === 'string' &&
108
+ resourceValue.length >= '$res:'.length &&
109
+ resourceValue.startsWith('$res:'));
110
+ }
111
+ function resourceValueToPath(resourceValue) {
112
+ if (isResource(resourceValue)) {
113
+ return resourceValue.substring('$res:'.length);
114
+ }
115
+ return resourceValue;
116
+ }
117
+ function pathToResourceValue(path) {
118
+ if (path == undefined) {
119
+ return undefined;
120
+ }
121
+ else {
122
+ return `$res:${path}`;
123
+ }
124
+ }
125
+ </script>
126
+
127
+ <div class="w-full flex flex-col gap-3">
128
+ <!-- Provider Selection -->
129
+ <div class="flex flex-col gap-2">
130
+ <ToggleButtonGroup selected={value?.kind} onSelected={onProviderChange} {disabled} wrap>
131
+ {#snippet children({ item })}
132
+ {#each providerOptions as option}
133
+ <ToggleButton value={option.value} label={option.label} {item} />
134
+ {/each}
135
+ {/snippet}
136
+ </ToggleButtonGroup>
137
+ </div>
138
+
139
+ <!-- Resource Selection -->
140
+ <div class="flex flex-col border border-gray-200 rounded-md p-2 gap-2">
141
+ <div class="flex flex-col gap-1">
142
+ <p class="text-sm font-medium text-primary">resource</p>
143
+ <ResourcePicker
144
+ bind:value={
145
+ () => resourceValueToPath(value?.resource),
146
+ (v) => {
147
+ if (value) {
148
+ value.resource = pathToResourceValue(v)
149
+ }
150
+ }
151
+ }
152
+ resourceType={value?.kind}
153
+ disabled={disabled || !value?.kind}
154
+ placeholder="Select resource"
155
+ selectFirst={true}
156
+ />
157
+ </div>
158
+
159
+ <!-- Model Selection -->
160
+ <div class="flex flex-col gap-1">
161
+ <p class="text-sm font-medium text-primary">model</p>
162
+ <Select
163
+ {items}
164
+ bind:value={value.model}
165
+ placeholder="Select model"
166
+ disabled={disabled || !value?.kind || !resourceValueToPath(value?.resource)}
167
+ onCreateItem={(r) => {
168
+ availableModels.push(r)
169
+ value.model = r
170
+ }}
171
+ createText="Press enter to use custom model"
172
+ {loading}
173
+ clearable={false}
174
+ noItemsMsg={'No models available'}
175
+ bind:filterText
176
+ />
177
+ </div>
178
+ </div>
179
+
180
+ {@render actions?.()}
181
+ </div>
@@ -0,0 +1,15 @@
1
+ import { type Snippet } from 'svelte';
2
+ import type { AIProvider } from '../gen';
3
+ interface ProviderValue {
4
+ kind?: AIProvider;
5
+ resource?: string;
6
+ model?: string;
7
+ }
8
+ interface Props {
9
+ value: ProviderValue | undefined;
10
+ disabled?: boolean;
11
+ actions?: Snippet;
12
+ }
13
+ declare const AiProviderPicker: import("svelte").Component<Props, {}, "value">;
14
+ type AiProviderPicker = ReturnType<typeof AiProviderPicker>;
15
+ export default AiProviderPicker;
@@ -86,14 +86,14 @@ async function getVariable(path) {
86
86
  <div class="relative">
87
87
  {#if JSON.stringify(value).length > 120}
88
88
  <button
89
- class="text-xs absolute top-0 right-4 text-tertiary"
89
+ class="text-xs absolute top-0 right-8 text-tertiary"
90
90
  onclick={() => {
91
91
  jsonViewerContent = value
92
92
  jsonViewer?.toggleDrawer()
93
93
  }}><Expand size={18} /></button
94
94
  >
95
95
  {/if}
96
- <div class="max-h-60 overflow-auto">
96
+ <div class="max-h-60 overflow-auto" style="scrollbar-gutter: stable">
97
97
  <ObjectViewer collapsed={false} topBrackets={true} pureViewer={true} json={value} />
98
98
  </div>
99
99
  </div>
@@ -23,13 +23,14 @@ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
23
23
  import SchemaFormDnd from './schema/SchemaFormDND.svelte';
24
24
  import SchemaForm from './SchemaForm.svelte';
25
25
  import { deepEqual } from 'fast-equals';
26
- import DynSelect from './DynSelect.svelte';
26
+ import DynamicInput from './DynamicInput.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
30
  import { base } from '../base';
31
31
  import { workspaceStore } from '../stores';
32
32
  import { getJsonSchemaFromResource } from './schema/jsonSchemaResource.svelte';
33
+ import AIProviderPicker from './AIProviderPicker.svelte';
33
34
  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();
34
35
  $effect(() => {
35
36
  if (description == undefined) {
@@ -206,6 +207,10 @@ export function focus() {
206
207
  el.style.height = el.scrollHeight + 50 + 'px';
207
208
  }
208
209
  }
210
+ const EMAIL_PATTERN = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
211
+ const IPV4_PATTERN = '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
212
+ const UUID_PATTERN = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';
213
+ const IPV6_PATTERN = '^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$';
209
214
  function validateInput(pattern, v, required) {
210
215
  if (nullable && emptyString(v)) {
211
216
  error = '';
@@ -232,6 +237,18 @@ function validateInput(pattern, v, required) {
232
237
  !valid && (valid = true);
233
238
  }
234
239
  }
240
+ else if (type == 'string' && format == 'email' && !testRegex(EMAIL_PATTERN, v)) {
241
+ error = 'invalid email address';
242
+ }
243
+ else if (type == 'string' && format == 'ipv4' && !testRegex(IPV4_PATTERN, v)) {
244
+ error = 'invalid IPv4 address';
245
+ }
246
+ else if (type == 'string' && format == 'ipv6' && !testRegex(IPV6_PATTERN, v)) {
247
+ error = 'invalid IPv6 address';
248
+ }
249
+ else if (type == 'string' && format == 'uuid' && !testRegex(UUID_PATTERN, v)) {
250
+ error = 'invalid UUID';
251
+ }
235
252
  else if (pattern && !testRegex(pattern, v)) {
236
253
  if (!emptyString(customErrorMessage)) {
237
254
  error = customErrorMessage ?? '';
@@ -506,6 +523,19 @@ onDestroy(() => {
506
523
  editTab="inputEditor"
507
524
  noPreview
508
525
  addPropertyInEditorTab
526
+ on:delete={(e) => {
527
+ // Handle property deletion
528
+ if (value && value.properties && value.properties[e.detail]) {
529
+ delete value.properties[e.detail]
530
+ // Also remove from order array if it exists
531
+ if (value.order) {
532
+ value.order = value.order.filter((key) => key !== e.detail)
533
+ }
534
+ // Update the value to trigger reactivity
535
+ value = { ...value }
536
+ dispatch('change')
537
+ }
538
+ }}
509
539
  />
510
540
  {/await}
511
541
  {:else if inputCat == 'object' && format?.startsWith('jsonschema-')}
@@ -733,14 +763,8 @@ onDestroy(() => {
733
763
  />
734
764
  </div>
735
765
  </div>
736
- {:else if inputCat == 'dynselect'}
737
- <DynSelect
738
- name={label}
739
- {otherArgs}
740
- {helperScript}
741
- bind:value
742
- entrypoint={format?.substring('dynselect_'.length) ?? ''}
743
- />
766
+ {:else if inputCat == 'dynamic'}
767
+ <DynamicInput name={label} {otherArgs} {helperScript} bind:value format={format ?? ''} />
744
768
  {:else if inputCat == 'resource-object' && resourceTypes == undefined}
745
769
  <span class="text-2xs text-tertiary">Loading resource types...</span>
746
770
  {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format && format?.split('-').length > 1 && resourceTypes.includes(format?.substring('resource-'.length))))}
@@ -1084,6 +1108,8 @@ onDestroy(() => {
1084
1108
  : undefined}
1085
1109
  {showSchemaExplorer}
1086
1110
  />
1111
+ {:else if inputCat == 'ai-provider'}
1112
+ <AIProviderPicker bind:value {disabled} {actions} />
1087
1113
  {:else if inputCat == 'email'}
1088
1114
  <input
1089
1115
  {autofocus}
@@ -1,5 +1,5 @@
1
1
  import type { EnumType, SchemaProperty } from '../common';
2
- import { type DynamicSelect } from '../utils';
2
+ import { type DynamicInput as DynamicInputTypes } from '../utils';
3
3
  import type ItemPicker from './ItemPicker.svelte';
4
4
  import type SimpleEditor from './SimpleEditor.svelte';
5
5
  import type VariableEditor from './VariableEditor.svelte';
@@ -58,7 +58,7 @@ interface Props {
58
58
  orderEditable?: boolean;
59
59
  shouldDispatchChanges?: boolean;
60
60
  noDefaultOnSelectFirst?: boolean;
61
- helperScript?: DynamicSelect.HelperScript;
61
+ helperScript?: DynamicInputTypes.HelperScript;
62
62
  otherArgs?: Record<string, any>;
63
63
  lightHeader?: boolean;
64
64
  diffStatus?: SchemaDiff | undefined;
@@ -99,8 +99,8 @@ declare const ArgInput: $$__sveltets_2_IsomorphicComponent<Props, {
99
99
  acceptChange: CustomEvent<any>;
100
100
  rejectChange: CustomEvent<any>;
101
101
  blur: CustomEvent<any>;
102
- keydownCmdEnter: CustomEvent<any>;
103
102
  change: CustomEvent<any>;
103
+ keydownCmdEnter: CustomEvent<any>;
104
104
  } & {
105
105
  [evt: string]: CustomEvent<any>;
106
106
  }, {}, {
@@ -23,6 +23,33 @@ async function loadCustomTags() {
23
23
  }
24
24
  }
25
25
  const dispatch = createEventDispatcher();
26
+ const customTagRegex = /^([\w-]+)\(((?:[\w-]+\+)*[\w-]+|(?:\^[\w-]+)+)\)$/;
27
+ const dynamicTagRegex = /\$args\[((?:\w+\.)*\w+)\]/;
28
+ let dynamicTag = $derived.by(() => {
29
+ let r = newTag.trim();
30
+ if (r == '')
31
+ return undefined;
32
+ let matched = r.match(dynamicTagRegex);
33
+ return matched?.[1];
34
+ });
35
+ let extractedCustomTag = $derived.by(() => {
36
+ let r = newTag.trim();
37
+ if (r == '')
38
+ return undefined;
39
+ let matched = r.match(customTagRegex);
40
+ console.log(matched);
41
+ let tag = matched?.[1];
42
+ let workspaces_raw = matched?.[2];
43
+ let tag_type = workspaces_raw?.includes('^') ? 'exclude' : 'include';
44
+ if (tag_type == 'exclude') {
45
+ workspaces_raw = workspaces_raw?.slice(1);
46
+ }
47
+ let workspaces = workspaces_raw?.split(tag_type == 'include' ? '+' : '^');
48
+ if (!workspaces_raw || workspaces_raw?.length == 0) {
49
+ return undefined;
50
+ }
51
+ return { tag, workspaces, tag_type };
52
+ });
26
53
  loadCustomTags();
27
54
  </script>
28
55
 
@@ -55,6 +82,53 @@ loadCustomTags();
55
82
  {/each}
56
83
  </div>
57
84
  <input type="text" bind:value={newTag} />
85
+ {#if extractedCustomTag}
86
+ <div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
87
+ <div class="font-medium mb-1">Workspace specific tag</div>
88
+ <div>
89
+ <b>Tag:</b>
90
+ {extractedCustomTag.tag}
91
+ </div>
92
+ <div>
93
+ <b>Workspaces:</b>
94
+ {#if extractedCustomTag.tag_type == 'include'}
95
+ {extractedCustomTag.workspaces?.join(', ')}
96
+ {:else}
97
+ All workspaces except {extractedCustomTag.workspaces?.join(', ')}
98
+ {/if}
99
+ </div>
100
+ </div>
101
+ {:else if newTag.trim()}
102
+ {#if newTag.includes('(') || newTag.includes(')') || newTag.includes('+') || newTag.includes('^') || ((newTag.includes('.') || newTag.includes('$args[')) && !dynamicTag)}
103
+ <div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
104
+ <div class="font-medium mb-1 text-red-500">Invalid tag</div>
105
+ <div>
106
+ <b>Tag:</b>
107
+ {newTag.trim()}
108
+ </div>
109
+ </div>
110
+ {:else}
111
+ <div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
112
+ <div class="font-medium mb-1">
113
+ {#if newTag.includes('$workspace') || newTag.includes('$args')}
114
+ Dynamic tag
115
+ {:else}
116
+ Simple tag
117
+ {/if}
118
+ </div>
119
+ <div>
120
+ <b>Tag:</b>
121
+ {newTag.trim()}
122
+ </div>
123
+ {#if newTag.includes('$workspace') && !dynamicTag}
124
+ <div>Interpolated tag based on workspace id the job was created in </div>
125
+ {/if}
126
+ {#if dynamicTag}
127
+ <div>Interpolated tag based on args input of <b>{dynamicTag}</b></div>
128
+ {/if}
129
+ </div>
130
+ {/if}
131
+ {/if}
58
132
 
59
133
  <Button
60
134
  variant="contained"
@@ -87,13 +161,25 @@ loadCustomTags();
87
161
  ></span
88
162
  >
89
163
  <span class="text-2xs text-tertiary"
90
- >To exclude 'workspace1' and 'workspace2' from a tag, use <pre
91
- class="inline">tag(^workspace1^workspace2)</pre
164
+ >To exclude 'workspace1' and 'workspace2' from a tag, use <pre class="inline"
165
+ >tag(^workspace1^workspace2)</pre
92
166
  ></span
93
167
  >
94
168
  <span class="text-2xs text-tertiary"
95
- >For dynamic tags based on the workspace, use <pre class="inline">$workspace</pre>, e.g:
169
+ >For <a
170
+ href="https://www.windmill.dev/docs/core_concepts/worker_groups#dynamic-tag"
171
+ target="_blank">dynamic tags</a
172
+ >
173
+ based on the workspace, use <pre class="inline">$workspace</pre>, e.g:
96
174
  <pre class="inline">tag-$workspace</pre></span
97
175
  >
176
+ <span class="text-2xs text-tertiary"
177
+ >For <a
178
+ href="https://www.windmill.dev/docs/core_concepts/worker_groups#dynamic-tag"
179
+ target="_blank">dynamic tags</a
180
+ >
181
+ based on args input, use <pre class="inline">$args[a.b.c]</pre> where
182
+ <pre class="inline">a.b.c</pre> is the path to the value in the args object</span
183
+ >
98
184
  {/if}
99
185
  </div>
@@ -1,14 +1,9 @@
1
1
  <script lang="ts">import 'chartjs-adapter-date-fns';
2
2
  import zoomPlugin from 'chartjs-plugin-zoom';
3
3
  import { Chart as ChartJS, CategoryScale, Legend, LineElement, LinearScale, PointElement, TimeScale, Title, Tooltip } from 'chart.js';
4
- import { createEventDispatcher } from 'svelte';
5
4
  import { getDbClockNow } from '../forLater';
6
5
  import { Line } from './chartjs-wrappers/chartJs';
7
- export let extendedJobs = undefined;
8
- export let maxIsNow = false;
9
- export let minTimeSet = undefined;
10
- export let maxTimeSet = undefined;
11
- const dispatch = createEventDispatcher();
6
+ let { extendedJobs = undefined, maxIsNow = false, minTimeSet = undefined, maxTimeSet = undefined, onZoom } = $props();
12
7
  function calculateTimeSeries(extendedJobs) {
13
8
  const timeline = new Map();
14
9
  extendedJobs.jobs.forEach((j) => {
@@ -40,7 +35,7 @@ function calculateTimeSeries(extendedJobs) {
40
35
  }
41
36
  const s = timeline.get(startTime);
42
37
  s.count += 1;
43
- s.id_started.push('unknoww');
38
+ s.id_started.push('unknown');
44
39
  if (j.duration_ms != undefined) {
45
40
  const jc = j;
46
41
  const endTime = startTime + jc.duration_ms;
@@ -79,32 +74,13 @@ function calculateTimeSeries(extendedJobs) {
79
74
  }
80
75
  return result;
81
76
  }
82
- let intervals = undefined;
83
- $: intervals = extendedJobs ? calculateTimeSeries(extendedJobs) : undefined;
84
77
  ChartJS.register(Title, Tooltip, Legend, zoomPlugin, LineElement, CategoryScale, LinearScale, PointElement, TimeScale);
85
- $: data = {
86
- datasets: [
87
- {
88
- borderColor: '#4ade80',
89
- backgroundColor: '#f8717100',
90
- pointRadius: 0,
91
- label: 'running',
92
- showLine: true,
93
- stepped: true,
94
- data: intervals?.map((job) => ({
95
- x: job.time,
96
- y: job.count,
97
- id: job.msg
98
- })) ?? []
99
- }
100
- ]
101
- };
102
78
  const zoomOptions = {
103
79
  pan: {
104
80
  enabled: true,
105
81
  modifierKey: 'ctrl',
106
82
  onPanComplete: ({ chart }) => {
107
- dispatch('zoom', {
83
+ onZoom({
108
84
  min: addSeconds(new Date(chart.scales.x.min), -1),
109
85
  max: addSeconds(new Date(chart.scales.x.max), 1)
110
86
  });
@@ -116,16 +92,13 @@ const zoomOptions = {
116
92
  },
117
93
  mode: 'x',
118
94
  onZoom: ({ chart }) => {
119
- dispatch('zoom', {
95
+ onZoom({
120
96
  min: addSeconds(new Date(chart.scales.x.min), -1),
121
97
  max: addSeconds(new Date(chart.scales.x.max), 1)
122
98
  });
123
99
  }
124
100
  }
125
101
  };
126
- let minTime = addSeconds(new Date(), -300);
127
- let maxTime = getDbClockNow();
128
- $: computeMinMaxTime(intervals, minTimeSet, maxTimeSet);
129
102
  function minJobTime(intervals) {
130
103
  return intervals[0].time;
131
104
  }
@@ -136,31 +109,46 @@ function computeMinMaxTime(intervals, minTimeSet, maxTimeSet) {
136
109
  let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined;
137
110
  let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined;
138
111
  if (minTimeSetDate && maxTimeSetDate) {
139
- minTime = minTimeSetDate;
140
- maxTime = maxTimeSetDate;
141
- return;
112
+ return { min: minTimeSetDate, max: maxTimeSetDate };
142
113
  }
143
114
  if (intervals == undefined || intervals?.length == 0) {
144
- minTime = minTimeSetDate ?? addSeconds(new Date(), -300);
145
- maxTime = maxTimeSetDate ?? getDbClockNow();
146
- return;
115
+ const minTime = minTimeSetDate ?? addSeconds(new Date(), -300);
116
+ const maxTime = maxTimeSetDate ?? getDbClockNow();
117
+ return { min: minTime, max: maxTime };
147
118
  }
148
119
  const maxJob = maxIsNow ? getDbClockNow() : maxJobTime(intervals);
149
120
  const minJob = minJobTime(intervals);
150
121
  const diff = (maxJob.getTime() - minJob.getTime()) / 20000;
151
- minTime = minTimeSetDate ?? addSeconds(minJob, -diff);
152
- if (maxIsNow) {
153
- maxTime = maxTimeSetDate ?? maxJob;
154
- }
155
- else {
156
- maxTime = maxTimeSetDate ?? addSeconds(maxJob, diff);
157
- }
122
+ const minTime = minTimeSetDate ?? addSeconds(minJob, -diff);
123
+ const maxTime = maxIsNow
124
+ ? (maxTimeSetDate ?? maxJob)
125
+ : (maxTimeSetDate ?? addSeconds(maxJob, diff));
126
+ return { min: minTime, max: maxTime };
158
127
  }
159
128
  function addSeconds(date, seconds) {
160
129
  date.setTime(date.getTime() + seconds * 1000);
161
130
  return date;
162
131
  }
163
- $: options = {
132
+ const intervals = $derived(extendedJobs ? calculateTimeSeries(extendedJobs) : undefined);
133
+ let data = $derived({
134
+ datasets: [
135
+ {
136
+ borderColor: '#4ade80',
137
+ backgroundColor: '#f8717100',
138
+ pointRadius: 0,
139
+ label: 'running',
140
+ showLine: true,
141
+ stepped: true,
142
+ data: intervals?.map((job) => ({
143
+ x: job.time,
144
+ y: job.count,
145
+ id: job.msg
146
+ })) ?? []
147
+ }
148
+ ]
149
+ });
150
+ const minMaxTimes = $derived(computeMinMaxTime(intervals, minTimeSet, maxTimeSet));
151
+ let options = $derived({
164
152
  responsive: true,
165
153
  maintainAspectRatio: false,
166
154
  plugins: {
@@ -182,8 +170,8 @@ $: options = {
182
170
  grid: {
183
171
  display: false
184
172
  },
185
- min: minTime,
186
- max: maxTime
173
+ min: minMaxTimes.min,
174
+ max: minMaxTimes.max
187
175
  },
188
176
  y: {
189
177
  grid: {
@@ -204,7 +192,7 @@ $: options = {
204
192
  intersect: false,
205
193
  mode: 'index'
206
194
  }
207
- };
195
+ });
208
196
  </script>
209
197
 
210
198
  <div class="relative max-h-40">
@@ -1,27 +1,15 @@
1
1
  import 'chartjs-adapter-date-fns';
2
2
  import type { ExtendedJobs } from '../gen';
3
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
- $$bindings?: Bindings;
6
- } & Exports;
7
- (internal: unknown, props: Props & {
8
- $$events?: Events;
9
- $$slots?: Slots;
10
- }): Exports & {
11
- $set?: any;
12
- $on?: any;
13
- };
14
- z_$$bindings?: Bindings;
15
- }
16
- declare const ConcurrentJobsChart: $$__sveltets_2_IsomorphicComponent<{
3
+ interface Props {
17
4
  extendedJobs?: ExtendedJobs | undefined;
18
5
  maxIsNow?: boolean;
19
6
  minTimeSet?: string | undefined;
20
7
  maxTimeSet?: string | undefined;
21
- }, {
22
- zoom: CustomEvent<any>;
23
- } & {
24
- [evt: string]: CustomEvent<any>;
25
- }, {}, {}, string>;
26
- type ConcurrentJobsChart = InstanceType<typeof ConcurrentJobsChart>;
8
+ onZoom: (zoom: {
9
+ min: Date;
10
+ max: Date;
11
+ }) => void;
12
+ }
13
+ declare const ConcurrentJobsChart: import("svelte").Component<Props, {}, "">;
14
+ type ConcurrentJobsChart = ReturnType<typeof ConcurrentJobsChart>;
27
15
  export default ConcurrentJobsChart;
@@ -31,7 +31,7 @@ declare const CustomPopover: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_P
31
31
  default: {};
32
32
  overlay: {};
33
33
  }>, {
34
- click: MouseEvent;
34
+ click: PointerEvent;
35
35
  } & {
36
36
  [evt: string]: CustomEvent<any>;
37
37
  }, {
@@ -0,0 +1,26 @@
1
+ <script lang="ts">import DropdownV2 from './DropdownV2.svelte';
2
+ import { ChevronDown } from 'lucide-svelte';
3
+ import { twMerge } from 'tailwind-merge';
4
+ let { items = [], extraLabel, selected, selectedDisplayName, btnClasses } = $props();
5
+ const filteredItems = $derived(items.filter((item) => item.id !== selected));
6
+ </script>
7
+
8
+ <DropdownV2 items={filteredItems}>
9
+ {#snippet buttonReplacement()}
10
+ <div
11
+ class={twMerge(
12
+ 'p-2 h-8 flex flex-row items-center gap-2 border hover:bg-surface-hover cursor-pointer rounded-md',
13
+ btnClasses
14
+ )}
15
+ >
16
+ <div class="flex flex-row items-center gap-1 pr-2 justify-between w-full">
17
+ <span class="text-xs whitespace-nowrap">
18
+ {selectedDisplayName ?? items.find((item) => item.id === selected)?.displayName ?? ''}
19
+ </span>
20
+
21
+ {@render extraLabel?.()}
22
+ </div>
23
+ <ChevronDown size={12} />
24
+ </div>
25
+ {/snippet}
26
+ </DropdownV2>