windmill-components 1.433.0 → 1.444.0

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 (286) hide show
  1. package/package/components/ArgInput.svelte +12 -16
  2. package/package/components/ArgInput.svelte.d.ts +1 -0
  3. package/package/components/AssignableTags.svelte +3 -1
  4. package/package/components/AssignableTags.svelte.d.ts +1 -0
  5. package/package/components/AuthSettings.svelte +248 -0
  6. package/package/components/AuthSettings.svelte.d.ts +19 -0
  7. package/package/components/AutoscalingConfigEditor.svelte +2 -2
  8. package/package/components/CronInput.svelte +2 -2
  9. package/package/components/DeployWorkspace.svelte +1 -1
  10. package/package/components/Description.svelte +9 -0
  11. package/package/components/Description.svelte.d.ts +18 -0
  12. package/package/components/Dev.svelte +18 -3
  13. package/package/components/DisplayResult.svelte +7 -4
  14. package/package/components/DisplayResult.svelte.d.ts +1 -0
  15. package/package/components/DropdownV2.svelte +2 -1
  16. package/package/components/DropdownV2.svelte.d.ts +1 -0
  17. package/package/components/EditableSchemaForm.svelte +2 -2
  18. package/package/components/Editor.svelte +9 -6
  19. package/package/components/Editor.svelte.d.ts +4 -2
  20. package/package/components/EditorBar.svelte +51 -6
  21. package/package/components/ErrorOrRecoveryHandler.svelte +4 -3
  22. package/package/components/ExecutionDuration.svelte +2 -1
  23. package/package/components/FieldHeader.svelte +9 -1
  24. package/package/components/FieldHeader.svelte.d.ts +1 -0
  25. package/package/components/FlowBuilder.svelte +16 -3
  26. package/package/components/FlowGraphViewer.svelte +2 -0
  27. package/package/components/FlowPreviewContent.svelte +6 -15
  28. package/package/components/FlowStatusViewerInner.svelte +80 -55
  29. package/package/components/FlowStatusViewerInner.svelte.d.ts +1 -0
  30. package/package/components/HighlightCode.svelte +3 -0
  31. package/package/components/InputTransformSchemaForm.svelte +1 -1
  32. package/package/components/InstanceSetting.svelte +774 -0
  33. package/package/components/InstanceSetting.svelte.d.ts +27 -0
  34. package/package/components/InstanceSettings.svelte +68 -1005
  35. package/package/components/InstanceSettings.svelte.d.ts +0 -4
  36. package/package/components/Label.svelte +16 -6
  37. package/package/components/Label.svelte.d.ts +3 -0
  38. package/package/components/Login.svelte +17 -9
  39. package/package/components/OAuthSetting.svelte +4 -3
  40. package/package/components/OauthExtraParams.svelte +1 -1
  41. package/package/components/OauthScopes.svelte +2 -2
  42. package/package/components/ObjectStoreConfigSettings.svelte +141 -128
  43. package/package/components/QueueMetricsDrawer.svelte +5 -5
  44. package/package/components/ResourceEditor.svelte +4 -0
  45. package/package/components/ResourceEditor.svelte.d.ts +1 -0
  46. package/package/components/ResourceEditorDrawer.svelte +15 -3
  47. package/package/components/ResourceEditorDrawer.svelte.d.ts +2 -2
  48. package/package/components/ResourcePicker.svelte +16 -5
  49. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  50. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  51. package/package/components/RunPageSchedules.svelte +15 -10
  52. package/package/components/SavedInputs.svelte +1 -1
  53. package/package/components/ScheduleEditorInner.svelte +58 -27
  54. package/package/components/SchemaForm.svelte +7 -5
  55. package/package/components/SchemaForm.svelte.d.ts +1 -0
  56. package/package/components/ScriptBuilder.svelte +58 -5
  57. package/package/components/ScriptEditor.svelte +78 -40
  58. package/package/components/ScriptEditor.svelte.d.ts +17 -2
  59. package/package/components/ScriptPicker.svelte +41 -34
  60. package/package/components/ScriptPicker.svelte.d.ts +1 -0
  61. package/package/components/ScriptVersionHistory.svelte +1 -1
  62. package/package/components/Section.svelte +38 -35
  63. package/package/components/Section.svelte.d.ts +2 -0
  64. package/package/components/ServiceLogsInner.svelte +1 -1
  65. package/package/components/SimpleEditor.svelte +2 -0
  66. package/package/components/Subsection.svelte +52 -0
  67. package/package/components/Subsection.svelte.d.ts +27 -0
  68. package/package/components/SuperadminSettings.svelte +23 -13
  69. package/package/components/TemplateEditor.svelte +4 -3
  70. package/package/components/TestConnection.svelte +5 -0
  71. package/package/components/TestJobLoader.svelte +2 -1
  72. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  73. package/package/components/Toggle.svelte +2 -4
  74. package/package/components/UserSettings.svelte +1 -1
  75. package/package/components/WorkerGroup.svelte +4 -4
  76. package/package/components/WorkerTagPicker.svelte +4 -2
  77. package/package/components/WorkerTagPicker.svelte.d.ts +1 -0
  78. package/package/components/WorkerTagSelect.svelte +2 -0
  79. package/package/components/WorkerTagSelect.svelte.d.ts +1 -0
  80. package/package/components/apps/components/display/AppDisplayComponent.svelte +2 -1
  81. package/package/components/apps/components/display/dbtable/utils.js +26 -1
  82. package/package/components/apps/components/helpers/RunnableComponent.svelte +8 -2
  83. package/package/components/apps/components/inputs/AppDateInput.svelte +7 -1
  84. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -1
  85. package/package/components/apps/editor/AppEditor.svelte +5 -34
  86. package/package/components/apps/editor/AppEditor.svelte.d.ts +1 -0
  87. package/package/components/apps/editor/AppEditorBottomPanel.svelte +4 -7
  88. package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +1 -3
  89. package/package/components/apps/editor/AppEditorHeader.svelte +148 -58
  90. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +1 -0
  91. package/package/components/apps/editor/DeploymentHistory.svelte +1 -1
  92. package/package/components/apps/editor/RunnableJobPanel.svelte +6 -2
  93. package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +1 -0
  94. package/package/components/apps/editor/appUtils.d.ts +1 -0
  95. package/package/components/apps/editor/appUtils.js +17 -0
  96. package/package/components/apps/editor/component/components.d.ts +82 -81
  97. package/package/components/apps/editor/component/components.js +4 -3
  98. package/package/components/apps/editor/componentsPanel/ComponentList.svelte +1 -1
  99. package/package/components/apps/editor/componentsPanel/GroupList.svelte +12 -2
  100. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +1 -1
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +1 -1
  102. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +53 -56
  103. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +1 -1
  104. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +3 -2
  105. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +1 -1
  106. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +16 -9
  107. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte.d.ts +1 -0
  108. package/package/components/apps/inputType.d.ts +2 -2
  109. package/package/components/apps/types.d.ts +2 -0
  110. package/package/components/common/alert/ConnectionIndicator.svelte +30 -0
  111. package/package/components/common/alert/ConnectionIndicator.svelte.d.ts +20 -0
  112. package/package/components/common/alert/Notification.svelte +15 -0
  113. package/package/components/common/alert/Notification.svelte.d.ts +17 -0
  114. package/package/components/common/button/AnimatedButton.svelte +1 -1
  115. package/package/components/common/button/RefreshButton.svelte +30 -0
  116. package/package/components/common/button/RefreshButton.svelte.d.ts +18 -0
  117. package/package/components/common/fileDownload/FileDownload.svelte +4 -3
  118. package/package/components/common/fileDownload/FileDownload.svelte.d.ts +1 -0
  119. package/package/components/common/fileUpload/FileUpload.svelte +3 -3
  120. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  121. package/package/components/common/layout/List.svelte +35 -0
  122. package/package/components/common/layout/List.svelte.d.ts +21 -0
  123. package/package/components/common/layout/ListElement.svelte +3 -0
  124. package/package/components/common/layout/ListElement.svelte.d.ts +27 -0
  125. package/package/components/common/menu/MenuV2.svelte +3 -2
  126. package/package/components/common/menu/MenuV2.svelte.d.ts +1 -0
  127. package/package/components/common/modal/Modal.svelte +6 -4
  128. package/package/components/common/modal/Modal.svelte.d.ts +1 -0
  129. package/package/components/common/modal/Modal2.svelte +101 -0
  130. package/package/components/common/modal/Modal2.svelte.d.ts +28 -0
  131. package/package/components/common/popup/Popup.svelte +5 -1
  132. package/package/components/common/popup/Popup.svelte.d.ts +2 -0
  133. package/package/components/common/toggleButton-v2/ToggleButton.svelte +1 -1
  134. package/package/components/copilot/FlowCopilotStatus.svelte +1 -1
  135. package/package/components/details/ClipboardPanel.svelte +12 -2
  136. package/package/components/details/ClipboardPanel.svelte.d.ts +2 -0
  137. package/package/components/details/CopyableCodeBlock.svelte +24 -0
  138. package/package/components/details/CopyableCodeBlock.svelte.d.ts +19 -0
  139. package/package/components/details/DetailPageLayout.svelte +3 -1
  140. package/package/components/details/EmailTriggerConfigSection.svelte +119 -0
  141. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +38 -0
  142. package/package/components/details/EmailTriggerPanel.svelte +27 -74
  143. package/package/components/details/EmailTriggerPanel.svelte.d.ts +7 -1
  144. package/package/components/flows/FlowEditor.svelte +1 -1
  145. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  146. package/package/components/flows/FlowHistoryInner.svelte +1 -1
  147. package/package/components/flows/content/BranchPredicateEditor.svelte +1 -1
  148. package/package/components/flows/content/FlowEditorPanel.svelte +30 -1
  149. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +2 -0
  150. package/package/components/flows/content/FlowInput.svelte +2 -15
  151. package/package/components/flows/content/FlowInputs.svelte +1 -1
  152. package/package/components/flows/content/FlowInputsQuick.svelte +2 -2
  153. package/package/components/flows/content/FlowModuleComponent.svelte +9 -5
  154. package/package/components/flows/content/FlowModuleEarlyStop.svelte +2 -2
  155. package/package/components/flows/content/FlowModuleHeader.svelte +4 -1
  156. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
  157. package/package/components/flows/content/FlowPathViewer.svelte +3 -1
  158. package/package/components/flows/content/FlowRetries.svelte +32 -5
  159. package/package/components/flows/content/FlowSettings.svelte +56 -48
  160. package/package/components/flows/flowStateUtils.d.ts +10 -1
  161. package/package/components/flows/flowStateUtils.js +23 -0
  162. package/package/components/flows/map/FlowModuleSchemaMap.svelte +9 -19
  163. package/package/components/flows/map/InsertModuleButton.svelte +3 -3
  164. package/package/components/flows/map/VirtualItem.svelte +29 -1
  165. package/package/components/flows/map/VirtualItem.svelte.d.ts +2 -0
  166. package/package/components/flows/pickers/TopLevelNode.svelte +2 -2
  167. package/package/components/flows/previousResults.js +8 -2
  168. package/package/components/flows/types.d.ts +1 -0
  169. package/package/components/graph/FlowGraphV2.svelte +16 -2
  170. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -0
  171. package/package/components/graph/graphBuilder.js +1 -0
  172. package/package/components/graph/renderers/nodes/InputNode.svelte +2 -0
  173. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +2 -0
  174. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +1 -1
  175. package/package/components/icons/CSharpIcon.svelte +14 -0
  176. package/package/components/icons/CSharpIcon.svelte.d.ts +25 -0
  177. package/package/components/icons/GitIcon.svelte +5 -2
  178. package/package/components/icons/XeroIcon.svelte +24 -0
  179. package/package/components/icons/XeroIcon.svelte.d.ts +17 -0
  180. package/package/components/icons/index.d.ts +3 -1
  181. package/package/components/icons/index.js +4 -2
  182. package/package/components/instanceSettings.d.ts +3 -1
  183. package/package/components/instanceSettings.js +77 -69
  184. package/package/components/meltComponents/Popover.svelte +82 -0
  185. package/package/components/meltComponents/Popover.svelte.d.ts +21 -0
  186. package/package/components/propertyPicker/PropPicker.svelte +5 -3
  187. package/package/components/runs/JobLoader.svelte +5 -2
  188. package/package/components/runs/JobPreview.svelte +5 -5
  189. package/package/components/runs/RunRow.svelte +3 -4
  190. package/package/components/runs/RunsFilter.svelte +4 -4
  191. package/package/components/schema/EditableSchemaDrawer.svelte +4 -4
  192. package/package/components/schema/PropertyEditor.svelte +1 -1
  193. package/package/components/schema/SchemaFormDND.svelte +2 -0
  194. package/package/components/schema/SchemaFormDND.svelte.d.ts +1 -0
  195. package/package/components/scriptEditor/LogPanel.svelte +176 -164
  196. package/package/components/scriptEditor/LogPanel.svelte.d.ts +2 -0
  197. package/package/components/search/GlobalSearchModal.svelte +3 -3
  198. package/package/components/sidebar/CriticalAlertModal.svelte +155 -9
  199. package/package/components/sidebar/CriticalAlertModalInner.svelte +65 -212
  200. package/package/components/sidebar/CriticalAlertModalInner.svelte.d.ts +2 -4
  201. package/package/components/sidebar/CriticalAlertTable.svelte +142 -0
  202. package/package/components/sidebar/CriticalAlertTable.svelte.d.ts +25 -0
  203. package/package/components/sidebar/OperatorMenu.svelte +30 -8
  204. package/package/components/sidebar/SideBarNotification.svelte +3 -6
  205. package/package/components/sidebar/SidebarContent.svelte +5 -5
  206. package/package/components/sidebar/WorkspaceMenu.svelte +9 -5
  207. package/package/components/sidebar/WorkspaceMenu.svelte.d.ts +1 -0
  208. package/package/components/sidebar/changelogs.js +82 -17
  209. package/package/components/splitPanes/SplitPanesOrColumnOnMobile.svelte +21 -21
  210. package/package/components/table/AutoDataTable.svelte +1 -1
  211. package/package/components/table/Cell.svelte +5 -3
  212. package/package/components/table/Cell.svelte.d.ts +1 -0
  213. package/package/components/table/DataTable.svelte +65 -58
  214. package/package/components/table/DataTable.svelte.d.ts +2 -0
  215. package/package/components/table/Head.svelte +1 -1
  216. package/package/components/table/Row.svelte +3 -1
  217. package/package/components/table/Row.svelte.d.ts +1 -0
  218. package/package/components/toast.js +3 -1
  219. package/package/components/triggers/CaptureButton.svelte +77 -0
  220. package/package/components/triggers/CaptureButton.svelte.d.ts +16 -0
  221. package/package/components/triggers/CaptureIcon.svelte +17 -0
  222. package/package/components/triggers/CaptureIcon.svelte.d.ts +23 -0
  223. package/package/components/triggers/CaptureSection.svelte +76 -0
  224. package/package/components/triggers/CaptureSection.svelte.d.ts +42 -0
  225. package/package/components/triggers/CaptureTable.svelte +224 -0
  226. package/package/components/triggers/CaptureTable.svelte.d.ts +43 -0
  227. package/package/components/triggers/CaptureWrapper.svelte +237 -0
  228. package/package/components/triggers/CaptureWrapper.svelte.d.ts +35 -0
  229. package/package/components/triggers/KafkaTriggerEditor.svelte +2 -2
  230. package/package/components/triggers/KafkaTriggerEditor.svelte.d.ts +2 -2
  231. package/package/components/triggers/KafkaTriggerEditorInner.svelte +47 -119
  232. package/package/components/triggers/KafkaTriggerEditorInner.svelte.d.ts +2 -2
  233. package/package/components/triggers/KafkaTriggersConfigSection.svelte +215 -0
  234. package/package/components/triggers/KafkaTriggersConfigSection.svelte.d.ts +36 -0
  235. package/package/components/triggers/KafkaTriggersPanel.svelte +73 -45
  236. package/package/components/triggers/KafkaTriggersPanel.svelte.d.ts +6 -0
  237. package/package/components/triggers/RouteEditor.svelte +2 -2
  238. package/package/components/triggers/RouteEditor.svelte.d.ts +2 -2
  239. package/package/components/triggers/RouteEditorConfigSection.svelte +162 -0
  240. package/package/components/triggers/RouteEditorConfigSection.svelte.d.ts +43 -0
  241. package/package/components/triggers/RouteEditorInner.svelte +98 -163
  242. package/package/components/triggers/RouteEditorInner.svelte.d.ts +2 -2
  243. package/package/components/triggers/RoutesPanel.svelte +69 -54
  244. package/package/components/triggers/RoutesPanel.svelte.d.ts +5 -0
  245. package/package/components/triggers/ScheduledPollPanel.svelte +5 -9
  246. package/package/components/triggers/TriggersEditor.svelte +119 -89
  247. package/package/components/triggers/TriggersEditor.svelte.d.ts +7 -0
  248. package/package/components/triggers/TriggersEditorSection.svelte +109 -0
  249. package/package/components/triggers/TriggersEditorSection.svelte.d.ts +29 -0
  250. package/package/components/triggers/TriggersWrapper.svelte +60 -0
  251. package/package/components/triggers/TriggersWrapper.svelte.d.ts +21 -0
  252. package/package/components/triggers/WebhooksConfigSection.svelte +382 -0
  253. package/package/components/triggers/WebhooksConfigSection.svelte.d.ts +39 -0
  254. package/package/components/triggers/WebhooksPanel.svelte +32 -331
  255. package/package/components/triggers/WebhooksPanel.svelte.d.ts +7 -1
  256. package/package/components/triggers/WebsocketEditorConfigSection.svelte +176 -0
  257. package/package/components/triggers/WebsocketEditorConfigSection.svelte.d.ts +37 -0
  258. package/package/components/triggers/WebsocketTriggerEditor.svelte +2 -2
  259. package/package/components/triggers/WebsocketTriggerEditor.svelte.d.ts +2 -2
  260. package/package/components/triggers/WebsocketTriggerEditorInner.svelte +29 -150
  261. package/package/components/triggers/WebsocketTriggerEditorInner.svelte.d.ts +2 -2
  262. package/package/components/triggers/WebsocketTriggersPanel.svelte +70 -45
  263. package/package/components/triggers/WebsocketTriggersPanel.svelte.d.ts +6 -0
  264. package/package/components/triggers.d.ts +6 -2
  265. package/package/components/triggers.js +16 -0
  266. package/package/components/wizards/AgGridWizard.svelte +4 -4
  267. package/package/editorUtils.d.ts +2 -0
  268. package/package/editorUtils.js +6 -3
  269. package/package/gen/core/OpenAPI.js +1 -1
  270. package/package/gen/schemas.gen.d.ts +17 -8
  271. package/package/gen/schemas.gen.js +17 -8
  272. package/package/gen/services.gen.d.ts +55 -5
  273. package/package/gen/services.gen.js +108 -5
  274. package/package/gen/types.gen.d.ts +180 -13
  275. package/package/hubPaths.json +6 -3
  276. package/package/infer.js +9 -0
  277. package/package/script_helpers.d.ts +5 -0
  278. package/package/script_helpers.js +68 -8
  279. package/package/scripts.d.ts +1 -1
  280. package/package/scripts.js +5 -1
  281. package/package/stores.d.ts +1 -0
  282. package/package/utils.d.ts +3 -1
  283. package/package/utils.js +20 -4
  284. package/package.json +11 -8
  285. package/package/components/flows/content/CapturePayload.svelte +0 -114
  286. package/package/components/flows/content/CapturePayload.svelte.d.ts +0 -17
@@ -0,0 +1,774 @@
1
+ <script>import { isCloudHosted } from '../cloud';
2
+ import { enterpriseLicense, isCriticalAlertsUIOpen } from '../stores';
3
+ import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, Slack, X } from 'lucide-svelte';
4
+ import Tooltip from './Tooltip.svelte';
5
+ import ObjectStoreConfigSettings from './ObjectStoreConfigSettings.svelte';
6
+ import { sendUserToast } from '../toast';
7
+ import ConfirmButton from './ConfirmButton.svelte';
8
+ import { IndexSearchService, SettingService } from '../gen';
9
+ import { Button, SecondsInput, Skeleton } from './common';
10
+ import Password from './Password.svelte';
11
+ import { classNames } from '../utils';
12
+ import Popover from './Popover.svelte';
13
+ import Toggle from './Toggle.svelte';
14
+ import { createEventDispatcher } from 'svelte';
15
+ import { fade } from 'svelte/transition';
16
+ import { base } from '../base';
17
+ import SimpleEditor from './SimpleEditor.svelte';
18
+ export let setting;
19
+ export let version;
20
+ export let values;
21
+ export let loading = true;
22
+ const dispatch = createEventDispatcher();
23
+ let latestKeyRenewalAttempt;
24
+ function showSetting(setting, values) {
25
+ if (setting == 'dev_instance') {
26
+ if (values['license_key'] == undefined) {
27
+ return false;
28
+ }
29
+ }
30
+ return true;
31
+ }
32
+ let licenseKeyChanged = false;
33
+ let renewing = false;
34
+ let opening = false;
35
+ async function reloadKeyrenewalAttemptInfo() {
36
+ latestKeyRenewalAttempt = await SettingService.getLatestKeyRenewalAttempt();
37
+ }
38
+ if (setting.key == 'license_key') {
39
+ reloadKeyrenewalAttemptInfo();
40
+ }
41
+ export async function renewLicenseKey() {
42
+ renewing = true;
43
+ try {
44
+ await SettingService.renewLicenseKey({
45
+ licenseKey: $values['license_key'] || undefined
46
+ });
47
+ sendUserToast('Key renewal successful');
48
+ reloadKeyrenewalAttemptInfo();
49
+ }
50
+ catch (err) {
51
+ latestKeyRenewalAttempt = await SettingService.getLatestKeyRenewalAttempt();
52
+ throw err;
53
+ }
54
+ finally {
55
+ renewing = false;
56
+ }
57
+ }
58
+ export async function openCustomerPortal() {
59
+ opening = true;
60
+ try {
61
+ const url = await SettingService.createCustomerPortalSession({
62
+ licenseKey: $values['license_key'] || undefined
63
+ });
64
+ window.open(url, '_blank');
65
+ }
66
+ finally {
67
+ opening = false;
68
+ }
69
+ }
70
+ function parseLicenseKey(key) {
71
+ let splitted = key.split('.');
72
+ if (splitted.length >= 3) {
73
+ try {
74
+ let i = parseInt(splitted[1]);
75
+ let date = new Date(i * 1000);
76
+ const stringDate = date.toLocaleDateString();
77
+ if (stringDate !== 'Invalid Date') {
78
+ return {
79
+ valid: date.getTime() > Date.now(),
80
+ expiration: date.toLocaleDateString()
81
+ };
82
+ }
83
+ }
84
+ catch { }
85
+ }
86
+ return {
87
+ valid: false
88
+ };
89
+ }
90
+ </script>
91
+
92
+ {#if (!setting.cloudonly || isCloudHosted()) && showSetting(setting.key, $values) && !(setting.hiddenIfNull && $values[setting.key] == null)}
93
+ {#if setting.ee_only != undefined && !$enterpriseLicense}
94
+ <div class="flex text-xs items-center gap-1 text-yellow-500 whitespace-nowrap">
95
+ <AlertTriangle size={16} />
96
+ EE only {#if setting.ee_only != ''}<Tooltip>{setting.ee_only}</Tooltip>{/if}
97
+ </div>
98
+ {/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>
137
+ {/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
172
+ placeholder={setting.placeholder}
173
+ on:keydown={() => {
174
+ licenseKeyChanged = true
175
+ }}
176
+ bind:password={$values[setting.key]}
177
+ />
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>
265
+ </div>
266
+ {/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
272
+ >
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
+ </div>
285
+ {/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 }}
295
+ />
296
+ <div class="flex flex-row">
297
+ <Button
298
+ variant="border"
299
+ color="light"
300
+ disabled={!$enterpriseLicense}
301
+ size="xs"
302
+ on:click={() => {
303
+ isCriticalAlertsUIOpen.set(true)
304
+ dispatch('closeDrawer')
305
+ }}
306
+ >
307
+ Show critical alerts
308
+ </Button>
309
+ </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'}
327
+ >
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) => {
336
+ if (e.target?.['value']) {
337
+ $values[setting.key][i] = {
338
+ slack_channel: e.target['value']
339
+ }
340
+ }
341
+ }}
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']
352
+ }
353
+ }
354
+ }}
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}
371
+ </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">
392
+ <Button
393
+ disabled={!$enterpriseLicense}
394
+ variant="border"
395
+ color="light"
396
+ 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)
405
+ }
406
+ }}
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 }}
435
+ disabled={!$enterpriseLicense}
436
+ >
437
+ Connect to Slack
438
+ </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
453
+ 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
+ }
519
+ }
520
+ }}
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
+ >
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
+ />
558
+ </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
573
+ 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
+ }
645
+ }}
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
+ >
683
+ <input
684
+ 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
+ >
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
706
+ >
707
+ gRPC
708
+ </div>
709
+ <!-- <div>
710
+ <label for="OTEL_EXPORTER_OTLP_PROTOCOL" class="block text-sm font-medium"
711
+ >Protocol<span class="text-2xs text-tertiary ml-4"
712
+ >grpc, http/protobuf, http/json</span
713
+ ></label
714
+ >
715
+ <input
716
+ type="text"
717
+ id="OTEL_EXPORTER_OTLP_PROTOCOL"
718
+ placeholder="grpc"
719
+ bind:value={$values[setting.key].otel_exporter_otlp_protocol}
720
+ />
721
+ </div>
722
+ <div>
723
+ <label for="OTEL_EXPORTER_OTLP_COMPRESSION" class="block text-sm font-medium"
724
+ >Compression <span class="text-2xs text-tertiary ml-4">none, gzip</span></label
725
+ >
726
+ <input
727
+ type="text"
728
+ id="OTEL_EXPORTER_OTLP_COMPRESSION"
729
+ placeholder="none"
730
+ bind:value={$values[setting.key].otel_exporter_otlp_compression}
731
+ />
732
+ </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]}
752
+ />
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]}
761
+ />
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>
769
+ {/if}
770
+ {:else}
771
+ <input disabled placeholder="Loading..." />
772
+ {/if}
773
+ </label>
774
+ {/if}