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,120 @@
1
+ <script lang="ts">"use strict";
2
+ let { prefix = '', value = $bindable(''), placeholder = '', class: className = '', ...restProps } = $props();
3
+ let inputElement = $state(null);
4
+ let internalValue = $state(prefix + value);
5
+ // Update internal value when prop changes
6
+ $effect(() => {
7
+ internalValue = prefix + value;
8
+ });
9
+ function handleInput(e) {
10
+ const newValue = e.target.value;
11
+ // Ensure the value always starts with the prefix
12
+ if (newValue.startsWith(prefix)) {
13
+ internalValue = newValue;
14
+ value = newValue.slice(prefix.length);
15
+ }
16
+ else {
17
+ internalValue = prefix;
18
+ value = '';
19
+ // Reset cursor position
20
+ if (inputElement) {
21
+ inputElement.value = prefix;
22
+ inputElement.setSelectionRange(prefix.length, prefix.length);
23
+ }
24
+ }
25
+ }
26
+ function handleKeyDown(e) {
27
+ const cursorPos = e.target.selectionStart;
28
+ const selectionEnd = e.target.selectionEnd;
29
+ // Prevent backspace if cursor is at or before prefix end
30
+ if (e.key === 'Backspace') {
31
+ if (cursorPos <= prefix.length && selectionEnd <= prefix.length) {
32
+ e.preventDefault();
33
+ }
34
+ else if (cursorPos <= prefix.length && selectionEnd > prefix.length) {
35
+ // If selection spans across prefix, only delete after prefix
36
+ e.preventDefault();
37
+ const newValue = prefix + internalValue.slice(selectionEnd);
38
+ internalValue = newValue;
39
+ value = newValue.slice(prefix.length);
40
+ // Set cursor position after prefix
41
+ setTimeout(() => {
42
+ inputElement.setSelectionRange(prefix.length, prefix.length);
43
+ }, 0);
44
+ }
45
+ }
46
+ // Prevent delete key within prefix
47
+ if (e.key === 'Delete' && cursorPos < prefix.length) {
48
+ e.preventDefault();
49
+ }
50
+ // Prevent selecting all (Ctrl+A) from selecting the prefix
51
+ if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
52
+ e.preventDefault();
53
+ inputElement.setSelectionRange(prefix.length, internalValue.length);
54
+ }
55
+ }
56
+ function handleClick() {
57
+ // Prevent cursor from being placed within prefix
58
+ if ((inputElement.selectionStart ?? 0) < prefix.length) {
59
+ inputElement.setSelectionRange(prefix.length, prefix.length);
60
+ }
61
+ }
62
+ function handleFocus() {
63
+ // Ensure cursor starts after prefix when focusing
64
+ if ((inputElement.selectionStart ?? 0) < prefix.length) {
65
+ inputElement.setSelectionRange(prefix.length, prefix.length);
66
+ }
67
+ }
68
+ function handlePaste(e) {
69
+ e.preventDefault();
70
+ const pasteData = e.clipboardData.getData('text');
71
+ const cursorPos = inputElement.selectionStart ?? 0;
72
+ const selectionEnd = inputElement.selectionEnd ?? 0;
73
+ if (cursorPos < prefix.length) {
74
+ // Paste at the end of prefix
75
+ internalValue = prefix + pasteData + internalValue.slice(prefix.length);
76
+ }
77
+ else {
78
+ // Normal paste
79
+ internalValue =
80
+ internalValue.slice(0, cursorPos) + pasteData + internalValue.slice(selectionEnd);
81
+ }
82
+ value = internalValue.slice(prefix.length);
83
+ // Set cursor position after pasted content
84
+ const newCursorPos = Math.max(prefix.length, cursorPos) + pasteData.length;
85
+ setTimeout(() => {
86
+ inputElement.setSelectionRange(newCursorPos, newCursorPos);
87
+ }, 0);
88
+ }
89
+ </script>
90
+
91
+ <input
92
+ bind:this={inputElement}
93
+ type="text"
94
+ {placeholder}
95
+ class="prefixed-input {className}"
96
+ value={internalValue}
97
+ oninput={handleInput}
98
+ onkeydown={handleKeyDown}
99
+ onclick={handleClick}
100
+ onfocus={handleFocus}
101
+ onpaste={handlePaste}
102
+ {...restProps}
103
+ />
104
+
105
+ <style>
106
+ .prefixed-input {
107
+ /* Default styles - can be overridden by class prop */
108
+ padding: 8px 12px;
109
+ border: 1px solid #ccc;
110
+ border-radius: 4px;
111
+ font-size: 14px;
112
+ width: 100%;
113
+ box-sizing: border-box;
114
+ }
115
+
116
+ .prefixed-input:focus {
117
+ outline: none;
118
+ border-color: #4caf50;
119
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
120
+ }</style>
@@ -0,0 +1,8 @@
1
+ declare const PrefixedInput: import("svelte").Component<{
2
+ prefix?: string;
3
+ value?: string;
4
+ placeholder?: string;
5
+ class?: string;
6
+ } & Record<string, any>, {}, "value">;
7
+ type PrefixedInput = ReturnType<typeof PrefixedInput>;
8
+ export default PrefixedInput;
@@ -0,0 +1,81 @@
1
+ <script lang="ts">import { JobService } from '../gen';
2
+ import { workspaceStore } from '../stores';
3
+ let { jobId, workspaceId, minimal = false } = $props();
4
+ let queuePositionInterval;
5
+ let queueState = $state(undefined);
6
+ let fetchingQueuePosition = false;
7
+ let workspace = $derived(workspaceId ?? $workspaceStore);
8
+ let scheduledFor = $state(undefined);
9
+ let scheduledForTimeout;
10
+ $effect(() => {
11
+ if (jobId && workspace) {
12
+ clearTimeout(scheduledForTimeout);
13
+ queueState = undefined;
14
+ scheduledForTimeout = setTimeout(() => {
15
+ try {
16
+ JobService.getScheduledFor({
17
+ workspace: workspace,
18
+ id: jobId
19
+ }).then((response) => {
20
+ scheduledFor = response;
21
+ });
22
+ }
23
+ catch (error) {
24
+ console.error('Failed to fetch scheduled for:', error);
25
+ }
26
+ }, 2000);
27
+ }
28
+ });
29
+ $effect(() => {
30
+ // Fetch queue position when loading and we have jobId
31
+ if (scheduledFor) {
32
+ // Initial fetch
33
+ fetchQueuePosition();
34
+ // Set up interval to refresh every 2 seconds
35
+ queuePositionInterval = setInterval(() => {
36
+ fetchQueuePosition();
37
+ }, 5000);
38
+ }
39
+ else {
40
+ // Clear interval when not loading
41
+ if (queuePositionInterval) {
42
+ clearInterval(queuePositionInterval);
43
+ queuePositionInterval = undefined;
44
+ }
45
+ queueState = undefined;
46
+ }
47
+ return () => {
48
+ if (queuePositionInterval) {
49
+ scheduledForTimeout && clearTimeout(scheduledForTimeout);
50
+ clearInterval(queuePositionInterval);
51
+ }
52
+ };
53
+ });
54
+ async function fetchQueuePosition() {
55
+ if (!workspace || !scheduledFor || fetchingQueuePosition)
56
+ return;
57
+ try {
58
+ fetchingQueuePosition = true;
59
+ queueState = await JobService.getQueuePosition({
60
+ workspace: workspace,
61
+ scheduledFor: scheduledFor
62
+ });
63
+ }
64
+ catch (error) {
65
+ console.error('Failed to fetch queue position:', error);
66
+ queueState = undefined;
67
+ }
68
+ finally {
69
+ fetchingQueuePosition = false;
70
+ }
71
+ }
72
+ </script>
73
+
74
+ {#if queueState}
75
+ <div class="text-small ml-4">
76
+ <span class="text-orange-600">Queue position: <b>{queueState.position}</b></span>
77
+ {#if !minimal}
78
+ <span class="ml-2 text-tertiary">(Waiting for an available worker)</span>
79
+ {/if}
80
+ </div>
81
+ {/if}
@@ -0,0 +1,8 @@
1
+ type $$ComponentProps = {
2
+ jobId: string;
3
+ workspaceId?: string | undefined;
4
+ minimal?: boolean;
5
+ };
6
+ declare const QueuePosition: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type QueuePosition = ReturnType<typeof QueuePosition>;
8
+ export default QueuePosition;
@@ -0,0 +1,13 @@
1
+ <script lang="ts">import ResourceTypePicker from './ResourceTypePicker.svelte';
2
+ let { format = $bindable() } = $props();
3
+ let resource = $state(format?.startsWith('resource-') ? format.substring('resource-'.length) : undefined);
4
+ </script>
5
+
6
+ <ResourceTypePicker
7
+ on:click={(e) => {
8
+ resource = e.detail
9
+ format = `resource-${resource ?? ''}`
10
+ }}
11
+ value={resource}
12
+ nonePickable={true}
13
+ />
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ format: string | undefined;
3
+ }
4
+ declare const ResourceNarrowing: import("svelte").Component<Props, {}, "format">;
5
+ type ResourceNarrowing = ReturnType<typeof ResourceNarrowing>;
6
+ export default ResourceNarrowing;
@@ -3,8 +3,6 @@ import { ResourceService } from '../gen';
3
3
  import { workspaceStore } from '../stores';
4
4
  import IconedResourceType from './IconedResourceType.svelte';
5
5
  import { Button, ClearableInput } from './common';
6
- import Popover from './meltComponents/Popover.svelte';
7
- import { offset, flip, shift } from 'svelte-floating-ui/dom';
8
6
  import Label from './Label.svelte';
9
7
  import Tooltip from './Tooltip.svelte';
10
8
  import Badge from './common/badge/Badge.svelte';
@@ -30,84 +28,61 @@ let search = $state('');
30
28
  let filteredResources = $derived(resources.filter((r) => r.toLowerCase().includes(search.toLowerCase())));
31
29
  </script>
32
30
 
33
- <Label label="Resource type" class="w-full col-span-2">
31
+ <Label label="Resource type" class="w-full mb-4">
34
32
  {#snippet header()}
35
33
  <Tooltip light small>Select a resource type to narrow down the object type.</Tooltip>
34
+
35
+ <div class="flex flex-row items-center w-full justify-between">
36
+ <Badge color={!value ? 'gray' : 'blue'}>
37
+ {value ?? 'None'}
38
+ </Badge>
39
+ </div>
36
40
  {/snippet}
37
41
 
38
- {#snippet action()}
39
- <div class="flex flex-row gap-1">
40
- <Button
41
- size="xs"
42
- color="light"
43
- on:click={() => onClick(undefined)}
44
- disabled={notPickable || value === undefined}
45
- >
46
- Clear
47
- </Button>
48
- <Popover
49
- floatingConfig={{
50
- strategy: 'fixed',
51
- placement: 'left-end',
52
- middleware: [offset(8), flip(), shift()]
53
- }}
54
- contentClasses="flex flex-col gap-2 h-full p-4 max-h-[40vh] w-[500px]"
55
- >
56
- {#snippet trigger()}
57
- <Button nonCaptureEvent size="xs" color="dark">Select resource type</Button>
58
- {/snippet}
59
- {#snippet content({ close })}
60
- <ClearableInput bind:value={search} placeholder="Search resource..." />
42
+ <div class="mt-2">
43
+ <ClearableInput bind:value={search} placeholder="Search resource..." />
61
44
 
62
- <div class="overflow-y-scroll h-full">
63
- <div
64
- class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center overflow-x-hidden"
65
- >
66
- {#if nonePickable && search === ''}
67
- {@const isPicked = value === undefined}
68
- <Button
69
- size="sm"
70
- variant="border"
71
- color={isPicked ? 'blue' : 'dark'}
72
- btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
73
- disabled={notPickable}
74
- on:click={() => {
75
- onClick(undefined)
76
- close()
77
- }}
78
- >
79
- None
80
- </Button>
81
- {/if}
82
- {#each filteredResources as r}
83
- {@const isPicked = value === r}
84
- <Button
85
- size="sm"
86
- variant="border"
87
- color={isPicked ? 'blue' : 'light'}
88
- btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
89
- disabled={notPickable}
90
- on:click={() => {
91
- onClick(r)
92
- close()
93
- }}
94
- >
95
- <IconedResourceType name={r} after={true} width="20px" height="20px" />
96
- </Button>
97
- {/each}
45
+ <div class="overflow-y-scroll max-h-[330px] h-full mt-1">
46
+ <div
47
+ class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center overflow-x-hidden"
48
+ >
49
+ {#if nonePickable && search === ''}
50
+ {@const isPicked = value === undefined}
51
+ <Button
52
+ size="sm"
53
+ variant="border"
54
+ color={isPicked ? 'blue' : 'light'}
55
+ btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
56
+ disabled={notPickable}
57
+ on:click={() => {
58
+ onClick(undefined)
59
+ close()
60
+ }}
61
+ >
62
+ None
63
+ </Button>
64
+ {/if}
65
+ {#each filteredResources as r}
66
+ {@const isPicked = value === r}
67
+ <Button
68
+ size="sm"
69
+ variant="border"
70
+ color={isPicked ? 'blue' : 'light'}
71
+ btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
72
+ disabled={notPickable}
73
+ on:click={() => {
74
+ onClick(r)
75
+ close()
76
+ }}
77
+ >
78
+ <IconedResourceType name={r} after={true} width="20px" height="20px" />
79
+ </Button>
80
+ {/each}
98
81
 
99
- {#if filteredResources.length === 0 && search !== ''}
100
- <div class="text-tertiary text-sm">No resources found</div>
101
- {/if}
102
- </div>
103
- </div>
104
- {/snippet}
105
- </Popover>
82
+ {#if filteredResources.length === 0 && search !== ''}
83
+ <div class="text-tertiary text-sm">No resources found</div>
84
+ {/if}
85
+ </div>
106
86
  </div>
107
- {/snippet}
108
- <div class="flex flex-row items-center w-full justify-between">
109
- <Badge color={!value ? 'gray' : 'blue'}>
110
- {value ?? 'None'}
111
- </Badge>
112
87
  </div>
113
88
  </Label>
@@ -2,60 +2,23 @@
2
2
  import zoomPlugin from 'chartjs-plugin-zoom';
3
3
  import Tooltip2 from './Tooltip.svelte';
4
4
  import { Chart as ChartJS, Title, Tooltip, Legend, LineElement, CategoryScale, LinearScale, PointElement, TimeScale, LogarithmicScale } from 'chart.js';
5
- import { createEventDispatcher } from 'svelte';
6
5
  import { getDbClockNow } from '../forLater';
7
6
  import Button from './common/button/Button.svelte';
8
7
  import { Scatter } from './chartjs-wrappers/chartJs';
9
- export let jobs = [];
10
- export let maxIsNow = false;
11
- export let minTimeSet = undefined;
12
- export let maxTimeSet = undefined;
13
- export let selectedIds = [];
14
- export let canSelect = true;
15
- export let lastFetchWentToEnd = false;
16
- const dispatch = createEventDispatcher();
8
+ import DarkModeObserver from './DarkModeObserver.svelte';
9
+ let { jobs = [], maxIsNow = false, minTimeSet = undefined, maxTimeSet = undefined, selectedIds = $bindable([]), canSelect = true, lastFetchWentToEnd = false, onPointClicked, onLoadExtra, onZoom } = $props();
17
10
  const SUCCESS_COLOR = '#4ade80';
18
11
  // const SUCCESS_COLOR_TRANSPARENT = '#c9b638'
19
- const SUCCESS_COLOR_TRANSPARENT = mergeColors(SUCCESS_COLOR, getBackgorundColor(), 0.8);
12
+ const SUCCESS_COLOR_TRANSPARENT = $derived(mergeColors(SUCCESS_COLOR, getBackgroundColor(), 0.8));
20
13
  const FAIL_COLOR = '#f87171';
21
- const FAIL_COLOR_TRANSPARENT = mergeColors(FAIL_COLOR, getBackgorundColor(), 0.8);
22
- $: success = jobs?.filter((x) => x.success);
23
- $: failed = jobs?.filter((x) => !x.success);
14
+ const FAIL_COLOR_TRANSPARENT = $derived(mergeColors(FAIL_COLOR, getBackgroundColor(), 0.8));
24
15
  ChartJS.register(Title, Tooltip, Legend, zoomPlugin, LineElement, CategoryScale, LinearScale, LogarithmicScale, PointElement, TimeScale);
25
- $: data = {
26
- datasets: [
27
- {
28
- borderColor: 'rgba(99,0,125, 0)',
29
- backgroundColor: FAIL_COLOR,
30
- radius: 3,
31
- label: 'Failed',
32
- data: failed?.map((job) => ({
33
- x: job.started_at,
34
- y: job.duration_ms,
35
- id: job.id,
36
- path: job.script_path
37
- })) ?? []
38
- },
39
- {
40
- borderColor: 'rgba(99,0,125, 0)',
41
- backgroundColor: SUCCESS_COLOR,
42
- radius: 3,
43
- label: 'Successful',
44
- data: success?.map((job) => ({
45
- x: job.started_at,
46
- y: job.duration_ms,
47
- id: job.id,
48
- path: job.script_path
49
- })) ?? []
50
- }
51
- ]
52
- };
53
16
  const zoomOptions = {
54
17
  pan: {
55
18
  enabled: true,
56
19
  modifierKey: 'ctrl',
57
20
  onPanComplete: ({ chart }) => {
58
- dispatch('zoom', {
21
+ onZoom({
59
22
  min: addSeconds(new Date(chart.scales.x.min), -1),
60
23
  max: addSeconds(new Date(chart.scales.x.max), 1)
61
24
  });
@@ -67,20 +30,20 @@ const zoomOptions = {
67
30
  },
68
31
  mode: 'x',
69
32
  onZoom: ({ chart }) => {
70
- dispatch('zoom', {
33
+ onZoom({
71
34
  min: addSeconds(new Date(chart.scales.x.min), -1),
72
35
  max: addSeconds(new Date(chart.scales.x.max), 1)
73
36
  });
74
37
  }
75
38
  }
76
39
  };
77
- function isDark() {
78
- return document.documentElement.classList.contains('dark');
79
- }
80
- ChartJS.defaults.color = isDark() ? '#ccc' : '#666';
81
- ChartJS.defaults.borderColor = isDark() ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
82
- function getBackgorundColor() {
83
- return isDark() ? '#2e3440' : '#ffffff';
40
+ let darkMode = $state(false);
41
+ $effect(() => {
42
+ ChartJS.defaults.color = darkMode ? '#ccc' : '#666';
43
+ ChartJS.defaults.borderColor = darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
44
+ });
45
+ function getBackgroundColor() {
46
+ return darkMode ? '#2e3440' : '#ffffff';
84
47
  }
85
48
  function hexToRgb(hexColor) {
86
49
  hexColor = hexColor.replace(/^#/, '');
@@ -106,22 +69,9 @@ function mergeColors(color1, color2, slider) {
106
69
  const blendedRgb = rgb1.map((c1, i) => Math.round(c1 * (1 - slider) + rgb2[i] * slider));
107
70
  return rgbToHex(blendedRgb);
108
71
  }
109
- function highlightSelectedPoints(ids) {
110
- if (!canSelect || ids.length === 0) {
111
- data.datasets[0].backgroundColor = FAIL_COLOR;
112
- data.datasets[1].backgroundColor = SUCCESS_COLOR;
113
- }
114
- else {
115
- data.datasets[0].backgroundColor = data.datasets[0].data.map((p) => ids.includes(p.id) ? FAIL_COLOR : FAIL_COLOR_TRANSPARENT);
116
- data.datasets[1].backgroundColor = data.datasets[1].data.map((p) => ids.includes(p.id) ? SUCCESS_COLOR : SUCCESS_COLOR_TRANSPARENT);
117
- }
118
- }
119
72
  function getPath(x) {
120
73
  return x.path;
121
74
  }
122
- let minTime = addSeconds(new Date(), -300);
123
- let maxTime = getDbClockNow();
124
- $: computeMinMaxTime(jobs, minTimeSet, maxTimeSet);
125
75
  function minJobTime(jobs) {
126
76
  let min = new Date(jobs[0].started_at);
127
77
  for (const job of jobs) {
@@ -147,31 +97,69 @@ function computeMinMaxTime(jobs, minTimeSet, maxTimeSet) {
147
97
  let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined;
148
98
  let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined;
149
99
  if (minTimeSetDate && maxTimeSetDate) {
150
- minTime = minTimeSetDate;
151
- maxTime = maxTimeSetDate;
152
- return;
100
+ return { minTime: minTimeSetDate, maxTime: maxTimeSetDate };
153
101
  }
154
102
  if (jobs == undefined || jobs?.length == 0) {
155
- minTime = minTimeSetDate ?? addSeconds(new Date(), -300);
156
- maxTime = maxTimeSetDate ?? getDbClockNow();
157
- return;
103
+ const computedMinTime = minTimeSetDate ?? addSeconds(new Date(), -300);
104
+ const computedMaxTime = maxTimeSetDate ?? getDbClockNow();
105
+ return { minTime: computedMinTime, maxTime: computedMaxTime };
158
106
  }
159
107
  const maxJob = maxIsNow ? getDbClockNow() : maxJobTime(jobs);
160
108
  const minJob = minJobTime(jobs);
161
109
  const diff = (maxJob.getTime() - minJob.getTime()) / 20000;
162
- minTime = minTimeSetDate ?? addSeconds(minJob, -diff);
163
- if (maxIsNow) {
164
- maxTime = maxTimeSetDate ?? maxJob;
165
- }
166
- else {
167
- maxTime = maxTimeSetDate ?? addSeconds(maxJob, diff);
168
- }
110
+ let computedMinTime = minTimeSetDate ?? addSeconds(minJob, -diff);
111
+ let computedMaxTime = maxIsNow
112
+ ? (maxTimeSetDate ?? maxJob)
113
+ : (maxTimeSetDate ?? addSeconds(maxJob, diff));
114
+ return { minTime: computedMinTime, maxTime: computedMaxTime };
169
115
  }
170
116
  function addSeconds(date, seconds) {
171
117
  date.setTime(date.getTime() + seconds * 1000);
172
118
  return date;
173
119
  }
174
- $: scatterOptions = {
120
+ let success = $derived(jobs?.filter((x) => x.success));
121
+ let failed = $derived(jobs?.filter((x) => !x.success));
122
+ let data = $derived.by(() => {
123
+ const data = {
124
+ datasets: [
125
+ {
126
+ borderColor: 'rgba(99,0,125, 0)',
127
+ backgroundColor: FAIL_COLOR,
128
+ radius: 3,
129
+ label: 'Failed',
130
+ data: failed?.map((job) => ({
131
+ x: job.started_at,
132
+ y: job.duration_ms,
133
+ id: job.id,
134
+ path: job.script_path
135
+ })) ?? []
136
+ },
137
+ {
138
+ borderColor: 'rgba(99,0,125, 0)',
139
+ backgroundColor: SUCCESS_COLOR,
140
+ radius: 3,
141
+ label: 'Successful',
142
+ data: success?.map((job) => ({
143
+ x: job.started_at,
144
+ y: job.duration_ms,
145
+ id: job.id,
146
+ path: job.script_path
147
+ })) ?? []
148
+ }
149
+ ]
150
+ };
151
+ if (!canSelect || selectedIds.length === 0) {
152
+ data.datasets[0].backgroundColor = FAIL_COLOR;
153
+ data.datasets[1].backgroundColor = SUCCESS_COLOR;
154
+ }
155
+ else {
156
+ data.datasets[0].backgroundColor = data.datasets[0].data.map((p) => selectedIds.includes(p.id) ? FAIL_COLOR : FAIL_COLOR_TRANSPARENT);
157
+ data.datasets[1].backgroundColor = data.datasets[1].data.map((p) => selectedIds.includes(p.id) ? SUCCESS_COLOR : SUCCESS_COLOR_TRANSPARENT);
158
+ }
159
+ return data;
160
+ });
161
+ const minMaxTime = $derived.by(() => computeMinMaxTime(jobs, minTimeSet, maxTimeSet));
162
+ let scatterOptions = $derived({
175
163
  responsive: true,
176
164
  maintainAspectRatio: false,
177
165
  plugins: {
@@ -187,11 +175,11 @@ $: scatterOptions = {
187
175
  }
188
176
  }
189
177
  },
190
- onClick: (e, u) => {
178
+ onClick: (_e, u) => {
191
179
  if (canSelect) {
192
180
  const ids = u.map((j) => data.datasets[j.datasetIndex].data[j.index].id);
193
181
  selectedIds = ids;
194
- dispatch('pointClicked', ids);
182
+ onPointClicked(ids);
195
183
  }
196
184
  },
197
185
  scales: {
@@ -200,8 +188,8 @@ $: scatterOptions = {
200
188
  grid: {
201
189
  display: false
202
190
  },
203
- min: minTime,
204
- max: maxTime
191
+ min: minMaxTime.minTime,
192
+ max: minMaxTime.maxTime
205
193
  },
206
194
  y: {
207
195
  grid: {
@@ -215,10 +203,11 @@ $: scatterOptions = {
215
203
  }
216
204
  },
217
205
  animation: false
218
- };
219
- $: data && scatterOptions && highlightSelectedPoints(selectedIds);
206
+ });
220
207
  </script>
221
208
 
209
+ <DarkModeObserver bind:darkMode />
210
+
222
211
  <!-- {JSON.stringify(minTime)}
223
212
  {JSON.stringify(maxTime)}
224
213
 
@@ -228,12 +217,8 @@ $: data && scatterOptions && highlightSelectedPoints(selectedIds);
228
217
  <!-- {JSON.stringify(jobs?.map((x) => x.started_at))} -->
229
218
  <div class="relative max-h-40">
230
219
  {#if !lastFetchWentToEnd}
231
- <div class="absolute top-[-10px] left-[60px]"
232
- ><Button
233
- size="xs"
234
- color="transparent"
235
- variant="contained"
236
- on:click={() => dispatch('loadExtra')}
220
+ <div class="absolute top-[-26px] left-[160px]"
221
+ ><Button size="xs" color="transparent" variant="contained" on:click={() => onLoadExtra()}
237
222
  >Load more <Tooltip2
238
223
  >There are more jobs to load but only the first 1000 were fetched</Tooltip2
239
224
  ></Button