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
@@ -5,37 +5,119 @@ import { RefreshCw } from 'lucide-svelte';
5
5
  import Badge from '../../../../common/badge/Badge.svelte';
6
6
  import Alert from '../../../../common/alert/Alert.svelte';
7
7
  import { isObject } from '../../../../../utils';
8
- let { id, columnDefs = [], result = [], allowColumnDefsActions = true, children } = $props();
8
+ let { id, columnDefs = [], result = [], allowColumnDefsActions = true, children, actionsPresent = false, customActionsHeader = undefined } = $props();
9
9
  const { app, mode, selectedComponent } = getContext('AppViewerContext');
10
+ let syncInProgress = false;
11
+ function hasActionsPlaceholder(cols) {
12
+ if (!Array.isArray(cols))
13
+ return false;
14
+ return cols.findIndex((c) => c?._isActionsColumn === true) > -1;
15
+ }
16
+ function addActionsPlaceholder(cols) {
17
+ const hdr = customActionsHeader ?? 'Actions';
18
+ const placeholder = {
19
+ field: '__actions__',
20
+ _isActionsColumn: true,
21
+ headerName: hdr,
22
+ flex: 1
23
+ };
24
+ if (!Array.isArray(cols))
25
+ return [placeholder];
26
+ return [...cols, placeholder];
27
+ }
28
+ function removeActionsPlaceholder(cols) {
29
+ if (!Array.isArray(cols))
30
+ return [];
31
+ return cols.filter((c) => c?._isActionsColumn !== true);
32
+ }
33
+ async function ensureActionsColumn() {
34
+ // Only act in editor (DND) mode
35
+ if ($mode !== 'dnd')
36
+ return;
37
+ const gridItem = findGridItem($app, id);
38
+ if (!gridItem)
39
+ return;
40
+ // Type the configuration more safely
41
+ const rawConf = gridItem.data.configuration?.columnDefs;
42
+ if (!rawConf)
43
+ return;
44
+ // Type guard for configuration structure
45
+ const conf = rawConf;
46
+ if (!conf.type || (conf.type !== 'static' && conf.type !== 'evalv2'))
47
+ return;
48
+ let currentColumns;
49
+ if (conf.type === 'static') {
50
+ currentColumns = Array.isArray(conf.value) ? conf.value : [];
51
+ }
52
+ else if (conf.type === 'evalv2') {
53
+ try {
54
+ const parsed = JSON.parse(conf.expr ?? '[]');
55
+ currentColumns = Array.isArray(parsed) ? parsed : [];
56
+ }
57
+ catch (e) {
58
+ console.warn('Failed to parse columnDefs expression:', e);
59
+ currentColumns = [];
60
+ }
61
+ }
62
+ const hasPlaceholder = hasActionsPlaceholder(currentColumns);
63
+ // Auto-sync logic: add missing actions column, remove when actions gone
64
+ const needsAdd = actionsPresent && !hasPlaceholder;
65
+ const needsRemove = !actionsPresent && hasPlaceholder;
66
+ if (!needsAdd && !needsRemove)
67
+ return;
68
+ let nextColumns = currentColumns || [];
69
+ if (needsAdd)
70
+ nextColumns = addActionsPlaceholder(nextColumns);
71
+ if (needsRemove)
72
+ nextColumns = removeActionsPlaceholder(nextColumns);
73
+ // Update configuration with proper typing
74
+ if (conf.type === 'static') {
75
+ conf.value = nextColumns;
76
+ }
77
+ else if (conf.type === 'evalv2') {
78
+ conf.expr = JSON.stringify(nextColumns);
79
+ }
80
+ await updateConfiguration();
81
+ }
82
+ $effect(() => {
83
+ const shouldSync = actionsPresent !== undefined || columnDefs?.length !== undefined;
84
+ if (shouldSync && !syncInProgress) {
85
+ syncInProgress = true;
86
+ ensureActionsColumn().finally(() => {
87
+ syncInProgress = false;
88
+ });
89
+ }
90
+ });
10
91
  async function syncColumns() {
11
- let gridItem = findGridItem($app, id);
92
+ const gridItem = findGridItem($app, id);
12
93
  if (gridItem && result) {
13
94
  const keys = Object.keys(result[0] ?? {}) ?? [];
14
- if (gridItem.data.configuration.columnDefs.type === 'static') {
15
- gridItem.data.configuration.columnDefs.value = keys.map((key) => ({
16
- field: key,
17
- headerName: key,
18
- flex: 1
19
- }));
95
+ const conf = gridItem.data.configuration.columnDefs;
96
+ const newColumns = keys.map((key) => ({
97
+ field: key,
98
+ headerName: key,
99
+ flex: 1
100
+ }));
101
+ if (conf.type === 'static') {
102
+ conf.value = newColumns;
20
103
  }
21
- else if (gridItem.data.configuration.columnDefs.type === 'evalv2') {
22
- gridItem.data.configuration.columnDefs.expr = JSON.stringify(keys.map((key, index) => ({
23
- field: key,
24
- headerName: key,
25
- flex: 1
26
- })));
104
+ else if (conf.type === 'evalv2') {
105
+ conf.expr = JSON.stringify(newColumns);
27
106
  }
28
107
  await updateConfiguration();
29
108
  }
30
109
  }
31
110
  async function setEmptyColumns() {
32
- let gridItem = findGridItem($app, id);
33
- if (gridItem && gridItem.data.configuration.columnDefs.type === 'static') {
34
- gridItem.data.configuration.columnDefs.value = [];
111
+ const gridItem = findGridItem($app, id);
112
+ if (!gridItem)
113
+ return;
114
+ const conf = gridItem.data.configuration.columnDefs;
115
+ if (conf.type === 'static') {
116
+ conf.value = [];
35
117
  await updateConfiguration();
36
118
  }
37
- else if (gridItem && gridItem.data.configuration.columnDefs.type === 'evalv2') {
38
- gridItem.data.configuration.columnDefs.expr = '[]';
119
+ else if (conf.type === 'evalv2') {
120
+ conf.expr = '[]';
39
121
  await updateConfiguration();
40
122
  }
41
123
  }
@@ -1,9 +1,12 @@
1
+ import type { WindmillColumnDef } from './utils';
1
2
  interface Props {
2
3
  id: string;
3
- columnDefs?: Array<any>;
4
- result?: Array<any> | undefined;
4
+ columnDefs?: WindmillColumnDef[];
5
+ result?: Array<Record<string, any>> | undefined;
5
6
  allowColumnDefsActions?: boolean;
6
7
  children?: import('svelte').Snippet;
8
+ actionsPresent?: boolean;
9
+ customActionsHeader?: string | undefined;
7
10
  }
8
11
  declare const SyncColumnDefs: import("svelte").Component<Props, {}, "">;
9
12
  type SyncColumnDefs = ReturnType<typeof SyncColumnDefs>;
@@ -76,6 +76,12 @@ export function transformColumnDefs({ columnDefs, actions, customActionsHeader,
76
76
  return [];
77
77
  }
78
78
  let r = columnDefs?.filter((x) => x && !x.ignored) ?? [];
79
+ // Allow an explicit "actions" placeholder in columnDefs so users can manage it like any column.
80
+ // When present, replace it with the computed actions colDef. When not present but actions exist,
81
+ // we will append the actions column after validation below.
82
+ const actionsIndex = r.findIndex((c) => {
83
+ return c?._isActionsColumn === true;
84
+ });
79
85
  if (onDelete) {
80
86
  r.push({
81
87
  field: 'delete',
@@ -118,15 +124,40 @@ export function transformColumnDefs({ columnDefs, actions, customActionsHeader,
118
124
  });
119
125
  }
120
126
  if (actions?.length) {
121
- r.push({
122
- headerName: customActionsHeader ?? 'Actions',
127
+ const computedActionsCol = {
128
+ field: '__actions__',
129
+ _isActionsColumn: true,
130
+ headerName: 'Actions',
123
131
  cellRenderer: tableActionsFactory,
124
132
  autoHeight: true,
125
133
  cellStyle: { textAlign: 'center' },
126
134
  cellClass: 'grid-cell-centered',
127
- lockPosition: 'right',
128
- ...(!wrapActions ? { minWidth: 130 * actions?.length } : {})
129
- });
135
+ // Only lock position to right if user hasn't explicitly positioned the actions column
136
+ ...(actionsIndex === -1 ? { lockPosition: 'right' } : {}),
137
+ // Set default minWidth based on number of actions (if not wrapping)
138
+ ...(!wrapActions ? { minWidth: 130 * actions?.length } : {}),
139
+ // Respect user-specified overrides when placeholder present (these should override defaults)
140
+ ...(actionsIndex > -1
141
+ ? {
142
+ // keep width/pin/flex/align/hide from placeholder when provided
143
+ ...(['width', 'minWidth', 'maxWidth', 'flex', 'pinned', 'headerName', 'cellStyle', 'cellClass', 'autoHeight', 'hide']
144
+ .reduce((acc, key) => {
145
+ if (r[actionsIndex] && r[actionsIndex][key] !== undefined)
146
+ acc[key] = r[actionsIndex][key];
147
+ return acc;
148
+ }, {}))
149
+ }
150
+ : {}),
151
+ ...(customActionsHeader?.trim() ? { headerName: customActionsHeader } : {})
152
+ };
153
+ if (actionsIndex > -1) {
154
+ // Replace the placeholder with computed column
155
+ r.splice(actionsIndex, 1, computedActionsCol);
156
+ }
157
+ else {
158
+ // Backward compatible: append if not explicitly placed
159
+ r.push(computedActionsCol);
160
+ }
130
161
  }
131
162
  return r.map((fields) => {
132
163
  let cr = defaultCellRenderer(fields.cellRendererType);
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">import DarkModeObserver from '../../../../DarkModeObserver.svelte';
2
- import { untrack } from 'svelte';
2
+ import { onMount, untrack } from 'svelte';
3
3
  /* Forked from MIT LICENSE
4
4
  https://raw.githubusercontent.com/Canutin/svelte-currency-input/main/src/lib/CurrencyInput.svelte
5
5
  */
@@ -14,7 +14,12 @@ const DEFAULT_CLASS_FORMATTED = 'currencyInput__formatted';
14
14
  const DEFAULT_CLASS_FORMATTED_POSITIVE = 'currencyInput__formatted--positive';
15
15
  const DEFAULT_CLASS_FORMATTED_NEGATIVE = 'currencyInput__formatted--negative';
16
16
  const DEFAULT_CLASS_FORMATTED_ZERO = 'currencyInput__formatted--zero';
17
- let { value = $bindable(DEFAULT_VALUE), locale = DEFAULT_LOCALE, currency = DEFAULT_CURRENCY, name = DEFAULT_NAME, required = false, disabled = false, placeholder = DEFAULT_VALUE, isNegativeAllowed = true, fractionDigits = DEFAULT_FRACTION_DIGITS, inputClasses = null, noColor = false, style = '' } = $props();
17
+ let { value = $bindable(), locale = DEFAULT_LOCALE, currency = DEFAULT_CURRENCY, name = DEFAULT_NAME, required = false, disabled = false, placeholder = DEFAULT_VALUE, isNegativeAllowed = true, fractionDigits = DEFAULT_FRACTION_DIGITS, inputClasses = null, noColor = false, style = '' } = $props();
18
+ onMount(() => {
19
+ if (value == undefined) {
20
+ value = DEFAULT_VALUE;
21
+ }
22
+ });
18
23
  // Formats value as: e.g. $1,523.00 | -$1,523.00
19
24
  const formatCurrency = (value, maximumFractionDigits, minimumFractionDigits) => {
20
25
  try {
@@ -67,7 +72,7 @@ const setUnformattedValue = (event) => {
67
72
  inputTarget = event.target;
68
73
  // Reverse the value when minus is pressed
69
74
  if (isNegativeAllowed && event.key === '-')
70
- value = value * -1;
75
+ value = (value ?? DEFAULT_VALUE) * -1;
71
76
  }
72
77
  // Remove all characters that arent: numbers, commas, periods (or minus signs if `isNegativeAllowed`)
73
78
  let unformattedValue = isNegativeAllowed
@@ -101,7 +106,7 @@ const setFormattedValue = () => {
101
106
  const startCaretPosition = inputTarget?.selectionStart || 0;
102
107
  const previousFormattedValueLength = formattedValue.length;
103
108
  // Apply formatting to input
104
- formattedValue = formatCurrency(value, fractionDigits, 0);
109
+ formattedValue = formatCurrency(value ?? DEFAULT_VALUE, fractionDigits, 0);
105
110
  // Update `value` after formatting
106
111
  setUnformattedValue();
107
112
  // New caret position
@@ -115,7 +120,7 @@ const setFormattedValue = () => {
115
120
  let formattedValue = $state('');
116
121
  let formattedPlaceholder = placeholder !== null ? formatCurrency(placeholder, fractionDigits, fractionDigits) : '';
117
122
  let isZero = $derived(value === 0);
118
- let isNegative = $derived(value < 0);
123
+ let isNegative = $derived((value ?? DEFAULT_VALUE) < 0);
119
124
  $effect(() => {
120
125
  value;
121
126
  untrack(() => {
@@ -12,7 +12,7 @@ import { Alert, Button, Tab } from '../../common';
12
12
  import TabContent from '../../common/tabs/TabContent.svelte';
13
13
  import Tabs from '../../common/tabs/TabsV2.svelte';
14
14
  import { userStore, workspaceStore } from '../../../stores';
15
- import { classNames, encodeState, getModifierKey, sendUserToast } from '../../../utils';
15
+ import { classNames, encodeState, getModifierKey, sendUserToast, urlParamsToObject } from '../../../utils';
16
16
  import AppPreview from './AppPreview.svelte';
17
17
  import ComponentList from './componentsPanel/ComponentList.svelte';
18
18
  import ContextPanel from './contextPanel/ContextPanel.svelte';
@@ -60,7 +60,7 @@ let context = $state({
60
60
  groups: $userStore?.groups,
61
61
  username: $userStore?.username,
62
62
  name: $userStore?.name,
63
- query: Object.fromEntries(new URL(window.location.href).searchParams.entries()),
63
+ query: urlParamsToObject(new URL(window.location.href).searchParams),
64
64
  hash: window.location.hash.substring(1),
65
65
  workspace: $workspaceStore,
66
66
  mode: 'editor',
@@ -643,7 +643,8 @@ $effect(() => {
643
643
  untrack(() => setGridPanelSize($componentActive));
644
644
  });
645
645
  $effect(() => {
646
- $connectingInput.opened, untrack(() => updatePannelInConnecting());
646
+ ;
647
+ ($connectingInput.opened, untrack(() => updatePannelInConnecting()));
647
648
  });
648
649
  $effect(() => {
649
650
  forceDeactivatePanzoom = isModifierKeyPressed && handMode;
@@ -91,7 +91,6 @@ function closeDraftDrawer() {
91
91
  }
92
92
  async function computeTriggerables() {
93
93
  const items = allItems($app.grid, $app.subgrids);
94
- console.debug('items', items);
95
94
  const allTriggers = (await Promise.all(items
96
95
  .flatMap((x) => {
97
96
  let c = x.data;
@@ -1,7 +1,7 @@
1
1
  import type { EditorBreakpoint } from '../types';
2
2
  import type { FilledItem } from '../svelte-grid/types';
3
- declare class __sveltets_Render<T> {
4
- props(): {
3
+ declare function $$render<T>(): {
4
+ props: {
5
5
  items: FilledItem<T>[];
6
6
  rowHeight?: number;
7
7
  gap?: any;
@@ -13,11 +13,18 @@ declare class __sveltets_Render<T> {
13
13
  parentWidth?: number | undefined;
14
14
  children?: import("svelte").Snippet<[any]>;
15
15
  };
16
- events(): {
16
+ exports: {};
17
+ bindings: "items" | "containerWidth";
18
+ slots: {};
19
+ events: {
17
20
  resize: CustomEvent<any>;
18
21
  mount: CustomEvent<any>;
19
22
  };
20
- slots(): {};
23
+ };
24
+ declare class __sveltets_Render<T> {
25
+ props(): ReturnType<typeof $$render<T>>['props'];
26
+ events(): ReturnType<typeof $$render<T>>['events'];
27
+ slots(): ReturnType<typeof $$render<T>>['slots'];
21
28
  bindings(): "items" | "containerWidth";
22
29
  exports(): {};
23
30
  }
@@ -92,7 +92,7 @@ let menuItemsSettings = $derived(findMenuItemsSettings($app, firstComponent));
92
92
 
93
93
  {#if gridItemWithLocation}
94
94
  {#if gridItemWithLocation.location.type === 'grid'}
95
- {#each $app.grid as gridItem, gridItemIndex}
95
+ {#each $app.grid as gridItem, gridItemIndex (gridItem.data.id)}
96
96
  {#if gridItem.data.id === gridItemWithLocation.item.id}
97
97
  <ComponentPanel
98
98
  bind:item={$app.grid[gridItemIndex]}
@@ -104,7 +104,7 @@ let menuItemsSettings = $derived(findMenuItemsSettings($app, firstComponent));
104
104
  {/if}
105
105
  {/each}
106
106
  {:else if gridItemWithLocation.location.type === 'subgrid' && $app.subgrids}
107
- {#each $app.subgrids[gridItemWithLocation.location.subgridKey] as subgridItem, subgridItemIndex}
107
+ {#each $app.subgrids[gridItemWithLocation.location.subgridKey] as subgridItem, subgridItemIndex (subgridItem.data.id)}
108
108
  {#if subgridItem.data.id === gridItemWithLocation.item.id}
109
109
  <ComponentPanel
110
110
  bind:item={$app.subgrids[gridItemWithLocation.location.subgridKey][subgridItemIndex]}
@@ -4,14 +4,14 @@ import { ChevronDown } from 'lucide-svelte';
4
4
  import { isOpenStore } from './store';
5
5
  import { createEventDispatcher, onMount } from 'svelte';
6
6
  import Tooltip from '../../../Tooltip.svelte';
7
- let { title, prefix = undefined, openByDefault = false, wrapperClasses = '', toggleClasses = '', contentWrapperClasses = '', isOpen = $bindable(false), tooltip = undefined, documentationLink = undefined, subtitle = undefined, titleSlot, children } = $props();
7
+ let { title, prefix = undefined, openByDefault = false, wrapperClasses = '', toggleClasses = '', contentWrapperClasses = '', isOpen = $bindable(), tooltip = undefined, documentationLink = undefined, subtitle = undefined, titleSlot, children } = $props();
8
8
  const dispatch = createEventDispatcher();
9
9
  let storeTitle = $derived(prefix + title);
10
10
  $effect(() => {
11
11
  isOpen = prefix ? $isOpenStore[storeTitle] : true;
12
12
  });
13
13
  $effect(() => {
14
- dispatch('open', isOpen);
14
+ dispatch('open', isOpen ?? false);
15
15
  });
16
16
  onMount(() => {
17
17
  if (prefix !== undefined && !(prefix + title in $isOpenStore)) {
@@ -30,6 +30,6 @@ declare const InlineScriptEditor: $$__sveltets_2_IsomorphicComponent<Props, {
30
30
  delete: CustomEvent<any>;
31
31
  } & {
32
32
  [evt: string]: CustomEvent<any>;
33
- }, {}, {}, "name" | "fields" | "inlineScript" | "editor">;
33
+ }, {}, {}, "name" | "fields" | "editor" | "inlineScript">;
34
34
  type InlineScriptEditor = InstanceType<typeof InlineScriptEditor>;
35
35
  export default InlineScriptEditor;
@@ -26,6 +26,6 @@ declare const InlineScriptEditorDrawer: $$__sveltets_2_IsomorphicComponent<Props
26
26
  [evt: string]: CustomEvent<any>;
27
27
  }, {}, {
28
28
  openDrawer: () => void;
29
- }, "inlineScript" | "isOpen">;
29
+ }, "isOpen" | "inlineScript">;
30
30
  type InlineScriptEditorDrawer = InstanceType<typeof InlineScriptEditorDrawer>;
31
31
  export default InlineScriptEditorDrawer;
@@ -26,6 +26,6 @@ declare const InlineScriptRunnableByPath: $$__sveltets_2_IsomorphicComponent<Pro
26
26
  fork: CustomEvent<any>;
27
27
  } & {
28
28
  [evt: string]: CustomEvent<any>;
29
- }, {}, {}, "runnable" | "fields">;
29
+ }, {}, {}, "fields" | "runnable">;
30
30
  type InlineScriptRunnableByPath = InstanceType<typeof InlineScriptRunnableByPath>;
31
31
  export default InlineScriptRunnableByPath;
@@ -1,14 +1,17 @@
1
1
  <script lang="ts">import { preventDefault, stopPropagation } from 'svelte/legacy';
2
2
  import { Button } from '../../../common';
3
3
  import { GripVertical, Loader2, Plus, X } from 'lucide-svelte';
4
- import { createEventDispatcher } from 'svelte';
4
+ import { createEventDispatcher, getContext, tick } from 'svelte';
5
5
  import SubTypeEditor from './SubTypeEditor.svelte';
6
6
  import { dragHandle, dragHandleZone } from '@windmill-labs/svelte-dnd-action';
7
7
  import { generateRandomString, pluralize } from '../../../../utils';
8
8
  import Toggle from '../../../Toggle.svelte';
9
9
  import QuickAddColumn from './QuickAddColumn.svelte';
10
10
  import RefreshDatabaseStudioTable from './RefreshDatabaseStudioTable.svelte';
11
+ import { findGridItem } from '../appUtils';
11
12
  let { componentInput = $bindable(), subFieldType = undefined, selectOptions = undefined, id } = $props();
13
+ const appContext = getContext('AppViewerContext');
14
+ const { app, selectedComponent } = appContext || {};
12
15
  let items = $state([]);
13
16
  items = getItems(componentInput);
14
17
  const dispatch = createEventDispatcher();
@@ -175,10 +178,30 @@ function addElementByType() {
175
178
  componentInput = componentInput;
176
179
  items = getItems(componentInput);
177
180
  }
178
- function deleteElementByType(index) {
181
+ async function updateConfiguration() {
182
+ if (selectedComponent && id) {
183
+ $selectedComponent = undefined;
184
+ await tick();
185
+ $selectedComponent = [id];
186
+ }
187
+ }
188
+ async function deleteElementByType(index) {
179
189
  if (componentInput.value) {
190
+ const item = componentInput.value[index];
191
+ // If deleting actions column, clear all table actions
192
+ if (subFieldType === 'ag-grid' && item && item._isActionsColumn === true) {
193
+ const gridItem = id ? findGridItem($app, id) : null;
194
+ if (gridItem && (gridItem.data.type === 'aggridcomponent' ||
195
+ gridItem.data.type === 'aggridcomponentee' ||
196
+ gridItem.data.type === 'aggridinfinitecomponent' ||
197
+ gridItem.data.type === 'aggridinfinitecomponentee') && Array.isArray(gridItem.data.actions)) {
198
+ gridItem.data.actions.length = 0;
199
+ }
200
+ await updateConfiguration();
201
+ return;
202
+ }
180
203
  componentInput.value.splice(index, 1);
181
- items.splice(index, 1); // Add this
204
+ items.splice(index, 1);
182
205
  items = items;
183
206
  componentInput.value = componentInput.value;
184
207
  dispatch('deleteArrayItem', { index });
@@ -117,7 +117,7 @@ function openConnection() {
117
117
  componentInput['value'] != undefined &&
118
118
  (componentInput['expr'] == '' || componentInput['expr'] == undefined)
119
119
  ) {
120
- componentInput['expr'] = JSON.stringify(componentInput['value'])
120
+ componentInput['expr'] = JSON.stringify(componentInput['value'], null, 2)
121
121
  } else if (fileUploadS3 && fieldType === 'text' && e.detail != 'uploadS3') {
122
122
  componentInput['value'] = ''
123
123
  } else if (e.detail == 'uploadS3') {
@@ -273,11 +273,19 @@ let s3FilePicker = $state(undefined);
273
273
  {:else if fieldType === 'ag-grid'}
274
274
  <div class="flex flex-row rounded-md bg-surface items-center h-full">
275
275
  <div class="relative w-full">
276
- <input
277
- class="text-xs px-2 border-y w-full flex flex-row items-center border-r rounded-r-md h-8"
278
- bind:value={componentInput.value.field}
279
- placeholder="Field"
280
- />
276
+ {#if componentInput.value._isActionsColumn === true}
277
+ <div
278
+ class="text-xs px-2 border w-full flex flex-row items-center rounded-r-md h-8 text-primary"
279
+ >
280
+ Actions Column
281
+ </div>
282
+ {:else}
283
+ <input
284
+ class="text-xs px-2 border-y w-full flex flex-row items-center border-r rounded-r-md h-8"
285
+ bind:value={componentInput.value.field}
286
+ placeholder="Field"
287
+ />
288
+ {/if}
281
289
  <div class="absolute top-1 right-1">
282
290
  <AgGridWizard bind:value={componentInput.value}>
283
291
  {#snippet trigger()}
@@ -1,7 +1,7 @@
1
1
  import type { FilledItem } from './types';
2
2
  import { type GridShadow } from '../editor/appUtils';
3
- declare class __sveltets_Render<T> {
4
- props(): {
3
+ declare function $$render<T>(): {
4
+ props: {
5
5
  items: FilledItem<T>[];
6
6
  rowHeight?: number;
7
7
  gap?: any;
@@ -16,28 +16,47 @@ declare class __sveltets_Render<T> {
16
16
  parentWidth?: number | undefined;
17
17
  disableMove?: boolean;
18
18
  children?: import("svelte").Snippet<[any]>;
19
- onDropped?: ((e: {
19
+ onDropped?: (e: {
20
20
  id: string;
21
21
  overlapped: string | undefined;
22
22
  x: number;
23
23
  y: number;
24
- }) => void) | undefined;
25
- onRedraw?: ((grid: FilledItem<T>[]) => void) | undefined;
26
- onResize?: ((e: {
24
+ }) => void;
25
+ onRedraw?: (grid: FilledItem<T>[]) => void;
26
+ onResize?: (e: {
27
27
  cols: number;
28
28
  xPerPx: number;
29
29
  yPerPx: number;
30
30
  width: number | undefined;
31
- }) => void) | undefined;
32
- onMounted?: ((e: {
31
+ }) => void;
32
+ onMounted?: (e: {
33
33
  cols: number;
34
34
  xPerPx: number;
35
35
  yPerPx: number;
36
36
  width: number | undefined;
37
- }) => void) | undefined;
37
+ }) => void;
38
38
  };
39
- events(): {};
40
- slots(): {};
39
+ exports: {
40
+ handleMove: (detail: {
41
+ cordDiff: {
42
+ x: number;
43
+ y: number;
44
+ };
45
+ clientY: number;
46
+ intersectingElement?: string | undefined;
47
+ shadow?: GridShadow | undefined;
48
+ overlapped?: string | undefined;
49
+ }) => void;
50
+ handleInitMove: (id: string) => void;
51
+ };
52
+ bindings: "containerWidth";
53
+ slots: {};
54
+ events: {};
55
+ };
56
+ declare class __sveltets_Render<T> {
57
+ props(): ReturnType<typeof $$render<T>>['props'];
58
+ events(): ReturnType<typeof $$render<T>>['events'];
59
+ slots(): ReturnType<typeof $$render<T>>['slots'];
41
60
  bindings(): "containerWidth";
42
61
  exports(): {
43
62
  handleMove: (detail: {
@@ -49,30 +49,34 @@ let dbManagerDrawer = $state();
49
49
  let resourceEditorDrawer = $state();
50
50
  </script>
51
51
 
52
- <ul class="flex flex-col divide-y mt-1">
53
- {#each assets.value ?? [] as asset}
54
- <li class="flex justify-between py-3 leading-4 text-sm pl-4">
55
- <div class="flex flex-col flex-1 truncate">
56
- {asset.path}
57
- <span class="text-2xs text-tertiary">
58
- {formatAssetKind({
59
- ...asset,
60
- ...(asset.kind === 'resource'
61
- ? { metadata: { resource_type: resourceDataCache[asset.path] } }
62
- : {})
63
- })}
64
- </span>
65
- </div>
66
- <AssetButtons
67
- {asset}
68
- {resourceDataCache}
69
- {dbManagerDrawer}
70
- {resourceEditorDrawer}
71
- {s3FilePicker}
72
- />
73
- </li>
74
- {/each}
75
- </ul>
52
+ {#if assets.value && assets.value.length > 0}
53
+ <ul class="flex flex-col divide-y mt-1">
54
+ {#each assets.value ?? [] as asset}
55
+ <li class="flex justify-between py-3 leading-4 text-sm pl-4">
56
+ <div class="flex flex-col flex-1 truncate">
57
+ {asset.path}
58
+ <span class="text-2xs text-tertiary">
59
+ {formatAssetKind({
60
+ ...asset,
61
+ ...(asset.kind === 'resource'
62
+ ? { metadata: { resource_type: resourceDataCache[asset.path] } }
63
+ : {})
64
+ })}
65
+ </span>
66
+ </div>
67
+ <AssetButtons
68
+ {asset}
69
+ {resourceDataCache}
70
+ {dbManagerDrawer}
71
+ {resourceEditorDrawer}
72
+ {s3FilePicker}
73
+ />
74
+ </li>
75
+ {/each}
76
+ </ul>
77
+ {:else}
78
+ <div class="text-sm text-tertiary">No assets found</div>
79
+ {/if}
76
80
 
77
81
  <S3FilePicker bind:this={s3FilePicker} readOnlyMode />
78
82
  <DbManagerDrawer bind:this={dbManagerDrawer} />
@@ -76,11 +76,7 @@ function kindToBadgeColor(kind) {
76
76
 
77
77
  <svelte:window onresize={() => computeHeight()} />
78
78
 
79
- <div
80
- class="divide-y min-w-[640px] h-full"
81
- id="audit-logs-table-wrapper"
82
- >
83
-
79
+ <div class="divide-y min-w-[640px] h-full" id="audit-logs-table-wrapper">
84
80
  <div bind:clientHeight={headerHeight}>
85
81
  <div
86
82
  class="flex flex-row bg-surface-secondary sticky top-0 w-full p-2 pr-4 text-xs font-semibold"
@@ -105,7 +101,7 @@ function kindToBadgeColor(kind) {
105
101
  scrollToAlignment="center"
106
102
  >
107
103
  {#snippet header()}{/snippet}
108
- {#snippet children({ index, style })}
104
+ {#snippet item({ index, style })}
109
105
  <div {style} class="w-full">
110
106
  {#if flatLogs}
111
107
  {@const logOrDate = flatLogs[index]}