@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
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
cleanup,
|
|
4
|
+
configure,
|
|
5
|
+
render,
|
|
6
|
+
screen,
|
|
7
|
+
waitFor,
|
|
8
|
+
} from "@testing-library/react";
|
|
9
|
+
import React, { ReactElement } from "react";
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* A real BaseModelTable mounts a card, a header and a full table before the
|
|
13
|
+
* first row exists. That comfortably outruns the 1s default when the whole
|
|
14
|
+
* Common suite is competing for the same box. A regression still fails, just
|
|
15
|
+
* later.
|
|
16
|
+
*/
|
|
17
|
+
configure({ asyncUtilTimeout: 15000 });
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
afterEach,
|
|
21
|
+
beforeEach,
|
|
22
|
+
describe,
|
|
23
|
+
expect,
|
|
24
|
+
jest,
|
|
25
|
+
test,
|
|
26
|
+
} from "@jest/globals";
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* ============================================================================
|
|
30
|
+
* WHY THIS FILE EXISTS - OneUptime issue #3585
|
|
31
|
+
* ============================================================================
|
|
32
|
+
*
|
|
33
|
+
* Every desktop body <td> is `whitespace-nowrap`, and `white-space` is an
|
|
34
|
+
* INHERITED CSS property, so that nowrap reaches whatever element a column's
|
|
35
|
+
* `getElement` returns. On the Discovery Scans page the "Responded Hosts"
|
|
36
|
+
* cell renders a 156-character server-authored sentence (RETIRE_RUN_PAYLOAD
|
|
37
|
+
* in Common/Server/Services/NetworkDeviceDiscoveryScanService.ts) inside a
|
|
38
|
+
* `max-w-md` div: a capped box holding one unbreakable line, so the sentence
|
|
39
|
+
* painted straight over the Recurrence and Started cells beside it.
|
|
40
|
+
*
|
|
41
|
+
* The fix gives a column two declarative options - `wrapContent` and
|
|
42
|
+
* `wrapMaxWidthClassName` - which Common/UI/Components/Table/CellClassName.ts
|
|
43
|
+
* turns into `whitespace-normal break-words` on the <td> and the width cap on
|
|
44
|
+
* the <td>'s content <div> (max-width is ignored on a table-cell box, so the
|
|
45
|
+
* cap has to live on the child).
|
|
46
|
+
*
|
|
47
|
+
* The reason the tests live at the ModelTable level rather than against
|
|
48
|
+
* TableRow directly: Common/UI/Components/ModelTable/BaseModelTable.tsx has
|
|
49
|
+
* exactly ONE ModelTable-column to Table-column conversion, the
|
|
50
|
+
* `columns.push({ ...column, ... })` inside `serializeToTableColumns`. Both
|
|
51
|
+
* new fields travel on that SPREAD. Nothing names them, nothing type-checks
|
|
52
|
+
* the hop, and TypeScript is perfectly happy if a future refactor replaces
|
|
53
|
+
* the spread with an explicit list of copied fields - which would silently
|
|
54
|
+
* reintroduce #3585, with a green TableRow unit test and nothing else to show
|
|
55
|
+
* for it. These tests drive a real BaseModelTable end to end so that hop is
|
|
56
|
+
* covered, and they are the only thing that would catch it.
|
|
57
|
+
*
|
|
58
|
+
* NOTE ON WHAT CAN BE ASSERTED: jsdom performs no layout. There is no
|
|
59
|
+
* getBoundingClientRect worth reading, no computed line breaking, no overflow
|
|
60
|
+
* and no column widths. Where a reader would reasonably expect "assert the
|
|
61
|
+
* text does not overlap the next column", these tests assert instead the
|
|
62
|
+
* exact classes and DOM structure that a browser turns into that behaviour -
|
|
63
|
+
* the class strings ARE the contract here.
|
|
64
|
+
* ============================================================================
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* BaseModelTable pulls in permissions, the current project and the i18n
|
|
69
|
+
* provider. None of those are what these tests are about, so they are stubbed
|
|
70
|
+
* to their permissive / no-op form and the tests focus on one thing: the
|
|
71
|
+
* wrapping options surviving the trip from a ModelTable column into the
|
|
72
|
+
* rendered <td>.
|
|
73
|
+
*/
|
|
74
|
+
jest.mock("../../../../UI/Utils/Permission", () => {
|
|
75
|
+
return {
|
|
76
|
+
__esModule: true,
|
|
77
|
+
default: {
|
|
78
|
+
getAllPermissions: () => {
|
|
79
|
+
return [];
|
|
80
|
+
},
|
|
81
|
+
getProjectPermissions: () => {
|
|
82
|
+
return [];
|
|
83
|
+
},
|
|
84
|
+
getGlobalPermissions: () => {
|
|
85
|
+
return [];
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
jest.mock("../../../../UI/Utils/User", () => {
|
|
92
|
+
return {
|
|
93
|
+
__esModule: true,
|
|
94
|
+
default: {
|
|
95
|
+
isMasterAdmin: () => {
|
|
96
|
+
return true;
|
|
97
|
+
},
|
|
98
|
+
getUserId: () => {
|
|
99
|
+
return null;
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
jest.mock("../../../../UI/Utils/Translation", () => {
|
|
106
|
+
return {
|
|
107
|
+
__esModule: true,
|
|
108
|
+
default: () => {
|
|
109
|
+
return {
|
|
110
|
+
translateString: (value: string | undefined) => {
|
|
111
|
+
return value;
|
|
112
|
+
},
|
|
113
|
+
translateValue: (value: unknown) => {
|
|
114
|
+
return value;
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
import BaseModelTable, {
|
|
122
|
+
BaseTableCallbacks,
|
|
123
|
+
ComponentProps as BaseModelTableProps,
|
|
124
|
+
} from "../../../../UI/Components/ModelTable/BaseModelTable";
|
|
125
|
+
import Columns from "../../../../UI/Components/ModelTable/Columns";
|
|
126
|
+
import Filter from "../../../../UI/Components/ModelFilter/Filter";
|
|
127
|
+
import FieldType from "../../../../UI/Components/Types/FieldType";
|
|
128
|
+
import ActionButtonSchema from "../../../../UI/Components/ActionButton/ActionButtonSchema";
|
|
129
|
+
import { ButtonStyleType } from "../../../../UI/Components/Button/Button";
|
|
130
|
+
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
131
|
+
import Query from "../../../../Types/BaseDatabase/Query";
|
|
132
|
+
import ListResult from "../../../../Types/BaseDatabase/ListResult";
|
|
133
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
134
|
+
|
|
135
|
+
const PREFS_KEY: string = "monitors-wrap-content-table";
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* The exact <td> class string every non-wrapping body cell had BEFORE the fix,
|
|
139
|
+
* character for character, and still has after it. Spelled out as a literal
|
|
140
|
+
* rather than imported from CellClassName.ts on purpose: importing the helper
|
|
141
|
+
* would only prove the helper agrees with itself, while this literal is the
|
|
142
|
+
* frozen "no column asked for anything, so nothing changed" contract that
|
|
143
|
+
* roughly two hundred column declarations with no layout coverage of their
|
|
144
|
+
* own are relying on.
|
|
145
|
+
*/
|
|
146
|
+
const NOWRAP_CELL_CLASS_NAME: string =
|
|
147
|
+
"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-500 sm:pl-6 align-top";
|
|
148
|
+
|
|
149
|
+
// Same, for the last rendered column, which takes the wider right padding.
|
|
150
|
+
const NOWRAP_LAST_CELL_CLASS_NAME: string =
|
|
151
|
+
"whitespace-nowrap py-4 pl-4 pr-6 text-sm font-medium text-gray-500 sm:pl-6 align-top";
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* The default cap a wrapping column gets when it names no width of its own.
|
|
155
|
+
* Hard-coded rather than imported for the same reason as above: this is the
|
|
156
|
+
* shipped value ("Responded Hosts" on the Discovery page relies on it), so
|
|
157
|
+
* changing it should have to be a deliberate edit here too.
|
|
158
|
+
*/
|
|
159
|
+
const DEFAULT_WRAP_WIDTH_CLASS_NAME: string = "max-w-md";
|
|
160
|
+
|
|
161
|
+
const FILTERS: Array<Filter<Monitor>> = [
|
|
162
|
+
{ title: "Name", type: FieldType.Text, field: { name: true } },
|
|
163
|
+
] as unknown as Array<Filter<Monitor>>;
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* One row is all these tests need - they are about the cell shell, not about
|
|
167
|
+
* the values in it. Every column below declares a real Monitor field, because
|
|
168
|
+
* TableRow only calls `getElement` for a column that resolved to a `key`, and
|
|
169
|
+
* the key is derived from the declared field.
|
|
170
|
+
*/
|
|
171
|
+
const ROWS: Array<JSONObject> = [
|
|
172
|
+
{
|
|
173
|
+
_id: "monitor-1",
|
|
174
|
+
name: "api-gateway",
|
|
175
|
+
description:
|
|
176
|
+
"Settings changed, so this scan is queued to run again. The previous run was retired.",
|
|
177
|
+
monitorType: "Website",
|
|
178
|
+
slug: "api-gateway",
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
type MakeColumnsFunction = () => Columns<Monitor>;
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* Four columns covering the whole option matrix, plus the generated Actions
|
|
186
|
+
* column that BaseModelTable appends. They are deliberately in ONE table: the
|
|
187
|
+
* bug report is a row where one cell wraps and its neighbours must not, so
|
|
188
|
+
* "per column, not per table" is part of the contract being pinned.
|
|
189
|
+
*/
|
|
190
|
+
const makeColumns: MakeColumnsFunction = (): Columns<Monitor> => {
|
|
191
|
+
const columns: Array<unknown> = [
|
|
192
|
+
/*
|
|
193
|
+
* The control. Declares neither option, exactly like almost every column
|
|
194
|
+
* in the product, and must come out byte-identical to how it rendered
|
|
195
|
+
* before the fix existed.
|
|
196
|
+
*/
|
|
197
|
+
{
|
|
198
|
+
field: { name: true },
|
|
199
|
+
title: "Name",
|
|
200
|
+
type: FieldType.Element,
|
|
201
|
+
getElement: (): ReactElement => {
|
|
202
|
+
return <span data-testid="cell-name">api-gateway</span>;
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
/*
|
|
206
|
+
* The #3585 shape: a cell holding a server-authored sentence, opting into
|
|
207
|
+
* wrapping without naming a width. This is the "Responded Hosts" column
|
|
208
|
+
* on App/FeatureSet/Dashboard/src/Pages/NetworkDevice/Discovery.tsx.
|
|
209
|
+
*/
|
|
210
|
+
{
|
|
211
|
+
field: { description: true },
|
|
212
|
+
title: "Status Message",
|
|
213
|
+
type: FieldType.Element,
|
|
214
|
+
wrapContent: true,
|
|
215
|
+
getElement: (): ReactElement => {
|
|
216
|
+
return (
|
|
217
|
+
<span data-testid="cell-status-message">
|
|
218
|
+
Settings changed, so this scan is queued to run again.
|
|
219
|
+
</span>
|
|
220
|
+
);
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
/*
|
|
224
|
+
* A wrapping column that names its own, wider cap. This is the shape
|
|
225
|
+
* ExceptionsTable.tsx's "Exception Message" column was migrated to.
|
|
226
|
+
*/
|
|
227
|
+
{
|
|
228
|
+
field: { monitorType: true },
|
|
229
|
+
title: "Exception Message",
|
|
230
|
+
type: FieldType.Element,
|
|
231
|
+
wrapContent: true,
|
|
232
|
+
wrapMaxWidthClassName: "max-w-3xl",
|
|
233
|
+
getElement: (): ReactElement => {
|
|
234
|
+
return <span data-testid="cell-exception-message">TypeError</span>;
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
/*
|
|
238
|
+
* The pre-existing contract: a column that only styles its content and
|
|
239
|
+
* never asked to wrap. It has to pass through untouched, and must NOT
|
|
240
|
+
* acquire a width cap.
|
|
241
|
+
*/
|
|
242
|
+
{
|
|
243
|
+
field: { slug: true },
|
|
244
|
+
title: "Note",
|
|
245
|
+
type: FieldType.Element,
|
|
246
|
+
contentClassName: "text-xs text-gray-500",
|
|
247
|
+
getElement: (): ReactElement => {
|
|
248
|
+
return <span data-testid="cell-note">a note</span>;
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
];
|
|
252
|
+
|
|
253
|
+
return columns as unknown as Columns<Monitor>;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
/*
|
|
257
|
+
* One row action, which is the cheapest way to make BaseModelTable decide it
|
|
258
|
+
* needs the generated Actions column at all (see `showActionsColumn` in
|
|
259
|
+
* serializeToTableColumns).
|
|
260
|
+
*/
|
|
261
|
+
const ACTION_BUTTONS: Array<ActionButtonSchema<Monitor>> = [
|
|
262
|
+
{
|
|
263
|
+
title: "Edit",
|
|
264
|
+
buttonStyleType: ButtonStyleType.NORMAL,
|
|
265
|
+
onClick: (): void => {
|
|
266
|
+
return undefined;
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
] as unknown as Array<ActionButtonSchema<Monitor>>;
|
|
270
|
+
|
|
271
|
+
describe("ModelTable column wrapping options (OneUptime issue #3585)", () => {
|
|
272
|
+
type MakeCallbacksFunction = (
|
|
273
|
+
rows: Array<JSONObject>,
|
|
274
|
+
) => BaseTableCallbacks<Monitor>;
|
|
275
|
+
|
|
276
|
+
/*
|
|
277
|
+
* Server-free: `getList` is a plain function returning a page of rows, and
|
|
278
|
+
* the model/JSON conversions are the identity, so the JSONObject rows above
|
|
279
|
+
* reach `getElement` untouched.
|
|
280
|
+
*/
|
|
281
|
+
const makeCallbacks: MakeCallbacksFunction = (
|
|
282
|
+
rows: Array<JSONObject>,
|
|
283
|
+
): BaseTableCallbacks<Monitor> => {
|
|
284
|
+
return {
|
|
285
|
+
deleteItem: async () => {
|
|
286
|
+
return undefined;
|
|
287
|
+
},
|
|
288
|
+
getModelFromJSON: (item: JSONObject) => {
|
|
289
|
+
return item as unknown as Monitor;
|
|
290
|
+
},
|
|
291
|
+
getJSONFromModel: (item: Monitor) => {
|
|
292
|
+
return item as unknown as JSONObject;
|
|
293
|
+
},
|
|
294
|
+
addSlugToSelect: (select: unknown) => {
|
|
295
|
+
return select;
|
|
296
|
+
},
|
|
297
|
+
getList: async (data: {
|
|
298
|
+
query: Query<Monitor>;
|
|
299
|
+
limit: number;
|
|
300
|
+
select: JSONObject;
|
|
301
|
+
sort: JSONObject;
|
|
302
|
+
}): Promise<ListResult<Monitor>> => {
|
|
303
|
+
return {
|
|
304
|
+
data: rows as unknown as Array<Monitor>,
|
|
305
|
+
count: rows.length,
|
|
306
|
+
skip: 0,
|
|
307
|
+
limit: data.limit,
|
|
308
|
+
};
|
|
309
|
+
},
|
|
310
|
+
toJSONArray: () => {
|
|
311
|
+
return [];
|
|
312
|
+
},
|
|
313
|
+
updateById: async () => {
|
|
314
|
+
return undefined;
|
|
315
|
+
},
|
|
316
|
+
showCreateEditModal: () => {
|
|
317
|
+
return <></>;
|
|
318
|
+
},
|
|
319
|
+
} as unknown as BaseTableCallbacks<Monitor>;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
type RenderTableFunction = () => ReturnType<typeof render>;
|
|
323
|
+
|
|
324
|
+
const renderTable: RenderTableFunction = (): ReturnType<typeof render> => {
|
|
325
|
+
const props: BaseModelTableProps<Monitor> = {
|
|
326
|
+
modelType: Monitor,
|
|
327
|
+
id: "monitors-table",
|
|
328
|
+
name: "Monitors",
|
|
329
|
+
userPreferencesKey: PREFS_KEY,
|
|
330
|
+
cardProps: { title: "Monitors" },
|
|
331
|
+
columns: makeColumns(),
|
|
332
|
+
filters: FILTERS,
|
|
333
|
+
isDeleteable: false,
|
|
334
|
+
isCreateable: false,
|
|
335
|
+
isViewable: false,
|
|
336
|
+
isEditable: false,
|
|
337
|
+
actionButtons: ACTION_BUTTONS,
|
|
338
|
+
// This suite is about cell classes; keep the URL out of it entirely.
|
|
339
|
+
disableUrlState: true,
|
|
340
|
+
callbacks: makeCallbacks(ROWS),
|
|
341
|
+
} as unknown as BaseModelTableProps<Monitor>;
|
|
342
|
+
|
|
343
|
+
return render(<BaseModelTable<Monitor> {...props} />);
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
type WaitForRowFunction = () => Promise<void>;
|
|
347
|
+
|
|
348
|
+
const waitForRow: WaitForRowFunction = async (): Promise<void> => {
|
|
349
|
+
await waitFor(() => {
|
|
350
|
+
expect(screen.queryByTestId("cell-name")).not.toBeNull();
|
|
351
|
+
});
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
type GetContentWrapperFunction = (testId: string) => HTMLElement;
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* TableRow renders a cell as <td><div className={content}>{element}</div>,
|
|
358
|
+
* so the wrapper is the marker span's direct parent. Reached that way
|
|
359
|
+
* rather than by index so a column reorder cannot quietly retarget an
|
|
360
|
+
* assertion.
|
|
361
|
+
*/
|
|
362
|
+
const getContentWrapper: GetContentWrapperFunction = (
|
|
363
|
+
testId: string,
|
|
364
|
+
): HTMLElement => {
|
|
365
|
+
return screen.getByTestId(testId).parentElement as HTMLElement;
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
type GetCellFunction = (testId: string) => HTMLElement;
|
|
369
|
+
|
|
370
|
+
const getCell: GetCellFunction = (testId: string): HTMLElement => {
|
|
371
|
+
return screen.getByTestId(testId).closest("td") as HTMLElement;
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
beforeEach(() => {
|
|
375
|
+
/*
|
|
376
|
+
* BaseModelTable reads any stored column layout out of localStorage on
|
|
377
|
+
* mount, and the runner shares one jsdom across files.
|
|
378
|
+
*/
|
|
379
|
+
window.localStorage.clear();
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
afterEach(() => {
|
|
383
|
+
cleanup();
|
|
384
|
+
jest.restoreAllMocks();
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
describe("a column that opts into wrapping", () => {
|
|
388
|
+
/*
|
|
389
|
+
* The heart of #3585. `whitespace-nowrap` on the <td> is what the
|
|
390
|
+
* sentence inherited; `whitespace-normal break-words` is what replaces
|
|
391
|
+
* it. jsdom cannot break a line, so the class list is the assertion.
|
|
392
|
+
*/
|
|
393
|
+
test("renders a <td> that declares whitespace-normal and break-words, never whitespace-nowrap", async () => {
|
|
394
|
+
renderTable();
|
|
395
|
+
|
|
396
|
+
await waitForRow();
|
|
397
|
+
|
|
398
|
+
const cell: HTMLElement = getCell("cell-status-message");
|
|
399
|
+
|
|
400
|
+
expect(cell).toHaveClass("whitespace-normal");
|
|
401
|
+
expect(cell).toHaveClass("break-words");
|
|
402
|
+
expect(cell).not.toHaveClass("whitespace-nowrap");
|
|
403
|
+
|
|
404
|
+
/*
|
|
405
|
+
* Pinned as a whole string, not just as three classes: the padding,
|
|
406
|
+
* text and alignment utilities are what keep a wrapping cell in the
|
|
407
|
+
* same visual rhythm as its neighbours, and a rewrite that produced the
|
|
408
|
+
* right whitespace classes while dropping those would look fine here
|
|
409
|
+
* and wrong on screen.
|
|
410
|
+
*/
|
|
411
|
+
expect(cell.className).toBe(
|
|
412
|
+
"whitespace-normal break-words py-4 pl-4 pr-3 text-sm font-medium text-gray-500 sm:pl-6 align-top",
|
|
413
|
+
);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
/*
|
|
417
|
+
* The width cap belongs on the content <div>, never on the <td>:
|
|
418
|
+
* `max-width` on a `display: table-cell` box is ignored outright, so a
|
|
419
|
+
* cap that drifted onto the <td> would do nothing at all - and the
|
|
420
|
+
* original bug was precisely a capped box around an unbreakable line.
|
|
421
|
+
*/
|
|
422
|
+
test("caps the content wrapper, not the <td>, when no width is named", async () => {
|
|
423
|
+
renderTable();
|
|
424
|
+
|
|
425
|
+
await waitForRow();
|
|
426
|
+
|
|
427
|
+
expect(getContentWrapper("cell-status-message").className).toBe(
|
|
428
|
+
DEFAULT_WRAP_WIDTH_CLASS_NAME,
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
expect(getCell("cell-status-message").className).not.toMatch(/max-w-/);
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
/*
|
|
435
|
+
* `wrapMaxWidthClassName` is the second of the two fields riding the
|
|
436
|
+
* BaseModelTable spread, and the one ExceptionsTable.tsx depends on: its
|
|
437
|
+
* "Exception Message" column was migrated from a hand-spelled
|
|
438
|
+
* "max-w-3xl whitespace-normal break-words" contentClassName onto these
|
|
439
|
+
* options, so if this field stops making the hop that table silently
|
|
440
|
+
* loses its width cap.
|
|
441
|
+
*/
|
|
442
|
+
test("uses wrapMaxWidthClassName on the wrapper when the column names one", async () => {
|
|
443
|
+
renderTable();
|
|
444
|
+
|
|
445
|
+
await waitForRow();
|
|
446
|
+
|
|
447
|
+
const wrapper: HTMLElement = getContentWrapper("cell-exception-message");
|
|
448
|
+
|
|
449
|
+
expect(wrapper.className).toBe("max-w-3xl");
|
|
450
|
+
// The named width replaces the default rather than stacking with it.
|
|
451
|
+
expect(wrapper).not.toHaveClass(DEFAULT_WRAP_WIDTH_CLASS_NAME);
|
|
452
|
+
|
|
453
|
+
// ...and the cell it sits in is still a wrapping cell.
|
|
454
|
+
expect(getCell("cell-exception-message")).toHaveClass(
|
|
455
|
+
"whitespace-normal",
|
|
456
|
+
"break-words",
|
|
457
|
+
);
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
describe("columns that opt into nothing", () => {
|
|
462
|
+
/*
|
|
463
|
+
* The regression that would hurt most: wrapping leaking from one column
|
|
464
|
+
* onto the rest of the row. "12 Mar 2026, 4:05 pm" folding onto two lines
|
|
465
|
+
* across every table in the product is a far bigger blast radius than the
|
|
466
|
+
* bug being fixed, so a sibling in the SAME rendered row is asserted to
|
|
467
|
+
* still be nowrap.
|
|
468
|
+
*/
|
|
469
|
+
test("a sibling column in the same row still renders a nowrap <td>", async () => {
|
|
470
|
+
renderTable();
|
|
471
|
+
|
|
472
|
+
await waitForRow();
|
|
473
|
+
|
|
474
|
+
const wrappingCell: HTMLElement = getCell("cell-status-message");
|
|
475
|
+
const plainCell: HTMLElement = getCell("cell-name");
|
|
476
|
+
|
|
477
|
+
// Same row - so this really is per column, not per table.
|
|
478
|
+
expect(plainCell.parentElement).toBe(wrappingCell.parentElement);
|
|
479
|
+
|
|
480
|
+
expect(plainCell.className).toBe(NOWRAP_CELL_CLASS_NAME);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
/*
|
|
484
|
+
* A column that declares neither option must produce the DOM it produced
|
|
485
|
+
* before the options existed - down to an empty wrapper className, so
|
|
486
|
+
* that not one class shifts for the columns nobody touched.
|
|
487
|
+
*/
|
|
488
|
+
test("a column that declares neither option gets an empty content wrapper", async () => {
|
|
489
|
+
renderTable();
|
|
490
|
+
|
|
491
|
+
await waitForRow();
|
|
492
|
+
|
|
493
|
+
expect(getContentWrapper("cell-name").className).toBe("");
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
/*
|
|
497
|
+
* `contentClassName` predates this work and is a different thing: styling
|
|
498
|
+
* for the content, with no opinion on wrapping. It has to pass through
|
|
499
|
+
* untouched, and - the important half - must NOT acquire a width cap,
|
|
500
|
+
* because a max-width on a still-nowrap cell is exactly the overlap
|
|
501
|
+
* generator #3585 was.
|
|
502
|
+
*/
|
|
503
|
+
test("a contentClassName-only column keeps its exact string, with no width injected", async () => {
|
|
504
|
+
renderTable();
|
|
505
|
+
|
|
506
|
+
await waitForRow();
|
|
507
|
+
|
|
508
|
+
expect(getContentWrapper("cell-note").className).toBe(
|
|
509
|
+
"text-xs text-gray-500",
|
|
510
|
+
);
|
|
511
|
+
expect(getContentWrapper("cell-note").className).not.toMatch(/max-w-/);
|
|
512
|
+
|
|
513
|
+
// And the cell itself is untouched: no opt-in, no wrapping.
|
|
514
|
+
expect(getCell("cell-note").className).toBe(NOWRAP_CELL_CLASS_NAME);
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
describe("the generated Actions column", () => {
|
|
519
|
+
/*
|
|
520
|
+
* BaseModelTable appends the Actions column itself (the second
|
|
521
|
+
* `columns.push` in serializeToTableColumns) with a title and a type and
|
|
522
|
+
* nothing else. It is the one column no caller can annotate, so it is the
|
|
523
|
+
* one most likely to be broken by a change to the shared cell helper: a
|
|
524
|
+
* width cap here would squeeze the row's buttons, and wrapping here would
|
|
525
|
+
* stack them.
|
|
526
|
+
*/
|
|
527
|
+
test("renders a nowrap last cell and an uncapped 'flex justify-end' container", async () => {
|
|
528
|
+
const { container } = renderTable();
|
|
529
|
+
|
|
530
|
+
await waitForRow();
|
|
531
|
+
|
|
532
|
+
const actionsContainer: HTMLElement = container.querySelector(
|
|
533
|
+
"tbody div.justify-end",
|
|
534
|
+
) as HTMLElement;
|
|
535
|
+
|
|
536
|
+
expect(actionsContainer).not.toBeNull();
|
|
537
|
+
/*
|
|
538
|
+
* Exactly this string: the actions container is built by appending the
|
|
539
|
+
* cell's content classes to "flex justify-end", so anything the helper
|
|
540
|
+
* wrongly handed a no-option column would show up here as extra
|
|
541
|
+
* classes.
|
|
542
|
+
*/
|
|
543
|
+
expect(actionsContainer.className).toBe("flex justify-end");
|
|
544
|
+
|
|
545
|
+
const actionsCell: HTMLElement = actionsContainer.closest(
|
|
546
|
+
"td",
|
|
547
|
+
) as HTMLElement;
|
|
548
|
+
|
|
549
|
+
// Appended last, and so it takes the last column's wider right padding.
|
|
550
|
+
const cells: Array<Element> = Array.from(
|
|
551
|
+
(actionsCell.parentElement as HTMLElement).querySelectorAll("td"),
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
expect(cells[cells.length - 1]).toBe(actionsCell);
|
|
555
|
+
expect(actionsCell.className).toBe(NOWRAP_LAST_CELL_CLASS_NAME);
|
|
556
|
+
|
|
557
|
+
// Nothing inside the actions cell is width-capped either.
|
|
558
|
+
expect(actionsCell.querySelector('[class*="max-w-"]')).toBeNull();
|
|
559
|
+
});
|
|
560
|
+
});
|
|
561
|
+
});
|