windmill-components 1.448.50 → 1.472.2

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 (533) hide show
  1. package/package/components/AddUser.svelte +52 -54
  2. package/package/components/ApiConnectForm.svelte +57 -45
  3. package/package/components/AppConnectInner.svelte +18 -8
  4. package/package/components/ArgInput.svelte +132 -83
  5. package/package/components/ArgInput.svelte.d.ts +12 -1
  6. package/package/components/ArrayTypeNarrowing.svelte +35 -30
  7. package/package/components/ArrayTypeNarrowing.svelte.d.ts +1 -0
  8. package/package/components/AssignableTags.svelte +10 -6
  9. package/package/components/AssignableTagsInner.svelte +1 -1
  10. package/package/components/Auth0Setting.svelte +103 -0
  11. package/package/components/Auth0Setting.svelte.d.ts +16 -0
  12. package/package/components/AuthSettings.svelte +7 -2
  13. package/package/components/AutoscalingConfigEditor.svelte +12 -17
  14. package/package/components/ChangeInstanceUsername.svelte +15 -13
  15. package/package/components/ChangeInstanceUsernameInner.svelte +4 -5
  16. package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +1 -0
  17. package/package/components/ConnectionSection.svelte +176 -0
  18. package/package/components/ConnectionSection.svelte.d.ts +28 -0
  19. package/package/components/ContentSearchInner.svelte +13 -3
  20. package/package/components/CronBuilder.svelte +12 -13
  21. package/package/components/CronBuilder.svelte.d.ts +1 -1
  22. package/package/components/CronInput.svelte +1 -1
  23. package/package/components/DBSchemaExplorer.svelte +18 -5
  24. package/package/components/DateTimeInput.svelte +3 -3
  25. package/package/components/DefaultTags.svelte +8 -8
  26. package/package/components/Dev.svelte +30 -8
  27. package/package/components/DisplayResult.svelte +132 -80
  28. package/package/components/DisplayResult.svelte.d.ts +2 -0
  29. package/package/components/DropdownV2.svelte +89 -16
  30. package/package/components/DropdownV2.svelte.d.ts +10 -27
  31. package/package/components/DropdownV2Inner.svelte +7 -4
  32. package/package/components/DropdownV2Inner.svelte.d.ts +4 -25
  33. package/package/components/DynSelect.svelte +6 -2
  34. package/package/components/EditableSchemaForm.svelte +48 -45
  35. package/package/components/EditableSchemaForm.svelte.d.ts +4 -1
  36. package/package/components/Editor.svelte +1 -1
  37. package/package/components/EditorBar.svelte +15 -13
  38. package/package/components/EditorBar.svelte.d.ts +1 -1
  39. package/package/components/EditorSettings.svelte +9 -7
  40. package/package/components/ErrorOrRecoveryHandler.svelte +195 -18
  41. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -2
  42. package/package/components/FlowBuilder.svelte +10 -31
  43. package/package/components/FlowBuilder.svelte.d.ts +3 -0
  44. package/package/components/FlowBuilderTutorials.svelte +34 -64
  45. package/package/components/FlowBuilderTutorials.svelte.d.ts +0 -1
  46. package/package/components/FlowHistoryJobPicker.svelte +48 -0
  47. package/package/components/FlowHistoryJobPicker.svelte.d.ts +21 -0
  48. package/package/components/FlowJobResult.svelte +6 -3
  49. package/package/components/FlowPreviewContent.svelte +264 -182
  50. package/package/components/FlowPreviewContent.svelte.d.ts +3 -0
  51. package/package/components/FlowStatusViewerInner.svelte +28 -7
  52. package/package/components/FlowStatusWaitingForEvents.svelte +2 -2
  53. package/package/components/FolderEditor.svelte +14 -7
  54. package/package/components/GroupEditor.svelte +4 -0
  55. package/package/components/HistoricInputs.svelte +51 -110
  56. package/package/components/HistoricInputs.svelte.d.ts +9 -3
  57. package/package/components/HistoricList.svelte +95 -0
  58. package/package/components/HistoricList.svelte.d.ts +24 -0
  59. package/package/components/IconedResourceType.svelte +4 -1
  60. package/package/components/InfiniteList.svelte +12 -6
  61. package/package/components/InputTransformForm.svelte +25 -5
  62. package/package/components/InstanceNameEditor.svelte +100 -103
  63. package/package/components/InstanceSetting.svelte +777 -607
  64. package/package/components/InstanceSettings.svelte +33 -36
  65. package/package/components/InviteUser.svelte +43 -43
  66. package/package/components/{apps/editor/settingsPanel/inputEditor/JsonEditor.svelte → JsonEditor.svelte} +1 -1
  67. package/package/components/{apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts → JsonEditor.svelte.d.ts} +1 -1
  68. package/package/components/JsonInputs.svelte +63 -0
  69. package/package/components/JsonInputs.svelte.d.ts +23 -0
  70. package/package/components/Label.svelte +6 -4
  71. package/package/components/Login.svelte +8 -2
  72. package/package/components/OAuthSetting.svelte +42 -15
  73. package/package/components/OAuthSetting.svelte.d.ts +1 -0
  74. package/package/components/ObjectResourceInput.svelte +6 -3
  75. package/package/components/ObjectResourceInput.svelte.d.ts +1 -1
  76. package/package/components/OktaSetting.svelte +9 -3
  77. package/package/components/PasswordArgInput.svelte +1 -1
  78. package/package/components/Path.svelte +16 -1
  79. package/package/components/Path.svelte.d.ts +1 -1
  80. package/package/components/ResourceEditor.svelte +6 -2
  81. package/package/components/ResourcePicker.svelte +3 -3
  82. package/package/components/ResourceTypePicker.svelte +10 -11
  83. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  84. package/package/components/RunForm.svelte +51 -47
  85. package/package/components/RunForm.svelte.d.ts +3 -0
  86. package/package/components/RunFormAdvancedPopup.svelte +2 -7
  87. package/package/components/RunFormAdvancedPopup.svelte.d.ts +0 -2
  88. package/package/components/RunPageSchedules.svelte +3 -2
  89. package/package/components/S3FilePicker.svelte +9 -1
  90. package/package/components/S3FilePicker.svelte.d.ts +1 -0
  91. package/package/components/S3ObjectPicker.svelte +13 -12
  92. package/package/components/S3ObjectPicker.svelte.d.ts +1 -1
  93. package/package/components/SavedInputsPicker.svelte +95 -56
  94. package/package/components/SavedInputsPicker.svelte.d.ts +10 -1
  95. package/package/components/SavedInputsV2.svelte +113 -0
  96. package/package/components/SavedInputsV2.svelte.d.ts +26 -0
  97. package/package/components/ScheduleEditorInner.svelte +40 -13
  98. package/package/components/SchemaForm.svelte +158 -191
  99. package/package/components/SchemaForm.svelte.d.ts +16 -3
  100. package/package/components/SchemaFormWithArgPicker.svelte +166 -0
  101. package/package/components/SchemaFormWithArgPicker.svelte.d.ts +29 -0
  102. package/package/components/ScriptBuilder.svelte +139 -71
  103. package/package/components/ScriptBuilder.svelte.d.ts +3 -0
  104. package/package/components/ScriptEditor.svelte +28 -2
  105. package/package/components/ScriptEditor.svelte.d.ts +2 -2
  106. package/package/components/ScriptPicker.svelte +6 -3
  107. package/package/components/ScriptSchema.svelte +2 -1
  108. package/package/components/ScriptSchema.svelte.d.ts +2 -0
  109. package/package/components/ScriptVersionHistory.svelte +9 -3
  110. package/package/components/Section.svelte +21 -9
  111. package/package/components/Section.svelte.d.ts +4 -0
  112. package/package/components/ShareModal.svelte +10 -5
  113. package/package/components/ShareModal.svelte.d.ts +2 -2
  114. package/package/components/SharedBadge.svelte +3 -3
  115. package/package/components/StringTypeNarrowing.svelte +10 -1
  116. package/package/components/SuperadminSettings.svelte +9 -2
  117. package/package/components/TestJobLoader.svelte +1 -1
  118. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  119. package/package/components/TimelineBar.svelte.d.ts +1 -1
  120. package/package/components/ToggleHubWorkspace.svelte +3 -3
  121. package/package/components/ToggleHubWorkspaceQuick.svelte +4 -4
  122. package/package/components/Tooltip.svelte +36 -30
  123. package/package/components/VariableEditor.svelte +27 -20
  124. package/package/components/WorkerGroup.svelte +12 -3
  125. package/package/components/apps/components/buttons/AppButton.svelte +22 -2
  126. package/package/components/apps/components/buttons/AppFormButton.svelte +74 -70
  127. package/package/components/apps/components/buttons/AppSchemaForm.svelte +4 -2
  128. package/package/components/apps/components/display/AppAccordionList.svelte +149 -0
  129. package/package/components/apps/components/display/AppAccordionList.svelte.d.ts +25 -0
  130. package/package/components/apps/components/display/AppCarouselList.svelte +114 -106
  131. package/package/components/apps/components/display/AppCustomComponent.svelte +13 -13
  132. package/package/components/apps/components/display/AppDisplayComponent.svelte +2 -1
  133. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +3 -1
  134. package/package/components/apps/components/display/AppHtml.svelte +28 -22
  135. package/package/components/apps/components/display/AppMarkdown.svelte +98 -31
  136. package/package/components/apps/components/display/AppMenu.svelte +77 -66
  137. package/package/components/apps/components/display/AppMenu.svelte.d.ts +0 -3
  138. package/package/components/apps/components/display/AppRecomputeAll.svelte +12 -1
  139. package/package/components/apps/components/display/AppText.svelte +8 -3
  140. package/package/components/apps/components/display/PlotlyHtml.svelte +16 -12
  141. package/package/components/apps/components/display/PlotlyHtmlV2.svelte +16 -12
  142. package/package/components/apps/components/display/VegaLiteHtml.svelte +9 -5
  143. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
  144. package/package/components/apps/components/display/dbtable/InsertRow.svelte +4 -4
  145. package/package/components/apps/components/display/dbtable/utils.js +19 -1
  146. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +6 -0
  147. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +4 -0
  148. package/package/components/apps/components/display/table/AppAggridTable.svelte +1 -1
  149. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +27 -19
  150. package/package/components/apps/components/display/table/AppTable.svelte +19 -15
  151. package/package/components/apps/components/helpers/InitializeComponent.svelte +1 -0
  152. package/package/components/apps/components/helpers/InputValue.svelte +4 -3
  153. package/package/components/apps/components/helpers/NonRunnableComponent.svelte +0 -2
  154. package/package/components/apps/components/helpers/RunnableComponent.svelte +16 -4
  155. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -0
  156. package/package/components/apps/components/helpers/RunnableWrapper.svelte +32 -3
  157. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  158. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -0
  159. package/package/components/apps/components/layout/AppConditionalWrapper.svelte +29 -21
  160. package/package/components/apps/components/layout/AppContainer.svelte +28 -20
  161. package/package/components/apps/components/layout/AppDecisionTree.svelte +59 -49
  162. package/package/components/apps/components/layout/AppDrawer.svelte +94 -87
  163. package/package/components/apps/components/layout/AppList.svelte +70 -62
  164. package/package/components/apps/components/layout/AppModal.svelte +83 -79
  165. package/package/components/apps/components/layout/AppSplitpanes.svelte +51 -43
  166. package/package/components/apps/components/layout/AppStepper.svelte +97 -83
  167. package/package/components/apps/components/layout/AppTabs.svelte +128 -74
  168. package/package/components/apps/editor/AppEditor.svelte +21 -3
  169. package/package/components/apps/editor/AppEditor.svelte.d.ts +24 -1
  170. package/package/components/apps/editor/AppEditorHeader.svelte +73 -61
  171. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +24 -1
  172. package/package/components/apps/editor/AppEditorTutorial.svelte +53 -60
  173. package/package/components/apps/editor/AppJsonEditor.svelte +1 -1
  174. package/package/components/apps/editor/AppPreview.svelte +5 -5
  175. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -0
  176. package/package/components/apps/editor/ComponentHeader.svelte +44 -20
  177. package/package/components/apps/editor/ComponentHeader.svelte.d.ts +1 -0
  178. package/package/components/apps/editor/DecisionTreeDebug.svelte +56 -73
  179. package/package/components/apps/editor/GridEditor.svelte +7 -4
  180. package/package/components/apps/editor/GridViewer.svelte +19 -7
  181. package/package/components/apps/editor/GridViewer.svelte.d.ts +1 -3
  182. package/package/components/apps/editor/PreviewToggle.svelte +3 -0
  183. package/package/components/apps/editor/RecomputeAllButton.svelte +7 -40
  184. package/package/components/apps/editor/RecomputeAllComponents.svelte +52 -19
  185. package/package/components/apps/editor/RecomputeAllWrapper.svelte +1 -10
  186. package/package/components/apps/editor/SubGridEditor.svelte +147 -145
  187. package/package/components/apps/editor/TabsDebug.svelte +43 -56
  188. package/package/components/apps/editor/component/Component.svelte +26 -926
  189. package/package/components/apps/editor/component/Component.svelte.d.ts +2 -3
  190. package/package/components/apps/editor/component/ComponentInner.svelte +775 -0
  191. package/package/components/apps/editor/component/ComponentInner.svelte.d.ts +22 -0
  192. package/package/components/apps/editor/component/ComponentRendered.svelte +195 -0
  193. package/package/components/apps/editor/component/ComponentRendered.svelte.d.ts +28 -0
  194. package/package/components/apps/editor/component/components.d.ts +154 -83
  195. package/package/components/apps/editor/component/components.js +59 -5
  196. package/package/components/apps/editor/component/sets.js +2 -1
  197. package/package/components/apps/editor/componentsPanel/CssProperty.svelte +8 -4
  198. package/package/components/apps/editor/componentsPanel/CustomComponentRow.svelte +12 -22
  199. package/package/components/apps/editor/componentsPanel/CustomComponentRow.svelte.d.ts +0 -1
  200. package/package/components/apps/editor/componentsPanel/CustomComponentsList.svelte +0 -2
  201. package/package/components/apps/editor/componentsPanel/GroupRow.svelte +12 -22
  202. package/package/components/apps/editor/componentsPanel/GroupRow.svelte.d.ts +0 -1
  203. package/package/components/apps/editor/componentsPanel/NameEditor.svelte +21 -20
  204. package/package/components/apps/editor/componentsPanel/ThemeNameEditor.svelte +9 -9
  205. package/package/components/apps/editor/componentsPanel/ThemeRow.svelte +32 -52
  206. package/package/components/apps/editor/componentsPanel/ThemeRow.svelte.d.ts +0 -1
  207. package/package/components/apps/editor/componentsPanel/cssUtils.js +7 -0
  208. package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +3 -0
  209. package/package/components/apps/editor/contextPanel/LazyModePanel.svelte +46 -0
  210. package/package/components/apps/editor/contextPanel/LazyModePanel.svelte.d.ts +14 -0
  211. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +19 -13
  212. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +10 -7
  213. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +11 -7
  214. package/package/components/apps/editor/inlineScriptsPanel/RunButton.svelte +2 -2
  215. package/package/components/apps/editor/settingsPanel/AlignmentEditor.svelte +8 -6
  216. package/package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +7 -0
  217. package/package/components/apps/editor/settingsPanel/ComponentPanelDataSource.svelte +5 -2
  218. package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +1 -1
  219. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +17 -7
  220. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte.d.ts +3 -0
  221. package/package/components/apps/editor/settingsPanel/TableActions.svelte +10 -1
  222. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +53 -51
  223. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte.d.ts +0 -1
  224. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +1 -1
  225. package/package/components/apps/rx.d.ts +3 -3
  226. package/package/components/apps/rx.js +5 -5
  227. package/package/components/apps/svelte-grid/Grid.svelte +121 -99
  228. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +0 -1
  229. package/package/components/apps/svelte-grid/MoveResize.svelte +2 -1
  230. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
  231. package/package/components/apps/svelte-select/lib/Select.svelte.d.ts +8 -8
  232. package/package/components/apps/types.d.ts +2 -0
  233. package/package/components/apps/utils.js +1 -1
  234. package/package/components/auditLogs/AuditLogMobileFilters.svelte +7 -6
  235. package/package/components/auditLogs/AuditLogsFilters.svelte +75 -37
  236. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +2 -0
  237. package/package/components/auditLogs/AuditLogsTable.svelte +2 -1
  238. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  239. package/package/components/common/alert/Alert.svelte +2 -27
  240. package/package/components/common/alert/Alert.svelte.d.ts +1 -1
  241. package/package/components/common/alert/model.d.ts +1 -0
  242. package/package/components/common/alert/model.js +26 -1
  243. package/package/components/common/button/Button.svelte +25 -39
  244. package/package/components/common/button/Button.svelte.d.ts +0 -1
  245. package/package/components/common/calendarPicker/CalendarPicker.svelte +30 -25
  246. package/package/components/common/confirmationModal/UnsavedConfirmationModal.svelte +12 -10
  247. package/package/components/common/confirmationModal/UnsavedConfirmationModal.svelte.d.ts +2 -3
  248. package/package/components/common/confirmationModal/unsavedTypes.d.ts +6 -0
  249. package/package/components/common/confirmationModal/unsavedTypes.js +1 -0
  250. package/package/components/common/drawer/Disposable.svelte +3 -1
  251. package/package/components/common/drawer/Disposable.svelte.d.ts +1 -0
  252. package/package/components/common/drawer/Drawer.svelte +2 -0
  253. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  254. package/package/components/common/fileInput/FileInput.svelte +63 -20
  255. package/package/components/common/fileInput/FileInput.svelte.d.ts +4 -1
  256. package/package/components/common/fileUpload/FileUpload.svelte +102 -20
  257. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +7 -0
  258. package/package/components/common/index.d.ts +0 -1
  259. package/package/components/common/index.js +0 -1
  260. package/package/components/common/layout/List.svelte.d.ts +1 -1
  261. package/package/components/common/toggleButton-v2/ToggleButton.svelte +42 -39
  262. package/package/components/common/toggleButton-v2/ToggleButton.svelte.d.ts +3 -1
  263. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +28 -29
  264. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +23 -7
  265. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +17 -18
  266. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +2 -1
  267. package/package/components/common/waitTimeWarning/WaitTimeWarning.svelte.d.ts +1 -1
  268. package/package/components/copilot/CodeCompletionStatus.svelte +1 -1
  269. package/package/components/copilot/CronGen.svelte +50 -50
  270. package/package/components/copilot/FlowCopilotDrawer.svelte +3 -2
  271. package/package/components/copilot/FlowCopilotStatus.svelte +16 -19
  272. package/package/components/copilot/PredicateGen.svelte +9 -10
  273. package/package/components/copilot/RegexGen.svelte +67 -66
  274. package/package/components/copilot/ScriptFix.svelte +122 -105
  275. package/package/components/copilot/ScriptGen.svelte +177 -135
  276. package/package/components/copilot/StepInputsGen.svelte +31 -28
  277. package/package/components/copilot/{TestAiKey.svelte → TestAIKey.svelte} +13 -2
  278. package/package/components/copilot/{TestAiKey.svelte.d.ts → TestAIKey.svelte.d.ts} +4 -2
  279. package/package/components/copilot/completion.d.ts +2 -2
  280. package/package/components/copilot/completion.js +1 -1
  281. package/package/components/copilot/flow.d.ts +3 -4
  282. package/package/components/copilot/flow.js +1 -1
  283. package/package/components/copilot/lib.d.ts +46 -54
  284. package/package/components/copilot/lib.js +278 -209
  285. package/package/components/copilot/prompts/edit.yaml +19 -0
  286. package/package/components/copilot/prompts/editPrompt.d.ts +3 -0
  287. package/package/components/copilot/prompts/editPrompt.js +3 -0
  288. package/package/components/copilot/prompts/fix.yaml +19 -0
  289. package/package/components/copilot/prompts/fixPrompt.d.ts +3 -0
  290. package/package/components/copilot/prompts/fixPrompt.js +3 -0
  291. package/package/components/copilot/prompts/gen.yaml +12 -0
  292. package/package/components/copilot/prompts/genPrompt.d.ts +3 -0
  293. package/package/components/copilot/prompts/genPrompt.js +3 -0
  294. package/package/components/custom_ui.d.ts +37 -0
  295. package/package/components/details/DetailPageDetailPanel.svelte +3 -1
  296. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +7 -1
  297. package/package/components/details/DetailPageHeader.svelte +12 -27
  298. package/package/components/details/DetailPageLayout.svelte +4 -0
  299. package/package/components/details/DetailPageLayout.svelte.d.ts +6 -0
  300. package/package/components/details/DetailPageTriggerPanel.svelte +20 -8
  301. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +4 -2
  302. package/package/components/details/EmailTriggerConfigSection.svelte +3 -3
  303. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +3 -1
  304. package/package/components/details/EmailTriggerPanel.svelte +1 -0
  305. package/package/components/flows/content/FlowInput.svelte +35 -44
  306. package/package/components/flows/content/FlowInputs.svelte +4 -1
  307. package/package/components/flows/content/FlowModuleComponent.svelte +10 -5
  308. package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -1
  309. package/package/components/flows/content/FlowModuleMock.svelte +1 -1
  310. package/package/components/flows/content/FlowModuleSuspend.svelte +15 -2
  311. package/package/components/flows/content/FlowRetries.svelte +4 -3
  312. package/package/components/flows/content/ScriptEditorDrawer.svelte +0 -1
  313. package/package/components/flows/flowStateUtils.js +1 -1
  314. package/package/components/flows/flowStore.d.ts +1 -1
  315. package/package/components/flows/header/FlowPreviewButtons.svelte +25 -16
  316. package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +1 -0
  317. package/package/components/flows/map/FlowJobsMenu.svelte +60 -47
  318. package/package/components/flows/previousResults.js +1 -1
  319. package/package/components/flows/propPicker/FlowPropPicker.svelte +28 -25
  320. package/package/components/flows/propPicker/PropPickerWrapper.svelte +1 -0
  321. package/package/components/flows/scheduleUtils.d.ts +2 -2
  322. package/package/components/flows/scheduleUtils.js +17 -13
  323. package/package/components/graph/FlowGraphV2.svelte +3 -2
  324. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +9 -4
  325. package/package/components/graph/renderers/triggers/TriggersBadge.svelte.d.ts +1 -1
  326. package/package/components/home/FlowIcon.svelte +4 -1
  327. package/package/components/home/FlowIcon.svelte.d.ts +1 -0
  328. package/package/components/home/ItemsList.svelte +32 -24
  329. package/package/components/icons/Auth0Icon.svelte +17 -0
  330. package/package/components/icons/Auth0Icon.svelte.d.ts +23 -0
  331. package/package/components/icons/AwsIcon.svelte +25 -6
  332. package/package/components/icons/AwsIcon.svelte.d.ts +3 -2
  333. package/package/components/icons/brands/Auth0.svelte +24 -0
  334. package/package/components/icons/brands/Auth0.svelte.d.ts +18 -0
  335. package/package/components/icons/index.d.ts +3 -1
  336. package/package/components/icons/index.js +3 -1
  337. package/package/components/instanceSettings.d.ts +5 -0
  338. package/package/components/instanceSettings.js +34 -3
  339. package/package/components/meltComponents/MeltButton.svelte +10 -0
  340. package/package/components/meltComponents/MeltButton.svelte.d.ts +23 -0
  341. package/package/components/meltComponents/Menu.svelte +70 -0
  342. package/package/components/meltComponents/Menu.svelte.d.ts +51 -0
  343. package/package/components/meltComponents/MenuItem.svelte +42 -0
  344. package/package/components/meltComponents/MenuItem.svelte.d.ts +27 -0
  345. package/package/components/meltComponents/MenuSingleItem.svelte +12 -0
  346. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +36 -0
  347. package/package/components/meltComponents/Menubar.svelte +7 -0
  348. package/package/components/meltComponents/Menubar.svelte.d.ts +255 -0
  349. package/package/components/meltComponents/Popover.svelte +78 -24
  350. package/package/components/meltComponents/Popover.svelte.d.ts +23 -4
  351. package/package/components/meltComponents/SideBarTab.svelte +18 -6
  352. package/package/components/meltComponents/SideBarTab.svelte.d.ts +2 -0
  353. package/package/components/meltComponents/Tooltip.svelte +66 -0
  354. package/package/components/meltComponents/Tooltip.svelte.d.ts +29 -0
  355. package/package/components/meltComponents/index.d.ts +5 -0
  356. package/package/components/meltComponents/index.js +5 -0
  357. package/package/components/preview/FlowPreviewStatus.svelte +2 -1
  358. package/package/components/propertyPicker/ObjectViewer.svelte +15 -3
  359. package/package/components/propertyPicker/PropPicker.svelte +0 -1
  360. package/package/components/runs/JobLoader.svelte +18 -18
  361. package/package/components/runs/JobLoader.svelte.d.ts +1 -1
  362. package/package/components/runs/MobileFilters.svelte +12 -11
  363. package/package/components/runs/PreprocessedArgsDisplay.svelte +2 -3
  364. package/package/components/runs/PreprocessedArgsDisplay.svelte.d.ts +1 -1
  365. package/package/components/runs/RunsFilter.svelte +350 -320
  366. package/package/components/schema/AddPropertyFormV2.svelte +7 -7
  367. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +3 -1
  368. package/package/components/schema/EditableSchemaDrawer.svelte +0 -1
  369. package/package/components/schema/EditableSchemaWrapper.svelte +1 -2
  370. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +0 -1
  371. package/package/components/schema/FlowPropertyEditor.svelte +51 -67
  372. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +0 -1
  373. package/package/components/schema/InputSelectedBadge.svelte +28 -0
  374. package/package/components/schema/InputSelectedBadge.svelte.d.ts +18 -0
  375. package/package/components/schema/PropertyEditor.svelte +7 -3
  376. package/package/components/schema/SchemaFormDND.svelte +4 -2
  377. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -1
  378. package/package/components/schema/SchemaPickerRow.svelte +11 -3
  379. package/package/components/schema/SchemaPickerRow.svelte.d.ts +1 -1
  380. package/package/components/scriptEditor/LogPanel.svelte +8 -2
  381. package/package/components/scriptEditor/LogPanel.svelte.d.ts +2 -0
  382. package/package/components/settings/ChangeWorkspaceId.svelte +24 -12
  383. package/package/components/settings/PremiumInfo.svelte +4 -4
  384. package/package/components/settings/WorkspaceOperatorSettings.svelte +159 -0
  385. package/package/components/settings/WorkspaceOperatorSettings.svelte.d.ts +14 -0
  386. package/package/components/settings/WorkspaceUserSettings.svelte +108 -96
  387. package/package/components/sidebar/CriticalAlertModal.svelte +66 -60
  388. package/package/components/sidebar/FavoriteMenu.svelte +30 -21
  389. package/package/components/sidebar/FavoriteMenu.svelte.d.ts +2 -0
  390. package/package/components/sidebar/MenuButton.svelte +20 -5
  391. package/package/components/sidebar/MenuButton.svelte.d.ts +3 -0
  392. package/package/components/sidebar/MenuLink.svelte +8 -5
  393. package/package/components/sidebar/MenuLink.svelte.d.ts +2 -0
  394. package/package/components/sidebar/OperatorMenu.svelte +219 -126
  395. package/package/components/sidebar/SidebarContent.svelte +107 -127
  396. package/package/components/sidebar/SidebarContent.svelte.d.ts +0 -1
  397. package/package/components/sidebar/UserMenu.svelte +91 -111
  398. package/package/components/sidebar/UserMenu.svelte.d.ts +2 -0
  399. package/package/components/sidebar/WorkspaceMenu.svelte +59 -54
  400. package/package/components/sidebar/WorkspaceMenu.svelte.d.ts +2 -0
  401. package/package/components/sidebar/changelogs.js +55 -0
  402. package/package/components/table/DataTable.svelte +6 -14
  403. package/package/components/table/DataTable.svelte.d.ts +1 -0
  404. package/package/components/triggers/CaptureButton.svelte +51 -68
  405. package/package/components/triggers/CaptureSection.svelte +5 -2
  406. package/package/components/triggers/CaptureSection.svelte.d.ts +3 -1
  407. package/package/components/triggers/CaptureTable.svelte +61 -23
  408. package/package/components/triggers/CaptureWrapper.svelte +87 -46
  409. package/package/components/triggers/CaptureWrapper.svelte.d.ts +8 -4
  410. package/package/components/triggers/TestTriggerConnection.svelte +82 -0
  411. package/package/components/triggers/TestTriggerConnection.svelte.d.ts +21 -0
  412. package/package/components/triggers/TriggersEditor.svelte +46 -14
  413. package/package/components/triggers/TriggersEditorSection.svelte +53 -46
  414. package/package/components/triggers/TriggersEditorSection.svelte.d.ts +3 -0
  415. package/package/components/triggers/TriggersWrapper.svelte +26 -8
  416. package/package/components/triggers/{RouteEditorConfigSection.svelte → http/RouteEditorConfigSection.svelte} +57 -57
  417. package/package/components/triggers/{RouteEditorConfigSection.svelte.d.ts → http/RouteEditorConfigSection.svelte.d.ts} +8 -9
  418. package/package/components/triggers/{RouteEditorInner.svelte → http/RouteEditorInner.svelte} +190 -147
  419. package/package/components/triggers/{RoutesPanel.svelte → http/RoutesPanel.svelte} +44 -47
  420. package/package/components/triggers/{KafkaTriggerEditorInner.svelte → kafka/KafkaTriggerEditorInner.svelte} +23 -23
  421. package/package/components/triggers/{KafkaTriggersConfigSection.svelte → kafka/KafkaTriggersConfigSection.svelte} +29 -17
  422. package/package/components/triggers/{KafkaTriggersConfigSection.svelte.d.ts → kafka/KafkaTriggersConfigSection.svelte.d.ts} +5 -3
  423. package/package/components/triggers/{KafkaTriggersPanel.svelte → kafka/KafkaTriggersPanel.svelte} +40 -45
  424. package/package/components/triggers/{NatsTriggerEditorInner.svelte → nats/NatsTriggerEditorInner.svelte} +19 -20
  425. package/package/components/triggers/{NatsTriggersConfigSection.svelte → nats/NatsTriggersConfigSection.svelte} +25 -18
  426. package/package/components/triggers/{NatsTriggersConfigSection.svelte.d.ts → nats/NatsTriggersConfigSection.svelte.d.ts} +5 -3
  427. package/package/components/triggers/{NatsTriggersPanel.svelte → nats/NatsTriggersPanel.svelte} +41 -44
  428. package/package/components/triggers/postgres/CheckPostgresRequirement.svelte +71 -0
  429. package/package/components/triggers/postgres/CheckPostgresRequirement.svelte.d.ts +18 -0
  430. package/package/components/triggers/postgres/PostgresEditorConfigSection.svelte +152 -0
  431. package/package/components/triggers/postgres/PostgresEditorConfigSection.svelte.d.ts +40 -0
  432. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte +19 -0
  433. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +21 -0
  434. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +578 -0
  435. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte.d.ts +21 -0
  436. package/package/components/triggers/postgres/PostgresTriggersPanel.svelte +112 -0
  437. package/package/components/triggers/postgres/PostgresTriggersPanel.svelte.d.ts +28 -0
  438. package/package/components/triggers/postgres/PublicationPicker.svelte +129 -0
  439. package/package/components/triggers/postgres/PublicationPicker.svelte.d.ts +23 -0
  440. package/package/components/triggers/postgres/RelationPicker.svelte +266 -0
  441. package/package/components/triggers/postgres/RelationPicker.svelte.d.ts +19 -0
  442. package/package/components/triggers/postgres/SlotPicker.svelte +92 -0
  443. package/package/components/triggers/postgres/SlotPicker.svelte.d.ts +18 -0
  444. package/package/components/triggers/postgres/utils.d.ts +5 -0
  445. package/package/components/triggers/postgres/utils.js +80 -0
  446. package/package/components/triggers/{ScheduledPollPanel.svelte → scheduled/ScheduledPollPanel.svelte} +3 -3
  447. package/package/components/triggers/sqs/SqsTriggerEditor.svelte +19 -0
  448. package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +21 -0
  449. package/package/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte +152 -0
  450. package/package/components/triggers/sqs/SqsTriggerEditorConfigSection.svelte.d.ts +40 -0
  451. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +234 -0
  452. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte.d.ts +21 -0
  453. package/package/components/triggers/sqs/SqsTriggerPanel.svelte +123 -0
  454. package/package/components/triggers/sqs/SqsTriggerPanel.svelte.d.ts +28 -0
  455. package/package/components/triggers/{WebhooksConfigSection.svelte → webhook/WebhooksConfigSection.svelte} +26 -21
  456. package/package/components/triggers/{WebhooksConfigSection.svelte.d.ts → webhook/WebhooksConfigSection.svelte.d.ts} +6 -4
  457. package/package/components/triggers/{WebhooksPanel.svelte → webhook/WebhooksPanel.svelte} +5 -4
  458. package/package/components/triggers/{WebsocketEditorConfigSection.svelte → websocket/WebsocketEditorConfigSection.svelte} +42 -34
  459. package/package/components/triggers/{WebsocketEditorConfigSection.svelte.d.ts → websocket/WebsocketEditorConfigSection.svelte.d.ts} +5 -3
  460. package/package/components/triggers/{WebsocketTriggerEditorInner.svelte → websocket/WebsocketTriggerEditorInner.svelte} +62 -43
  461. package/package/components/triggers/{WebsocketTriggersPanel.svelte → websocket/WebsocketTriggersPanel.svelte} +45 -49
  462. package/package/components/triggers.d.ts +1 -1
  463. package/package/components/triggers.js +4 -0
  464. package/package/components/tutorials/FlowBuilderTutorialErrorHandler.svelte +1 -1
  465. package/package/components/wizards/AgChartWizard.svelte +26 -24
  466. package/package/components/wizards/AgGridWizard.svelte +166 -161
  467. package/package/components/wizards/ChartJSWizard.svelte +32 -30
  468. package/package/components/wizards/DBExplorerWizard.svelte +21 -12
  469. package/package/components/wizards/NavbarWizard.svelte +108 -107
  470. package/package/components/wizards/PlotlyWizard.svelte +84 -75
  471. package/package/components/wizards/TableActionsWizard.svelte +69 -66
  472. package/package/components/wizards/TableColumnWizard.svelte +52 -47
  473. package/package/gen/core/OpenAPI.js +1 -1
  474. package/package/gen/schemas.gen.d.ts +456 -111
  475. package/package/gen/schemas.gen.js +470 -112
  476. package/package/gen/services.gen.d.ts +429 -2
  477. package/package/gen/services.gen.js +890 -17
  478. package/package/gen/types.gen.d.ts +1491 -158
  479. package/package/hub.d.ts +3 -0
  480. package/package/hubPaths.json +5 -1
  481. package/package/inferArgSig.js +11 -4
  482. package/package/script_helpers.d.ts +5 -3
  483. package/package/script_helpers.js +138 -98
  484. package/package/scripts.d.ts +1 -1
  485. package/package/stores.d.ts +6 -3
  486. package/package/stores.js +5 -3
  487. package/package/utils.d.ts +15 -0
  488. package/package/utils.js +17 -3
  489. package/package/zIndexes.d.ts +2 -0
  490. package/package/zIndexes.js +3 -1
  491. package/package.json +5 -5
  492. package/package/components/CapturesInputs.svelte +0 -16
  493. package/package/components/CapturesInputs.svelte.d.ts +0 -21
  494. package/package/components/LightweightArgInput.svelte +0 -622
  495. package/package/components/LightweightArgInput.svelte.d.ts +0 -70
  496. package/package/components/LightweightObjectResourceInput.svelte +0 -40
  497. package/package/components/LightweightObjectResourceInput.svelte.d.ts +0 -19
  498. package/package/components/LightweightSchemaForm.svelte +0 -100
  499. package/package/components/LightweightSchemaForm.svelte.d.ts +0 -43
  500. package/package/components/common/button/ButtonDropdown.svelte +0 -61
  501. package/package/components/common/button/ButtonDropdown.svelte.d.ts +0 -22
  502. package/package/components/common/menu/MenuV2.svelte +0 -51
  503. package/package/components/common/menu/MenuV2.svelte.d.ts +0 -26
  504. package/package/components/common/popup/Popup.svelte +0 -66
  505. package/package/components/common/popup/Popup.svelte.d.ts +0 -35
  506. package/package/components/common/toggleButton-v2/ToggleEnable.svelte +0 -34
  507. package/package/components/common/toggleButton-v2/ToggleEnable.svelte.d.ts +0 -23
  508. package/package/components/details/Menu.svelte +0 -58
  509. package/package/components/details/Menu.svelte.d.ts +0 -16
  510. package/package/components/flows/map/FlowCopilotButton.svelte +0 -54
  511. package/package/components/flows/map/FlowCopilotButton.svelte.d.ts +0 -16
  512. package/package/components/meltComponents/ButtonDropDown.svelte +0 -32
  513. package/package/components/meltComponents/ButtonDropDown.svelte.d.ts +0 -27
  514. package/package/components/tutorials/TutorialItem.svelte +0 -27
  515. package/package/components/tutorials/TutorialItem.svelte.d.ts +0 -22
  516. /package/package/components/triggers/{RouteEditor.svelte → http/RouteEditor.svelte} +0 -0
  517. /package/package/components/triggers/{RouteEditor.svelte.d.ts → http/RouteEditor.svelte.d.ts} +0 -0
  518. /package/package/components/triggers/{RouteEditorInner.svelte.d.ts → http/RouteEditorInner.svelte.d.ts} +0 -0
  519. /package/package/components/triggers/{RoutesPanel.svelte.d.ts → http/RoutesPanel.svelte.d.ts} +0 -0
  520. /package/package/components/triggers/{KafkaTriggerEditor.svelte → kafka/KafkaTriggerEditor.svelte} +0 -0
  521. /package/package/components/triggers/{KafkaTriggerEditor.svelte.d.ts → kafka/KafkaTriggerEditor.svelte.d.ts} +0 -0
  522. /package/package/components/triggers/{KafkaTriggerEditorInner.svelte.d.ts → kafka/KafkaTriggerEditorInner.svelte.d.ts} +0 -0
  523. /package/package/components/triggers/{KafkaTriggersPanel.svelte.d.ts → kafka/KafkaTriggersPanel.svelte.d.ts} +0 -0
  524. /package/package/components/triggers/{NatsTriggerEditor.svelte → nats/NatsTriggerEditor.svelte} +0 -0
  525. /package/package/components/triggers/{NatsTriggerEditor.svelte.d.ts → nats/NatsTriggerEditor.svelte.d.ts} +0 -0
  526. /package/package/components/triggers/{NatsTriggerEditorInner.svelte.d.ts → nats/NatsTriggerEditorInner.svelte.d.ts} +0 -0
  527. /package/package/components/triggers/{NatsTriggersPanel.svelte.d.ts → nats/NatsTriggersPanel.svelte.d.ts} +0 -0
  528. /package/package/components/triggers/{ScheduledPollPanel.svelte.d.ts → scheduled/ScheduledPollPanel.svelte.d.ts} +0 -0
  529. /package/package/components/triggers/{WebhooksPanel.svelte.d.ts → webhook/WebhooksPanel.svelte.d.ts} +0 -0
  530. /package/package/components/triggers/{WebsocketTriggerEditor.svelte → websocket/WebsocketTriggerEditor.svelte} +0 -0
  531. /package/package/components/triggers/{WebsocketTriggerEditor.svelte.d.ts → websocket/WebsocketTriggerEditor.svelte.d.ts} +0 -0
  532. /package/package/components/triggers/{WebsocketTriggerEditorInner.svelte.d.ts → websocket/WebsocketTriggerEditorInner.svelte.d.ts} +0 -0
  533. /package/package/components/triggers/{WebsocketTriggersPanel.svelte.d.ts → websocket/WebsocketTriggersPanel.svelte.d.ts} +0 -0
@@ -1,11 +1,11 @@
1
1
  <script>import { isCloudHosted } from '../cloud';
2
2
  import { enterpriseLicense, isCriticalAlertsUIOpen } from '../stores';
3
- import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, Slack, X } from 'lucide-svelte';
3
+ import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, RefreshCcw, Slack, X } from 'lucide-svelte';
4
4
  import Tooltip from './Tooltip.svelte';
5
5
  import ObjectStoreConfigSettings from './ObjectStoreConfigSettings.svelte';
6
6
  import { sendUserToast } from '../toast';
7
7
  import ConfirmButton from './ConfirmButton.svelte';
8
- import { IndexSearchService, SettingService } from '../gen';
8
+ import { IndexSearchService, SettingService, TeamsService } from '../gen';
9
9
  import { Button, SecondsInput, Skeleton } from './common';
10
10
  import Password from './Password.svelte';
11
11
  import { classNames } from '../utils';
@@ -14,13 +14,19 @@ import Toggle from './Toggle.svelte';
14
14
  import { createEventDispatcher } from 'svelte';
15
15
  import { fade } from 'svelte/transition';
16
16
  import { base } from '../base';
17
+ import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
18
+ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
17
19
  import SimpleEditor from './SimpleEditor.svelte';
18
20
  export let setting;
19
21
  export let version;
20
22
  export let values;
21
23
  export let loading = true;
22
24
  const dispatch = createEventDispatcher();
25
+ if (setting.fieldType == 'select' && $values[setting.key] == undefined) {
26
+ $values[setting.key] = 'default';
27
+ }
23
28
  let latestKeyRenewalAttempt;
29
+ let isFetching = false;
24
30
  function showSetting(setting, values) {
25
31
  if (setting == 'dev_instance') {
26
32
  if (values['license_key'] == undefined) {
@@ -32,6 +38,7 @@ function showSetting(setting, values) {
32
38
  let licenseKeyChanged = false;
33
39
  let renewing = false;
34
40
  let opening = false;
41
+ let to = '';
35
42
  async function reloadKeyrenewalAttemptInfo() {
36
43
  latestKeyRenewalAttempt = await SettingService.getLatestKeyRenewalAttempt();
37
44
  }
@@ -87,8 +94,50 @@ function parseLicenseKey(key) {
87
94
  valid: false
88
95
  };
89
96
  }
97
+ async function fetchTeams() {
98
+ if (isFetching)
99
+ return;
100
+ isFetching = true;
101
+ try {
102
+ $values['teams'] = await TeamsService.syncTeams();
103
+ }
104
+ catch (error) {
105
+ console.error('Error fetching teams:', error);
106
+ }
107
+ finally {
108
+ isFetching = false;
109
+ }
110
+ }
111
+ function handleTeamChange(event, i) {
112
+ const teamId = event.target.value;
113
+ const team = $values['teams'].find((team) => team.team_id === teamId) || null;
114
+ $values['critical_error_channels'][i] = {
115
+ teams_channel: {
116
+ team_id: team?.team_id,
117
+ team_name: team?.team_name,
118
+ channel_id: team?.channels[0]?.channel_id,
119
+ channel_name: team?.channels[0]?.channel_name
120
+ }
121
+ };
122
+ }
123
+ function handleChannelChange(event, setting, i) {
124
+ const channelId = event.target.value;
125
+ const team = $values['teams'].find((team) => team.team_id === $values['critical_error_channels'][i]?.teams_channel?.team_id);
126
+ const channel = team?.channels.find((channel) => channel.channel_id === channelId) || null;
127
+ if (channelId) {
128
+ $values['critical_error_channels'][i] = {
129
+ teams_channel: {
130
+ team_id: team?.team_id,
131
+ team_name: team?.team_name,
132
+ channel_id: channel?.channel_id,
133
+ channel_name: channel?.channel_name
134
+ }
135
+ };
136
+ }
137
+ }
90
138
  </script>
91
139
 
140
+ <!-- {JSON.stringify($values, null, 2)} -->
92
141
  {#if (!setting.cloudonly || isCloudHosted()) && showSetting(setting.key, $values) && !(setting.hiddenIfNull && $values[setting.key] == null)}
93
142
  {#if setting.ee_only != undefined && !$enterpriseLicense}
94
143
  <div class="flex text-xs items-center gap-1 text-yellow-500 whitespace-nowrap">
@@ -96,617 +145,732 @@ function parseLicenseKey(key) {
96
145
  EE only {#if setting.ee_only != ''}<Tooltip>{setting.ee_only}</Tooltip>{/if}
97
146
  </div>
98
147
  {/if}
99
- <!-- svelte-ignore a11y-label-has-associated-control -->
100
- <label class="block pb-2">
101
- <span class="text-primary font-semibold text-sm">{setting.label}</span>
102
- {#if setting.description}
103
- <span class="text-secondary text-xs">
104
- {@html setting.description}
105
- </span>
106
- {/if}
107
- {#if setting.tooltip}
108
- <Tooltip>{setting.tooltip}</Tooltip>
109
- {/if}
110
- {#if $values}
111
- {@const hasError = setting.isValid && !setting.isValid($values[setting.key])}
112
- {#if loading}
113
- <Skeleton layout={[[2.5]]} />
114
- {:else if setting.fieldType == 'text'}
115
- <input
116
- disabled={setting.ee_only != undefined && !$enterpriseLicense}
117
- type="text"
118
- placeholder={setting.placeholder}
119
- class={hasError
120
- ? 'border !border-red-700 !border-opacity-30 !focus:border-red-700 !focus:border-opacity-30'
121
- : ''}
122
- bind:value={$values[setting.key]}
123
- />
124
- {#if setting.advancedToggle}
125
- <div class="mt-1">
126
- <Toggle
127
- size="xs"
128
- options={{ right: setting.advancedToggle.label }}
129
- checked={setting.advancedToggle.checked($values)}
130
- on:change={() => {
131
- if (setting.advancedToggle) {
132
- $values = setting.advancedToggle.onChange($values)
133
- }
134
- }}
135
- />
136
- </div>
148
+ {#if setting.fieldType == 'select'}
149
+ <div>
150
+ <!-- svelte-ignore a11y-label-has-associated-control -->
151
+ <label class="block pb-2">
152
+ <span class="text-primary font-semibold text-sm">{setting.label}</span>
153
+ {#if setting.description}
154
+ <span class="text-secondary text-xs">
155
+ {@html setting.description}
156
+ </span>
137
157
  {/if}
138
- {:else if setting.fieldType == 'textarea'}
139
- <textarea
140
- disabled={!$enterpriseLicense}
141
- rows="2"
142
- placeholder={setting.placeholder}
143
- bind:value={$values[setting.key]}
144
- />
145
- {#if setting.key == 'saml_metadata'}
146
- <div class="flex mt-2">
147
- <Button
148
- disabled={!$enterpriseLicense}
149
- on:click={async (e) => {
150
- const res = await SettingService.testMetadata({
151
- requestBody: $values[setting.key]
152
- })
153
- sendUserToast(`Metadata valid, see console for full content`)
154
- console.log(`Metadata content:`, res)
155
- }}>Test content/url</Button
156
- >
157
- </div>
158
- {/if}
159
- {:else if setting.fieldType == 'codearea'}
160
- <SimpleEditor
161
- autoHeight
162
- class="editor"
163
- lang={setting.codeAreaLang ?? 'txt'}
164
- bind:code={$values[setting.key]}
165
- fixedOverflowWidgets={false}
166
- />
167
- {:else if setting.fieldType == 'license_key'}
168
- {@const { valid, expiration } = parseLicenseKey($values[setting.key] ?? '')}
169
- <div class="flex gap-2">
170
- <Password
171
- small
158
+ </label>
159
+ <ToggleButtonGroup bind:selected={$values[setting.key]} let:item={toggleButton}>
160
+ {#each setting.select_items ?? [] as item}
161
+ <ToggleButton
162
+ value={item.value ?? item.label}
163
+ label={item.label}
164
+ tooltip={item.tooltip}
165
+ item={toggleButton}
166
+ />
167
+ {/each}
168
+ </ToggleButtonGroup>
169
+ </div>
170
+ {:else}
171
+ <!-- svelte-ignore a11y-label-has-associated-control -->
172
+ <label class="block pb-2">
173
+ <span class="text-primary font-semibold text-sm">{setting.label}</span>
174
+ {#if setting.description}
175
+ <span class="text-secondary text-xs">
176
+ {@html setting.description}
177
+ </span>
178
+ {/if}
179
+ {#if setting.tooltip}
180
+ <Tooltip>{setting.tooltip}</Tooltip>
181
+ {/if}
182
+ {#if $values}
183
+ {@const hasError = setting.isValid && !setting.isValid($values[setting.key])}
184
+ {#if loading}
185
+ <Skeleton layout={[[2.5]]} />
186
+ {:else if setting.fieldType == 'text'}
187
+ <input
188
+ disabled={setting.ee_only != undefined && !$enterpriseLicense}
189
+ type="text"
172
190
  placeholder={setting.placeholder}
173
- on:keydown={() => {
174
- licenseKeyChanged = true
175
- }}
176
- bind:password={$values[setting.key]}
191
+ class={hasError
192
+ ? 'border !border-red-700 !border-opacity-30 !focus:border-red-700 !focus:border-opacity-30'
193
+ : ''}
194
+ bind:value={$values[setting.key]}
177
195
  />
178
- <Button
179
- variant={$values[setting.key] ? 'contained' : 'border'}
180
- size="xs"
181
- on:click={async () => {
182
- await SettingService.testLicenseKey({
183
- requestBody: { license_key: $values[setting.key] }
184
- })
185
- sendUserToast('Valid key')
186
- }}
187
- >
188
- Test key
189
- </Button>
190
- </div>
191
- <div class="mt-1 flex flex-col gap-1 items-start">
192
- {#if $values[setting.key]?.length > 0}
193
- {#if valid}
194
- <div class="flex flex-row gap-1 items-center">
195
- <Info size={12} class="text-tertiary" />
196
- <span class="text-tertiary text-xs">License key expires on {expiration ?? ''}</span>
197
- </div>
198
- {:else if expiration}
199
- <div class="flex flex-row gap-1 items-center">
200
- <AlertCircle size={12} class="text-red-600" />
201
- <span class="text-red-600 dark:text-red-400 text-xs"
202
- >License key expired on {expiration}</span
203
- >
204
- </div>
205
- {:else}
206
- <div class="flex flex-row gap-1 items-center">
207
- <AlertCircle size={12} class="text-red-600" />
208
- <span class="text-red-600 dark:text-red-400 text-xs"
209
- >Invalid license key format</span
210
- >
211
- </div>
212
- {/if}
213
- {/if}
214
- {#if latestKeyRenewalAttempt}
215
- {@const attemptedAt = new Date(latestKeyRenewalAttempt.attempted_at).toLocaleString()}
216
- {@const isTrial = latestKeyRenewalAttempt.result.startsWith('error: trial:')}
217
- <div class="relative">
218
- <Popover notClickable>
219
- <div class="flex flex-row items-center gap-1">
220
- {#if latestKeyRenewalAttempt.result === 'success'}
221
- <BadgeCheck class="text-green-600" size={12} />
222
- {:else}
223
- <BadgeX class={isTrial ? 'text-yellow-600' : 'text-red-600'} size={12} />
224
- {/if}
225
- <span
226
- class={classNames(
227
- 'text-xs',
228
- latestKeyRenewalAttempt.result === 'success'
229
- ? 'text-green-600'
230
- : isTrial
231
- ? 'text-yellow-600'
232
- : 'text-red-600'
233
- )}
234
- >
235
- {latestKeyRenewalAttempt.result === 'success'
236
- ? 'Latest key renewal succeeded'
237
- : isTrial
238
- ? 'Latest key renewal ignored because in trial'
239
- : 'Latest key renewal failed'}
240
- on {attemptedAt}
241
- </span>
242
- </div>
243
- <div slot="text">
244
- {#if latestKeyRenewalAttempt.result === 'success'}
245
- <span class="text-green-300">
246
- Latest key renewal succeeded on {attemptedAt}
247
- </span>
248
- {:else if isTrial}
249
- <span class="text-yellow-300">
250
- License key cannot be renewed during trial ({attemptedAt})
251
- </span>
252
- {:else}
253
- <span class="text-red-300">
254
- Latest key renewal failed on {attemptedAt}: {latestKeyRenewalAttempt.result.replace(
255
- 'error: ',
256
- ''
257
- )}
258
- </span>
259
- {/if}
260
- <br />
261
- As long as invoices are paid and usage corresponds to the subscription, the key is
262
- renewed daily with a validity of 35 days (grace period).
263
- </div>
264
- </Popover>
196
+ {#if setting.advancedToggle}
197
+ <div class="mt-1">
198
+ <Toggle
199
+ size="xs"
200
+ options={{ right: setting.advancedToggle.label }}
201
+ checked={setting.advancedToggle.checked($values)}
202
+ on:change={() => {
203
+ if (setting.advancedToggle) {
204
+ $values = setting.advancedToggle.onChange($values)
205
+ }
206
+ }}
207
+ />
265
208
  </div>
266
209
  {/if}
267
- {#if licenseKeyChanged && !$enterpriseLicense}
268
- {#if version.startsWith('CE')}
269
- <div class="text-red-400"
270
- >License key is set but image used is the Community Edition {version}. Switch image
271
- to EE.</div
210
+ {:else if setting.fieldType == 'textarea'}
211
+ <textarea
212
+ disabled={!$enterpriseLicense}
213
+ rows="2"
214
+ placeholder={setting.placeholder}
215
+ bind:value={$values[setting.key]}
216
+ />
217
+ {#if setting.key == 'saml_metadata'}
218
+ <div class="flex mt-2">
219
+ <Button
220
+ disabled={!$enterpriseLicense}
221
+ on:click={async (e) => {
222
+ try {
223
+ const res = await SettingService.testMetadata({
224
+ requestBody: $values[setting.key]
225
+ })
226
+ sendUserToast(`Metadata valid: ${res}`)
227
+ } catch (error) {
228
+ sendUserToast(`Invalid metadata`, true, error.message)
229
+ }
230
+ }}>Test content/url</Button
272
231
  >
273
- {/if}
274
- {/if}
275
-
276
- {#if valid || expiration}
277
- <div class="flex flex-row gap-2 mt-1">
278
- <Button on:click={renewLicenseKey} loading={renewing} size="xs" color="dark"
279
- >Renew key
280
- </Button>
281
- <Button color="dark" size="xs" loading={opening} on:click={openCustomerPortal}>
282
- Open customer portal
283
- </Button>
284
232
  </div>
285
233
  {/if}
286
- </div>
287
- {:else if setting.fieldType == 'email'}
288
- <input type="email" placeholder={setting.placeholder} bind:value={$values[setting.key]} />
289
- {:else if setting.key == 'critical_alert_mute_ui'}
290
- <div class="flex flex-col gap-y-2 my-2 py-2">
291
- <Toggle
292
- disabled={!$enterpriseLicense}
293
- bind:checked={$values[setting.key]}
294
- options={{ right: setting.description }}
234
+ {:else if setting.fieldType == 'codearea'}
235
+ <SimpleEditor
236
+ autoHeight
237
+ class="editor"
238
+ lang={setting.codeAreaLang ?? 'txt'}
239
+ bind:code={$values[setting.key]}
240
+ fixedOverflowWidgets={false}
295
241
  />
296
- <div class="flex flex-row">
242
+ {:else if setting.fieldType == 'license_key'}
243
+ {@const { valid, expiration } = parseLicenseKey($values[setting.key] ?? '')}
244
+ <div class="flex gap-2">
245
+ <Password
246
+ small
247
+ placeholder={setting.placeholder}
248
+ on:keydown={() => {
249
+ licenseKeyChanged = true
250
+ }}
251
+ bind:password={$values[setting.key]}
252
+ />
297
253
  <Button
298
- variant="border"
299
- color="light"
300
- disabled={!$enterpriseLicense}
254
+ variant={$values[setting.key] ? 'contained' : 'border'}
301
255
  size="xs"
302
- on:click={() => {
303
- isCriticalAlertsUIOpen.set(true)
304
- dispatch('closeDrawer')
256
+ on:click={async () => {
257
+ await SettingService.testLicenseKey({
258
+ requestBody: { license_key: $values[setting.key] }
259
+ })
260
+ sendUserToast('Valid key')
305
261
  }}
306
262
  >
307
- Show critical alerts
263
+ Test key
308
264
  </Button>
309
265
  </div>
310
- </div>
311
- {:else if setting.fieldType == 'critical_error_channels'}
312
- <div class="w-full flex gap-x-16 flex-wrap">
313
- <div class="w-full max-w-lg">
314
- {#if $enterpriseLicense && Array.isArray($values[setting.key])}
315
- {#each $values[setting.key] ?? [] as v, i}
316
- <div class="flex w-full max-w-lg mt-1 gap-2 items-center">
317
- <select
318
- class="w-20"
319
- on:change={(e) => {
320
- if (e.target?.['value']) {
321
- $values[setting.key][i] = {
322
- [e.target['value']]: ''
323
- }
324
- }
325
- }}
326
- value={v && 'slack_channel' in v ? 'slack_channel' : 'email'}
266
+ <div class="mt-1 flex flex-col gap-1 items-start">
267
+ {#if $values[setting.key]?.length > 0}
268
+ {#if valid}
269
+ <div class="flex flex-row gap-1 items-center">
270
+ <Info size={12} class="text-tertiary" />
271
+ <span class="text-tertiary text-xs"
272
+ >License key expires on {expiration ?? ''}</span
327
273
  >
328
- <option value="email">Email</option>
329
- <option value="slack_channel">Slack</option>
330
- </select>
331
- {#if v && 'slack_channel' in v}
332
- <input
333
- type="text"
334
- placeholder="Slack channel"
335
- on:input={(e) => {
274
+ </div>
275
+ {:else if expiration}
276
+ <div class="flex flex-row gap-1 items-center">
277
+ <AlertCircle size={12} class="text-red-600" />
278
+ <span class="text-red-600 dark:text-red-400 text-xs"
279
+ >License key expired on {expiration}</span
280
+ >
281
+ </div>
282
+ {:else}
283
+ <div class="flex flex-row gap-1 items-center">
284
+ <AlertCircle size={12} class="text-red-600" />
285
+ <span class="text-red-600 dark:text-red-400 text-xs"
286
+ >Invalid license key format</span
287
+ >
288
+ </div>
289
+ {/if}
290
+ {/if}
291
+ {#if latestKeyRenewalAttempt}
292
+ {@const attemptedAt = new Date(latestKeyRenewalAttempt.attempted_at).toLocaleString()}
293
+ {@const isTrial = latestKeyRenewalAttempt.result.startsWith('error: trial:')}
294
+ <div class="relative">
295
+ <Popover notClickable>
296
+ <div class="flex flex-row items-center gap-1">
297
+ {#if latestKeyRenewalAttempt.result === 'success'}
298
+ <BadgeCheck class="text-green-600" size={12} />
299
+ {:else}
300
+ <BadgeX class={isTrial ? 'text-yellow-600' : 'text-red-600'} size={12} />
301
+ {/if}
302
+ <span
303
+ class={classNames(
304
+ 'text-xs',
305
+ latestKeyRenewalAttempt.result === 'success'
306
+ ? 'text-green-600'
307
+ : isTrial
308
+ ? 'text-yellow-600'
309
+ : 'text-red-600'
310
+ )}
311
+ >
312
+ {latestKeyRenewalAttempt.result === 'success'
313
+ ? 'Latest key renewal succeeded'
314
+ : isTrial
315
+ ? 'Latest key renewal ignored because in trial'
316
+ : 'Latest key renewal failed'}
317
+ on {attemptedAt}
318
+ </span>
319
+ </div>
320
+ <div slot="text">
321
+ {#if latestKeyRenewalAttempt.result === 'success'}
322
+ <span class="text-green-300">
323
+ Latest key renewal succeeded on {attemptedAt}
324
+ </span>
325
+ {:else if isTrial}
326
+ <span class="text-yellow-300">
327
+ License key cannot be renewed during trial ({attemptedAt})
328
+ </span>
329
+ {:else}
330
+ <span class="text-red-300">
331
+ Latest key renewal failed on {attemptedAt}: {latestKeyRenewalAttempt.result.replace(
332
+ 'error: ',
333
+ ''
334
+ )}
335
+ </span>
336
+ {/if}
337
+ <br />
338
+ As long as invoices are paid and usage corresponds to the subscription, the key is
339
+ renewed daily with a validity of 35 days (grace period).
340
+ </div>
341
+ </Popover>
342
+ </div>
343
+ {/if}
344
+ {#if licenseKeyChanged && !$enterpriseLicense}
345
+ {#if version.startsWith('CE')}
346
+ <div class="text-red-400"
347
+ >License key is set but image used is the Community Edition {version}. Switch
348
+ image to EE.</div
349
+ >
350
+ {/if}
351
+ {/if}
352
+
353
+ {#if valid || expiration}
354
+ <div class="flex flex-row gap-2 mt-1">
355
+ <Button on:click={renewLicenseKey} loading={renewing} size="xs" color="dark"
356
+ >Renew key
357
+ </Button>
358
+ <Button color="dark" size="xs" loading={opening} on:click={openCustomerPortal}>
359
+ Open customer portal
360
+ </Button>
361
+ </div>
362
+ {/if}
363
+ </div>
364
+ {:else if setting.fieldType == 'email'}
365
+ <input type="email" placeholder={setting.placeholder} bind:value={$values[setting.key]} />
366
+ {:else if setting.key == 'critical_alert_mute_ui'}
367
+ <div class="flex flex-col gap-y-2 my-2 py-2">
368
+ <Toggle
369
+ disabled={!$enterpriseLicense}
370
+ bind:checked={$values[setting.key]}
371
+ options={{ right: setting.description }}
372
+ />
373
+ <div class="flex flex-row">
374
+ <Button
375
+ variant="border"
376
+ color="light"
377
+ disabled={!$enterpriseLicense}
378
+ size="xs"
379
+ on:click={() => {
380
+ isCriticalAlertsUIOpen.set(true)
381
+ dispatch('closeDrawer')
382
+ }}
383
+ >
384
+ Show critical alerts
385
+ </Button>
386
+ </div>
387
+ </div>
388
+ {:else if setting.fieldType == 'critical_error_channels'}
389
+ <div class="w-full flex gap-x-16 flex-wrap">
390
+ <div class="w-full max-w-lg">
391
+ {#if $enterpriseLicense && Array.isArray($values[setting.key])}
392
+ {#each $values[setting.key] ?? [] as v, i}
393
+ <div class="flex w-full max-w-lg mt-1 gap-2 items-center">
394
+ <select
395
+ class="max-w-24"
396
+ on:change={(e) => {
336
397
  if (e.target?.['value']) {
337
398
  $values[setting.key][i] = {
338
- slack_channel: e.target['value']
399
+ [e.target['value']]: ''
339
400
  }
340
401
  }
402
+ if (e.target?.['value'] === 'teams_channel') {
403
+ fetchTeams()
404
+ }
341
405
  }}
342
- value={v?.slack_channel ?? ''}
343
- />
344
- {:else}
345
- <input
346
- type="email"
347
- placeholder="Email address"
348
- on:input={(e) => {
349
- if (e.target?.['value']) {
350
- $values[setting.key][i] = {
351
- email: e.target['value']
406
+ value={(() => {
407
+ if (!v) return 'email'
408
+ return (
409
+ ['slack_channel', 'teams_channel'].find((type) => type in v) || 'email'
410
+ )
411
+ })()}
412
+ >
413
+ <option value="email">Email</option>
414
+ <option value="slack_channel">Slack</option>
415
+ <option value="teams_channel">Teams</option>
416
+ </select>
417
+ {#if v && 'slack_channel' in v}
418
+ <input
419
+ type="text"
420
+ placeholder="Slack channel"
421
+ on:input={(e) => {
422
+ if (e.target?.['value']) {
423
+ $values[setting.key][i] = {
424
+ slack_channel: e.target['value']
425
+ }
352
426
  }
353
- }
427
+ }}
428
+ value={v?.slack_channel ?? ''}
429
+ />
430
+ {:else if v && 'teams_channel' in v}
431
+ <div class="flex flex-row gap-2 w-full">
432
+ <select on:change={(e) => handleTeamChange(e, i)}>
433
+ <option
434
+ value=""
435
+ disabled
436
+ selected={!$values['critical_error_channels'][i]?.teams_channel
437
+ ?.team_id}>Select team</option
438
+ >
439
+ {#if $values['teams']}
440
+ {#each $values['teams'] as team}
441
+ <option
442
+ value={team.team_id}
443
+ selected={$values['critical_error_channels'][i]?.teams_channel
444
+ ?.team_id === team.team_id}
445
+ >
446
+ {team.team_name}
447
+ </option>
448
+ {/each}
449
+ {/if}
450
+ </select>
451
+ {#if $values['critical_error_channels'][i]?.teams_channel?.team_id}
452
+ <select
453
+ id="channel-select"
454
+ on:change={(e) => handleChannelChange(e, setting, i)}
455
+ >
456
+ <option
457
+ value=""
458
+ disabled
459
+ selected={!$values['critical_error_channels'][i]?.teams_channel
460
+ ?.channel_id}>Select channel</option
461
+ >
462
+ {#each $values['teams'].find((team) => team.team_id === $values['critical_error_channels'][i]?.teams_channel?.team_id)?.channels ?? [] as channel}
463
+ <option
464
+ value={channel.channel_id}
465
+ selected={$values['critical_error_channels'][i]?.teams_channel
466
+ ?.channel_id === channel.channel_id}
467
+ >
468
+ {channel.channel_name}
469
+ </option>
470
+ {/each}
471
+ </select>
472
+ {/if}
473
+ <div>
474
+ <button on:click={fetchTeams} class="flex items-center gap-1 mt-2">
475
+ <RefreshCcw size={16} class={isFetching ? 'animate-spin' : ''} />
476
+ </button>
477
+ </div>
478
+ </div>
479
+ {:else}
480
+ <input
481
+ type="email"
482
+ placeholder="Email address"
483
+ on:input={(e) => {
484
+ if (e.target?.['value']) {
485
+ $values[setting.key][i] = {
486
+ email: e.target['value']
487
+ }
488
+ }
489
+ }}
490
+ value={v?.email ?? ''}
491
+ />
492
+ {/if}
493
+ <button
494
+ transition:fade|local={{ duration: 100 }}
495
+ class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover"
496
+ aria-label="Clear"
497
+ on:click={() => {
498
+ $values[setting.key] = $values[setting.key].filter(
499
+ (_, index) => index !== i
500
+ )
354
501
  }}
355
- value={v?.email ?? ''}
356
- />
357
- {/if}
358
- <button
359
- transition:fade|local={{ duration: 100 }}
360
- class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover"
361
- aria-label="Clear"
362
- on:click={() => {
363
- $values[setting.key] = $values[setting.key].filter((_, index) => index !== i)
364
- }}
365
- >
366
- <X size={14} />
367
- </button>
368
- </div>
369
- {/each}
370
- {/if}
502
+ >
503
+ <X size={14} />
504
+ </button>
505
+ </div>
506
+ {/each}
507
+ {/if}
508
+ </div>
371
509
  </div>
372
- </div>
373
- <div class="flex mt-2 gap-20 items-center">
374
- <Button
375
- variant="border"
376
- color="light"
377
- size="md"
378
- btnClasses="mt-1"
379
- on:click={() => {
380
- if ($values[setting.key] == undefined || !Array.isArray($values[setting.key])) {
381
- $values[setting.key] = []
382
- }
383
- $values[setting.key] = $values[setting.key].concat('')
384
- }}
385
- id="arg-input-add-item"
386
- startIcon={{ icon: Plus }}
387
- disabled={!$enterpriseLicense}
388
- >
389
- Add channel
390
- </Button>
391
- <div class="flex mt-1">
510
+ <div class="flex mt-2 gap-20 items-center">
392
511
  <Button
393
- disabled={!$enterpriseLicense}
394
512
  variant="border"
395
513
  color="light"
396
514
  size="md"
397
- on:click={async () => {
398
- try {
399
- await SettingService.testCriticalChannels({
400
- requestBody: $values[setting.key]
401
- })
402
- sendUserToast('Test message sent successfully to critical channels', false)
403
- } catch (error) {
404
- sendUserToast('Failed to send test message: ' + error.message, true)
515
+ btnClasses="mt-1"
516
+ on:click={() => {
517
+ if ($values[setting.key] == undefined || !Array.isArray($values[setting.key])) {
518
+ $values[setting.key] = []
405
519
  }
520
+ $values[setting.key] = $values[setting.key].concat('')
406
521
  }}
407
- >
408
- Test channels
409
- </Button>
410
- </div>
411
- </div>
412
- {:else if setting.fieldType == 'slack_connect'}
413
- <div class="flex flex-col items-start self-start">
414
- {#if $values[setting.key] && 'team_name' in $values[setting.key]}
415
- <div class="text-sm">
416
- Connected to <code>{$values[setting.key]['team_name']}</code>
417
- </div>
418
- <Button
419
- size="sm"
420
- endIcon={{ icon: Slack }}
421
- btnClasses="mt-2"
422
- variant="border"
423
- on:click={async () => {
424
- $values[setting.key] = undefined
425
- }}
426
- >
427
- Disconnect Slack
428
- </Button>
429
- {:else}
430
- <Button
431
- size="xs"
432
- color="dark"
433
- href="{base}/api/oauth/connect_slack?instance=true"
434
- startIcon={{ icon: Slack }}
522
+ id="arg-input-add-item"
523
+ startIcon={{ icon: Plus }}
435
524
  disabled={!$enterpriseLicense}
436
525
  >
437
- Connect to Slack
526
+ Add channel
438
527
  </Button>
439
- {/if}
440
- </div>
441
- {:else if setting.fieldType == 'indexer_rates'}
442
- <div class="flex flex-col gap-4 mt-4">
443
- {#if $values[setting.key]}
444
- <div>
445
- <label for="writer_memory_budget" class="block text-sm font-medium">
446
- Index writer memory budget (MB)
447
- <Tooltip>
448
- The allocated memory arena for the indexer. A bigger value means less writing to
449
- disk and potentially higher indexing throughput
450
- </Tooltip>
451
- </label>
452
- <input
528
+ <div class="flex mt-1">
529
+ <Button
453
530
  disabled={!$enterpriseLicense}
454
- type="number"
455
- id="writer_memory_budget"
456
- placeholder="300"
457
- on:input={(e) => {
458
- if (e.target instanceof HTMLInputElement) {
459
- if (e.target.valueAsNumber) {
460
- $values[setting.key].writer_memory_budget =
461
- e.target.valueAsNumber * (1024 * 1024)
462
- }
463
- }
464
- }}
465
- value={$values[setting.key].writer_memory_budget / (1024 * 1024)}
466
- />
467
- </div>
468
- <h3>Completed Job Index</h3>
469
- <div>
470
- <label for="commit_job_max_batch_size" class="block text-sm font-medium">
471
- Commit max batch size <Tooltip>
472
- The max amount of documents (here jobs) per commit. To optimize indexing
473
- throughput, it is best to keep this as high as possible. However, especially when
474
- reindexing the whole instance, it can be useful to have a limit on how many jobs
475
- can be written without being commited. A commit will make the jobs available for
476
- search, constitute a "checkpoint" state in the indexing and will be logged.
477
- </Tooltip>
478
- </label>
479
- <input
480
- disabled={!$enterpriseLicense}
481
- type="number"
482
- id="commit_job_max_batch_size"
483
- placeholder="100000"
484
- bind:value={$values[setting.key].commit_job_max_batch_size}
485
- />
486
- </div>
487
- <div>
488
- <label for="refresh_index_period" class="block text-sm font-medium">
489
- Refresh index period (s) <Tooltip>
490
- The index will query new jobs periodically and write them on the index. This
491
- setting sets that period.
492
- </Tooltip></label
493
- >
494
- <input
495
- disabled={!$enterpriseLicense}
496
- type="number"
497
- id="refresh_index_period"
498
- placeholder="300"
499
- bind:value={$values[setting.key].refresh_index_period}
500
- />
501
- </div>
502
- <div>
503
- <label for="max_indexed_job_log_size" class="block text-sm font-medium">
504
- Max indexed job log size (KB) <Tooltip>
505
- Job logs are included when indexing, but to avoid the index size growing
506
- artificially, the logs will be truncated after a size has been reached.
507
- </Tooltip>
508
- </label>
509
- <input
510
- disabled={!$enterpriseLicense}
511
- type="number"
512
- id="max_indexed_job_log_size"
513
- placeholder="1024"
514
- on:input={(e) => {
515
- if (e.target instanceof HTMLInputElement) {
516
- if (e.target.valueAsNumber) {
517
- $values[setting.key].max_indexed_job_log_size = e.target.valueAsNumber * 1024
518
- }
531
+ variant="border"
532
+ color="light"
533
+ size="md"
534
+ on:click={async () => {
535
+ try {
536
+ await SettingService.testCriticalChannels({
537
+ requestBody: $values[setting.key]
538
+ })
539
+ sendUserToast('Test message sent successfully to critical channels', false)
540
+ } catch (error) {
541
+ sendUserToast('Failed to send test message: ' + error.message, true)
519
542
  }
520
543
  }}
521
- value={$values[setting.key].max_indexed_job_log_size / 1024}
522
- />
523
- </div>
524
- <h3>Service Logs Index</h3>
525
- <div>
526
- <label for="commit_log_max_batch_size" class="block text-sm font-medium"
527
- >Commit max batch size <Tooltip>
528
- The max amount of documents per commit. In this case 1 document is one log file
529
- representing all logs during 1 minute for a specific host. To optimize indexing
530
- throughput, it is best to keep this as high as possible. However, especially when
531
- reindexing the whole instance, it can be useful to have a limit on how many logs
532
- can be written without being commited. A commit will make the logs available for
533
- search, appear as a log line, and be a "checkpoint" of the indexing progress.
534
- </Tooltip>
535
- </label>
536
- <input
537
- disabled={!$enterpriseLicense}
538
- type="number"
539
- id="commit_log_max_batch_size"
540
- placeholder="10000"
541
- bind:value={$values[setting.key].commit_log_max_batch_size}
542
- />
543
- </div>
544
- <div>
545
- <label for="refresh_log_index_period" class="block text-sm font-medium">
546
- Refresh index period (s) <Tooltip>
547
- The index will query new service logs peridically and write them on the index.
548
- This setting sets that period.
549
- </Tooltip></label
550
544
  >
551
- <input
552
- disabled={!$enterpriseLicense}
553
- type="number"
554
- id="refresh_log_index_period"
555
- placeholder="300"
556
- bind:value={$values[setting.key].refresh_log_index_period}
557
- />
545
+ Test channels
546
+ </Button>
558
547
  </div>
559
- <h3>Reset Index</h3>
560
- This buttons will clear the whole index, and the service will start reindexing from scratch.
561
- Full text search might be down during this time.
562
- <div>
563
- <ConfirmButton
564
- on:click={async () => {
565
- let r = await IndexSearchService.clearIndex({
566
- idxName: 'JobIndex'
567
- })
568
- console.log('asasd')
569
- sendUserToast(r)
570
- }}>Clear <b>Jobs</b> Index</ConfirmButton
571
- >
572
- <ConfirmButton
548
+ </div>
549
+ {:else if setting.fieldType == 'slack_connect'}
550
+ <div class="flex flex-col items-start self-start">
551
+ {#if $values[setting.key] && 'team_name' in $values[setting.key]}
552
+ <div class="text-sm">
553
+ Connected to <code>{$values[setting.key]['team_name']}</code>
554
+ </div>
555
+ <Button
556
+ size="sm"
557
+ endIcon={{ icon: Slack }}
558
+ btnClasses="mt-2"
559
+ variant="border"
573
560
  on:click={async () => {
574
- let r = await IndexSearchService.clearIndex({
575
- idxName: 'ServiceLogIndex'
576
- })
577
- console.log('asasd')
578
- sendUserToast(r)
579
- }}>Clear <b>Service Logs</b> Index</ConfirmButton
580
- >
581
- </div>
582
- {/if}
583
- </div>
584
- {:else if setting.fieldType == 'smtp_connect'}
585
- <div class="flex flex-col gap-4 border rounded p-4">
586
- {#if $values[setting.key]}
587
- <div>
588
- <label for="smtp_host" class="block text-sm font-medium">Host</label>
589
- <input
590
- type="text"
591
- id="smtp_host"
592
- placeholder="smtp.gmail.com"
593
- bind:value={$values[setting.key].smtp_host}
594
- />
595
- </div>
596
- <div>
597
- <label for="smtp_port" class="block text-sm font-medium">Port</label>
598
- <input
599
- type="number"
600
- id="smtp_port"
601
- placeholder="587"
602
- bind:value={$values[setting.key].smtp_port}
603
- />
604
- </div>
605
- <div>
606
- <label for="smtp_username" class="block text-sm font-medium">Username</label>
607
- <input
608
- type="text"
609
- id="smtp_username"
610
- placeholder="ruben@windmill.dev"
611
- bind:value={$values[setting.key].smtp_username}
612
- />
613
- </div>
614
- <div>
615
- <label for="smtp_password" class="block text-sm font-medium">Password</label>
616
- <Password bind:password={$values[setting.key].smtp_password} />
617
- </div>
618
- <div>
619
- <label for="smtp_from" class="block text-sm font-medium">From Address</label>
620
- <input
621
- type="email"
622
- id="smtp_from"
623
- placeholder="noreply@windmill.dev"
624
- bind:value={$values[setting.key].smtp_from}
625
- />
626
- </div>
627
- <div>
628
- <Toggle
629
- disabled={$values[setting.key].smtp_disable_tls == true || !$enterpriseLicense}
630
- id="smtp_tls_implicit"
631
- bind:checked={$values[setting.key].smtp_tls_implicit}
632
- options={{ right: 'Implicit TLS' }}
633
- label="Implicit TLS"
634
- />
635
- </div>
636
- <div>
637
- <Toggle
638
- id="smtp_disable_tls"
639
- disabled={!$enterpriseLicense}
640
- bind:checked={$values[setting.key].smtp_disable_tls}
641
- on:change={() => {
642
- if ($values[setting.key].smtp_disable_tls) {
643
- $values[setting.key].smtp_tls_implicit = false
644
- }
561
+ $values[setting.key] = undefined
645
562
  }}
646
- options={{ right: 'Disable TLS' }}
647
- label="Disable TLS"
648
- />
649
- </div>
650
- {/if}
651
- </div>
652
- {:else if setting.fieldType == 'otel'}
653
- <div class="flex flex-col gap-4 border rounded p-4">
654
- {#if $values[setting.key]}
655
- <div class="flex gap-8">
656
- <Toggle
657
- disabled={!$enterpriseLicense}
658
- id="tracing_enabled"
659
- bind:checked={$values[setting.key].tracing_enabled}
660
- options={{ right: 'Tracing' }}
661
- label="Tracing"
662
- />
663
- <Toggle
664
- disabled={!$enterpriseLicense}
665
- id="logs_enabled"
666
- bind:checked={$values[setting.key].logs_enabled}
667
- options={{ right: 'Logs' }}
668
- label="logs"
669
- />
670
- <Toggle
671
- disabled
672
- id="metrics_enabled"
673
- bind:checked={$values[setting.key].logs_enabled}
674
- options={{ right: 'Metrics (coming soon)' }}
675
- label="metrics"
676
- />
677
- </div>
678
-
679
- <div>
680
- <label for="OTEL_EXPORTER_OTLP_ENDPOINT" class="block text-sm font-medium"
681
- >Endpoint</label
682
563
  >
683
- <input
564
+ Disconnect Slack
565
+ </Button>
566
+ {:else}
567
+ <Button
568
+ size="xs"
569
+ color="dark"
570
+ href="{base}/api/oauth/connect_slack?instance=true"
571
+ startIcon={{ icon: Slack }}
684
572
  disabled={!$enterpriseLicense}
685
- type="text"
686
- id="OTEL_EXPORTER_OTLP_ENDPOINT"
687
- placeholder="http://otel-collector.example.com:4317"
688
- bind:value={$values[setting.key].otel_exporter_otlp_endpoint}
689
- />
690
- </div>
691
- <div>
692
- <label for="OTEL_EXPORTER_OTLP_HEADERS" class="block text-sm font-medium"
693
- >Headers</label
694
573
  >
695
- <input
696
- disabled={!$enterpriseLicense}
697
- type="text"
698
- id="OTEL_EXPORTER_OTLP_HEADERS"
699
- placeholder="Authorization=Bearer my-secret-token,Env=production"
700
- bind:value={$values[setting.key].otel_exporter_otlp_headers}
701
- />
702
- </div>
703
- <div>
704
- <label for="OTEL_EXPORTER_OTLP_PROTOCOL" class="block text-sm font-medium"
705
- >Protocol</label
574
+ Connect to Slack
575
+ </Button>
576
+ {/if}
577
+ </div>
578
+ {:else if setting.fieldType == 'indexer_rates'}
579
+ <div class="flex flex-col gap-4 mt-4">
580
+ {#if $values[setting.key]}
581
+ <div>
582
+ <label for="writer_memory_budget" class="block text-sm font-medium">
583
+ Index writer memory budget (MB)
584
+ <Tooltip>
585
+ The allocated memory arena for the indexer. A bigger value means less writing to
586
+ disk and potentially higher indexing throughput
587
+ </Tooltip>
588
+ </label>
589
+ <input
590
+ disabled={!$enterpriseLicense}
591
+ type="number"
592
+ id="writer_memory_budget"
593
+ placeholder="300"
594
+ on:input={(e) => {
595
+ if (e.target instanceof HTMLInputElement) {
596
+ if (e.target.valueAsNumber) {
597
+ $values[setting.key].writer_memory_budget =
598
+ e.target.valueAsNumber * (1024 * 1024)
599
+ }
600
+ }
601
+ }}
602
+ value={$values[setting.key].writer_memory_budget / (1024 * 1024)}
603
+ />
604
+ </div>
605
+ <h3>Completed Job Index</h3>
606
+ <div>
607
+ <label for="commit_job_max_batch_size" class="block text-sm font-medium">
608
+ Commit max batch size <Tooltip>
609
+ The max amount of documents (here jobs) per commit. To optimize indexing
610
+ throughput, it is best to keep this as high as possible. However, especially
611
+ when reindexing the whole instance, it can be useful to have a limit on how many
612
+ jobs can be written without being commited. A commit will make the jobs
613
+ available for search, constitute a "checkpoint" state in the indexing and will
614
+ be logged.
615
+ </Tooltip>
616
+ </label>
617
+ <input
618
+ disabled={!$enterpriseLicense}
619
+ type="number"
620
+ id="commit_job_max_batch_size"
621
+ placeholder="100000"
622
+ bind:value={$values[setting.key].commit_job_max_batch_size}
623
+ />
624
+ </div>
625
+ <div>
626
+ <label for="refresh_index_period" class="block text-sm font-medium">
627
+ Refresh index period (s) <Tooltip>
628
+ The index will query new jobs periodically and write them on the index. This
629
+ setting sets that period.
630
+ </Tooltip></label
631
+ >
632
+ <input
633
+ disabled={!$enterpriseLicense}
634
+ type="number"
635
+ id="refresh_index_period"
636
+ placeholder="300"
637
+ bind:value={$values[setting.key].refresh_index_period}
638
+ />
639
+ </div>
640
+ <div>
641
+ <label for="max_indexed_job_log_size" class="block text-sm font-medium">
642
+ Max indexed job log size (KB) <Tooltip>
643
+ Job logs are included when indexing, but to avoid the index size growing
644
+ artificially, the logs will be truncated after a size has been reached.
645
+ </Tooltip>
646
+ </label>
647
+ <input
648
+ disabled={!$enterpriseLicense}
649
+ type="number"
650
+ id="max_indexed_job_log_size"
651
+ placeholder="1024"
652
+ on:input={(e) => {
653
+ if (e.target instanceof HTMLInputElement) {
654
+ if (e.target.valueAsNumber) {
655
+ $values[setting.key].max_indexed_job_log_size =
656
+ e.target.valueAsNumber * 1024
657
+ }
658
+ }
659
+ }}
660
+ value={$values[setting.key].max_indexed_job_log_size / 1024}
661
+ />
662
+ </div>
663
+ <h3>Service Logs Index</h3>
664
+ <div>
665
+ <label for="commit_log_max_batch_size" class="block text-sm font-medium"
666
+ >Commit max batch size <Tooltip>
667
+ The max amount of documents per commit. In this case 1 document is one log file
668
+ representing all logs during 1 minute for a specific host. To optimize indexing
669
+ throughput, it is best to keep this as high as possible. However, especially
670
+ when reindexing the whole instance, it can be useful to have a limit on how many
671
+ logs can be written without being commited. A commit will make the logs
672
+ available for search, appear as a log line, and be a "checkpoint" of the
673
+ indexing progress.
674
+ </Tooltip>
675
+ </label>
676
+ <input
677
+ disabled={!$enterpriseLicense}
678
+ type="number"
679
+ id="commit_log_max_batch_size"
680
+ placeholder="10000"
681
+ bind:value={$values[setting.key].commit_log_max_batch_size}
682
+ />
683
+ </div>
684
+ <div>
685
+ <label for="refresh_log_index_period" class="block text-sm font-medium">
686
+ Refresh index period (s) <Tooltip>
687
+ The index will query new service logs peridically and write them on the index.
688
+ This setting sets that period.
689
+ </Tooltip></label
690
+ >
691
+ <input
692
+ disabled={!$enterpriseLicense}
693
+ type="number"
694
+ id="refresh_log_index_period"
695
+ placeholder="300"
696
+ bind:value={$values[setting.key].refresh_log_index_period}
697
+ />
698
+ </div>
699
+ <h3>Reset Index</h3>
700
+ This buttons will clear the whole index, and the service will start reindexing from scratch.
701
+ Full text search might be down during this time.
702
+ <div>
703
+ <ConfirmButton
704
+ on:click={async () => {
705
+ let r = await IndexSearchService.clearIndex({
706
+ idxName: 'JobIndex'
707
+ })
708
+ console.log('asasd')
709
+ sendUserToast(r)
710
+ }}>Clear <b>Jobs</b> Index</ConfirmButton
711
+ >
712
+ <ConfirmButton
713
+ on:click={async () => {
714
+ let r = await IndexSearchService.clearIndex({
715
+ idxName: 'ServiceLogIndex'
716
+ })
717
+ console.log('asasd')
718
+ sendUserToast(r)
719
+ }}>Clear <b>Service Logs</b> Index</ConfirmButton
720
+ >
721
+ </div>
722
+ {/if}
723
+ </div>
724
+ {:else if setting.fieldType == 'smtp_connect'}
725
+ <div class="flex flex-col gap-4 border rounded p-4">
726
+ {#if $values[setting.key]}
727
+ <div class="flex gap-4"
728
+ ><input type="email" bind:value={to} placeholder="contact@windmill.dev" />
729
+ <Button
730
+ disabled={to == ''}
731
+ on:click={async () => {
732
+ let smtp = $values[setting.key]
733
+ await SettingService.testSmtp({
734
+ requestBody: {
735
+ to,
736
+ smtp: {
737
+ host: smtp['smtp_host'],
738
+ username: smtp['smtp_username'],
739
+ password: smtp['smtp_password'],
740
+ port: smtp['smtp_port'],
741
+ from: smtp['smtp_from'],
742
+ tls_implicit: smtp['smtp_tls_implicit'],
743
+ disable_tls: smtp['smtp_disable_tls']
744
+ }
745
+ }
746
+ })
747
+ sendUserToast('Test email sent')
748
+ }}>Test SMTP settings</Button
749
+ ></div
706
750
  >
707
- gRPC
708
- </div>
709
- <!-- <div>
751
+ <div>
752
+ <label for="smtp_host" class="block text-sm font-medium">Host</label>
753
+ <input
754
+ type="text"
755
+ id="smtp_host"
756
+ placeholder="smtp.gmail.com"
757
+ bind:value={$values[setting.key].smtp_host}
758
+ />
759
+ </div>
760
+ <div>
761
+ <label for="smtp_port" class="block text-sm font-medium">Port</label>
762
+ <input
763
+ type="number"
764
+ id="smtp_port"
765
+ placeholder="587"
766
+ bind:value={$values[setting.key].smtp_port}
767
+ />
768
+ </div>
769
+ <div>
770
+ <label for="smtp_username" class="block text-sm font-medium">Username</label>
771
+ <input
772
+ type="text"
773
+ id="smtp_username"
774
+ placeholder="ruben@windmill.dev"
775
+ bind:value={$values[setting.key].smtp_username}
776
+ />
777
+ </div>
778
+ <div>
779
+ <label for="smtp_password" class="block text-sm font-medium">Password</label>
780
+ <Password bind:password={$values[setting.key].smtp_password} />
781
+ </div>
782
+ <div>
783
+ <label for="smtp_from" class="block text-sm font-medium">From Address</label>
784
+ <input
785
+ type="email"
786
+ id="smtp_from"
787
+ placeholder="noreply@windmill.dev"
788
+ bind:value={$values[setting.key].smtp_from}
789
+ />
790
+ </div>
791
+ <div>
792
+ <Toggle
793
+ disabled={$values[setting.key].smtp_disable_tls == true || !$enterpriseLicense}
794
+ id="smtp_tls_implicit"
795
+ bind:checked={$values[setting.key].smtp_tls_implicit}
796
+ options={{ right: 'Implicit TLS' }}
797
+ label="Implicit TLS"
798
+ />
799
+ </div>
800
+ <div>
801
+ <Toggle
802
+ id="smtp_disable_tls"
803
+ disabled={!$enterpriseLicense}
804
+ bind:checked={$values[setting.key].smtp_disable_tls}
805
+ on:change={() => {
806
+ if ($values[setting.key].smtp_disable_tls) {
807
+ $values[setting.key].smtp_tls_implicit = false
808
+ }
809
+ }}
810
+ options={{ right: 'Disable TLS' }}
811
+ label="Disable TLS"
812
+ />
813
+ </div>
814
+ {/if}
815
+ </div>
816
+ {:else if setting.fieldType == 'otel'}
817
+ <div class="flex flex-col gap-4 border rounded p-4">
818
+ {#if $values[setting.key]}
819
+ <div class="flex gap-8">
820
+ <Toggle
821
+ disabled={!$enterpriseLicense}
822
+ id="tracing_enabled"
823
+ bind:checked={$values[setting.key].tracing_enabled}
824
+ options={{ right: 'Tracing' }}
825
+ label="Tracing"
826
+ />
827
+ <Toggle
828
+ disabled={!$enterpriseLicense}
829
+ id="logs_enabled"
830
+ bind:checked={$values[setting.key].logs_enabled}
831
+ options={{ right: 'Logs' }}
832
+ label="logs"
833
+ />
834
+ <Toggle
835
+ disabled
836
+ id="metrics_enabled"
837
+ bind:checked={$values[setting.key].logs_enabled}
838
+ options={{ right: 'Metrics (coming soon)' }}
839
+ label="metrics"
840
+ />
841
+ </div>
842
+
843
+ <div>
844
+ <label for="OTEL_EXPORTER_OTLP_ENDPOINT" class="block text-sm font-medium"
845
+ >Endpoint</label
846
+ >
847
+ <input
848
+ disabled={!$enterpriseLicense}
849
+ type="text"
850
+ id="OTEL_EXPORTER_OTLP_ENDPOINT"
851
+ placeholder="http://otel-collector.example.com:4317"
852
+ bind:value={$values[setting.key].otel_exporter_otlp_endpoint}
853
+ />
854
+ </div>
855
+ <div>
856
+ <label for="OTEL_EXPORTER_OTLP_HEADERS" class="block text-sm font-medium"
857
+ >Headers</label
858
+ >
859
+ <input
860
+ disabled={!$enterpriseLicense}
861
+ type="text"
862
+ id="OTEL_EXPORTER_OTLP_HEADERS"
863
+ placeholder="Authorization=Bearer my-secret-token,Env=production"
864
+ bind:value={$values[setting.key].otel_exporter_otlp_headers}
865
+ />
866
+ </div>
867
+ <div>
868
+ <label for="OTEL_EXPORTER_OTLP_PROTOCOL" class="block text-sm font-medium"
869
+ >Protocol</label
870
+ >
871
+ gRPC
872
+ </div>
873
+ <!-- <div>
710
874
  <label for="OTEL_EXPORTER_OTLP_PROTOCOL" class="block text-sm font-medium"
711
875
  >Protocol<span class="text-2xs text-tertiary ml-4"
712
876
  >grpc, http/protobuf, http/json</span
@@ -730,45 +894,51 @@ function parseLicenseKey(key) {
730
894
  bind:value={$values[setting.key].otel_exporter_otlp_compression}
731
895
  />
732
896
  </div> -->
733
- {/if}
734
- </div>
735
- {:else if setting.fieldType == 'object_store_config'}
736
- <ObjectStoreConfigSettings bind:bucket_config={$values[setting.key]} />
737
- <div class="mb-6" />
738
- {:else if setting.fieldType == 'number'}
739
- <input type="number" placeholder={setting.placeholder} bind:value={$values[setting.key]} />
740
- {:else if setting.fieldType == 'password'}
741
- <input
742
- autocomplete="new-password"
743
- type="password"
744
- placeholder={setting.placeholder}
745
- bind:value={$values[setting.key]}
746
- />
747
- {:else if setting.fieldType == 'boolean'}
748
- <div class="mt-0.5">
749
- <Toggle
750
- disabled={setting.ee_only != undefined && !$enterpriseLicense}
751
- bind:checked={$values[setting.key]}
897
+ {/if}
898
+ </div>
899
+ {:else if setting.fieldType == 'object_store_config'}
900
+ <ObjectStoreConfigSettings bind:bucket_config={$values[setting.key]} />
901
+ <div class="mb-6" />
902
+ {:else if setting.fieldType == 'number'}
903
+ <input
904
+ type="number"
905
+ placeholder={setting.placeholder}
906
+ bind:value={$values[setting.key]}
752
907
  />
753
- </div>
754
- {:else if setting.fieldType == 'seconds'}
755
- <div>
756
- <SecondsInput
757
- max={setting.ee_only != undefined && !$enterpriseLicense
758
- ? 60 * 60 * 24 * 30
759
- : undefined}
760
- bind:seconds={$values[setting.key]}
908
+ {:else if setting.fieldType == 'password'}
909
+ <input
910
+ autocomplete="new-password"
911
+ type="password"
912
+ placeholder={setting.placeholder}
913
+ bind:value={$values[setting.key]}
761
914
  />
762
- </div>
763
- {/if}
764
-
765
- {#if hasError}
766
- <span class="text-red-500 dark:text-red-400 text-sm">
767
- {setting.error ?? ''}
768
- </span>
915
+ {:else if setting.fieldType == 'boolean'}
916
+ <div class="mt-0.5">
917
+ <Toggle
918
+ disabled={setting.ee_only != undefined && !$enterpriseLicense}
919
+ bind:checked={$values[setting.key]}
920
+ />
921
+ </div>
922
+ {:else if setting.fieldType == 'seconds'}
923
+ <div>
924
+ <SecondsInput
925
+ max={setting.ee_only != undefined && !$enterpriseLicense
926
+ ? 60 * 60 * 24 * 30
927
+ : undefined}
928
+ bind:seconds={$values[setting.key]}
929
+ />
930
+ </div>
931
+ {:else if setting.fieldType == 'select'}
932
+ TODO
933
+ {/if}
934
+ {#if hasError}
935
+ <span class="text-red-500 dark:text-red-400 text-sm">
936
+ {setting.error ?? ''}
937
+ </span>
938
+ {/if}
939
+ {:else}
940
+ <input disabled placeholder="Loading..." />
769
941
  {/if}
770
- {:else}
771
- <input disabled placeholder="Loading..." />
772
- {/if}
773
- </label>
942
+ </label>
943
+ {/if}
774
944
  {/if}