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
@@ -1,6 +1,7 @@
1
1
  import FlowLogViewer from './FlowLogViewer.svelte';
2
2
  import type { FlowModule, FlowStatusModule, Job } from '../gen';
3
3
  import type { GraphModuleState } from './graph/model';
4
+ import type { NavigationChain } from '../keyboardChain';
4
5
  type RootJobData = Partial<Job>;
5
6
  interface Props {
6
7
  modules: FlowModule[];
@@ -28,7 +29,10 @@ interface Props {
28
29
  getSelectedIteration: (stepId: string) => number;
29
30
  flowSummary?: string;
30
31
  mode?: 'flow' | 'aiagent';
32
+ currentId?: string | null;
33
+ navigationChain?: NavigationChain;
34
+ select: (id: string) => void;
31
35
  }
32
- declare const FlowLogViewer: import("svelte").Component<Props, {}, "">;
36
+ declare const FlowLogViewer: import("svelte").Component<Props, {}, "navigationChain">;
33
37
  type FlowLogViewer = ReturnType<typeof FlowLogViewer>;
34
38
  export default FlowLogViewer;
@@ -7,6 +7,9 @@ let { job, localModuleStates, workspaceId, render, onSelectedIteration, mode = '
7
7
  let expandedRows = $state({});
8
8
  let allExpanded = $state(false);
9
9
  let showResultsInputs = $state(true);
10
+ // Keyboard navigation state - incremental like expandedRows
11
+ let currentId = $state('flow-root');
12
+ let navigationChain = $state({});
10
13
  let moduleTracker = new ChangeTracker($state.snapshot(job.raw_flow?.modules ?? []));
11
14
  $effect(() => {
12
15
  readFieldsRecursively(job.raw_flow?.modules ?? []);
@@ -29,9 +32,46 @@ function toggleExpandAll() {
29
32
  allExpanded = !allExpanded;
30
33
  expandedRows = {};
31
34
  }
35
+ // Keyboard event handler using navigation links
36
+ function handleKeydown(event) {
37
+ if (!currentId && job.raw_flow?.modules) {
38
+ currentId = 'flow-root';
39
+ }
40
+ else if (!currentId) {
41
+ return;
42
+ }
43
+ switch (event.key) {
44
+ case 'ArrowDown':
45
+ event.preventDefault();
46
+ const downId = navigationChain[currentId]?.downId;
47
+ if (downId) {
48
+ currentId = downId;
49
+ }
50
+ break;
51
+ case 'ArrowUp':
52
+ event.preventDefault();
53
+ const upId = navigationChain[currentId]?.upId;
54
+ if (upId) {
55
+ currentId = upId;
56
+ }
57
+ break;
58
+ case 'Enter':
59
+ event.preventDefault();
60
+ toggleExpanded(currentId);
61
+ break;
62
+ }
63
+ }
64
+ function select(id) {
65
+ currentId = id;
66
+ }
32
67
  </script>
33
68
 
34
- <div class="w-full rounded-md overflow-hidden border">
69
+ <div
70
+ class="w-full rounded-md overflow-hidden border focus:border-gray-400 dark:focus:border-gray-400"
71
+ role="tree"
72
+ tabindex="0"
73
+ onkeydown={handleKeydown}
74
+ >
35
75
  <FlowLogViewer
36
76
  {modules}
37
77
  {localModuleStates}
@@ -48,5 +88,8 @@ function toggleExpandAll() {
48
88
  flowId="root"
49
89
  flowStatus={undefined}
50
90
  {mode}
91
+ {currentId}
92
+ bind:navigationChain
93
+ {select}
51
94
  />
52
95
  </div>
@@ -30,6 +30,6 @@ declare const FlowLoopIterationPreview: $$__sveltets_2_IsomorphicComponent<Props
30
30
  whileLoopSchema: Schema;
31
31
  test: () => void;
32
32
  runPreview: (args: Record<string, any>, restartedFrom: RestartedFrom | undefined) => Promise<void>;
33
- }, "job" | "jobId" | "previewArgs">;
33
+ }, "job" | "previewArgs" | "jobId">;
34
34
  type FlowLoopIterationPreview = InstanceType<typeof FlowLoopIterationPreview>;
35
35
  export default FlowLoopIterationPreview;
@@ -57,6 +57,6 @@ declare const FlowPreviewContent: $$__sveltets_2_IsomorphicComponent<Props, {
57
57
  getIsOwner: () => boolean;
58
58
  getJob: () => Job | undefined;
59
59
  flowHasChanged: () => boolean;
60
- }, "initial" | "preventEscape" | "job" | "jobId" | "scrollTop" | "localModuleStates" | "rightColumnSelect" | "localDurationStatuses" | "selectedJobStep" | "previewMode" | "selectedJobStepIsTopLevel" | "selectedJobStepType" | "branchOrIterationN">;
60
+ }, "initial" | "preventEscape" | "job" | "scrollTop" | "jobId" | "localModuleStates" | "rightColumnSelect" | "localDurationStatuses" | "selectedJobStep" | "previewMode" | "selectedJobStepIsTopLevel" | "selectedJobStepType" | "branchOrIterationN">;
61
61
  type FlowPreviewContent = InstanceType<typeof FlowPreviewContent>;
62
62
  export default FlowPreviewContent;
@@ -28,6 +28,7 @@ import { createState } from '../svelte5Utils.svelte';
28
28
  import JobLoader from './JobLoader.svelte';
29
29
  import { writable } from 'svelte/store';
30
30
  import { AI_TOOL_CALL_PREFIX, AI_TOOL_MESSAGE_PREFIX, getToolCallId } from './graph/renderers/nodes/AIToolNode.svelte';
31
+ import JobAssetsViewer from './assets/JobAssetsViewer.svelte';
31
32
  let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition, hideDownloadLogs, hideJobId } = getContext('FlowStatusViewer');
32
33
  let { jobId, initialJob = undefined, workspaceId = undefined, flowJobIds = undefined, innerModule = undefined, render = true, isOwner = false, selectedNode = $bindable(undefined), globalModuleStates, globalDurationStatuses = [], globalIterationBounds, updateRecursiveRefreshFn = undefined, isSelectedBranch = true, isSubflow = false, reducedPolling = false, wideResults = false, hideFlowResult = false, workspace = $workspaceStore, prefix = undefined, topModuleStates = undefined, refreshGlobal, updateGlobalRefresh, subflowParentsGlobalModuleStates = [], subflowParentsDurationStatuses = [], isForloopSelected = false, job = $bindable(undefined), rightColumnSelect = $bindable('timeline'), localModuleStates = $bindable({}), localDurationStatuses = $bindable({}), customUi, onResultStreamUpdate = undefined, graphTabOpen, isNodeSelected, loadExtraLogs = undefined, onStart = undefined, onJobsLoaded = undefined, onDone = undefined, toolCallStore } = $props();
33
34
  let getTopModuleStates = $derived(topModuleStates ?? localModuleStates);
@@ -786,6 +787,14 @@ function getParentLoopsPrefix(modId) {
786
787
  }
787
788
  return '';
788
789
  }
790
+ // Set all tabs content to the same height to prevent layout jumps
791
+ let tabsHeight = $state({
792
+ sequenceHeight: 0,
793
+ logsHeight: 0,
794
+ assetsHeight: 0,
795
+ graphHeight: 0
796
+ });
797
+ let minTabHeight = $derived(Math.max(tabsHeight.sequenceHeight, tabsHeight.logsHeight, tabsHeight.assetsHeight, tabsHeight.graphHeight));
789
798
  </script>
790
799
 
791
800
  <JobLoader workspaceOverride={workspaceId} {noLogs} noCode bind:this={jobLoader} />
@@ -864,12 +873,17 @@ function getParentLoopsPrefix(modId) {
864
873
  : ''}><span class="font-semibold">Logs</span></Tab
865
874
  >
866
875
  <Tab value="sequence"><span class="font-semibold">Details</span></Tab>
876
+ <Tab value="assets"><span class="font-semibold">Assets</span></Tab>
867
877
  </Tabs>
868
878
  {:else}
869
879
  <div class="h-[30px]"></div>
870
880
  {/if}
871
881
  {/if}
872
- <div class="{selected != 'sequence' ? 'hidden' : ''} max-w-7xl mx-auto">
882
+ <div
883
+ class="{selected != 'sequence' ? 'hidden' : ''} max-w-7xl mx-auto"
884
+ bind:clientHeight={tabsHeight.sequenceHeight}
885
+ style="min-height: {minTabHeight}px"
886
+ >
873
887
  {#if isListJob}
874
888
  {@const sliceFrom =
875
889
  globalIterationBounds[buildSubflowKey(flowJobIds?.moduleId ?? '', prefix)]
@@ -1218,7 +1232,11 @@ function getParentLoopsPrefix(modId) {
1218
1232
  <div class="p-2 text-tertiary text-sm italic">Empty flow</div>
1219
1233
  {/if}
1220
1234
  </div>
1221
- <div class="{selected != 'logs' ? 'hidden' : ''} mx-auto h-[800px]">
1235
+ <div
1236
+ class="{selected != 'logs' ? 'hidden' : ''} mx-auto"
1237
+ bind:clientHeight={tabsHeight.logsHeight}
1238
+ style="min-height: {minTabHeight}px"
1239
+ >
1222
1240
  <FlowLogViewerWrapper
1223
1241
  {job}
1224
1242
  {localModuleStates}
@@ -1227,10 +1245,23 @@ function getParentLoopsPrefix(modId) {
1227
1245
  {onSelectedIteration}
1228
1246
  />
1229
1247
  </div>
1248
+ {#if selected == 'assets' && render}
1249
+ <div
1250
+ class="p-2"
1251
+ bind:clientHeight={tabsHeight.assetsHeight}
1252
+ style="min-height: {minTabHeight}px"
1253
+ >
1254
+ <JobAssetsViewer {job} />
1255
+ </div>
1256
+ {/if}
1230
1257
  </div>
1231
1258
  {#if render}
1232
1259
  {#if job.raw_flow && !isListJob}
1233
- <div class="{selected != 'graph' ? 'hidden' : ''} grow mt-4">
1260
+ <div
1261
+ class="{selected != 'graph' ? 'hidden' : ''} grow mt-4"
1262
+ bind:clientHeight={tabsHeight.graphHeight}
1263
+ style="min-height: {minTabHeight}px"
1264
+ >
1234
1265
  <div class="grid grid-cols-3 border h-full" bind:clientHeight={wrapperHeight}>
1235
1266
  <div class="col-span-2 bg-surface-secondary">
1236
1267
  <div class="flex flex-col">
@@ -40,7 +40,7 @@ async function addFolder() {
40
40
  loadFolders();
41
41
  </script>
42
42
 
43
- <Drawer bind:this={newFolder}>
43
+ <Drawer bind:this={newFolder} name="newFolder">
44
44
  <DrawerContent
45
45
  title="New Folder"
46
46
  on:close={() => {
@@ -32,6 +32,8 @@ let monaco = $state(undefined);
32
32
  let monacoTemplate = $state(undefined);
33
33
  let argInput = $state(undefined);
34
34
  let focusedPrev = false;
35
+ const variableMatch = (value) => value.match(/^variable\('([^']+)'\)$/);
36
+ const resourceMatch = (value) => value.match(/^resource\('([^']+)'\)$/);
35
37
  const dispatch = createEventDispatcher();
36
38
  $effect(() => {
37
39
  editor = monaco;
@@ -144,18 +146,18 @@ function isStaticTemplate(inputCat) {
144
146
  }
145
147
  function connectProperty(rawValue) {
146
148
  // Extract path from variable('x') or resource('x') format
147
- const varMatch = rawValue.match(/^variable\('([^']+)'\)$/);
148
- const resourceMatch = rawValue.match(/^resource\('([^']+)'\)$/);
149
+ const varMatch = variableMatch(rawValue);
150
+ const resMatch = resourceMatch(rawValue);
149
151
  if (varMatch) {
150
152
  arg.type = 'static';
151
153
  propertyType = 'static';
152
154
  arg.value = '$var:' + varMatch[1];
153
155
  monacoTemplate?.setCode(arg.value);
154
156
  }
155
- else if (resourceMatch) {
157
+ else if (resMatch) {
156
158
  arg.type = 'static';
157
159
  propertyType = 'static';
158
- arg.value = '$res:' + resourceMatch[1];
160
+ arg.value = '$res:' + resMatch[1];
159
161
  monacoTemplate?.setCode(arg.value);
160
162
  }
161
163
  else {
@@ -169,12 +171,20 @@ function onFocus() {
169
171
  focused = true;
170
172
  if (isStaticTemplate(inputCat)) {
171
173
  focusProp?.(argName, 'append', (path) => {
172
- const toAppend = `\$\{${path}}`;
173
- arg.value = `${arg.value ?? ''}${toAppend}`;
174
- monacoTemplate?.setCode(arg.value);
175
- setPropertyType(arg.value);
176
- argInput?.focus();
177
- return false;
174
+ // Empty field + variable = use $var:/$res: syntax instead of ${...}
175
+ const isEmpty = !arg.value || arg.value.trim() === '';
176
+ if (isEmpty && variableMatch(path)) {
177
+ connectProperty(path);
178
+ return true;
179
+ }
180
+ else {
181
+ const toAppend = `\$\{${path}}`;
182
+ arg.value = `${arg.value ?? ''}${toAppend}`;
183
+ monacoTemplate?.setCode(arg.value);
184
+ setPropertyType(arg.value);
185
+ argInput?.focus();
186
+ return false;
187
+ }
178
188
  });
179
189
  }
180
190
  else {
@@ -79,7 +79,7 @@ ${Object.entries(args)
79
79
  {#each Object.entries(args).sort((a, b) => a[0].localeCompare(b[0])) as [arg, value]}
80
80
  <Row>
81
81
  <Cell first>{arg}</Cell>
82
- <Cell last><ArgInfo {value} /></Cell>
82
+ <Cell><ArgInfo {value} /></Cell>
83
83
  </Row>
84
84
  {/each}
85
85
  {:else if args}
@@ -61,6 +61,6 @@ declare const JobLoader: import("svelte").Component<Props, {
61
61
  cancelJob: () => Promise<void>;
62
62
  clearCurrentJob: () => Promise<void>;
63
63
  watchJob: (testId: string, callbacks?: Callbacks) => Promise<void>;
64
- }, "job" | "isLoading" | "notfound" | "jobUpdateLastFetch" | "scriptProgress">;
64
+ }, "isLoading" | "job" | "notfound" | "jobUpdateLastFetch" | "scriptProgress">;
65
65
  type JobLoader = ReturnType<typeof JobLoader>;
66
66
  export default JobLoader;
@@ -4,6 +4,7 @@ import { forLater } from '../forLater';
4
4
  import DurationMs from './DurationMs.svelte';
5
5
  import { Calendar, CheckCircle2, Circle, Clock, Hourglass, Play, XCircle } from 'lucide-svelte';
6
6
  import NoWorkerWithTagWarning from './runs/NoWorkerWithTagWarning.svelte';
7
+ import QueuePosition from './QueuePosition.svelte';
7
8
  const SMALL_ICON_SIZE = 12;
8
9
  export let job;
9
10
  </script>
@@ -56,6 +57,7 @@ export let job;
56
57
  <div class="flex flex-row gap-1 items-center">
57
58
  <Badge color="orange" icon={{ icon: Clock, position: 'left' }}>Queued</Badge>
58
59
  <NoWorkerWithTagWarning tag={job.tag} />
60
+ <QueuePosition jobId={job.id} workspaceId={job.workspace_id} minimal />
59
61
  </div>
60
62
  {:else}
61
63
  <Circle size={SMALL_ICON_SIZE} class="text-gray-200" />
@@ -1,4 +1,4 @@
1
- <script lang="ts">import AnsiUp from 'ansi_up';
1
+ <script lang="ts">import { AnsiUp } from 'ansi_up';
2
2
  export let content;
3
3
  export let highlighted;
4
4
  const ansi_up = new AnsiUp();
@@ -24,8 +24,8 @@ let html = highlightSnippet(content);
24
24
  </script>
25
25
 
26
26
  <button on:click class="font-light !m-0 !p-0">
27
- <pre
28
- class="bg-surface-secondary hover:bg-surface px-2 py-1 text-secondary text-xs w-[100%] whitespace-pre border min-w-full text-start" >
27
+ <pre
28
+ class="bg-surface-secondary hover:bg-surface px-2 py-1 text-secondary text-xs w-[100%] whitespace-pre border min-w-full text-start">
29
29
  {@html html}
30
30
  </pre>
31
31
  </button>
@@ -15,7 +15,7 @@ declare const LogSnippetViewer: $$__sveltets_2_IsomorphicComponent<{
15
15
  content: string;
16
16
  highlighted: any[];
17
17
  }, {
18
- click: MouseEvent;
18
+ click: PointerEvent;
19
19
  } & {
20
20
  [evt: string]: CustomEvent<any>;
21
21
  }, {}, {}, string>;
@@ -11,12 +11,13 @@ import { Button, Drawer, DrawerContent } from './common';
11
11
  import { copyToClipboard } from '../utils';
12
12
  import { base } from '../base';
13
13
  import { workspaceStore } from '../stores';
14
- import AnsiUp from 'ansi_up';
14
+ import { AnsiUp } from 'ansi_up';
15
15
  import NoWorkerWithTagWarning from './runs/NoWorkerWithTagWarning.svelte';
16
16
  import { JobService } from '../gen';
17
17
  import Tooltip from './Tooltip.svelte';
18
18
  import { twMerge } from 'tailwind-merge';
19
- let { content, isLoading, duration = undefined, mem = undefined, wrapperClass = '', jobId = undefined, tag, small = false, drawerOpen = $bindable(false), noMaxH = false, noAutoScroll = false, download = true, customEmptyMessage = 'No logs are available yet', tagLabel = undefined, noPadding = false } = $props();
19
+ import QueuePosition from './QueuePosition.svelte';
20
+ let { content, isLoading, duration = undefined, mem = undefined, wrapperClass = '', jobId = undefined, tag, small = false, drawerOpen = $bindable(false), noMaxH = false, noAutoScroll = false, download = true, customEmptyMessage = 'No logs are available yet', tagLabel = undefined, noPadding = false, navigationId = undefined } = $props();
20
21
  // @ts-ignore
21
22
  const ansi_up = $state(new AnsiUp());
22
23
  ansi_up.use_classes = true;
@@ -157,78 +158,88 @@ let html = $derived(ansi_up.ansi_to_html(downloadStartUrl && prefixIndex != unde
157
158
  </DrawerContent>
158
159
  </Drawer>
159
160
 
160
- <div class="relative w-full h-full {wrapperClass}">
161
- <div
162
- bind:this={div}
163
- class="w-full h-full overflow-auto relative bg-surface-secondary {noMaxH ? '' : 'max-h-screen'}"
164
- >
165
- <div class="sticky z-10 top-0 right-0 w-full flex flex-row-reverse justify-between text-sm">
166
- <div class="flex gap-2 pl-0.5 bg-surface-secondary">
167
- {#if jobId && download}
168
- <div class="flex items-center">
169
- <a
170
- class="text-primary pb-0.5"
171
- target="_blank"
172
- href="{base}/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}"
173
- download="windmill_logs_{jobId}.txt"
174
- ><Download size="14" />
175
- </a>
176
- </div>
177
- {/if}
178
- <button onclick={logViewer.openDrawer}><Expand size="12" /></button>
179
- {#if !noAutoScroll}
180
- <div
181
- class="{small ? '' : 'py-2'} pr-2 {small
182
- ? '!text-2xs'
183
- : '!text-xs'} flex gap-2 text-tertiary items-center"
184
- >
185
- Auto scroll
186
- <input class="windmillapp" type="checkbox" bind:checked={scroll} />
187
- </div>
188
- {/if}
189
- </div>
190
- </div>
191
- {#if isLoading}
192
- <div class="flex gap-2 absolute top-2 left-2 items-center z-10">
193
- <Loader2 class="animate-spin" />
194
- {#if tag}
195
- <div class="flex flex-row items-center gap-1">
196
- <div class="text-secondary {small ? '!text-2xs' : '!text-xs'}"
197
- >{tagLabel ?? 'tag'}: {tag}</div
161
+ <div class="w-full h-full {wrapperClass}">
162
+ <div class="w-full h-full relative">
163
+ <div
164
+ bind:this={div}
165
+ class="w-full h-full overflow-auto bg-surface-secondary pt-4 {noMaxH ? '' : 'max-h-screen'}"
166
+ data-nav-id={navigationId}
167
+ >
168
+ <div class="absolute z-10 top-0 right-0 flex flex-row-reverse justify-between text-sm">
169
+ <div class="flex gap-2">
170
+ {#if jobId && download}
171
+ <div class="flex items-center">
172
+ <a
173
+ class="text-primary pb-0.5"
174
+ target="_blank"
175
+ href="{base}/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}"
176
+ download="windmill_logs_{jobId}.txt"
177
+ ><Download size="14" />
178
+ </a>
179
+ </div>
180
+ {/if}
181
+ <button onclick={logViewer.openDrawer}><Expand size="12" /></button>
182
+ {#if !noAutoScroll}
183
+ <div
184
+ class="{small ? '' : 'py-2'} pr-2 {small
185
+ ? '!text-2xs'
186
+ : '!text-xs'} flex gap-2 text-tertiary items-center"
198
187
  >
199
- <NoWorkerWithTagWarning {tagLabel} {tag} />
200
- </div>
201
- {/if}
188
+ Auto scroll
189
+ <input class="windmillapp" type="checkbox" bind:checked={scroll} />
190
+ </div>
191
+ {/if}
192
+ </div>
202
193
  </div>
203
- {:else if duration}
204
- <span
205
- class="absolute {small ? '!text-2xs' : '!text-xs'} text-tertiary dark:text-gray-400 {small
206
- ? 'top-0'
207
- : 'top-2'} left-2">took {duration}ms</span
208
- >
209
- {/if}
210
- {#if mem}
211
- <span
212
- class="absolute {small ? '!text-2xs' : '!text-xs'} text-tertiary dark:text-gray-400 {small
213
- ? 'top-0'
214
- : 'top-2'} left-36">mem peak: {(mem / 1024).toPrecision(4)}MB</span
194
+ {#if isLoading}
195
+ <div class="flex gap-2 absolute top-2 left-2 items-center z-10">
196
+ <Loader2 class="animate-spin" />
197
+ {#if tag}
198
+ <div class="flex flex-row items-center gap-1">
199
+ <div class="text-secondary {small ? '!text-2xs' : '!text-xs'}"
200
+ >{tagLabel ?? 'tag'}: {tag}</div
201
+ >
202
+ <NoWorkerWithTagWarning {tagLabel} {tag} />
203
+ </div>
204
+ {/if}
205
+ {#if jobId}
206
+ <QueuePosition {jobId} />
207
+ {/if}
208
+ </div>
209
+ {:else if duration}
210
+ <span
211
+ class={twMerge(
212
+ 'absolute text-tertiary dark:text-gray-400',
213
+ small ? '!text-2xs' : '!text-xs',
214
+ small ? 'top-0' : 'top-2',
215
+ noPadding ? '' : 'left-2'
216
+ )}>took {duration}ms</span
217
+ >
218
+ {/if}
219
+ {#if mem}
220
+ <span
221
+ class="absolute {small ? '!text-2xs' : '!text-xs'} text-tertiary dark:text-gray-400 {small
222
+ ? 'top-0'
223
+ : 'top-2'} left-36">mem peak: {(mem / 1024).toPrecision(4)}MB</span
224
+ >
225
+ {/if}
226
+ <pre
227
+ class={twMerge(
228
+ 'whitespace-pre break-words w-full',
229
+ small ? '!text-2xs' : '!text-xs',
230
+ noPadding ? '' : 'p-2'
231
+ )}
232
+ >{#if content}{@const len =
233
+ (content?.length ?? 0) +
234
+ (loadedFromObjectStore?.length ?? 0)}{#if downloadStartUrl}<button
235
+ onclick={getStoreLogs}
236
+ >Show more... &nbsp;<Tooltip>{tooltipText(prefixIndex)}</Tooltip></button
237
+ ><br />{:else if len > LOG_LIMIT}(truncated to the last {LOG_LIMIT} characters)<br
238
+ /><button onclick={() => showMoreTruncate(len)}>Show more..</button><br />{/if}<span
239
+ >{@html html}</span
240
+ >{:else if !isLoading}<span>{customEmptyMessage}</span>{/if}</pre
215
241
  >
216
- {/if}
217
- <pre
218
- class={twMerge(
219
- 'whitespace-pre break-words w-full',
220
- small ? '!text-2xs' : '!text-xs',
221
- noPadding ? '' : 'p-2'
222
- )}
223
- >{#if content}{@const len =
224
- (content?.length ?? 0) +
225
- (loadedFromObjectStore?.length ?? 0)}{#if downloadStartUrl}<button onclick={getStoreLogs}
226
- >Show more... &nbsp;<Tooltip>{tooltipText(prefixIndex)}</Tooltip></button
227
- ><br />{:else if len > LOG_LIMIT}(truncated to the last {LOG_LIMIT} characters)<br
228
- /><button onclick={() => showMoreTruncate(len)}>Show more..</button><br />{/if}<span
229
- >{@html html}</span
230
- >{:else if !isLoading}<span>{customEmptyMessage}</span>{/if}</pre
231
- >
242
+ </div>
232
243
  </div>
233
244
  </div>
234
245
 
@@ -435,4 +446,9 @@ let html = $derived(ansi_up.ansi_to_html(downloadStartUrl && prefixIndex != unde
435
446
  }
436
447
  :global(.dark) :global(.ansi-bright-white-bg) {
437
448
  background-color: rgb(229, 233, 240);
449
+ }
450
+
451
+ :global([data-nav-id]:focus-visible) {
452
+ outline: none;
453
+ outline-offset: 0;
438
454
  }</style>
@@ -14,6 +14,7 @@ interface Props {
14
14
  customEmptyMessage?: string;
15
15
  tagLabel?: string;
16
16
  noPadding?: boolean;
17
+ navigationId?: string;
17
18
  }
18
19
  declare const LogViewer: import("svelte").Component<Props, {
19
20
  scrollToBottom: () => void;
@@ -4,7 +4,7 @@ const lastMetaUsed = writable(undefined);
4
4
 
5
5
  <script lang="ts">import { pathToMeta } from '../common';
6
6
  import { localeConcatAnd, pluralize } from '../utils';
7
- import { AppService, FlowService, FolderService, ResourceService, ScheduleService, ScriptService, HttpTriggerService, VariableService, WebsocketTriggerService, KafkaTriggerService, PostgresTriggerService, NatsTriggerService, MqttTriggerService, SqsTriggerService, GcpTriggerService } from '../gen';
7
+ import { AppService, FlowService, FolderService, ResourceService, ScheduleService, ScriptService, HttpTriggerService, VariableService, WebsocketTriggerService, KafkaTriggerService, PostgresTriggerService, NatsTriggerService, MqttTriggerService, SqsTriggerService, GcpTriggerService, EmailTriggerService } from '../gen';
8
8
  import { superadmin, userStore, workspaceStore } from '../stores';
9
9
  import { createEventDispatcher, getContext, untrack } from 'svelte';
10
10
  import { writable } from 'svelte/store';
@@ -224,6 +224,12 @@ async function pathExists(path, kind) {
224
224
  path: path
225
225
  });
226
226
  }
227
+ else if (kind === 'email_trigger') {
228
+ return await EmailTriggerService.existsEmailTrigger({
229
+ workspace: $workspaceStore,
230
+ path: path
231
+ });
232
+ }
227
233
  else {
228
234
  return false;
229
235
  }
@@ -1,4 +1,4 @@
1
- type PathKind = 'resource' | 'script' | 'variable' | 'flow' | 'schedule' | 'app' | 'raw_app' | 'http_trigger' | 'websocket_trigger' | 'kafka_trigger' | 'postgres_trigger' | 'nats_trigger' | 'mqtt_trigger' | 'sqs_trigger' | 'gcp_trigger';
1
+ type PathKind = 'resource' | 'script' | 'variable' | 'flow' | 'schedule' | 'app' | 'raw_app' | 'http_trigger' | 'websocket_trigger' | 'kafka_trigger' | 'postgres_trigger' | 'nats_trigger' | 'mqtt_trigger' | 'sqs_trigger' | 'gcp_trigger' | 'email_trigger';
2
2
  interface Props {
3
3
  fullNamePlaceholder?: string | undefined;
4
4
  namePlaceholder?: string;