@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.
- package/Models/DatabaseModels/Alert.ts +166 -0
- package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
- package/Models/DatabaseModels/AlertOwnerRule.ts +38 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +989 -0
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
- package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
- package/Models/DatabaseModels/GlobalConfig.ts +19 -0
- package/Models/DatabaseModels/GlobalOidc.ts +351 -0
- package/Models/DatabaseModels/GlobalOidcProject.ts +265 -0
- package/Models/DatabaseModels/GlobalSso.ts +312 -0
- package/Models/DatabaseModels/GlobalSsoProject.ts +268 -0
- package/Models/DatabaseModels/Incident.ts +166 -0
- package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
- package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
- package/Models/DatabaseModels/Index.ts +32 -0
- package/Models/DatabaseModels/PodmanHost.ts +859 -0
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
- package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
- package/Models/DatabaseModels/PodmanResource.ts +498 -0
- package/Models/DatabaseModels/Project.ts +31 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
- package/Models/DatabaseModels/StatusPage.ts +82 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Server/API/DashboardAPI.ts +89 -0
- package/Server/API/DockerSwarmResourceAPI.ts +137 -0
- package/Server/API/StatusPageAPI.ts +2 -0
- package/Server/API/TelemetryAPI.ts +8 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.ts +3199 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.ts +176 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.ts +299 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/UserAuthorization.ts +113 -42
- package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
- package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
- package/Server/Services/DockerSwarmClusterService.ts +404 -0
- package/Server/Services/DockerSwarmResourceService.ts +381 -0
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GlobalConfigService.ts +50 -0
- package/Server/Services/GlobalOidcProjectService.ts +85 -0
- package/Server/Services/GlobalOidcService.ts +10 -0
- package/Server/Services/GlobalSsoProjectService.ts +85 -0
- package/Server/Services/GlobalSsoService.ts +10 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
- package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +22 -0
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
- package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
- package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
- package/Server/Services/PodmanHostService.ts +368 -0
- package/Server/Services/PodmanResourceService.ts +310 -0
- package/Server/Services/ProjectService.ts +44 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
- package/Server/Services/TelemetryUsageBillingService.ts +18 -0
- package/Server/Services/TraceAggregationService.ts +1 -0
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
- package/Server/Utils/Cookie.ts +39 -5
- package/Server/Utils/JsonWebToken.ts +7 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +10 -0
- package/Server/Utils/Monitor/MonitorClusterContext.ts +35 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +306 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +45 -0
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +17 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
- package/Server/Utils/Telemetry/Telemetry.ts +10 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -0
- package/Server/Utils/ValidateGlobalProviderProjectTeams.ts +119 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +51 -13
- package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +163 -0
- package/Tests/Server/Utils/CookieSSOToken.test.ts +130 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +1 -0
- package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
- package/Types/Dashboard/DashboardComponentType.ts +7 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
- package/Types/Dashboard/DashboardTemplates.ts +194 -0
- package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JsonWebTokenData.ts +3 -0
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
- package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
- package/Types/Monitor/HostAlertTemplates.ts +455 -0
- package/Types/Monitor/HostMetricCatalog.ts +177 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +21 -0
- package/Types/Monitor/MonitorStep.ts +99 -0
- package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
- package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
- package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
- package/Types/Monitor/MonitorType.ts +42 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
- package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
- package/Types/Permission.ts +465 -4
- package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
- package/Types/SSO/SsoProviderType.ts +8 -0
- package/Types/Telemetry/EntityType.ts +12 -0
- package/Types/Telemetry/ServiceType.ts +2 -0
- package/UI/Components/Accordion/Accordion.tsx +5 -1
- package/UI/Components/CardSelect/CardSelect.tsx +6 -1
- package/UI/Components/CategoryCheckbox/Index.tsx +2 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +2 -0
- package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +8 -1
- package/UI/Components/Dropdown/Dropdown.tsx +2 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +3 -0
- package/UI/Components/FilePicker/FilePicker.tsx +2 -0
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -0
- package/UI/Components/Forms/Fields/FieldLabel.tsx +4 -0
- package/UI/Components/Forms/Fields/FormField.tsx +72 -15
- package/UI/Components/Forms/Fields/IconPicker.tsx +2 -0
- package/UI/Components/Forms/Validation.ts +107 -23
- package/UI/Components/Icon/Icon.tsx +57 -0
- package/UI/Components/Input/Input.tsx +4 -0
- package/UI/Components/Link/Link.tsx +23 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +3 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +63 -2
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +6 -0
- package/UI/Components/Radio/Radio.tsx +2 -0
- package/UI/Components/RadioButtons/GroupRadioButtons.tsx +6 -1
- package/UI/Components/Tabs/Tabs.tsx +63 -0
- package/UI/Components/TextArea/TextArea.tsx +2 -0
- package/UI/Components/TimePicker/TimePicker.tsx +2 -0
- package/UI/Components/Toggle/Toggle.tsx +2 -1
- package/UI/Components/Tooltip/Tooltip.tsx +6 -1
- package/UI/Utils/TelemetryService.ts +1 -0
- package/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.ts +70 -0
- package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
- package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
- package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
- package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
- package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
- package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -0
- package/Utils/Dashboard/Components/Index.ts +51 -0
- package/Utils/Telemetry/EntityKey.ts +18 -0
- package/build/dist/Models/DatabaseModels/Alert.js +162 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +1018 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +20 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidc.js +379 -0
- package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +276 -0
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GlobalSso.js +341 -0
- package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +279 -0
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +162 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +32 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
- package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Project.js +32 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +84 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +89 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
- package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +2 -0
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +8 -1
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js +1100 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js +73 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js +106 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +77 -34
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +30 -4
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +168 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
- package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +55 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcProjectService.js +80 -0
- package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -0
- package/build/dist/Server/Services/GlobalOidcService.js +9 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -0
- package/build/dist/Server/Services/GlobalSsoProjectService.js +80 -0
- package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -0
- package/build/dist/Server/Services/GlobalSsoService.js +9 -0
- package/build/dist/Server/Services/GlobalSsoService.js.map +1 -0
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +28 -4
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +8 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +22 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +43 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostService.js +319 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
- package/build/dist/Server/Services/PodmanResourceService.js +196 -0
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +36 -1
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +13 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Cookie.js +32 -3
- package/build/dist/Server/Utils/Cookie.js.map +1 -1
- package/build/dist/Server/Utils/JsonWebToken.js +6 -0
- package/build/dist/Server/Utils/JsonWebToken.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +8 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +35 -7
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +194 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +35 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +16 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +30 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +18 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js +66 -0
- package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +7 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +168 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
- package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +358 -0
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
- package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
- package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStep.js +69 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js +21 -0
- package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
- package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
- package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +39 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
- package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
- package/build/dist/Types/Permission.js +420 -4
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
- package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
- package/build/dist/Types/SSO/SsoProviderType.js +9 -0
- package/build/dist/Types/SSO/SsoProviderType.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +12 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +2 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +5 -3
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/CategoryCheckbox/Index.js +1 -1
- package/build/dist/UI/Components/CategoryCheckbox/Index.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +4 -2
- package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +2 -2
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/FilePicker/FilePicker.js +1 -1
- package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FieldLabel.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FieldLabel.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +58 -22
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +64 -15
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +16 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/Link/Link.js +22 -1
- package/build/dist/UI/Components/Link/Link.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +2 -2
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +46 -2
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +6 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Radio/Radio.js +1 -1
- package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js +1 -1
- package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/Tabs/Tabs.js +50 -1
- package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/TimePicker/TimePicker.js +1 -1
- package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +6 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +1 -0
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +28 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +14 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- 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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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={
|
|
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:
|
|
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={
|
|
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={
|
|
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
|
-
|
|
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
|
|
30
|
-
field.
|
|
31
|
-
|
|
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
|
|
38
|
-
field.
|
|
39
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
95
|
-
field.
|
|
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
|
|
103
|
-
field.
|
|
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
|
|
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
|
|
147
|
-
field
|
|
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] =
|
|
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) {
|