@oneuptime/common 12.0.33 → 12.0.34
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/AnalyticsModels/RumSession.ts +117 -1
- package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
- package/Models/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
- package/Models/DatabaseModels/RumApplication.ts +6 -6
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
- package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamMember.ts +0 -9
- package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamPermission.ts +3 -24
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/TelemetryAPI.ts +1284 -164
- package/Server/API/UserNotificationSettingAPI.ts +55 -0
- package/Server/API/UserTelegramAPI.ts +48 -4
- package/Server/EnvironmentConfig.ts +35 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +453 -7
- package/Server/Services/AccessTokenService.ts +1 -0
- package/Server/Services/AlertCustomFieldService.ts +98 -0
- package/Server/Services/AlertService.ts +37 -0
- package/Server/Services/ApiKeyPermissionService.ts +461 -29
- package/Server/Services/CustomFieldMappingService.ts +879 -0
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
- package/Server/Services/ProjectService.ts +22 -0
- package/Server/Services/RoutineEmailSettingsService.ts +73 -0
- package/Server/Services/RumSessionReplayViewService.ts +104 -24
- package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
- package/Server/Services/ScheduledMaintenanceService.ts +32 -0
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
- package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
- package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
- package/Server/Utils/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LogRedaction.ts +20 -0
- package/Server/Utils/Logger.ts +11 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/SSRFProtection.ts +217 -10
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
- package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
- package/Server/Utils/StartServer.ts +2 -17
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
- package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
- package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
- package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
- package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
- package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
- package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
- package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
- package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
- package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
- package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
- package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
- package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
- package/Tests/Types/JSONFunctions.test.ts +260 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
- package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
- package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
- package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
- package/Tests/Types/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
- package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
- package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
- package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
- package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
- package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
- package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
- package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
- package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
- package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
- package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
- package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
- package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
- package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
- package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
- package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
- package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
- package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
- package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
- package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
- package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
- package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
- package/Tests/Utils/ValueFormatter.test.ts +148 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSONFunctions.ts +189 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/DockerAlertTemplates.ts +338 -128
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
- package/Types/Monitor/HostAlertTemplates.ts +302 -130
- package/Types/Monitor/IotAlertTemplates.ts +112 -104
- package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
- package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
- package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
- package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
- package/Types/Monitor/RumAlertTemplates.ts +46 -7
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Rum/SessionReplay.ts +209 -0
- package/Types/Rum/SessionReplayApi.ts +722 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
- package/Types/Rum/SessionReplayConsentMode.ts +11 -7
- package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
- package/Types/Rum/SessionReplayHealth.ts +238 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/WebsiteRequest.ts +85 -3
- package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
- package/UI/Components/Charts/Line/LineChart.tsx +13 -2
- package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
- package/UI/Components/Charts/Utils/XAxis.ts +217 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
- package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
- package/UI/Components/Header/Header.tsx +25 -9
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
- package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
- package/UI/Components/Icon/Icon.tsx +11 -0
- package/UI/Components/JSONTable/JSONTable.tsx +2 -2
- package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
- package/UI/Components/ModelTable/Column.ts +15 -0
- package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
- package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
- package/UI/Components/Table/CellClassName.ts +81 -0
- package/UI/Components/Table/TableRow.tsx +20 -14
- package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
- package/UI/Components/Table/Types/Column.ts +36 -0
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
- package/UI/Components/Workflow/NodePlacement.ts +57 -0
- package/UI/Components/Workflow/Workflow.tsx +47 -18
- package/UI/Config.ts +15 -33
- package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/Utils/API.ts +129 -3
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/Rum/ChunkMath.ts +106 -0
- package/Utils/Rum/SessionReplayHealth.ts +732 -0
- package/Utils/Rum/SessionReplayStringMap.ts +226 -0
- package/Utils/Schema/ModelSchema.ts +1 -0
- package/Utils/StatusPage/ResourceSearch.ts +290 -0
- package/Utils/Telemetry/OriginAllowList.ts +355 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
- package/Utils/ValueFormatter.ts +35 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
- package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +769 -109
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
- package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +28 -6
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +1 -0
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
- package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +34 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
- package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
- package/build/dist/Server/Services/GlobalConfigService.js +133 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +32 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +163 -0
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +29 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
- package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +62 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +166 -3
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +20 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +10 -0
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SSRFProtection.js +136 -9
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +3 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
- package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.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/JSONFunctions.js +118 -37
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
- package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +117 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +55 -3
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
- package/build/dist/UI/Components/Header/Header.js +2 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
- package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
- package/build/dist/UI/Components/Table/CellClassName.js +55 -0
- package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +16 -13
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
- package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Config.js +10 -20
- package/build/dist/UI/Config.js.map +1 -1
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Utils/API.js +67 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +76 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
- package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +32 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,6 +19,12 @@ import {
|
|
|
19
19
|
CustomFieldDropdownOption,
|
|
20
20
|
parseCustomFieldDropdownOptions,
|
|
21
21
|
} from "../../../Types/CustomField/CustomFieldDropdownOption";
|
|
22
|
+
import {
|
|
23
|
+
CustomFieldMappingSourceInfo,
|
|
24
|
+
getCustomFieldMappingRelationSelect,
|
|
25
|
+
getCustomFieldMappingSources,
|
|
26
|
+
hasCustomFieldMappingSource,
|
|
27
|
+
} from "../../../Types/CustomField/CustomFieldMappingCatalog";
|
|
22
28
|
import Color from "../../../Types/Color";
|
|
23
29
|
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
24
30
|
import { PromiseVoidFunction } from "../../../Types/FunctionTypes";
|
|
@@ -94,6 +100,74 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
94
100
|
const [model, setModel] = useState<BaseModel | null>(null);
|
|
95
101
|
const [showModelForm, setShowModelForm] = useState<boolean>(false);
|
|
96
102
|
|
|
103
|
+
/*
|
|
104
|
+
* Which related resources this resource's custom fields may inherit from.
|
|
105
|
+
* Empty for most of them, in which case everything below behaves exactly as
|
|
106
|
+
* it did before mapping existed.
|
|
107
|
+
*/
|
|
108
|
+
const mappingSources: Array<CustomFieldMappingSourceInfo> =
|
|
109
|
+
getCustomFieldMappingSources(new props.customFieldType().tableName!);
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* A mapped field is a derived value, so it is shown rather than edited — but
|
|
113
|
+
* only on records that actually have a source to derive it from. On a record
|
|
114
|
+
* with none, the mapping can never fill it in and there is no reason to take
|
|
115
|
+
* the field away from the operator.
|
|
116
|
+
*/
|
|
117
|
+
type IsMappedAndInheritedFunction = (schemaItem: BaseModel) => boolean;
|
|
118
|
+
|
|
119
|
+
const isMappedAndInherited: IsMappedAndInheritedFunction = (
|
|
120
|
+
schemaItem: BaseModel,
|
|
121
|
+
): boolean => {
|
|
122
|
+
const resource: string | undefined = (schemaItem as any)
|
|
123
|
+
.mapFromResourceType;
|
|
124
|
+
const fieldName: string | undefined = (schemaItem as any)
|
|
125
|
+
.mapFromCustomFieldName;
|
|
126
|
+
|
|
127
|
+
if (!resource || !fieldName) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const source: CustomFieldMappingSourceInfo | undefined =
|
|
132
|
+
mappingSources.find((candidate: CustomFieldMappingSourceInfo) => {
|
|
133
|
+
return candidate.resource === resource;
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
if (!source) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return hasCustomFieldMappingSource({
|
|
141
|
+
source: source,
|
|
142
|
+
record: model as unknown as Record<string, unknown>,
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
type GetMappedDescriptionFunction = (
|
|
147
|
+
schemaItem: BaseModel,
|
|
148
|
+
) => string | undefined;
|
|
149
|
+
|
|
150
|
+
const getMappedDescription: GetMappedDescriptionFunction = (
|
|
151
|
+
schemaItem: BaseModel,
|
|
152
|
+
): string | undefined => {
|
|
153
|
+
const description: string | undefined = (schemaItem as any).description;
|
|
154
|
+
|
|
155
|
+
if (!isMappedAndInherited(schemaItem)) {
|
|
156
|
+
return description;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const source: CustomFieldMappingSourceInfo | undefined =
|
|
160
|
+
mappingSources.find((candidate: CustomFieldMappingSourceInfo) => {
|
|
161
|
+
return candidate.resource === (schemaItem as any).mapFromResourceType;
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
const note: string = `Copied from the ${source?.title} custom field "${
|
|
165
|
+
(schemaItem as any).mapFromCustomFieldName
|
|
166
|
+
}".`;
|
|
167
|
+
|
|
168
|
+
return description ? `${description} ${note}` : note;
|
|
169
|
+
};
|
|
170
|
+
|
|
97
171
|
const onLoad: PromiseVoidFunction = async (): Promise<void> => {
|
|
98
172
|
try {
|
|
99
173
|
// load schema.
|
|
@@ -113,16 +187,33 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
113
187
|
customFieldType: true,
|
|
114
188
|
description: true,
|
|
115
189
|
dropdownOptions: true,
|
|
190
|
+
mapFromResourceType: true,
|
|
191
|
+
mapFromCustomFieldName: true,
|
|
116
192
|
} as any,
|
|
117
193
|
sort: {},
|
|
118
194
|
});
|
|
119
195
|
|
|
196
|
+
/*
|
|
197
|
+
* The relation a mapped field would inherit through is read alongside
|
|
198
|
+
* the values, so the card can tell "this field is mapped and this record
|
|
199
|
+
* has a monitor" (show it, read-only) from "this field is mapped but
|
|
200
|
+
* this record has none" (leave it editable — an SLO or security-event
|
|
201
|
+
* alert has no monitor and would otherwise be locked out of the field
|
|
202
|
+
* entirely). Nothing extra is selected for the six resources that have
|
|
203
|
+
* no mapping sources at all.
|
|
204
|
+
*/
|
|
205
|
+
const itemSelect: JSONObject = {
|
|
206
|
+
customFields: true,
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
for (const source of mappingSources) {
|
|
210
|
+
Object.assign(itemSelect, getCustomFieldMappingRelationSelect(source));
|
|
211
|
+
}
|
|
212
|
+
|
|
120
213
|
const item: BaseModel | null = await ModelAPI.getItem<BaseModel>({
|
|
121
214
|
modelType: props.modelType,
|
|
122
215
|
id: props.modelId,
|
|
123
|
-
select:
|
|
124
|
-
customFields: true,
|
|
125
|
-
} as any,
|
|
216
|
+
select: itemSelect as any,
|
|
126
217
|
});
|
|
127
218
|
|
|
128
219
|
setSchemaList(schemaList.data);
|
|
@@ -195,8 +286,19 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
195
286
|
* take the button away, or the error message is telling the operator to
|
|
196
287
|
* retry something they can no longer reach.
|
|
197
288
|
*/
|
|
289
|
+
/*
|
|
290
|
+
* A field whose value is copied from a related resource is not one the
|
|
291
|
+
* modal offers, so a card where EVERY field is mapped has nothing to edit
|
|
292
|
+
* and the button would open an empty form.
|
|
293
|
+
*/
|
|
294
|
+
const editableSchemaCount: number = schemaList.filter(
|
|
295
|
+
(schemaItem: BaseModel) => {
|
|
296
|
+
return !isMappedAndInherited(schemaItem);
|
|
297
|
+
},
|
|
298
|
+
).length;
|
|
299
|
+
|
|
198
300
|
const canEdit: boolean =
|
|
199
|
-
isEditable && !isLoading &&
|
|
301
|
+
isEditable && !isLoading && editableSchemaCount > 0 && Boolean(model);
|
|
200
302
|
|
|
201
303
|
/*
|
|
202
304
|
* Custom field values live on the record itself, so editing them is an
|
|
@@ -269,7 +371,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
269
371
|
return {
|
|
270
372
|
key: (schemaItem as any).name,
|
|
271
373
|
title: (schemaItem as any).name,
|
|
272
|
-
description: (schemaItem as
|
|
374
|
+
description: getMappedDescription(schemaItem) as string,
|
|
273
375
|
fieldType: (schemaItem as any).customFieldType,
|
|
274
376
|
placeholder: "No data entered",
|
|
275
377
|
dropdownOptions: isDropdown
|
|
@@ -292,26 +394,42 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
292
394
|
}}
|
|
293
395
|
formProps={{
|
|
294
396
|
initialValues: (model as any)?.["customFields"] || {},
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
397
|
+
/*
|
|
398
|
+
* Mapped fields are left OUT of the form rather than rendered
|
|
399
|
+
* disabled: `Field.disabled` is honoured by only three of the
|
|
400
|
+
* form's input branches, so a disabled Dropdown, multi-select or
|
|
401
|
+
* toggle stays fully editable and the value would silently snap
|
|
402
|
+
* back on the next sync. Their stored values still survive the
|
|
403
|
+
* save — this form submits its whole values object, which starts
|
|
404
|
+
* from the record's existing bag — and the server re-applies the
|
|
405
|
+
* mapping on update either way.
|
|
406
|
+
*/
|
|
407
|
+
fields: schemaList
|
|
408
|
+
.filter((schemaItem: BaseModel) => {
|
|
409
|
+
return !isMappedAndInherited(schemaItem);
|
|
410
|
+
})
|
|
411
|
+
.map((schemaItem: BaseModel) => {
|
|
412
|
+
const isDropdown: boolean =
|
|
413
|
+
(schemaItem as any).customFieldType ===
|
|
414
|
+
CustomFieldType.Dropdown ||
|
|
415
|
+
(schemaItem as any).customFieldType ===
|
|
416
|
+
CustomFieldType.MultiSelectDropdown;
|
|
417
|
+
return {
|
|
418
|
+
field: {
|
|
419
|
+
[(schemaItem as any).name]: true,
|
|
420
|
+
},
|
|
421
|
+
title: (schemaItem as any).name,
|
|
422
|
+
description: (schemaItem as any).description,
|
|
423
|
+
fieldType: (schemaItem as any).customFieldType,
|
|
424
|
+
required: false,
|
|
425
|
+
placeholder: "",
|
|
426
|
+
dropdownOptions: isDropdown
|
|
427
|
+
? parseDropdownOptions(
|
|
428
|
+
(schemaItem as any).dropdownOptions,
|
|
429
|
+
)
|
|
430
|
+
: undefined,
|
|
431
|
+
};
|
|
432
|
+
}),
|
|
315
433
|
}}
|
|
316
434
|
/>
|
|
317
435
|
)}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import API from "../../Utils/API/API";
|
|
2
|
+
import ModelAPI, { ListResult } from "../../Utils/ModelAPI/ModelAPI";
|
|
3
|
+
import ComponentLoader from "../ComponentLoader/ComponentLoader";
|
|
4
|
+
import Dropdown, { DropdownOption, DropdownValue } from "../Dropdown/Dropdown";
|
|
5
|
+
import ErrorMessage from "../ErrorMessage/ErrorMessage";
|
|
6
|
+
import BaseModel, {
|
|
7
|
+
DatabaseBaseModelType,
|
|
8
|
+
} from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
9
|
+
import CustomFieldType from "../../../Types/CustomField/CustomFieldType";
|
|
10
|
+
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
11
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
12
|
+
import React, {
|
|
13
|
+
FunctionComponent,
|
|
14
|
+
ReactElement,
|
|
15
|
+
useEffect,
|
|
16
|
+
useState,
|
|
17
|
+
} from "react";
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Picks the field a custom field copies its value from
|
|
21
|
+
* (OneUptime/oneuptime#3549) — the "map from" half of the settings form.
|
|
22
|
+
*
|
|
23
|
+
* WHY THIS IS A CUSTOM COMPONENT AND NOT `fetchDropdownOptions`. The list of
|
|
24
|
+
* offerable fields depends on ANOTHER value in the same form: only source
|
|
25
|
+
* fields of the same type can be mapped, so choosing "Number" has to change
|
|
26
|
+
* what this picker shows. `Field.fetchDropdownOptions` is awaited from a
|
|
27
|
+
* `useAsyncEffect` in BasicForm whose dependency array is
|
|
28
|
+
* `[props.fields, currentFormStepId]` — it does not re-run when a value
|
|
29
|
+
* changes, so a picker built on it would keep offering the previous type's
|
|
30
|
+
* fields. `getCustomElement` receives the live form values on every render
|
|
31
|
+
* instead, which is the route three other call sites in this codebase already
|
|
32
|
+
* take for exactly this reason.
|
|
33
|
+
*
|
|
34
|
+
* A configured value that is no longer offered — the source field was renamed
|
|
35
|
+
* or deleted — is still shown, flagged. The mapping has quietly stopped
|
|
36
|
+
* resolving at that point, and the settings page is the only place anyone
|
|
37
|
+
* would find out.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
export interface ComponentProps {
|
|
41
|
+
projectId: ObjectID;
|
|
42
|
+
/** Definition table listing the fields available on the source resource. */
|
|
43
|
+
sourceDefinitionModelType: DatabaseBaseModelType;
|
|
44
|
+
/** How the source is named to the operator, e.g. "Monitor". */
|
|
45
|
+
sourceTitle: string;
|
|
46
|
+
/** The type this field holds; only same-typed sources can be mapped. */
|
|
47
|
+
targetFieldType?: CustomFieldType | undefined;
|
|
48
|
+
initialValue?: string | undefined;
|
|
49
|
+
onChange?: ((value: string) => void) | undefined;
|
|
50
|
+
onBlur?: (() => void) | undefined;
|
|
51
|
+
error?: string | undefined;
|
|
52
|
+
tabIndex?: number | undefined;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface SourceField {
|
|
56
|
+
name: string;
|
|
57
|
+
customFieldType?: CustomFieldType | undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const MapFromCustomFieldInput: FunctionComponent<ComponentProps> = (
|
|
61
|
+
props: ComponentProps,
|
|
62
|
+
): ReactElement => {
|
|
63
|
+
const [sourceFields, setSourceFields] = useState<Array<SourceField>>([]);
|
|
64
|
+
const [isLoading, setIsLoading] = useState<boolean>(true);
|
|
65
|
+
const [loadError, setLoadError] = useState<string>("");
|
|
66
|
+
const [selectedValue, setSelectedValue] = useState<string>(
|
|
67
|
+
props.initialValue || "",
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const sourceModelName: string = props.sourceDefinitionModelType.name;
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
let isMounted: boolean = true;
|
|
74
|
+
|
|
75
|
+
const load: () => Promise<void> = async (): Promise<void> => {
|
|
76
|
+
try {
|
|
77
|
+
setIsLoading(true);
|
|
78
|
+
setLoadError("");
|
|
79
|
+
|
|
80
|
+
const result: ListResult<BaseModel> = await ModelAPI.getList<BaseModel>(
|
|
81
|
+
{
|
|
82
|
+
modelType: props.sourceDefinitionModelType,
|
|
83
|
+
query: {
|
|
84
|
+
projectId: props.projectId,
|
|
85
|
+
} as any,
|
|
86
|
+
limit: LIMIT_PER_PROJECT,
|
|
87
|
+
skip: 0,
|
|
88
|
+
select: {
|
|
89
|
+
name: true,
|
|
90
|
+
customFieldType: true,
|
|
91
|
+
} as any,
|
|
92
|
+
sort: {},
|
|
93
|
+
},
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
if (!isMounted) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
setSourceFields(
|
|
101
|
+
result.data.map((item: BaseModel): SourceField => {
|
|
102
|
+
return {
|
|
103
|
+
name: (item as any)["name"],
|
|
104
|
+
customFieldType: (item as any)["customFieldType"],
|
|
105
|
+
};
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
108
|
+
setIsLoading(false);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
if (!isMounted) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
setIsLoading(false);
|
|
115
|
+
setLoadError(API.getFriendlyMessage(err));
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
load().catch(() => {
|
|
120
|
+
// load() reports its own failures through loadError.
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return () => {
|
|
124
|
+
isMounted = false;
|
|
125
|
+
};
|
|
126
|
+
/*
|
|
127
|
+
* The source list is per-project and per-source-table; neither changes
|
|
128
|
+
* while this input is mounted. The type filter below is applied on each
|
|
129
|
+
* render instead, so choosing a different field type re-filters without a
|
|
130
|
+
* refetch.
|
|
131
|
+
*/
|
|
132
|
+
}, [props.projectId.toString(), sourceModelName]);
|
|
133
|
+
|
|
134
|
+
const options: Array<DropdownOption> = sourceFields
|
|
135
|
+
.filter((field: SourceField) => {
|
|
136
|
+
if (!field.name) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* With no type chosen yet there is nothing to be compatible with, so
|
|
142
|
+
* offer nothing rather than a list that will be rejected on save.
|
|
143
|
+
*/
|
|
144
|
+
if (!props.targetFieldType) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return field.customFieldType === props.targetFieldType;
|
|
149
|
+
})
|
|
150
|
+
.map((field: SourceField): DropdownOption => {
|
|
151
|
+
return { label: field.name, value: field.name };
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const isSelectedValueOffered: boolean = options.some(
|
|
155
|
+
(option: DropdownOption) => {
|
|
156
|
+
return option.value === selectedValue;
|
|
157
|
+
},
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (selectedValue && !isSelectedValueOffered) {
|
|
161
|
+
options.unshift({
|
|
162
|
+
label: `${selectedValue} (no longer available on ${props.sourceTitle})`,
|
|
163
|
+
value: selectedValue,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (isLoading) {
|
|
168
|
+
return <ComponentLoader />;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (loadError) {
|
|
172
|
+
return <ErrorMessage message={loadError} />;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!props.targetFieldType) {
|
|
176
|
+
return (
|
|
177
|
+
<ErrorMessage message="Choose a field type above before picking the field to map from." />
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (options.length === 0) {
|
|
182
|
+
return (
|
|
183
|
+
<ErrorMessage
|
|
184
|
+
message={`No ${props.sourceTitle} custom field of this type exists in this project. Create one first, or choose a different field type.`}
|
|
185
|
+
/>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<Dropdown
|
|
191
|
+
options={options}
|
|
192
|
+
value={options.find((option: DropdownOption) => {
|
|
193
|
+
return option.value === selectedValue;
|
|
194
|
+
})}
|
|
195
|
+
tabIndex={props.tabIndex}
|
|
196
|
+
error={props.error}
|
|
197
|
+
placeholder={`Select a ${props.sourceTitle} custom field`}
|
|
198
|
+
onBlur={() => {
|
|
199
|
+
if (props.onBlur) {
|
|
200
|
+
props.onBlur();
|
|
201
|
+
}
|
|
202
|
+
}}
|
|
203
|
+
onChange={(value: DropdownValue | Array<DropdownValue> | null) => {
|
|
204
|
+
const nextValue: string = value ? value.toString() : "";
|
|
205
|
+
|
|
206
|
+
setSelectedValue(nextValue);
|
|
207
|
+
|
|
208
|
+
if (props.onChange) {
|
|
209
|
+
props.onChange(nextValue);
|
|
210
|
+
}
|
|
211
|
+
}}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
export default MapFromCustomFieldInput;
|
|
@@ -6,10 +6,13 @@ import OneUptimeDate from "../../../Types/Date";
|
|
|
6
6
|
import Dictionary from "../../../Types/Dictionary";
|
|
7
7
|
import ObjectID from "../../../Types/ObjectID";
|
|
8
8
|
import UptimeBarTooltipIncident from "../../../Types/Monitor/UptimeBarTooltipIncident";
|
|
9
|
+
import DayUptimeGraphUtil from "../../../Utils/Uptime/DayUptimeGraphUtil";
|
|
10
|
+
import UptimeHistoryLabels from "../../../Types/Monitor/UptimeHistoryLabels";
|
|
9
11
|
import React, {
|
|
10
12
|
FunctionComponent,
|
|
11
13
|
ReactElement,
|
|
12
14
|
useEffect,
|
|
15
|
+
useRef,
|
|
13
16
|
useState,
|
|
14
17
|
} from "react";
|
|
15
18
|
import UptimeEvent from "../../../Utils/Uptime/Event";
|
|
@@ -21,6 +24,20 @@ export interface BarChartRule {
|
|
|
21
24
|
uptimePercentGreaterThanOrEqualTo: number;
|
|
22
25
|
}
|
|
23
26
|
|
|
27
|
+
/*
|
|
28
|
+
* Everything the tooltip shows for one day, handed to onBarClick so that a
|
|
29
|
+
* caller opening a dialog can show the same reading rather than a strictly
|
|
30
|
+
* poorer one. Before this existed the only way to see a day's uptime was to
|
|
31
|
+
* hover it, which is not something a touch screen or a keyboard can do.
|
|
32
|
+
*/
|
|
33
|
+
export interface UptimeBarDaySummary {
|
|
34
|
+
date: Date;
|
|
35
|
+
uptimePercent: number;
|
|
36
|
+
hasEvents: boolean;
|
|
37
|
+
statusDurations: Array<StatusDuration>;
|
|
38
|
+
incidents: Array<UptimeBarTooltipIncident>;
|
|
39
|
+
}
|
|
40
|
+
|
|
24
41
|
export interface ComponentProps {
|
|
25
42
|
startDate: Date;
|
|
26
43
|
endDate: Date;
|
|
@@ -31,9 +48,18 @@ export interface ComponentProps {
|
|
|
31
48
|
defaultBarColor: Color;
|
|
32
49
|
incidents?: Array<UptimeBarTooltipIncident> | undefined;
|
|
33
50
|
onBarClick?:
|
|
34
|
-
| ((
|
|
51
|
+
| ((
|
|
52
|
+
date: Date,
|
|
53
|
+
incidents: Array<UptimeBarTooltipIncident>,
|
|
54
|
+
summary: UptimeBarDaySummary,
|
|
55
|
+
) => void)
|
|
35
56
|
| undefined;
|
|
36
57
|
onIncidentClick?: ((incidentId: string) => void) | undefined;
|
|
58
|
+
/*
|
|
59
|
+
* Wording for the accessible names. Defaults to English, matching the
|
|
60
|
+
* tooltip; the status page passes translated strings.
|
|
61
|
+
*/
|
|
62
|
+
labels?: UptimeHistoryLabels | undefined;
|
|
37
63
|
}
|
|
38
64
|
|
|
39
65
|
const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
@@ -41,6 +67,39 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
|
41
67
|
): ReactElement => {
|
|
42
68
|
const [days, setDays] = useState<number>(0);
|
|
43
69
|
|
|
70
|
+
/*
|
|
71
|
+
* The strip is one tab stop with a roving tabindex inside it - see
|
|
72
|
+
* DayUptimeGraphUtil. null means "nothing focused yet", which resolves to
|
|
73
|
+
* today rather than to three months ago.
|
|
74
|
+
*/
|
|
75
|
+
const [focusedBarIndex, setFocusedBarIndex] = useState<number | null>(null);
|
|
76
|
+
const barRefs: React.MutableRefObject<Array<HTMLButtonElement | null>> =
|
|
77
|
+
useRef<Array<HTMLButtonElement | null>>([]);
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Set only by a key press, so that moving focus is a thing the widget does
|
|
81
|
+
* in response to the keyboard and never a thing it does to a visitor who
|
|
82
|
+
* simply clicked. Focus is applied in an effect rather than in the handler
|
|
83
|
+
* because the bar the visitor is moving to may not be the same DOM node
|
|
84
|
+
* after the render that the key press causes.
|
|
85
|
+
*/
|
|
86
|
+
const shouldRestoreFocus: React.MutableRefObject<boolean> =
|
|
87
|
+
useRef<boolean>(false);
|
|
88
|
+
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (!shouldRestoreFocus.current) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
shouldRestoreFocus.current = false;
|
|
95
|
+
|
|
96
|
+
if (focusedBarIndex === null) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
barRefs.current[focusedBarIndex]?.focus();
|
|
101
|
+
}, [focusedBarIndex]);
|
|
102
|
+
|
|
44
103
|
useEffect(() => {
|
|
45
104
|
setDays(
|
|
46
105
|
OneUptimeDate.getNumberOfDaysBetweenDatesInclusive(
|
|
@@ -50,6 +109,40 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
|
50
109
|
);
|
|
51
110
|
}, [props.startDate, props.endDate]);
|
|
52
111
|
|
|
112
|
+
const activeBarIndex: number = DayUptimeGraphUtil.getActiveBarIndex({
|
|
113
|
+
storedIndex: focusedBarIndex,
|
|
114
|
+
barCount: days,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
type MoveFocusFunction = (event: React.KeyboardEvent, index: number) => void;
|
|
118
|
+
|
|
119
|
+
const moveFocus: MoveFocusFunction = (
|
|
120
|
+
event: React.KeyboardEvent,
|
|
121
|
+
index: number,
|
|
122
|
+
): void => {
|
|
123
|
+
const nextIndex: number | null = DayUptimeGraphUtil.getNextFocusIndex({
|
|
124
|
+
key: event.key,
|
|
125
|
+
currentIndex: index,
|
|
126
|
+
barCount: days,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
if (nextIndex === null) {
|
|
130
|
+
// Not ours: Tab, Enter and Space must keep their normal meaning.
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
shouldRestoreFocus.current = true;
|
|
136
|
+
setFocusedBarIndex(nextIndex);
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* Focused here as well as in the effect: when the strip does not re-render
|
|
140
|
+
* (the index it was already on), the effect does not run, and focus must
|
|
141
|
+
* still land somewhere real.
|
|
142
|
+
*/
|
|
143
|
+
barRefs.current[nextIndex]?.focus();
|
|
144
|
+
};
|
|
145
|
+
|
|
53
146
|
type GetIncidentsForDayFunction = (
|
|
54
147
|
startOfDay: Date,
|
|
55
148
|
endOfDay: Date,
|
|
@@ -236,8 +329,33 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
|
236
329
|
});
|
|
237
330
|
}
|
|
238
331
|
|
|
239
|
-
|
|
240
|
-
|
|
332
|
+
/*
|
|
333
|
+
* Every day opens, not only the days that happen to carry an incident.
|
|
334
|
+
* The uptime reading and the status breakdown used to live in a hover
|
|
335
|
+
* tooltip and nowhere else, which put them out of reach of every phone
|
|
336
|
+
* and every keyboard - and a phone is how most people read a status page
|
|
337
|
+
* during an outage.
|
|
338
|
+
*/
|
|
339
|
+
const isClickable: boolean = Boolean(props.onBarClick);
|
|
340
|
+
|
|
341
|
+
const summary: UptimeBarDaySummary = {
|
|
342
|
+
date: todaysDay,
|
|
343
|
+
uptimePercent: uptimePercentForTheDay,
|
|
344
|
+
hasEvents: hasEvents,
|
|
345
|
+
statusDurations: statusDurations,
|
|
346
|
+
incidents: dayIncidents,
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
const ariaLabel: string = DayUptimeGraphUtil.getDayAriaLabel({
|
|
350
|
+
dateLabel: OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
|
|
351
|
+
todaysDay,
|
|
352
|
+
true,
|
|
353
|
+
),
|
|
354
|
+
hasEvents: hasEvents,
|
|
355
|
+
uptimePercent: uptimePercentForTheDay,
|
|
356
|
+
incidentCount: dayIncidents.length,
|
|
357
|
+
labels: props.labels,
|
|
358
|
+
});
|
|
241
359
|
|
|
242
360
|
return (
|
|
243
361
|
<Tooltip
|
|
@@ -250,22 +368,56 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
|
250
368
|
statusDurations={statusDurations}
|
|
251
369
|
incidents={dayIncidents}
|
|
252
370
|
onIncidentClick={props.onIncidentClick}
|
|
371
|
+
labels={props.labels}
|
|
253
372
|
/>
|
|
254
373
|
}
|
|
255
374
|
>
|
|
256
|
-
<
|
|
257
|
-
|
|
375
|
+
<button
|
|
376
|
+
type="button"
|
|
377
|
+
ref={(element: HTMLButtonElement | null) => {
|
|
378
|
+
barRefs.current[dayNumber] = element;
|
|
379
|
+
}}
|
|
380
|
+
data-testid="uptime-bar"
|
|
381
|
+
data-day-index={dayNumber}
|
|
382
|
+
aria-label={ariaLabel}
|
|
383
|
+
/*
|
|
384
|
+
* One tab stop for the whole strip. Ninety bars per resource across
|
|
385
|
+
* a page of resources would otherwise bury the footer behind
|
|
386
|
+
* thousands of Tab presses.
|
|
387
|
+
*/
|
|
388
|
+
tabIndex={DayUptimeGraphUtil.getBarTabIndex({
|
|
389
|
+
index: dayNumber,
|
|
390
|
+
activeIndex: activeBarIndex,
|
|
391
|
+
})}
|
|
392
|
+
/*
|
|
393
|
+
* The focus indicator is drawn *inside* the bar (a negative outline
|
|
394
|
+
* offset), not around it. Callers wrap this strip in an
|
|
395
|
+
* overflow-x-auto scroller so it can be swiped on a phone, and
|
|
396
|
+
* overflow-x also clips vertically - anything drawn outside the
|
|
397
|
+
* bar's own box loses its top and bottom edge to that scroller. Two
|
|
398
|
+
* pixels of indigo inside a seven pixel bar reads clearly against
|
|
399
|
+
* every bar colour and cannot be clipped by anything.
|
|
400
|
+
*/
|
|
401
|
+
className={`${className} relative block p-0 border-0 appearance-none focus:outline-none focus-visible:z-10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-indigo-600${
|
|
402
|
+
isClickable ? " cursor-pointer hover:opacity-80" : ""
|
|
403
|
+
}`}
|
|
258
404
|
style={{
|
|
259
405
|
backgroundColor: color.toString(),
|
|
260
406
|
}}
|
|
407
|
+
onFocus={() => {
|
|
408
|
+
setFocusedBarIndex(dayNumber);
|
|
409
|
+
}}
|
|
410
|
+
onKeyDown={(event: React.KeyboardEvent) => {
|
|
411
|
+
moveFocus(event, dayNumber);
|
|
412
|
+
}}
|
|
261
413
|
onClick={
|
|
262
414
|
isClickable
|
|
263
415
|
? () => {
|
|
264
|
-
props.onBarClick!(todaysDay, dayIncidents);
|
|
416
|
+
props.onBarClick!(todaysDay, dayIncidents, summary);
|
|
265
417
|
}
|
|
266
418
|
: undefined
|
|
267
419
|
}
|
|
268
|
-
|
|
420
|
+
/>
|
|
269
421
|
</Tooltip>
|
|
270
422
|
);
|
|
271
423
|
};
|
|
@@ -282,8 +434,21 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
|
|
|
282
434
|
return elements;
|
|
283
435
|
};
|
|
284
436
|
|
|
437
|
+
/*
|
|
438
|
+
* Deliberately not overflow-hidden any more: it clipped the focus ring of
|
|
439
|
+
* the first and last bar, which is the one part of this widget a keyboard
|
|
440
|
+
* user has to be able to see.
|
|
441
|
+
*/
|
|
285
442
|
return (
|
|
286
|
-
<div
|
|
443
|
+
<div
|
|
444
|
+
className="flex space-x-0.5 rounded"
|
|
445
|
+
role="group"
|
|
446
|
+
aria-label={DayUptimeGraphUtil.getGraphAriaLabel({
|
|
447
|
+
dayCount: days,
|
|
448
|
+
labels: props.labels,
|
|
449
|
+
})}
|
|
450
|
+
data-testid="day-uptime-graph"
|
|
451
|
+
>
|
|
287
452
|
{getUptimeGraph()}
|
|
288
453
|
</div>
|
|
289
454
|
);
|