@oneuptime/common 11.0.2 → 11.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/Models/DatabaseModels/Alert.ts +166 -0
  2. package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
  3. package/Models/DatabaseModels/AlertOwnerRule.ts +38 -0
  4. package/Models/DatabaseModels/DockerSwarmCluster.ts +989 -0
  5. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
  8. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
  9. package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
  10. package/Models/DatabaseModels/GlobalConfig.ts +19 -0
  11. package/Models/DatabaseModels/GlobalOidc.ts +351 -0
  12. package/Models/DatabaseModels/GlobalOidcProject.ts +265 -0
  13. package/Models/DatabaseModels/GlobalSso.ts +312 -0
  14. package/Models/DatabaseModels/GlobalSsoProject.ts +268 -0
  15. package/Models/DatabaseModels/Incident.ts +166 -0
  16. package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
  17. package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
  18. package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
  19. package/Models/DatabaseModels/Index.ts +32 -0
  20. package/Models/DatabaseModels/PodmanHost.ts +859 -0
  21. package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
  22. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
  23. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
  24. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
  25. package/Models/DatabaseModels/PodmanResource.ts +498 -0
  26. package/Models/DatabaseModels/Project.ts +31 -0
  27. package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
  28. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
  29. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
  30. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
  31. package/Models/DatabaseModels/StatusPage.ts +82 -0
  32. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  33. package/Server/API/DashboardAPI.ts +89 -0
  34. package/Server/API/DockerSwarmResourceAPI.ts +137 -0
  35. package/Server/API/StatusPageAPI.ts +2 -0
  36. package/Server/API/TelemetryAPI.ts +8 -1
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.ts +3199 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.ts +176 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.ts +25 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.ts +25 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.ts +38 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.ts +299 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.ts +21 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  45. package/Server/Middleware/UserAuthorization.ts +113 -42
  46. package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
  47. package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
  48. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
  49. package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
  50. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
  51. package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
  52. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
  53. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
  54. package/Server/Services/DockerSwarmClusterService.ts +404 -0
  55. package/Server/Services/DockerSwarmResourceService.ts +381 -0
  56. package/Server/Services/ExceptionAggregationService.ts +1 -0
  57. package/Server/Services/GlobalConfigService.ts +50 -0
  58. package/Server/Services/GlobalOidcProjectService.ts +85 -0
  59. package/Server/Services/GlobalOidcService.ts +10 -0
  60. package/Server/Services/GlobalSsoProjectService.ts +85 -0
  61. package/Server/Services/GlobalSsoService.ts +10 -0
  62. package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
  63. package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
  64. package/Server/Services/IncidentService.ts +11 -0
  65. package/Server/Services/Index.ts +22 -0
  66. package/Server/Services/LogAggregationService.ts +1 -0
  67. package/Server/Services/MetricAggregationService.ts +1 -0
  68. package/Server/Services/OpenTelemetryIngestService.ts +37 -0
  69. package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
  70. package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
  71. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
  72. package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
  73. package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
  74. package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
  75. package/Server/Services/PodmanHostService.ts +368 -0
  76. package/Server/Services/PodmanResourceService.ts +310 -0
  77. package/Server/Services/ProjectService.ts +44 -1
  78. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
  79. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
  80. package/Server/Services/TelemetryUsageBillingService.ts +18 -0
  81. package/Server/Services/TraceAggregationService.ts +1 -0
  82. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
  83. package/Server/Utils/Cookie.ts +39 -5
  84. package/Server/Utils/JsonWebToken.ts +7 -0
  85. package/Server/Utils/Monitor/MonitorAlert.ts +10 -0
  86. package/Server/Utils/Monitor/MonitorClusterContext.ts +35 -6
  87. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +306 -0
  88. package/Server/Utils/Monitor/MonitorIncident.ts +45 -0
  89. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +17 -0
  90. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -0
  91. package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
  92. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
  93. package/Server/Utils/Telemetry/Telemetry.ts +10 -0
  94. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -0
  95. package/Server/Utils/ValidateGlobalProviderProjectTeams.ts +119 -0
  96. package/Tests/Server/Middleware/UserAuthorization.test.ts +51 -13
  97. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +163 -0
  98. package/Tests/Server/Utils/CookieSSOToken.test.ts +130 -0
  99. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +1 -0
  100. package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
  101. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
  102. package/Types/Dashboard/DashboardComponentType.ts +7 -0
  103. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  104. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
  105. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
  106. package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
  107. package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
  108. package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
  109. package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
  110. package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
  111. package/Types/Dashboard/DashboardTemplates.ts +194 -0
  112. package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
  113. package/Types/Icon/IconProp.ts +1 -0
  114. package/Types/JsonWebTokenData.ts +3 -0
  115. package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
  116. package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
  117. package/Types/Monitor/HostAlertTemplates.ts +455 -0
  118. package/Types/Monitor/HostMetricCatalog.ts +177 -0
  119. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +21 -0
  120. package/Types/Monitor/MonitorStep.ts +99 -0
  121. package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
  122. package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
  123. package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
  124. package/Types/Monitor/MonitorType.ts +42 -0
  125. package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
  126. package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
  127. package/Types/Permission.ts +465 -4
  128. package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
  129. package/Types/SSO/SsoProviderType.ts +8 -0
  130. package/Types/Telemetry/EntityType.ts +12 -0
  131. package/Types/Telemetry/ServiceType.ts +2 -0
  132. package/UI/Components/Accordion/Accordion.tsx +5 -1
  133. package/UI/Components/CardSelect/CardSelect.tsx +6 -1
  134. package/UI/Components/CategoryCheckbox/Index.tsx +2 -1
  135. package/UI/Components/CodeEditor/CodeEditor.tsx +2 -0
  136. package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +8 -1
  137. package/UI/Components/Dropdown/Dropdown.tsx +2 -0
  138. package/UI/Components/EntityDropdown/EntityDropdown.tsx +3 -0
  139. package/UI/Components/FilePicker/FilePicker.tsx +2 -0
  140. package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -0
  141. package/UI/Components/Forms/Fields/FieldLabel.tsx +4 -0
  142. package/UI/Components/Forms/Fields/FormField.tsx +72 -15
  143. package/UI/Components/Forms/Fields/IconPicker.tsx +2 -0
  144. package/UI/Components/Forms/Validation.ts +107 -23
  145. package/UI/Components/Icon/Icon.tsx +57 -0
  146. package/UI/Components/Input/Input.tsx +4 -0
  147. package/UI/Components/Link/Link.tsx +23 -0
  148. package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
  149. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
  150. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  151. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +3 -0
  152. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +63 -2
  153. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +6 -0
  154. package/UI/Components/Radio/Radio.tsx +2 -0
  155. package/UI/Components/RadioButtons/GroupRadioButtons.tsx +6 -1
  156. package/UI/Components/Tabs/Tabs.tsx +63 -0
  157. package/UI/Components/TextArea/TextArea.tsx +2 -0
  158. package/UI/Components/TimePicker/TimePicker.tsx +2 -0
  159. package/UI/Components/Toggle/Toggle.tsx +2 -1
  160. package/UI/Components/Tooltip/Tooltip.tsx +6 -1
  161. package/UI/Utils/TelemetryService.ts +1 -0
  162. package/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.ts +70 -0
  163. package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
  164. package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
  165. package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
  166. package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
  167. package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
  168. package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
  169. package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -0
  170. package/Utils/Dashboard/Components/Index.ts +51 -0
  171. package/Utils/Telemetry/EntityKey.ts +18 -0
  172. package/build/dist/Models/DatabaseModels/Alert.js +162 -0
  173. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  174. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
  175. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
  177. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +1018 -0
  179. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
  180. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
  181. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
  182. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
  183. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
  184. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
  185. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
  186. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
  187. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
  188. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
  189. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js.map +1 -0
  190. package/build/dist/Models/DatabaseModels/GlobalConfig.js +20 -0
  191. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/GlobalOidc.js +379 -0
  193. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -0
  194. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +276 -0
  195. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -0
  196. package/build/dist/Models/DatabaseModels/GlobalSso.js +341 -0
  197. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -0
  198. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +279 -0
  199. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -0
  200. package/build/dist/Models/DatabaseModels/Incident.js +162 -0
  201. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
  203. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
  205. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
  207. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/Index.js +32 -0
  209. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
  211. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
  213. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
  215. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
  217. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
  219. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
  221. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/Project.js +32 -0
  223. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  224. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
  225. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  226. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
  227. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
  229. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  230. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
  231. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  232. package/build/dist/Models/DatabaseModels/StatusPage.js +84 -0
  233. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  234. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  235. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  236. package/build/dist/Server/API/DashboardAPI.js +89 -0
  237. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  238. package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
  239. package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
  240. package/build/dist/Server/API/StatusPageAPI.js +2 -0
  241. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  242. package/build/dist/Server/API/TelemetryAPI.js +8 -1
  243. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js +1100 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js +73 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js +14 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js +14 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js +23 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js +106 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js +14 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js.map +1 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  260. package/build/dist/Server/Middleware/UserAuthorization.js +77 -34
  261. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  262. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +30 -4
  263. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
  265. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  266. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +168 -0
  267. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
  268. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
  269. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
  270. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
  271. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
  272. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
  273. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
  274. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
  275. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
  276. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
  277. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
  278. package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
  279. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
  280. package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
  281. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
  282. package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
  283. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  284. package/build/dist/Server/Services/GlobalConfigService.js +55 -0
  285. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  286. package/build/dist/Server/Services/GlobalOidcProjectService.js +80 -0
  287. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -0
  288. package/build/dist/Server/Services/GlobalOidcService.js +9 -0
  289. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -0
  290. package/build/dist/Server/Services/GlobalSsoProjectService.js +80 -0
  291. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -0
  292. package/build/dist/Server/Services/GlobalSsoService.js +9 -0
  293. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -0
  294. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +28 -4
  295. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
  297. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentService.js +8 -0
  299. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  300. package/build/dist/Server/Services/Index.js +22 -0
  301. package/build/dist/Server/Services/Index.js.map +1 -1
  302. package/build/dist/Server/Services/LogAggregationService.js +1 -0
  303. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  304. package/build/dist/Server/Services/MetricAggregationService.js +1 -0
  305. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  306. package/build/dist/Server/Services/OpenTelemetryIngestService.js +43 -13
  307. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  308. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
  309. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
  310. package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
  311. package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
  312. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
  313. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
  314. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
  315. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
  316. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
  317. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
  318. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
  319. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
  320. package/build/dist/Server/Services/PodmanHostService.js +319 -0
  321. package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
  322. package/build/dist/Server/Services/PodmanResourceService.js +196 -0
  323. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
  324. package/build/dist/Server/Services/ProjectService.js +36 -1
  325. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  326. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
  327. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  328. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
  329. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  330. package/build/dist/Server/Services/TelemetryUsageBillingService.js +13 -0
  331. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  332. package/build/dist/Server/Services/TraceAggregationService.js +1 -0
  333. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  334. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
  335. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  336. package/build/dist/Server/Utils/Cookie.js +32 -3
  337. package/build/dist/Server/Utils/Cookie.js.map +1 -1
  338. package/build/dist/Server/Utils/JsonWebToken.js +6 -0
  339. package/build/dist/Server/Utils/JsonWebToken.js.map +1 -1
  340. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +8 -0
  341. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  342. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +35 -7
  343. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
  344. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +194 -0
  345. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  346. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +35 -1
  347. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  348. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +9 -0
  349. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  350. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -0
  351. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  352. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +16 -0
  353. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  354. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +30 -0
  355. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  356. package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
  357. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  358. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +18 -0
  359. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  360. package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js +66 -0
  361. package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js.map +1 -0
  362. package/build/dist/Types/Dashboard/DashboardComponentType.js +7 -0
  363. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  364. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  365. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  366. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js +2 -0
  367. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  368. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
  369. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  370. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
  371. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
  372. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
  373. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
  374. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
  375. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
  376. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
  377. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
  378. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
  379. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js.map +1 -0
  380. package/build/dist/Types/Dashboard/DashboardTemplates.js +168 -0
  381. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  382. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
  383. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
  384. package/build/dist/Types/Icon/IconProp.js +1 -0
  385. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  386. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +358 -0
  387. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
  388. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
  389. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
  390. package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
  391. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
  392. package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
  393. package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
  394. package/build/dist/Types/Monitor/MonitorStep.js +69 -0
  395. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  396. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js +21 -0
  397. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
  398. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
  399. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
  400. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
  401. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js.map +1 -0
  402. package/build/dist/Types/Monitor/MonitorType.js +39 -0
  403. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  404. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
  405. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
  406. package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
  407. package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
  408. package/build/dist/Types/Permission.js +420 -4
  409. package/build/dist/Types/Permission.js.map +1 -1
  410. package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
  411. package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
  412. package/build/dist/Types/SSO/SsoProviderType.js +9 -0
  413. package/build/dist/Types/SSO/SsoProviderType.js.map +1 -0
  414. package/build/dist/Types/Telemetry/EntityType.js +12 -0
  415. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  416. package/build/dist/Types/Telemetry/ServiceType.js +2 -0
  417. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  418. package/build/dist/UI/Components/Accordion/Accordion.js +5 -3
  419. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  420. package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
  421. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  422. package/build/dist/UI/Components/CategoryCheckbox/Index.js +1 -1
  423. package/build/dist/UI/Components/CategoryCheckbox/Index.js.map +1 -1
  424. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +1 -1
  425. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  426. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +4 -2
  427. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
  428. package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
  429. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  430. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +2 -2
  431. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  432. package/build/dist/UI/Components/FilePicker/FilePicker.js +1 -1
  433. package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
  434. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
  435. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  436. package/build/dist/UI/Components/Forms/Fields/FieldLabel.js +1 -1
  437. package/build/dist/UI/Components/Forms/Fields/FieldLabel.js.map +1 -1
  438. package/build/dist/UI/Components/Forms/Fields/FormField.js +58 -22
  439. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  440. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +1 -1
  441. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  442. package/build/dist/UI/Components/Forms/Validation.js +64 -15
  443. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  444. package/build/dist/UI/Components/Icon/Icon.js +16 -0
  445. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  446. package/build/dist/UI/Components/Input/Input.js +1 -1
  447. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  448. package/build/dist/UI/Components/Link/Link.js +22 -1
  449. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  450. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
  451. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  452. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
  453. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  454. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  455. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  456. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +2 -2
  457. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  458. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +46 -2
  459. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  460. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +6 -0
  461. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  462. package/build/dist/UI/Components/Radio/Radio.js +1 -1
  463. package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
  464. package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js +1 -1
  465. package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js.map +1 -1
  466. package/build/dist/UI/Components/Tabs/Tabs.js +50 -1
  467. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  468. package/build/dist/UI/Components/TextArea/TextArea.js +1 -1
  469. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  470. package/build/dist/UI/Components/TimePicker/TimePicker.js +1 -1
  471. package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
  472. package/build/dist/UI/Components/Toggle/Toggle.js +1 -1
  473. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  474. package/build/dist/UI/Components/Tooltip/Tooltip.js +6 -1
  475. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  476. package/build/dist/UI/Utils/TelemetryService.js +1 -0
  477. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  478. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js +55 -0
  479. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  480. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
  481. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
  482. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
  483. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  484. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
  485. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
  486. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
  487. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
  488. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
  489. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
  490. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
  491. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
  492. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
  493. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js.map +1 -0
  494. package/build/dist/Utils/Dashboard/Components/Index.js +28 -0
  495. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  496. package/build/dist/Utils/Telemetry/EntityKey.js +14 -0
  497. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  498. package/package.json +1 -1
@@ -35,7 +35,7 @@ import GenericObject from "../../../../Types/GenericObject";
35
35
  import { JSONValue } from "../../../../Types/JSON";
36
36
  import ObjectID from "../../../../Types/ObjectID";
37
37
  import Typeof from "../../../../Types/Typeof";
38
- import React, { ReactElement, useEffect } from "react";
38
+ import React, { ReactElement, useEffect, useId } from "react";
39
39
  import Radio, { RadioValue } from "../../Radio/Radio";
40
40
  import { BasicRadioButtonOption } from "../../RadioButtons/BasicRadioButtons";
41
41
  import HorizontalRule from "../../HorizontalRule/HorizontalRule";
@@ -67,6 +67,21 @@ const FormField: <T extends GenericObject>(
67
67
  props.field.placeholder,
68
68
  );
69
69
 
70
+ /*
71
+ * Unique, stable id used to programmatically associate the field's <label>
72
+ * (htmlFor) with its input control (id) for screen readers (WCAG 1.3.1).
73
+ * useId guarantees uniqueness even when the same field renders twice on a
74
+ * page (e.g. two subscribe forms inside tabs).
75
+ */
76
+ const fieldId: string = useId();
77
+
78
+ /*
79
+ * Id of the field's <label> element. Composite widgets (dropdowns, pickers,
80
+ * toggles, radio/checkbox groups) that cannot use htmlFor instead point at
81
+ * this via aria-labelledby so the control still has an accessible name.
82
+ */
83
+ const fieldLabelId: string = `${fieldId}-label`;
84
+
70
85
  type onChangeFunction = (value: JSONValue) => void;
71
86
 
72
87
  const onChange: onChangeFunction = (value: JSONValue): void => {
@@ -196,6 +211,30 @@ const FormField: <T extends GenericObject>(
196
211
 
197
212
  const index: number = props.index + 1;
198
213
 
214
+ /*
215
+ * Only native text-like controls (rendered via <Input> / <TextArea>) receive
216
+ * the generated id, so the label's htmlFor must only point at those to avoid
217
+ * a dangling association on composite widgets (dropdowns, pickers, etc.).
218
+ */
219
+ const fieldRendersLabelableInput: boolean = [
220
+ FormFieldSchemaType.Name,
221
+ FormFieldSchemaType.Email,
222
+ FormFieldSchemaType.Hostname,
223
+ FormFieldSchemaType.URL,
224
+ FormFieldSchemaType.Route,
225
+ FormFieldSchemaType.Text,
226
+ FormFieldSchemaType.Number,
227
+ FormFieldSchemaType.Password,
228
+ FormFieldSchemaType.EncryptedText,
229
+ FormFieldSchemaType.Date,
230
+ FormFieldSchemaType.DateTime,
231
+ FormFieldSchemaType.Port,
232
+ FormFieldSchemaType.Phone,
233
+ FormFieldSchemaType.Domain,
234
+ FormFieldSchemaType.PositiveNumber,
235
+ FormFieldSchemaType.LongText,
236
+ ].includes(props.field.fieldType as FormFieldSchemaType);
237
+
199
238
  const fieldType: string = props.field.fieldType
200
239
  ? getFieldType(props.field.fieldType)
201
240
  : "text";
@@ -313,6 +352,8 @@ const FormField: <T extends GenericObject>(
313
352
  {props.field.fieldType !== FormFieldSchemaType.Checkbox && (
314
353
  <FieldLabelElement
315
354
  title={props.field.title || ""}
355
+ id={fieldLabelId}
356
+ htmlFor={fieldRendersLabelableInput ? fieldId : undefined}
316
357
  description={getFieldDescription()}
317
358
  sideLink={props.field.sideLink}
318
359
  required={required}
@@ -325,8 +366,9 @@ const FormField: <T extends GenericObject>(
325
366
  {/* Time Picker */}
326
367
  {props.field.fieldType === FormFieldSchemaType.Time && (
327
368
  <TimePicker
369
+ ariaLabelledby={fieldLabelId}
328
370
  autoFocus={!props.disableAutofocus && index === 1}
329
- tabIndex={index}
371
+ tabIndex={0}
330
372
  disabled={props.isDisabled || props.field.disabled}
331
373
  error={props.touched && props.error ? props.error : undefined}
332
374
  dataTestId={props.field.dataTestId}
@@ -349,6 +391,7 @@ const FormField: <T extends GenericObject>(
349
391
 
350
392
  {props.field.fieldType === FormFieldSchemaType.Color && (
351
393
  <ColorPicker
394
+ ariaLabelledby={fieldLabelId}
352
395
  error={props.touched && props.error ? props.error : undefined}
353
396
  dataTestId={props.field.dataTestId}
354
397
  onChange={async (value: Color | null) => {
@@ -356,7 +399,7 @@ const FormField: <T extends GenericObject>(
356
399
  props.setFieldValue(props.fieldName, value);
357
400
  props.setFieldTouched(props.fieldName, true);
358
401
  }}
359
- tabIndex={index}
402
+ tabIndex={0}
360
403
  placeholder={translatedPlaceholder || ""}
361
404
  initialValue={
362
405
  props.currentValues &&
@@ -369,6 +412,7 @@ const FormField: <T extends GenericObject>(
369
412
 
370
413
  {props.field.fieldType === FormFieldSchemaType.Icon && (
371
414
  <IconPicker
415
+ ariaLabelledby={fieldLabelId}
372
416
  error={props.touched && props.error ? props.error : undefined}
373
417
  dataTestId={props.field.dataTestId}
374
418
  onChange={async (value: IconProp | null) => {
@@ -376,7 +420,7 @@ const FormField: <T extends GenericObject>(
376
420
  props.setFieldValue(props.fieldName, value);
377
421
  props.setFieldTouched(props.fieldName, true);
378
422
  }}
379
- tabIndex={index}
423
+ tabIndex={0}
380
424
  placeholder={translatedPlaceholder || ""}
381
425
  initialValue={
382
426
  props.currentValues &&
@@ -399,9 +443,10 @@ const FormField: <T extends GenericObject>(
399
443
  */
400
444
  (props.field.dropdownModal && props.field.dropdownModal.type ? (
401
445
  <EntityDropdown
446
+ ariaLabelledby={fieldLabelId}
402
447
  error={props.touched && props.error ? props.error : undefined}
403
448
  id={props.field.id}
404
- tabIndex={index}
449
+ tabIndex={0}
405
450
  dataTestId={props.field.dataTestId}
406
451
  onChange={(
407
452
  value: DropdownValue | Array<DropdownValue> | null,
@@ -430,9 +475,10 @@ const FormField: <T extends GenericObject>(
430
475
  />
431
476
  ) : (
432
477
  <Dropdown
478
+ ariaLabelledby={fieldLabelId}
433
479
  error={props.touched && props.error ? props.error : undefined}
434
480
  id={props.field.id}
435
- tabIndex={index}
481
+ tabIndex={0}
436
482
  dataTestId={props.field.dataTestId}
437
483
  onChange={async (
438
484
  value: DropdownValue | Array<DropdownValue> | null,
@@ -460,8 +506,9 @@ const FormField: <T extends GenericObject>(
460
506
 
461
507
  {props.field.fieldType === FormFieldSchemaType.CardSelect && (
462
508
  <CardSelect
509
+ ariaLabelledby={fieldLabelId}
463
510
  error={props.touched && props.error ? props.error : undefined}
464
- tabIndex={index}
511
+ tabIndex={0}
465
512
  dataTestId={props.field.dataTestId}
466
513
  singleColumn={props.field.cardSelectSingleColumn}
467
514
  onChange={(value: string) => {
@@ -480,7 +527,7 @@ const FormField: <T extends GenericObject>(
480
527
 
481
528
  {props.field.fieldType === FormFieldSchemaType.ObjectID && (
482
529
  <IDGenerator
483
- tabIndex={index}
530
+ tabIndex={0}
484
531
  dataTestId={props.field.dataTestId}
485
532
  disabled={props.isDisabled || props.field.disabled}
486
533
  error={props.touched && props.error ? props.error : undefined}
@@ -528,6 +575,7 @@ const FormField: <T extends GenericObject>(
528
575
  {props.field.fieldType ===
529
576
  FormFieldSchemaType.OptionChooserButton && (
530
577
  <RadioButtons
578
+ ariaLabelledby={fieldLabelId}
531
579
  error={props.touched && props.error ? props.error : undefined}
532
580
  dataTestId={props.field.dataTestId}
533
581
  onChange={async (value: string) => {
@@ -546,6 +594,7 @@ const FormField: <T extends GenericObject>(
546
594
 
547
595
  {props.field.fieldType === FormFieldSchemaType.RadioButton && (
548
596
  <Radio
597
+ ariaLabelledby={fieldLabelId}
549
598
  error={props.touched && props.error ? props.error : undefined}
550
599
  dataTestId={props.field.dataTestId}
551
600
  onChange={async (value: RadioValue | null) => {
@@ -574,8 +623,9 @@ const FormField: <T extends GenericObject>(
574
623
  {props.field.fieldType === FormFieldSchemaType.LongText && (
575
624
  <TextArea
576
625
  autoFocus={!props.disableAutofocus && index === 1}
626
+ id={fieldId}
577
627
  error={props.touched && props.error ? props.error : undefined}
578
- tabIndex={index}
628
+ tabIndex={0}
579
629
  dataTestId={props.field.dataTestId}
580
630
  disableSpellCheck={props.field.disableSpellCheck}
581
631
  onChange={async (value: string) => {
@@ -597,9 +647,10 @@ const FormField: <T extends GenericObject>(
597
647
 
598
648
  {props.field.fieldType === FormFieldSchemaType.JSON && (
599
649
  <CodeEditor
650
+ ariaLabelledby={fieldLabelId}
600
651
  error={props.touched && props.error ? props.error : undefined}
601
652
  type={CodeType.JSON}
602
- tabIndex={index}
653
+ tabIndex={0}
603
654
  dataTestId={props.field.dataTestId}
604
655
  onChange={async (value: string) => {
605
656
  onChange(value);
@@ -626,9 +677,10 @@ const FormField: <T extends GenericObject>(
626
677
 
627
678
  {props.field.fieldType === FormFieldSchemaType.Markdown && (
628
679
  <MarkdownEditor
680
+ ariaLabelledby={fieldLabelId}
629
681
  error={props.touched && props.error ? props.error : undefined}
630
682
  dataTestId={props.field.dataTestId}
631
- tabIndex={index}
683
+ tabIndex={0}
632
684
  disableSpellCheck={props.field.disableSpellCheck}
633
685
  onChange={async (value: string) => {
634
686
  onChange(value);
@@ -651,7 +703,7 @@ const FormField: <T extends GenericObject>(
651
703
  props.field.getCustomElement &&
652
704
  props.field.getCustomElement(props.currentValues, {
653
705
  error: props.touched && props.error ? props.error : undefined,
654
- tabIndex: index,
706
+ tabIndex: 0,
655
707
  onChange: async (value: string) => {
656
708
  onChange(value);
657
709
  props.setFieldValue(props.fieldName, value);
@@ -673,8 +725,9 @@ const FormField: <T extends GenericObject>(
673
725
  props.field.fieldType === FormFieldSchemaType.CSS ||
674
726
  props.field.fieldType === FormFieldSchemaType.JavaScript) && (
675
727
  <CodeEditor
728
+ ariaLabelledby={fieldLabelId}
676
729
  error={props.touched && props.error ? props.error : undefined}
677
- tabIndex={index}
730
+ tabIndex={0}
678
731
  onChange={async (value: string) => {
679
732
  onChange(value);
680
733
  props.setFieldValue(props.fieldName, value);
@@ -696,8 +749,9 @@ const FormField: <T extends GenericObject>(
696
749
 
697
750
  {isFileField && (
698
751
  <FilePicker
752
+ ariaLabelledby={fieldLabelId}
699
753
  error={props.touched && props.error ? props.error : undefined}
700
- tabIndex={index}
754
+ tabIndex={0}
701
755
  onChange={async (files: Array<FileModel>) => {
702
756
  const strippedFiles: Array<FileModel> = files.map(
703
757
  (i: FileModel) => {
@@ -753,6 +807,7 @@ const FormField: <T extends GenericObject>(
753
807
 
754
808
  {props.field.fieldType === FormFieldSchemaType.Toggle && (
755
809
  <Toggle
810
+ ariaLabelledby={fieldLabelId}
756
811
  error={props.touched && props.error ? props.error : undefined}
757
812
  onChange={async (value: boolean) => {
758
813
  onChange(value);
@@ -794,6 +849,7 @@ const FormField: <T extends GenericObject>(
794
849
 
795
850
  {props.field.fieldType === FormFieldSchemaType.CategoryCheckbox && (
796
851
  <CategoryCheckbox
852
+ ariaLabelledby={fieldLabelId}
797
853
  categories={props.field.categoryCheckboxProps?.categories || []}
798
854
  options={props.field.categoryCheckboxProps?.options || []}
799
855
  error={props.touched && props.error ? props.error : undefined}
@@ -829,7 +885,8 @@ const FormField: <T extends GenericObject>(
829
885
  props.field.fieldType === FormFieldSchemaType.PositiveNumber) && (
830
886
  <Input
831
887
  autoFocus={!props.disableAutofocus && index === 1}
832
- tabIndex={index}
888
+ id={fieldId}
889
+ tabIndex={0}
833
890
  disabled={props.isDisabled || props.field.disabled}
834
891
  error={props.touched && props.error ? props.error : undefined}
835
892
  dataTestId={props.field.dataTestId}
@@ -22,6 +22,7 @@ export interface ComponentProps {
22
22
  dataTestId?: string | undefined;
23
23
  onEnterPress?: (() => void) | undefined;
24
24
  error?: string | undefined;
25
+ ariaLabelledby?: string | undefined;
25
26
  }
26
27
 
27
28
  const IconPicker: FunctionComponent<ComponentProps> = (
@@ -93,6 +94,7 @@ const IconPicker: FunctionComponent<ComponentProps> = (
93
94
  readOnly={true}
94
95
  type={InputType.TEXT}
95
96
  tabIndex={props.tabIndex}
97
+ ariaLabelledby={props.ariaLabelledby}
96
98
  onChange={() => {}}
97
99
  onFocus={props.onFocus || undefined}
98
100
  />
@@ -17,6 +17,52 @@ import Phone from "../../../Types/Phone";
17
17
  import { Logger } from "../../Utils/Logger";
18
18
  import Port from "../../../Types/Port";
19
19
  import Typeof from "../../../Types/Typeof";
20
+ import i18next from "i18next";
21
+
22
+ type InterpolationValues = Record<string, string | number>;
23
+
24
+ const interpolateTemplate: (
25
+ template: string,
26
+ values: InterpolationValues,
27
+ ) => string = (template: string, values: InterpolationValues): string => {
28
+ return template.replace(
29
+ /\{\{(\w+)\}\}/g,
30
+ (match: string, key: string): string => {
31
+ return key in values ? String(values[key]) : match;
32
+ },
33
+ );
34
+ };
35
+
36
+ /*
37
+ * Localize a validation message (WCAG 3.1.2 Language of Parts). The English
38
+ * template — including any {{placeholders}} — doubles as the i18next flat key,
39
+ * so a locale file maps it to a translated template that keeps correct word
40
+ * order. When an i18next instance is initialized (e.g. the status page) the
41
+ * lookup + interpolation run through it; otherwise (apps that don't set up i18n)
42
+ * we fall back to JS-interpolating the English template, so placeholders are
43
+ * never shown literally and behavior is unchanged where i18n isn't set up.
44
+ */
45
+ const translateValidationMessage: (
46
+ template: string,
47
+ values?: InterpolationValues,
48
+ ) => string = (template: string, values: InterpolationValues = {}): string => {
49
+ const englishFallback: string = interpolateTemplate(template, values);
50
+ try {
51
+ if (!i18next.isInitialized) {
52
+ return englishFallback;
53
+ }
54
+ const translated: unknown = i18next.t(template, {
55
+ defaultValue: template,
56
+ keySeparator: false,
57
+ nsSeparator: false,
58
+ interpolation: { escapeValue: false },
59
+ ...values,
60
+ });
61
+ return typeof translated === "string" ? translated : englishFallback;
62
+ } catch {
63
+ return englishFallback;
64
+ }
65
+ };
20
66
 
21
67
  export default class Validation {
22
68
  public static validateLength<T extends GenericObject>(
@@ -26,35 +72,52 @@ export default class Validation {
26
72
  if (content && field.validation) {
27
73
  if (field.validation.minLength) {
28
74
  if (content.trim().length < field.validation?.minLength) {
29
- return `${field.title || name} cannot be less than ${
30
- field.validation.minLength
31
- } characters.`;
75
+ return translateValidationMessage(
76
+ "{{field}} cannot be less than {{minLength}} characters.",
77
+ {
78
+ field: field.title || field.name || "",
79
+ minLength: field.validation.minLength,
80
+ },
81
+ );
32
82
  }
33
83
  }
34
84
 
35
85
  if (field.validation.maxLength) {
36
86
  if (content.trim().length > field.validation?.maxLength) {
37
- return `${field.title || name} cannot be more than ${
38
- field.validation.maxLength
39
- } characters.`;
87
+ return translateValidationMessage(
88
+ "{{field}} cannot be more than {{maxLength}} characters.",
89
+ {
90
+ field: field.title || field.name || "",
91
+ maxLength: field.validation.maxLength,
92
+ },
93
+ );
40
94
  }
41
95
  }
42
96
 
43
97
  if (field.validation.noSpaces) {
44
98
  if (content.trim().includes(" ")) {
45
- return `${field.title || name} should not have spaces.`;
99
+ return translateValidationMessage(
100
+ "{{field}} should not have spaces.",
101
+ { field: field.title || field.name || "" },
102
+ );
46
103
  }
47
104
  }
48
105
 
49
106
  if (field.validation.noSpecialCharacters) {
50
107
  if (!content.match(/^[A-Za-z0-9_-]*$/)) {
51
- return `${field.title || name} can only contain letters, numbers, hyphens (-), and underscores (_).`;
108
+ return translateValidationMessage(
109
+ "{{field}} can only contain letters, numbers, hyphens (-), and underscores (_).",
110
+ { field: field.title || field.name || "" },
111
+ );
52
112
  }
53
113
  }
54
114
 
55
115
  if (field.validation.noNumbers) {
56
116
  if (!content.match(/^[A-Za-z]*$/)) {
57
- return `${field.title || name} should not have numbers.`;
117
+ return translateValidationMessage(
118
+ "{{field}} should not have numbers.",
119
+ { field: field.title || field.name || "" },
120
+ );
58
121
  }
59
122
  }
60
123
  }
@@ -68,7 +131,10 @@ export default class Validation {
68
131
  if (content && field.validation) {
69
132
  if (field.validation.dateShouldBeInTheFuture) {
70
133
  if (OneUptimeDate.isInThePast(content.trim())) {
71
- return `${field.title || name} should be a future date.`;
134
+ return translateValidationMessage(
135
+ "{{field}} should be a future date.",
136
+ { field: field.title || field.name || "" },
137
+ );
72
138
  }
73
139
  }
74
140
  }
@@ -85,23 +151,33 @@ export default class Validation {
85
151
  content = parseInt(content);
86
152
  } catch (e) {
87
153
  Logger.error(e as string);
88
- return `${field.title || name} should be a number.`;
154
+ return translateValidationMessage("{{field}} should be a number.", {
155
+ field: field.title || field.name || "",
156
+ });
89
157
  }
90
158
  }
91
159
 
92
160
  if (field.validation.maxValue) {
93
161
  if (content > field.validation?.maxValue) {
94
- return `${field.title || name} should not be more than ${
95
- field.validation?.maxValue
96
- }.`;
162
+ return translateValidationMessage(
163
+ "{{field}} should not be more than {{maxValue}}.",
164
+ {
165
+ field: field.title || field.name || "",
166
+ maxValue: field.validation.maxValue,
167
+ },
168
+ );
97
169
  }
98
170
  }
99
171
 
100
172
  if (field.validation.minValue) {
101
173
  if (content < field.validation?.minValue) {
102
- return `${field.title || name} should not be less than ${
103
- field.validation?.minValue
104
- }.`;
174
+ return translateValidationMessage(
175
+ "{{field}} should not be less than {{minValue}}.",
176
+ {
177
+ field: field.title || field.name || "",
178
+ minValue: field.validation.minValue,
179
+ },
180
+ );
105
181
  }
106
182
  }
107
183
  }
@@ -126,7 +202,9 @@ export default class Validation {
126
202
  }
127
203
 
128
204
  if (required && (!content || content.length === 0)) {
129
- return `${field.title} is required.`;
205
+ return translateValidationMessage("{{field}} is required.", {
206
+ field: field.title || field.name || "",
207
+ });
130
208
  }
131
209
  return null;
132
210
  }
@@ -143,9 +221,13 @@ export default class Validation {
143
221
  (entity[field.validation?.toMatchField] as string).toString().trim() !==
144
222
  content.trim()
145
223
  ) {
146
- return `${field.title} should match ${
147
- field.validation?.toMatchField as string
148
- }`;
224
+ return translateValidationMessage(
225
+ "{{field}} should match {{matchField}}",
226
+ {
227
+ field: field.title || field.name || "",
228
+ matchField: field.validation?.toMatchField as string,
229
+ },
230
+ );
149
231
  }
150
232
  return null;
151
233
  }
@@ -156,7 +238,7 @@ export default class Validation {
156
238
  ): string | null {
157
239
  if (content && field.fieldType === FormFieldSchemaType.Email) {
158
240
  if (!Email.isValid(content!)) {
159
- return "Email is not valid.";
241
+ return translateValidationMessage("Email is not valid.");
160
242
  }
161
243
  }
162
244
 
@@ -329,7 +411,9 @@ export default class Validation {
329
411
  }
330
412
  }
331
413
  } else if (field.required) {
332
- errors[name] = `${field.title || name} is required.`;
414
+ errors[name] = translateValidationMessage("{{field}} is required.", {
415
+ field: field.title || field.name || "",
416
+ });
333
417
  }
334
418
  }
335
419
 
@@ -2894,6 +2894,63 @@ const Icon: FunctionComponent<ComponentProps> = ({
2894
2894
  />
2895
2895
  </>,
2896
2896
  );
2897
+ } else if (icon === IconProp.Podman) {
2898
+ /*
2899
+ * Podman glyph — a pod (rounded enclosure) grouping containers, with a
2900
+ * small seal-head nod to Podman's mascot. Intentionally a hand-drawn
2901
+ * generic mark (not the official Podman seal logo / trademark), matching
2902
+ * the generic-glyph convention used for Kubernetes/Docker above and
2903
+ * deliberately distinct from the Docker whale.
2904
+ */
2905
+ return getSvgWrapper(
2906
+ <>
2907
+ {/* Pod enclosure */}
2908
+ <rect
2909
+ x="3"
2910
+ y="8"
2911
+ width="18"
2912
+ height="11"
2913
+ rx="2"
2914
+ strokeLinecap="round"
2915
+ strokeLinejoin="round"
2916
+ />
2917
+ {/* Grouped containers inside the pod */}
2918
+ <rect
2919
+ x="6"
2920
+ y="12"
2921
+ width="3.5"
2922
+ height="4"
2923
+ rx="0.4"
2924
+ strokeLinecap="round"
2925
+ strokeLinejoin="round"
2926
+ />
2927
+ <rect
2928
+ x="10.25"
2929
+ y="12"
2930
+ width="3.5"
2931
+ height="4"
2932
+ rx="0.4"
2933
+ strokeLinecap="round"
2934
+ strokeLinejoin="round"
2935
+ />
2936
+ <rect
2937
+ x="14.5"
2938
+ y="12"
2939
+ width="3.5"
2940
+ height="4"
2941
+ rx="0.4"
2942
+ strokeLinecap="round"
2943
+ strokeLinejoin="round"
2944
+ />
2945
+ {/* Seal head peeking over the pod */}
2946
+ <circle cx="17" cy="5.5" r="2" />
2947
+ <path
2948
+ strokeLinecap="round"
2949
+ strokeLinejoin="round"
2950
+ d="M19 6.2c1 0.1 1.8-0.2 2.4-0.9"
2951
+ />
2952
+ </>,
2953
+ );
2897
2954
  } else if (icon === IconProp.Proxmox) {
2898
2955
  /*
2899
2956
  * Generic hypervisor glyph — VM tiles running on a server base.
@@ -23,6 +23,8 @@ export enum InputType {
23
23
 
24
24
  export interface ComponentProps {
25
25
  initialValue?: undefined | string | Date;
26
+ id?: string | undefined;
27
+ ariaLabelledby?: string | undefined;
26
28
  onClick?: undefined | (() => void);
27
29
  placeholder?: undefined | string;
28
30
  className?: undefined | string;
@@ -155,11 +157,13 @@ const Input: FunctionComponent<ComponentProps> = (
155
157
  <input
156
158
  autoFocus={props.autoFocus}
157
159
  ref={ref}
160
+ id={props.id}
158
161
  onFocus={props.onFocus}
159
162
  onClick={props.onClick}
160
163
  data-testid={props.dataTestId}
161
164
  spellCheck={!props.disableSpellCheck}
162
165
  autoComplete={props.autoComplete}
166
+ aria-labelledby={props.ariaLabelledby}
163
167
  aria-invalid={props.error ? "true" : undefined}
164
168
  aria-describedby={props.error ? "input-error-message" : undefined}
165
169
  onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
@@ -41,6 +41,14 @@ const Link: FunctionComponent<ComponentProps> = (
41
41
  */
42
42
  if (props.to) {
43
43
  linkProps["href"] = props.to.toString();
44
+ } else if (props.onClick) {
45
+ /*
46
+ * An anchor with an onClick but no href is not reachable or operable via the
47
+ * keyboard. Expose it as a button so it is focusable and activatable with
48
+ * Enter/Space (WCAG 2.1.1). Purely visual — no appearance change.
49
+ */
50
+ linkProps["role"] = "button";
51
+ linkProps["tabIndex"] = 0;
44
52
  }
45
53
 
46
54
  if (props.openInNewTab) {
@@ -61,6 +69,21 @@ const Link: FunctionComponent<ComponentProps> = (
61
69
  style={props.style}
62
70
  title={props.title}
63
71
  aria-label={props.title}
72
+ onKeyDown={(event: React.KeyboardEvent<HTMLAnchorElement>) => {
73
+ /*
74
+ * For onClick-only links (no href) we render role="button"; activate them
75
+ * with Enter/Space like a native button. Links with an href are activated
76
+ * natively by the browser, so we leave those alone.
77
+ */
78
+ if (
79
+ !props.to &&
80
+ props.onClick &&
81
+ (event.key === "Enter" || event.key === " ")
82
+ ) {
83
+ event.preventDefault();
84
+ props.onClick();
85
+ }
86
+ }}
64
87
  onAuxClick={(event: React.MouseEvent<HTMLAnchorElement>) => {
65
88
  // middle click
66
89
  if (event.button === 1) {