@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
|
@@ -120,6 +120,17 @@ type CapturedColumn = {
|
|
|
120
120
|
isRemovable?: boolean | undefined;
|
|
121
121
|
disableSort?: boolean | undefined;
|
|
122
122
|
noValueMessage?: string | undefined;
|
|
123
|
+
/*
|
|
124
|
+
* The three properties that decide whether a cell's text may occupy more
|
|
125
|
+
* than one line, captured for issue #3585. They are configuration in
|
|
126
|
+
* exactly the same way the layout flags above are — a column declares them
|
|
127
|
+
* and TableRow renders through them — so the only place they can be
|
|
128
|
+
* asserted is here, off the props the page handed the table. See the
|
|
129
|
+
* "long status messages wrap inside their own column" block at the bottom.
|
|
130
|
+
*/
|
|
131
|
+
contentClassName?: string | undefined;
|
|
132
|
+
wrapContent?: boolean | undefined;
|
|
133
|
+
wrapMaxWidthClassName?: string | undefined;
|
|
123
134
|
getElement?:
|
|
124
135
|
| ((item: NetworkDeviceDiscoveryScan) => React.ReactElement)
|
|
125
136
|
| undefined;
|
|
@@ -205,6 +216,23 @@ import NetworkDeviceDiscoveryScan from "../../../Models/DatabaseModels/NetworkDe
|
|
|
205
216
|
import ObjectID from "../../../Types/ObjectID";
|
|
206
217
|
import Route from "../../../Types/API/Route";
|
|
207
218
|
import FieldType from "../../../UI/Components/Types/FieldType";
|
|
219
|
+
/*
|
|
220
|
+
* The renderer's own cell-class helpers (issue #3585). The page declares
|
|
221
|
+
* `wrapContent` on a column; these two functions are what TableRow turns that
|
|
222
|
+
* declaration into, so running the page's real column objects through them
|
|
223
|
+
* asserts the flag has the effect it is being set for — rather than asserting
|
|
224
|
+
* that a property the page sets is a property the page sets.
|
|
225
|
+
*/
|
|
226
|
+
import TableColumn from "../../../UI/Components/Table/Types/Column";
|
|
227
|
+
import {
|
|
228
|
+
getTableCellClassName,
|
|
229
|
+
getTableCellContentClassName,
|
|
230
|
+
} from "../../../UI/Components/Table/CellClassName";
|
|
231
|
+
/*
|
|
232
|
+
* The Recurrence cell hangs the fully formatted date off a `title`, so the
|
|
233
|
+
* expectation is computed with the same utility the cell formats with.
|
|
234
|
+
*/
|
|
235
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
208
236
|
import ModelTableColumn from "../../../UI/Components/ModelTable/Column";
|
|
209
237
|
import ModelTableColumns from "../../../UI/Components/ModelTable/Columns";
|
|
210
238
|
import {
|
|
@@ -352,6 +380,53 @@ function renderRecurrenceCell(
|
|
|
352
380
|
return container.textContent || "";
|
|
353
381
|
}
|
|
354
382
|
|
|
383
|
+
/*
|
|
384
|
+
* The same cells as element trees rather than as strings, for issue #3585.
|
|
385
|
+
*
|
|
386
|
+
* The helpers above return textContent, which is the right shape for the
|
|
387
|
+
* questions they answer ("what does an operator read on this row") and the
|
|
388
|
+
* wrong one for #3585, where both the defect and the fix are carried by
|
|
389
|
+
* classes and attributes rather than by words.
|
|
390
|
+
*
|
|
391
|
+
* jsdom performs NO layout: there is no getBoundingClientRect, no computed
|
|
392
|
+
* `white-space`, no column width, so the overlap the issue reports cannot be
|
|
393
|
+
* observed here at all. What CAN be observed is the markup pairing that
|
|
394
|
+
* produced it — a width-capped box nested inside an inherited nowrap line —
|
|
395
|
+
* and the configuration that now tells the renderer to unset that nowrap.
|
|
396
|
+
* Every assertion in that block is therefore a class, attribute, DOM-shape or
|
|
397
|
+
* text assertion, deliberately, and never a visual one.
|
|
398
|
+
*/
|
|
399
|
+
function renderCellContainer(
|
|
400
|
+
columnKey: string,
|
|
401
|
+
scan: Partial<NetworkDeviceDiscoveryScan>,
|
|
402
|
+
): HTMLElement {
|
|
403
|
+
const column: CapturedColumn = columnNamed(columnKey);
|
|
404
|
+
|
|
405
|
+
if (!column.getElement) {
|
|
406
|
+
throw new Error(`The "${columnKey}" column renders no element`);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const { container } = render(
|
|
410
|
+
<MemoryRouter>
|
|
411
|
+
{column.getElement(scan as NetworkDeviceDiscoveryScan)}
|
|
412
|
+
</MemoryRouter>,
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
return container;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function renderRespondedHostsCell(
|
|
419
|
+
scan: Partial<NetworkDeviceDiscoveryScan>,
|
|
420
|
+
): HTMLElement {
|
|
421
|
+
return renderCellContainer("respondedHostCount", scan);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function renderRecurrenceCellElement(
|
|
425
|
+
scan: Partial<NetworkDeviceDiscoveryScan>,
|
|
426
|
+
): HTMLElement {
|
|
427
|
+
return renderCellContainer("isRecurring", scan);
|
|
428
|
+
}
|
|
429
|
+
|
|
355
430
|
/*
|
|
356
431
|
* A credential list of one, carrying whatever the operator typed into that
|
|
357
432
|
* card's port box.
|
|
@@ -2588,3 +2663,396 @@ describe("Scan Target says how big the sweep is while it is being typed", () =>
|
|
|
2588
2663
|
);
|
|
2589
2664
|
});
|
|
2590
2665
|
});
|
|
2666
|
+
|
|
2667
|
+
/*
|
|
2668
|
+
* OneUptime issue #3585: "status message overlaps the columns next to it on
|
|
2669
|
+
* the Discovery Scans table".
|
|
2670
|
+
*
|
|
2671
|
+
* WHAT WENT WRONG, because the shape of it decides the shape of these tests.
|
|
2672
|
+
* Saving an edit retires the scan's run, and the retire payload
|
|
2673
|
+
* (RETIRE_RUN_PAYLOAD in
|
|
2674
|
+
* Common/Server/Services/NetworkDeviceDiscoveryScanService.ts) writes a
|
|
2675
|
+
* 156-character sentence into statusMessage explaining why the results
|
|
2676
|
+
* vanished. The Responded Hosts cell renders that sentence. Every desktop body
|
|
2677
|
+
* <td> in Common/UI/Components/Table/TableRow.tsx declares `whitespace-nowrap`,
|
|
2678
|
+
* and `white-space` is an INHERITED property — so the nowrap reached the div
|
|
2679
|
+
* this page rendered inside the cell no matter what classes that div carried.
|
|
2680
|
+
* The div carried `max-w-md`, which capped the BOX while the LINE inside it
|
|
2681
|
+
* stayed unbreakable, so the sentence ran straight out of the cell and painted
|
|
2682
|
+
* over the Recurrence and Started cells beside it. A max-width paired with a
|
|
2683
|
+
* nowrap does not contain long text; it is precisely what turns "the table
|
|
2684
|
+
* gets wider" into "the text lands on top of its neighbours".
|
|
2685
|
+
*
|
|
2686
|
+
* THE FIX, and therefore what is asserted here: the wrapping is asked for at
|
|
2687
|
+
* COLUMN level (`wrapContent`, with an optional `wrapMaxWidthClassName`), the
|
|
2688
|
+
* renderer emits `whitespace-normal break-words` on the <td> and the width cap
|
|
2689
|
+
* on its content div, and the inner `max-w-md` this page used to spell by hand
|
|
2690
|
+
* is DELETED rather than left in place beside the new option.
|
|
2691
|
+
*
|
|
2692
|
+
* HOW IT IS ASSERTED. jsdom performs no layout whatsoever — no
|
|
2693
|
+
* getBoundingClientRect, no computed `white-space`, no column widths, no
|
|
2694
|
+
* overflow — so the overlap itself is not observable in any test that could
|
|
2695
|
+
* live in this repo. Every assertion below is therefore a configuration,
|
|
2696
|
+
* class, attribute, DOM-shape or text assertion: the flags the page declares,
|
|
2697
|
+
* the classes the real TableRow helpers derive from those flags, and the
|
|
2698
|
+
* markup the cell renders for the exact row the issue was filed about. The
|
|
2699
|
+
* negative ones matter as much as the positive ones — a `max-w-*` left behind
|
|
2700
|
+
* inside the cell re-creates the original pairing exactly, and a wrap flag
|
|
2701
|
+
* that spread to the timestamp and badge columns would be a page-wide restyle
|
|
2702
|
+
* wearing this fix's name.
|
|
2703
|
+
*/
|
|
2704
|
+
describe("long status messages wrap inside their own column (issue #3585)", () => {
|
|
2705
|
+
/*
|
|
2706
|
+
* The sentence the server actually writes, inlined rather than imported:
|
|
2707
|
+
* Common/Server/Services/NetworkDeviceDiscoveryScanService.ts is a server
|
|
2708
|
+
* module that pulls in the database layer, and this is a UI test. Copying it
|
|
2709
|
+
* is deliberate — a reword on the server side surfaces here as a failure,
|
|
2710
|
+
* which is the moment to re-check that the reworded sentence still wraps.
|
|
2711
|
+
*/
|
|
2712
|
+
const RETIRE_MESSAGE: string =
|
|
2713
|
+
"Settings changed, so this scan is queued to run again. The hosts the previous run found have been cleared - they described settings this scan no longer has.";
|
|
2714
|
+
|
|
2715
|
+
/*
|
|
2716
|
+
* The retired row itself: no host counts (the payload nulls them) and the
|
|
2717
|
+
* sentence above. This is the row an operator sees straight after pressing
|
|
2718
|
+
* Save on the Edit dialog, and the row screenshotted in the issue.
|
|
2719
|
+
*/
|
|
2720
|
+
const RETIRED_SCAN: Partial<NetworkDeviceDiscoveryScan> = {
|
|
2721
|
+
respondedHostCount: null,
|
|
2722
|
+
statusMessage: RETIRE_MESSAGE,
|
|
2723
|
+
} as unknown as Partial<NetworkDeviceDiscoveryScan>;
|
|
2724
|
+
|
|
2725
|
+
/*
|
|
2726
|
+
* The captured column as the type TableRow's helpers take. The mock stores
|
|
2727
|
+
* the page's own column objects under a looser local type, so this is a cast
|
|
2728
|
+
* rather than a copy — the helpers run over the very objects the page
|
|
2729
|
+
* declared.
|
|
2730
|
+
*/
|
|
2731
|
+
function tableColumnFor(
|
|
2732
|
+
title: string,
|
|
2733
|
+
): TableColumn<NetworkDeviceDiscoveryScan> {
|
|
2734
|
+
return columnByTitle(
|
|
2735
|
+
title,
|
|
2736
|
+
) as unknown as TableColumn<NetworkDeviceDiscoveryScan>;
|
|
2737
|
+
}
|
|
2738
|
+
|
|
2739
|
+
function cellClassNameFor(title: string): string {
|
|
2740
|
+
return getTableCellClassName<NetworkDeviceDiscoveryScan>({
|
|
2741
|
+
column: tableColumnFor(title),
|
|
2742
|
+
isLastRenderedColumn: false,
|
|
2743
|
+
});
|
|
2744
|
+
}
|
|
2745
|
+
|
|
2746
|
+
beforeEach(() => {
|
|
2747
|
+
capturedTableProps = null;
|
|
2748
|
+
jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
|
|
2749
|
+
|
|
2750
|
+
const probe: Probe = new Probe();
|
|
2751
|
+
probe.id = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
2752
|
+
probe.name = "Datacenter Probe";
|
|
2753
|
+
|
|
2754
|
+
jest.spyOn(ProbeUtil, "getAllProbes").mockResolvedValue([probe] as never);
|
|
2755
|
+
});
|
|
2756
|
+
|
|
2757
|
+
afterEach(() => {
|
|
2758
|
+
cleanup();
|
|
2759
|
+
jest.restoreAllMocks();
|
|
2760
|
+
capturedTableProps = null;
|
|
2761
|
+
});
|
|
2762
|
+
|
|
2763
|
+
/*
|
|
2764
|
+
* THE assertion that tells the fixed page from the broken one. Everything
|
|
2765
|
+
* else in this block describes the shape of the fix; this one line is the
|
|
2766
|
+
* fix. Delete `wrapContent` from the Responded Hosts column and the cell is
|
|
2767
|
+
* back to inheriting the row's nowrap, with the status message back on top
|
|
2768
|
+
* of the two columns to its right.
|
|
2769
|
+
*/
|
|
2770
|
+
test("the Responded Hosts column asks for its prose to wrap", async () => {
|
|
2771
|
+
await renderPage();
|
|
2772
|
+
|
|
2773
|
+
expect(columnByTitle("Responded Hosts").wrapContent).toBe(true);
|
|
2774
|
+
});
|
|
2775
|
+
|
|
2776
|
+
/*
|
|
2777
|
+
* And the flag has to REACH the markup. Asserted through the two helpers
|
|
2778
|
+
* TableRow and TableSkeletonRows render with, rather than by restating the
|
|
2779
|
+
* class strings this test would like them to produce: the claim is "this
|
|
2780
|
+
* column's cell wraps", and the code that decides that is what is asked.
|
|
2781
|
+
*/
|
|
2782
|
+
test("that flag makes the rendered cell a wrapping one, not a nowrap one", async () => {
|
|
2783
|
+
await renderPage();
|
|
2784
|
+
|
|
2785
|
+
const className: string = cellClassNameFor("Responded Hosts");
|
|
2786
|
+
|
|
2787
|
+
expect(className).toContain("whitespace-normal");
|
|
2788
|
+
expect(className).toContain("break-words");
|
|
2789
|
+
/*
|
|
2790
|
+
* The inherited declaration that caused #3585. Its absence here is the
|
|
2791
|
+
* whole point: it is unset on the cell, so it is unset on every element
|
|
2792
|
+
* getElement returns beneath it.
|
|
2793
|
+
*/
|
|
2794
|
+
expect(className).not.toContain("whitespace-nowrap");
|
|
2795
|
+
});
|
|
2796
|
+
|
|
2797
|
+
/*
|
|
2798
|
+
* The width cap is not spelled on this column, so it takes the shared
|
|
2799
|
+
* default — one place to change if 28rem turns out to be wrong for prose,
|
|
2800
|
+
* rather than a number copied into every column that holds a sentence. The
|
|
2801
|
+
* contentClassName check is the other half: the cap now arrives through the
|
|
2802
|
+
* wrap option, and a hand-written `max-w-*` sitting beside it would be
|
|
2803
|
+
* resolved by stylesheet order rather than by intent.
|
|
2804
|
+
*/
|
|
2805
|
+
test("it takes the shared default width cap rather than naming one", async () => {
|
|
2806
|
+
await renderPage();
|
|
2807
|
+
|
|
2808
|
+
const column: CapturedColumn = columnByTitle("Responded Hosts");
|
|
2809
|
+
|
|
2810
|
+
expect(column.wrapMaxWidthClassName).toBeUndefined();
|
|
2811
|
+
expect(column.contentClassName).toBeUndefined();
|
|
2812
|
+
|
|
2813
|
+
expect(
|
|
2814
|
+
getTableCellContentClassName<NetworkDeviceDiscoveryScan>(
|
|
2815
|
+
tableColumnFor("Responded Hosts"),
|
|
2816
|
+
),
|
|
2817
|
+
).toBe("max-w-md");
|
|
2818
|
+
});
|
|
2819
|
+
|
|
2820
|
+
/*
|
|
2821
|
+
* Recurrence wraps too, and narrower. The same RETIRE_RUN_PAYLOAD write that
|
|
2822
|
+
* sets the status message also sets status Pending and nextScanAt NULL, so
|
|
2823
|
+
* the row that reports #3585 renders a sentence in this cell as well — and
|
|
2824
|
+
* this column's headline is "Every 60 min", so it has no business being as
|
|
2825
|
+
* wide as the results cell.
|
|
2826
|
+
*/
|
|
2827
|
+
test("the Recurrence column wraps, capped narrower than Responded Hosts", async () => {
|
|
2828
|
+
await renderPage();
|
|
2829
|
+
|
|
2830
|
+
const column: CapturedColumn = columnByTitle("Recurrence");
|
|
2831
|
+
|
|
2832
|
+
expect(column.wrapContent).toBe(true);
|
|
2833
|
+
expect(column.wrapMaxWidthClassName).toBe("max-w-xs");
|
|
2834
|
+
|
|
2835
|
+
expect(
|
|
2836
|
+
getTableCellContentClassName<NetworkDeviceDiscoveryScan>(
|
|
2837
|
+
tableColumnFor("Recurrence"),
|
|
2838
|
+
),
|
|
2839
|
+
).toBe("max-w-xs");
|
|
2840
|
+
expect(cellClassNameFor("Recurrence")).toContain("whitespace-normal");
|
|
2841
|
+
});
|
|
2842
|
+
|
|
2843
|
+
/*
|
|
2844
|
+
* Started is one of the two columns the message used to be painted over, and
|
|
2845
|
+
* it must not be "fixed" by being allowed to wrap: a timestamp folded onto
|
|
2846
|
+
* two lines is a regression of its own, and `whitespace-nowrap` on date
|
|
2847
|
+
* cells is what keeps "Mar 12 2026, 16:05" whole.
|
|
2848
|
+
*/
|
|
2849
|
+
test("the Started timestamp is left on its single line", async () => {
|
|
2850
|
+
await renderPage();
|
|
2851
|
+
|
|
2852
|
+
expect(columnByTitle("Started").wrapContent).toBeFalsy();
|
|
2853
|
+
expect(cellClassNameFor("Started")).toContain("whitespace-nowrap");
|
|
2854
|
+
});
|
|
2855
|
+
|
|
2856
|
+
/*
|
|
2857
|
+
* The scope check. Two columns hold prose; the rest hold a name, an entity,
|
|
2858
|
+
* a badge and an address, and every one of them still gets the default
|
|
2859
|
+
* single-line cell. This is what separates a targeted fix from "the whole
|
|
2860
|
+
* table now wraps", which is a much larger visual change than #3585 asked
|
|
2861
|
+
* for and which no screenshot in the issue would justify.
|
|
2862
|
+
*/
|
|
2863
|
+
test.each(["Scan", "Probe", "Status", "Scan Target"])(
|
|
2864
|
+
"the %s column is untouched and still renders on one line",
|
|
2865
|
+
async (title: string) => {
|
|
2866
|
+
await renderPage();
|
|
2867
|
+
|
|
2868
|
+
expect(columnByTitle(title).wrapContent).toBeFalsy();
|
|
2869
|
+
expect(columnByTitle(title).wrapMaxWidthClassName).toBeUndefined();
|
|
2870
|
+
expect(cellClassNameFor(title)).toContain("whitespace-nowrap");
|
|
2871
|
+
},
|
|
2872
|
+
);
|
|
2873
|
+
|
|
2874
|
+
/*
|
|
2875
|
+
* The page's one pre-existing contentClassName, left exactly as it was. It
|
|
2876
|
+
* is a type/colour class with no width in it, which is the only kind of
|
|
2877
|
+
* contentClassName that was ever safe on a nowrap cell — and the migration
|
|
2878
|
+
* of the wrap idiom must not have gone rewriting the ones that were fine.
|
|
2879
|
+
*/
|
|
2880
|
+
test("the one pre-existing contentClassName on this page is unchanged", async () => {
|
|
2881
|
+
await renderPage();
|
|
2882
|
+
|
|
2883
|
+
expect(columnByTitle("Scan Target").contentClassName).toBe(
|
|
2884
|
+
"text-sm text-gray-900",
|
|
2885
|
+
);
|
|
2886
|
+
});
|
|
2887
|
+
|
|
2888
|
+
/*
|
|
2889
|
+
* The rule that makes the class of bug in #3585 unspellable on this page: a
|
|
2890
|
+
* width cap may only arrive through `wrapMaxWidthClassName`, which the
|
|
2891
|
+
* renderer emits ONLY together with `whitespace-normal`. A `max-w-*` written
|
|
2892
|
+
* into a contentClassName is the pairing that overlaps, whichever column it
|
|
2893
|
+
* is written on, so no column here may hold one.
|
|
2894
|
+
*/
|
|
2895
|
+
test("no column caps its width through contentClassName", async () => {
|
|
2896
|
+
await renderPage();
|
|
2897
|
+
|
|
2898
|
+
const columns: Array<CapturedColumn> = capturedTableProps?.columns || [];
|
|
2899
|
+
|
|
2900
|
+
expect(columns.length).toBeGreaterThan(0);
|
|
2901
|
+
|
|
2902
|
+
for (const column of columns) {
|
|
2903
|
+
expect(column.contentClassName || "").not.toContain("max-w-");
|
|
2904
|
+
}
|
|
2905
|
+
});
|
|
2906
|
+
|
|
2907
|
+
/*
|
|
2908
|
+
* THE ROW FROM THE ISSUE. An operator edits a scan, the server retires the
|
|
2909
|
+
* run, and this is the cell they are looking at. The sentence has to be
|
|
2910
|
+
* there in full — the fix wraps it, it does not truncate it, and nothing
|
|
2911
|
+
* about #3585 justifies hiding what happened to the results — and the hover
|
|
2912
|
+
* tooltip that predates the fix has to survive it, because the same cell
|
|
2913
|
+
* still carries probe explanations far longer than this one.
|
|
2914
|
+
*/
|
|
2915
|
+
test("the retired-run sentence renders in full, and still on a tooltip", async () => {
|
|
2916
|
+
await renderPage();
|
|
2917
|
+
|
|
2918
|
+
const container: HTMLElement = renderRespondedHostsCell(RETIRED_SCAN);
|
|
2919
|
+
|
|
2920
|
+
expect(container.textContent).toContain(RETIRE_MESSAGE);
|
|
2921
|
+
expect(container.querySelector(`[title="${RETIRE_MESSAGE}"]`)).toBeTruthy();
|
|
2922
|
+
});
|
|
2923
|
+
|
|
2924
|
+
/*
|
|
2925
|
+
* The negative half, and the one that would catch a "fix" that only added
|
|
2926
|
+
* the option without cleaning up after it. The inner `max-w-md` had to be
|
|
2927
|
+
* DELETED, not supplemented: leaving it re-creates the exact capped-box
|
|
2928
|
+
* pairing that caused the overlap, and it would now sit inside a cell that
|
|
2929
|
+
* ALSO has a cap — two `max-w-*` on nested elements, resolved by stylesheet
|
|
2930
|
+
* order rather than by intent.
|
|
2931
|
+
*
|
|
2932
|
+
* (No layout is being measured here — jsdom has none. This asserts that the
|
|
2933
|
+
* markup which made the overlap possible is gone.)
|
|
2934
|
+
*/
|
|
2935
|
+
test("nothing inside the cell caps its own width any more", async () => {
|
|
2936
|
+
await renderPage();
|
|
2937
|
+
|
|
2938
|
+
const container: HTMLElement = renderRespondedHostsCell(RETIRED_SCAN);
|
|
2939
|
+
|
|
2940
|
+
expect(container.querySelectorAll("[class*='max-w-']")).toHaveLength(0);
|
|
2941
|
+
});
|
|
2942
|
+
|
|
2943
|
+
/*
|
|
2944
|
+
* The reporting branch, which is the cell as it renders on a normal day. The
|
|
2945
|
+
* three things it says all predate #3585 and all have issues of their own
|
|
2946
|
+
* behind them — the headline count, the ping-only tally (#3445) and the
|
|
2947
|
+
* probe's explanation (#3287) — so this is the regression test for "the
|
|
2948
|
+
* layout change quietly dropped a line".
|
|
2949
|
+
*/
|
|
2950
|
+
test("a reported scan still says everything it said before", async () => {
|
|
2951
|
+
await renderPage();
|
|
2952
|
+
|
|
2953
|
+
const container: HTMLElement = renderRespondedHostsCell({
|
|
2954
|
+
respondedHostCount: 0,
|
|
2955
|
+
scannedHostCount: 254,
|
|
2956
|
+
discoveredDevices: [
|
|
2957
|
+
{ ipAddress: "10.0.0.4", snmpReachable: false },
|
|
2958
|
+
{ ipAddress: "10.0.0.9", snmpReachable: false },
|
|
2959
|
+
],
|
|
2960
|
+
statusMessage: RETIRE_MESSAGE,
|
|
2961
|
+
} as unknown as Partial<NetworkDeviceDiscoveryScan>);
|
|
2962
|
+
|
|
2963
|
+
// The count — a zero alone reads as "empty subnet" (issue #3287).
|
|
2964
|
+
expect(container.textContent).toContain("0 of 254 hosts");
|
|
2965
|
+
// ...which is why the ping-only tally sits under it (issue #3445).
|
|
2966
|
+
expect(container.textContent).toContain("+ 2 alive without SNMP");
|
|
2967
|
+
// ...and the probe's account of the sweep under that (issue #3287).
|
|
2968
|
+
expect(container.textContent).toContain(RETIRE_MESSAGE);
|
|
2969
|
+
expect(container.querySelector(`[title="${RETIRE_MESSAGE}"]`)).toBeTruthy();
|
|
2970
|
+
|
|
2971
|
+
expect(container.querySelectorAll("[class*='max-w-']")).toHaveLength(0);
|
|
2972
|
+
});
|
|
2973
|
+
|
|
2974
|
+
/*
|
|
2975
|
+
* And the empty branch: a scan with nothing to report and nothing to explain
|
|
2976
|
+
* is still a bare em-dash, exactly like every other empty cell on this
|
|
2977
|
+
* table.
|
|
2978
|
+
*/
|
|
2979
|
+
test("a scan with nothing to say still renders a bare em-dash", async () => {
|
|
2980
|
+
await renderPage();
|
|
2981
|
+
|
|
2982
|
+
const container: HTMLElement = renderRespondedHostsCell({});
|
|
2983
|
+
|
|
2984
|
+
expect(container.textContent).toBe("—");
|
|
2985
|
+
expect(container.querySelectorAll("[class*='max-w-']")).toHaveLength(0);
|
|
2986
|
+
});
|
|
2987
|
+
|
|
2988
|
+
/*
|
|
2989
|
+
* The Recurrence cell in the state RETIRE_RUN_PAYLOAD actually writes:
|
|
2990
|
+
* recurring, Pending, nextScanAt NULL. This row is the sibling of the one
|
|
2991
|
+
* above — the same save produces both — so the wrap flag added to this
|
|
2992
|
+
* column has to leave its wording alone.
|
|
2993
|
+
*/
|
|
2994
|
+
test("a retired recurring scan still says the next run waits for this one", async () => {
|
|
2995
|
+
await renderPage();
|
|
2996
|
+
|
|
2997
|
+
expect(
|
|
2998
|
+
renderRecurrenceCell({
|
|
2999
|
+
isRecurring: true,
|
|
3000
|
+
rescanIntervalInMinutes: 60,
|
|
3001
|
+
status: "Pending",
|
|
3002
|
+
nextScanAt: null,
|
|
3003
|
+
} as unknown as Partial<NetworkDeviceDiscoveryScan>),
|
|
3004
|
+
).toContain("Next scan is scheduled when this run finishes");
|
|
3005
|
+
});
|
|
3006
|
+
|
|
3007
|
+
/*
|
|
3008
|
+
* The warning branch from issue #3444 — a recurring scan that has finished
|
|
3009
|
+
* with nothing scheduled will never run again — including the colour that
|
|
3010
|
+
* makes it read as a warning rather than as a caption.
|
|
3011
|
+
*/
|
|
3012
|
+
test("the never-again warning keeps its wording and its colour", async () => {
|
|
3013
|
+
await renderPage();
|
|
3014
|
+
|
|
3015
|
+
const container: HTMLElement = renderRecurrenceCellElement({
|
|
3016
|
+
isRecurring: true,
|
|
3017
|
+
rescanIntervalInMinutes: 60,
|
|
3018
|
+
status: "Completed",
|
|
3019
|
+
nextScanAt: null,
|
|
3020
|
+
} as unknown as Partial<NetworkDeviceDiscoveryScan>);
|
|
3021
|
+
|
|
3022
|
+
expect(container.textContent).toContain(
|
|
3023
|
+
"No next scan is scheduled. Open Edit and save to schedule one.",
|
|
3024
|
+
);
|
|
3025
|
+
expect(container.querySelector(".text-yellow-600")).toBeTruthy();
|
|
3026
|
+
});
|
|
3027
|
+
|
|
3028
|
+
// The two branches the fix had no business touching at all.
|
|
3029
|
+
test("a one-time scan still reads as one-time", async () => {
|
|
3030
|
+
await renderPage();
|
|
3031
|
+
|
|
3032
|
+
expect(renderRecurrenceCell({ isRecurring: false })).toBe("One-time");
|
|
3033
|
+
});
|
|
3034
|
+
|
|
3035
|
+
test("a scheduled scan still hangs the exact date off a tooltip", async () => {
|
|
3036
|
+
await renderPage();
|
|
3037
|
+
|
|
3038
|
+
const nextScanAt: Date = new Date(Date.now() + 30 * 60000);
|
|
3039
|
+
|
|
3040
|
+
const container: HTMLElement = renderRecurrenceCellElement({
|
|
3041
|
+
isRecurring: true,
|
|
3042
|
+
rescanIntervalInMinutes: 60,
|
|
3043
|
+
status: "Completed",
|
|
3044
|
+
nextScanAt: nextScanAt,
|
|
3045
|
+
});
|
|
3046
|
+
|
|
3047
|
+
expect(container.textContent).toContain("Next scan");
|
|
3048
|
+
/*
|
|
3049
|
+
* The cell shows a relative time and keeps the absolute one on the title,
|
|
3050
|
+
* formatted by the same utility this expectation is built with.
|
|
3051
|
+
*/
|
|
3052
|
+
expect(
|
|
3053
|
+
container.querySelector(
|
|
3054
|
+
`[title="${OneUptimeDate.getDateAsLocalFormattedString(nextScanAt)}"]`,
|
|
3055
|
+
),
|
|
3056
|
+
).toBeTruthy();
|
|
3057
|
+
});
|
|
3058
|
+
});
|