@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,625 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
3
|
+
import { RenderResult, cleanup, render, screen } from "@testing-library/react";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { ReactElement } from "react";
|
|
6
|
+
import Table from "../../../UI/Components/Table/Table";
|
|
7
|
+
import Column from "../../../UI/Components/Table/Types/Column";
|
|
8
|
+
import Columns from "../../../UI/Components/Table/Types/Columns";
|
|
9
|
+
import {
|
|
10
|
+
DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME,
|
|
11
|
+
getTableCellClassName,
|
|
12
|
+
getTableCellContentClassName,
|
|
13
|
+
} from "../../../UI/Components/Table/CellClassName";
|
|
14
|
+
import FieldType from "../../../UI/Components/Types/FieldType";
|
|
15
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* OneUptime issue #3585 - a status sentence painted over the columns beside it.
|
|
19
|
+
*
|
|
20
|
+
* The Discovery Scans table renders a server-written sentence in its "Responded
|
|
21
|
+
* Hosts" cell (RETIRE_RUN_PAYLOAD in
|
|
22
|
+
* Common/Server/Services/NetworkDeviceDiscoveryScanService.ts, 156 characters).
|
|
23
|
+
* Every desktop body <td> in TableRow.tsx declares `whitespace-nowrap`, and
|
|
24
|
+
* `white-space` is an INHERITED property, so the nowrap reached the sentence
|
|
25
|
+
* whatever classes its own element carried. The cell also carried `max-w-md`,
|
|
26
|
+
* which capped the BOX the unbreakable line then overflowed out of - so the
|
|
27
|
+
* sentence was painted straight across the Recurrence and Started cells rather
|
|
28
|
+
* than merely widening the table. A width cap on a nowrap cell is the overlap
|
|
29
|
+
* generator, not the fix.
|
|
30
|
+
*
|
|
31
|
+
* The fix routes both class strings through
|
|
32
|
+
* Common/UI/Components/Table/CellClassName.ts and adds two column options,
|
|
33
|
+
* `wrapContent` and `wrapMaxWidthClassName`, such that a width cap can only
|
|
34
|
+
* ever be emitted together with a wrapping mode.
|
|
35
|
+
*
|
|
36
|
+
* IMPORTANT, and the reason every assertion below is a class / attribute /
|
|
37
|
+
* DOM-structure / text assertion: jsdom performs NO layout. There is no
|
|
38
|
+
* getBoundingClientRect worth reading, no computed line breaking, no overflow
|
|
39
|
+
* and no column widths. Where a reader would reasonably expect "assert the text
|
|
40
|
+
* did not overlap its neighbour", what is asserted instead is the exact class
|
|
41
|
+
* contract the browser would have applied - which is the whole of what the fix
|
|
42
|
+
* changes.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
jest.mock("react-i18next", () => {
|
|
46
|
+
return {
|
|
47
|
+
useTranslation: () => {
|
|
48
|
+
return {
|
|
49
|
+
t: (key: string, opts?: { defaultValue?: string }): string => {
|
|
50
|
+
return opts?.defaultValue ?? key;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
interface Row {
|
|
58
|
+
_id?: string | undefined;
|
|
59
|
+
name?: string | undefined;
|
|
60
|
+
message?: string | undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* The literal sentence from RETIRE_RUN_PAYLOAD - the text that was on screen
|
|
65
|
+
* when #3585 was reported. Kept verbatim so the fixture is the bug's own data.
|
|
66
|
+
*/
|
|
67
|
+
const STATUS_MESSAGE: string =
|
|
68
|
+
"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.";
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* A 400-character sentence for the default-renderer path (a column with a key
|
|
72
|
+
* and no getElement). Longer than anything a nowrap cell can hold on a laptop.
|
|
73
|
+
*/
|
|
74
|
+
const LONG_TEXT: string =
|
|
75
|
+
`A very long status sentence written by the server. ${"The scan reported nothing and this is the reason why. ".repeat(
|
|
76
|
+
8,
|
|
77
|
+
)}`.slice(0, 400);
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* The two strings the cell renderers hard-coded before CellClassName.ts
|
|
81
|
+
* existed. They are spelled out here, in full, on purpose: the point of the
|
|
82
|
+
* refactor is that roughly two hundred column declarations across the product
|
|
83
|
+
* - dates, counts, badges, ids, none of which have layout coverage of their
|
|
84
|
+
* own - keep byte-for-byte the classes they had. Anything that shifts a single
|
|
85
|
+
* utility in these strings has changed every table in OneUptime.
|
|
86
|
+
*/
|
|
87
|
+
const DEFAULT_CELL_CLASS_NAME: string =
|
|
88
|
+
"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-500 sm:pl-6 align-top";
|
|
89
|
+
const DEFAULT_LAST_CELL_CLASS_NAME: string =
|
|
90
|
+
"whitespace-nowrap py-4 pl-4 pr-6 text-sm font-medium text-gray-500 sm:pl-6 align-top";
|
|
91
|
+
|
|
92
|
+
const data: Array<Row> = [
|
|
93
|
+
{ _id: "1", name: "10.0.0.0/24", message: STATUS_MESSAGE },
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
type RenderTableFunction = (columns: Columns<Row>) => RenderResult;
|
|
97
|
+
|
|
98
|
+
const renderTable: RenderTableFunction = (
|
|
99
|
+
columns: Columns<Row>,
|
|
100
|
+
): RenderResult => {
|
|
101
|
+
return render(
|
|
102
|
+
<Table<Row>
|
|
103
|
+
id="test-table"
|
|
104
|
+
data={data}
|
|
105
|
+
columns={columns}
|
|
106
|
+
currentPageNumber={1}
|
|
107
|
+
totalItemsCount={data.length}
|
|
108
|
+
itemsOnPage={10}
|
|
109
|
+
error=""
|
|
110
|
+
isLoading={false}
|
|
111
|
+
singularLabel="Scan"
|
|
112
|
+
pluralLabel="Scans"
|
|
113
|
+
sortOrder={SortOrder.Ascending}
|
|
114
|
+
sortBy={null}
|
|
115
|
+
onSortChanged={() => {}}
|
|
116
|
+
onNavigateToPage={() => {}}
|
|
117
|
+
/>,
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* The table decides mobile vs desktop from window.innerWidth at mount
|
|
123
|
+
* (< 768 = mobile). jsdom defaults to 1024, so desktop is the baseline and the
|
|
124
|
+
* mobile test must set the width BEFORE rendering.
|
|
125
|
+
*/
|
|
126
|
+
const setViewportWidth: (width: number) => void = (width: number): void => {
|
|
127
|
+
Object.defineProperty(window, "innerWidth", {
|
|
128
|
+
configurable: true,
|
|
129
|
+
writable: true,
|
|
130
|
+
value: width,
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
type GetBodyCellsFunction = (container: HTMLElement) => Array<HTMLElement>;
|
|
135
|
+
|
|
136
|
+
const getBodyCells: GetBodyCellsFunction = (
|
|
137
|
+
container: HTMLElement,
|
|
138
|
+
): Array<HTMLElement> => {
|
|
139
|
+
return Array.from(container.querySelectorAll<HTMLElement>("tbody tr td"));
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/*
|
|
143
|
+
* The <div> TableRow puts directly inside the <td> around a cell's content.
|
|
144
|
+
* The width cap of a wrapping column has to live here rather than on the <td>,
|
|
145
|
+
* because `max-width` on a `display: table-cell` box is ignored outright.
|
|
146
|
+
*/
|
|
147
|
+
type GetContentWrapperFunction = (cell: HTMLElement) => HTMLElement;
|
|
148
|
+
|
|
149
|
+
const getContentWrapper: GetContentWrapperFunction = (
|
|
150
|
+
cell: HTMLElement,
|
|
151
|
+
): HTMLElement => {
|
|
152
|
+
const wrapper: Element | null = cell.firstElementChild;
|
|
153
|
+
|
|
154
|
+
if (!(wrapper instanceof HTMLElement)) {
|
|
155
|
+
throw new Error("The cell rendered no content wrapper element.");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return wrapper;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
afterEach(() => {
|
|
162
|
+
cleanup();
|
|
163
|
+
setViewportWidth(1024);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
/*
|
|
167
|
+
* The helpers on their own, with hand-built column objects. Cheap, exact, and
|
|
168
|
+
* they pin the two strings without paying for a render - so a failure here
|
|
169
|
+
* says "the class contract moved" rather than "some table broke".
|
|
170
|
+
*/
|
|
171
|
+
describe("CellClassName helpers", () => {
|
|
172
|
+
test("a column that declares nothing keeps the pre-#3585 cell classes", () => {
|
|
173
|
+
const column: Column<Row> = { title: "Name", type: FieldType.Text };
|
|
174
|
+
|
|
175
|
+
expect(
|
|
176
|
+
getTableCellClassName<Row>({
|
|
177
|
+
column: column,
|
|
178
|
+
isLastRenderedColumn: false,
|
|
179
|
+
}),
|
|
180
|
+
).toBe(DEFAULT_CELL_CLASS_NAME);
|
|
181
|
+
|
|
182
|
+
expect(
|
|
183
|
+
getTableCellClassName<Row>({
|
|
184
|
+
column: column,
|
|
185
|
+
isLastRenderedColumn: true,
|
|
186
|
+
}),
|
|
187
|
+
).toBe(DEFAULT_LAST_CELL_CLASS_NAME);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("wrapContent swaps nowrap for whitespace-normal break-words, and nothing else", () => {
|
|
191
|
+
const column: Column<Row> = {
|
|
192
|
+
title: "Message",
|
|
193
|
+
type: FieldType.Text,
|
|
194
|
+
wrapContent: true,
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
expect(
|
|
198
|
+
getTableCellClassName<Row>({
|
|
199
|
+
column: column,
|
|
200
|
+
isLastRenderedColumn: false,
|
|
201
|
+
}),
|
|
202
|
+
).toBe(
|
|
203
|
+
DEFAULT_CELL_CLASS_NAME.replace(
|
|
204
|
+
"whitespace-nowrap",
|
|
205
|
+
"whitespace-normal break-words",
|
|
206
|
+
),
|
|
207
|
+
);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("the content wrapper is empty unless the column asked for something", () => {
|
|
211
|
+
expect(
|
|
212
|
+
getTableCellContentClassName<Row>({
|
|
213
|
+
title: "Name",
|
|
214
|
+
type: FieldType.Text,
|
|
215
|
+
}),
|
|
216
|
+
).toBe("");
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test("a wrapping column gets the default width cap, and a named one replaces it", () => {
|
|
220
|
+
expect(
|
|
221
|
+
getTableCellContentClassName<Row>({
|
|
222
|
+
title: "Message",
|
|
223
|
+
type: FieldType.Text,
|
|
224
|
+
wrapContent: true,
|
|
225
|
+
}),
|
|
226
|
+
).toBe(DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME);
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Replaced, not appended: two max-w-* utilities on one element are resolved
|
|
230
|
+
* by Tailwind's stylesheet order rather than the order they were written,
|
|
231
|
+
* so the narrower one would silently lose.
|
|
232
|
+
*/
|
|
233
|
+
expect(
|
|
234
|
+
getTableCellContentClassName<Row>({
|
|
235
|
+
title: "Message",
|
|
236
|
+
type: FieldType.Text,
|
|
237
|
+
wrapContent: true,
|
|
238
|
+
wrapMaxWidthClassName: "max-w-3xl",
|
|
239
|
+
}),
|
|
240
|
+
).toBe("max-w-3xl");
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("a width cap alone emits nothing - the #3585 pairing is unspellable", () => {
|
|
244
|
+
/*
|
|
245
|
+
* This is the assertion that matters most. `max-w-md` on a cell that is
|
|
246
|
+
* still `whitespace-nowrap` is precisely the combination that painted the
|
|
247
|
+
* status sentence over the Recurrence and Started columns. Through the new
|
|
248
|
+
* API it cannot be expressed: the width is only ever emitted alongside the
|
|
249
|
+
* wrapping mode that makes it safe.
|
|
250
|
+
*/
|
|
251
|
+
const column: Column<Row> = {
|
|
252
|
+
title: "Message",
|
|
253
|
+
type: FieldType.Text,
|
|
254
|
+
wrapMaxWidthClassName: "max-w-md",
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
expect(getTableCellContentClassName<Row>(column)).toBe("");
|
|
258
|
+
expect(
|
|
259
|
+
getTableCellClassName<Row>({
|
|
260
|
+
column: column,
|
|
261
|
+
isLastRenderedColumn: false,
|
|
262
|
+
}),
|
|
263
|
+
).toBe(DEFAULT_CELL_CLASS_NAME);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test("contentClassName still reaches the wrapper, alone and alongside a wrap", () => {
|
|
267
|
+
expect(
|
|
268
|
+
getTableCellContentClassName<Row>({
|
|
269
|
+
title: "Name",
|
|
270
|
+
type: FieldType.Text,
|
|
271
|
+
contentClassName: "text-sm text-gray-900",
|
|
272
|
+
}),
|
|
273
|
+
).toBe("text-sm text-gray-900");
|
|
274
|
+
|
|
275
|
+
expect(
|
|
276
|
+
getTableCellContentClassName<Row>({
|
|
277
|
+
title: "Message",
|
|
278
|
+
type: FieldType.Text,
|
|
279
|
+
wrapContent: true,
|
|
280
|
+
contentClassName: "text-sm text-gray-900",
|
|
281
|
+
}),
|
|
282
|
+
).toBe(`${DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME} text-sm text-gray-900`);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
/*
|
|
287
|
+
* The rendered table, which is what the ~200 existing column declarations
|
|
288
|
+
* actually go through. A column that says nothing about wrapping must come out
|
|
289
|
+
* of the refactor with not one class moved, in either the <td> or the wrapper.
|
|
290
|
+
*/
|
|
291
|
+
describe("columns that declare no wrapping are untouched", () => {
|
|
292
|
+
const columns: Columns<Row> = [
|
|
293
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
294
|
+
{
|
|
295
|
+
title: "Message",
|
|
296
|
+
type: FieldType.Text,
|
|
297
|
+
key: "message",
|
|
298
|
+
getElement: (item: Row): ReactElement => {
|
|
299
|
+
return <span>{item.message}</span>;
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
];
|
|
303
|
+
|
|
304
|
+
test("the cell is still nowrap and never wraps", () => {
|
|
305
|
+
const { container } = renderTable(columns);
|
|
306
|
+
const cells: Array<HTMLElement> = getBodyCells(container);
|
|
307
|
+
|
|
308
|
+
expect(cells.length).toBe(2);
|
|
309
|
+
|
|
310
|
+
for (const cell of cells) {
|
|
311
|
+
expect(cell).toHaveClass("whitespace-nowrap");
|
|
312
|
+
expect(cell).not.toHaveClass("whitespace-normal");
|
|
313
|
+
expect(cell).not.toHaveClass("break-words");
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test("the cell class string is byte-for-byte what it was before the fix", () => {
|
|
318
|
+
const { container } = renderTable(columns);
|
|
319
|
+
const cells: Array<HTMLElement> = getBodyCells(container);
|
|
320
|
+
|
|
321
|
+
// Non-last cell: pr-3. Last rendered cell: pr-6.
|
|
322
|
+
expect(cells[0]!.getAttribute("class")).toBe(DEFAULT_CELL_CLASS_NAME);
|
|
323
|
+
expect(cells[1]!.getAttribute("class")).toBe(DEFAULT_LAST_CELL_CLASS_NAME);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test("the content wrapper carries an empty class, not a stray space or a width", () => {
|
|
327
|
+
/*
|
|
328
|
+
* Exactly "" - no separator left behind by the join, and above all no
|
|
329
|
+
* injected max-w-*. A width silently added here would recreate #3585 on
|
|
330
|
+
* every table in the product at once.
|
|
331
|
+
*/
|
|
332
|
+
const { container } = renderTable(columns);
|
|
333
|
+
const cells: Array<HTMLElement> = getBodyCells(container);
|
|
334
|
+
|
|
335
|
+
expect(getContentWrapper(cells[0]!).getAttribute("class")).toBe("");
|
|
336
|
+
expect(getContentWrapper(cells[1]!).getAttribute("class")).toBe("");
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
/*
|
|
341
|
+
* The Discovery "Responded Hosts" column, in the shape the fix gives it.
|
|
342
|
+
*/
|
|
343
|
+
describe("columns that opt into wrapping", () => {
|
|
344
|
+
type BuildColumnsFunction = (message: Column<Row>) => Columns<Row>;
|
|
345
|
+
|
|
346
|
+
const buildColumns: BuildColumnsFunction = (
|
|
347
|
+
message: Column<Row>,
|
|
348
|
+
): Columns<Row> => {
|
|
349
|
+
return [{ title: "Network", type: FieldType.Text, key: "name" }, message];
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
const messageColumn: Column<Row> = {
|
|
353
|
+
title: "Responded Hosts",
|
|
354
|
+
type: FieldType.Element,
|
|
355
|
+
key: "message",
|
|
356
|
+
wrapContent: true,
|
|
357
|
+
getElement: (item: Row): ReactElement => {
|
|
358
|
+
return (
|
|
359
|
+
<div className="text-xs text-gray-500" title={item.message}>
|
|
360
|
+
{item.message}
|
|
361
|
+
</div>
|
|
362
|
+
);
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
test("the cell wraps instead of forcing one unbreakable line", () => {
|
|
367
|
+
/*
|
|
368
|
+
* jsdom does no line breaking, so what is checked is the declaration the
|
|
369
|
+
* browser would break on: nowrap gone, whitespace-normal and break-words
|
|
370
|
+
* present. break-words matters as much as the wrap - a single long token
|
|
371
|
+
* (a URL, a 60-character hostname) has no break opportunity without it.
|
|
372
|
+
*/
|
|
373
|
+
const { container } = renderTable(buildColumns(messageColumn));
|
|
374
|
+
const cell: HTMLElement = getBodyCells(container)[1]!;
|
|
375
|
+
|
|
376
|
+
expect(cell).toHaveClass("whitespace-normal");
|
|
377
|
+
expect(cell).toHaveClass("break-words");
|
|
378
|
+
expect(cell).not.toHaveClass("whitespace-nowrap");
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test("with no width named, the wrapper takes the exported default cap", () => {
|
|
382
|
+
const { container } = renderTable(buildColumns(messageColumn));
|
|
383
|
+
const wrapper: HTMLElement = getContentWrapper(getBodyCells(container)[1]!);
|
|
384
|
+
|
|
385
|
+
// Asserted against the exported constant, so the two cannot drift apart.
|
|
386
|
+
expect(wrapper).toHaveClass(DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME);
|
|
387
|
+
expect(wrapper.getAttribute("class")).toBe(
|
|
388
|
+
DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME,
|
|
389
|
+
);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test("a named width replaces the default rather than joining it", () => {
|
|
393
|
+
const { container } = renderTable(
|
|
394
|
+
buildColumns({
|
|
395
|
+
...messageColumn,
|
|
396
|
+
wrapMaxWidthClassName: "max-w-3xl",
|
|
397
|
+
}),
|
|
398
|
+
);
|
|
399
|
+
const wrapper: HTMLElement = getContentWrapper(getBodyCells(container)[1]!);
|
|
400
|
+
|
|
401
|
+
expect(wrapper).toHaveClass("max-w-3xl");
|
|
402
|
+
/*
|
|
403
|
+
* Both present would not be "the last one wins": Tailwind emits max-w-md
|
|
404
|
+
* and max-w-3xl as equally specific rules, so the winner is whichever the
|
|
405
|
+
* stylesheet happens to define later - not the one the column asked for.
|
|
406
|
+
*/
|
|
407
|
+
expect(wrapper).not.toHaveClass(DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME);
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
test("contentClassName is kept and sits alongside the cap", () => {
|
|
411
|
+
const { container } = renderTable(
|
|
412
|
+
buildColumns({
|
|
413
|
+
...messageColumn,
|
|
414
|
+
contentClassName: "text-sm text-gray-900",
|
|
415
|
+
}),
|
|
416
|
+
);
|
|
417
|
+
const wrapper: HTMLElement = getContentWrapper(getBodyCells(container)[1]!);
|
|
418
|
+
|
|
419
|
+
expect(wrapper).toHaveClass(DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME);
|
|
420
|
+
expect(wrapper).toHaveClass("text-sm");
|
|
421
|
+
expect(wrapper).toHaveClass("text-gray-900");
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
test("the row's padding and vertical rhythm survive the refactor", () => {
|
|
425
|
+
/*
|
|
426
|
+
* A wrapping cell must still line up with the nowrap cells beside it -
|
|
427
|
+
* same padding, same type scale, same top alignment. Only the white-space
|
|
428
|
+
* pair is allowed to differ.
|
|
429
|
+
*/
|
|
430
|
+
const { container } = renderTable(buildColumns(messageColumn));
|
|
431
|
+
const cells: Array<HTMLElement> = getBodyCells(container);
|
|
432
|
+
const wrappingCell: HTMLElement = cells[1]!;
|
|
433
|
+
|
|
434
|
+
for (const className of [
|
|
435
|
+
"py-4",
|
|
436
|
+
"pl-4",
|
|
437
|
+
"sm:pl-6",
|
|
438
|
+
"align-top",
|
|
439
|
+
"text-sm",
|
|
440
|
+
"font-medium",
|
|
441
|
+
"text-gray-500",
|
|
442
|
+
]) {
|
|
443
|
+
expect(wrappingCell).toHaveClass(className);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
expect(cells[0]).toHaveClass("pr-3");
|
|
447
|
+
expect(wrappingCell).toHaveClass("pr-6");
|
|
448
|
+
expect(wrappingCell).not.toHaveClass("pr-3");
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
test("a width cap without wrapContent changes nothing at all", () => {
|
|
452
|
+
/*
|
|
453
|
+
* The rendered proof of the helper-level assertion above: this is the
|
|
454
|
+
* exact declaration #3585 was, and through the new API it produces a plain
|
|
455
|
+
* nowrap cell with an empty wrapper - no capped box for an unbreakable
|
|
456
|
+
* line to overflow out of.
|
|
457
|
+
*/
|
|
458
|
+
const { container } = renderTable(
|
|
459
|
+
buildColumns({
|
|
460
|
+
title: "Responded Hosts",
|
|
461
|
+
type: FieldType.Element,
|
|
462
|
+
key: "message",
|
|
463
|
+
wrapMaxWidthClassName: "max-w-md",
|
|
464
|
+
getElement: (item: Row): ReactElement => {
|
|
465
|
+
return <span>{item.message}</span>;
|
|
466
|
+
},
|
|
467
|
+
}),
|
|
468
|
+
);
|
|
469
|
+
const cell: HTMLElement = getBodyCells(container)[1]!;
|
|
470
|
+
|
|
471
|
+
expect(cell).toHaveClass("whitespace-nowrap");
|
|
472
|
+
expect(cell.getAttribute("class")).toBe(DEFAULT_LAST_CELL_CLASS_NAME);
|
|
473
|
+
expect(getContentWrapper(cell).getAttribute("class")).toBe("");
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
test("a plain text column with no getElement can wrap too", () => {
|
|
477
|
+
/*
|
|
478
|
+
* The default-renderer path. #3585 was reported on a getElement column,
|
|
479
|
+
* but the great majority of prose cells in the product are plain keyed
|
|
480
|
+
* text; the option is only worth having if it reaches them as well.
|
|
481
|
+
*/
|
|
482
|
+
const { container } = renderTable([
|
|
483
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
484
|
+
{
|
|
485
|
+
title: "Message",
|
|
486
|
+
type: FieldType.Text,
|
|
487
|
+
key: "message",
|
|
488
|
+
wrapContent: true,
|
|
489
|
+
},
|
|
490
|
+
]);
|
|
491
|
+
const cell: HTMLElement = getBodyCells(container)[1]!;
|
|
492
|
+
|
|
493
|
+
expect(cell).toHaveClass("whitespace-normal");
|
|
494
|
+
expect(cell).toHaveClass("break-words");
|
|
495
|
+
expect(cell).not.toHaveClass("whitespace-nowrap");
|
|
496
|
+
expect(getContentWrapper(cell)).toHaveClass(
|
|
497
|
+
DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME,
|
|
498
|
+
);
|
|
499
|
+
expect(cell.textContent).toBe(STATUS_MESSAGE);
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
test("a 400-character value still lands in a wrapping default-rendered cell", () => {
|
|
503
|
+
const { container } = render(
|
|
504
|
+
<Table<Row>
|
|
505
|
+
id="long-text-table"
|
|
506
|
+
data={[{ _id: "1", name: "10.0.0.0/24", message: LONG_TEXT }]}
|
|
507
|
+
columns={[
|
|
508
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
509
|
+
{
|
|
510
|
+
title: "Message",
|
|
511
|
+
type: FieldType.Text,
|
|
512
|
+
key: "message",
|
|
513
|
+
wrapContent: true,
|
|
514
|
+
},
|
|
515
|
+
]}
|
|
516
|
+
currentPageNumber={1}
|
|
517
|
+
totalItemsCount={1}
|
|
518
|
+
itemsOnPage={10}
|
|
519
|
+
error=""
|
|
520
|
+
isLoading={false}
|
|
521
|
+
singularLabel="Scan"
|
|
522
|
+
pluralLabel="Scans"
|
|
523
|
+
sortOrder={SortOrder.Ascending}
|
|
524
|
+
sortBy={null}
|
|
525
|
+
onSortChanged={() => {}}
|
|
526
|
+
onNavigateToPage={() => {}}
|
|
527
|
+
/>,
|
|
528
|
+
);
|
|
529
|
+
const cell: HTMLElement = getBodyCells(container)[1]!;
|
|
530
|
+
|
|
531
|
+
expect(LONG_TEXT.length).toBe(400);
|
|
532
|
+
expect(cell.textContent).toBe(LONG_TEXT);
|
|
533
|
+
expect(cell).toHaveClass("whitespace-normal");
|
|
534
|
+
expect(getContentWrapper(cell)).toHaveClass(
|
|
535
|
+
DEFAULT_WRAP_MAX_WIDTH_CLASS_NAME,
|
|
536
|
+
);
|
|
537
|
+
});
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
/*
|
|
541
|
+
* Two things the refactor could have broken quietly, because neither is what
|
|
542
|
+
* the issue was about.
|
|
543
|
+
*/
|
|
544
|
+
describe("what the shared helper must not disturb", () => {
|
|
545
|
+
test("the extra right padding is decided by rendered columns, not declared ones", () => {
|
|
546
|
+
/*
|
|
547
|
+
* The last-cell test in TableRow compares against the RENDERED column
|
|
548
|
+
* count. A hideOnMobile column is in the fixture because that is where
|
|
549
|
+
* declared and rendered part company; at this width it is rendered, so it
|
|
550
|
+
* is the last cell and it is the one that must carry pr-6. If the helper
|
|
551
|
+
* were ever handed a declared index, the wider padding would land on the
|
|
552
|
+
* wrong cell - or on none.
|
|
553
|
+
*/
|
|
554
|
+
setViewportWidth(1280);
|
|
555
|
+
|
|
556
|
+
const { container } = renderTable([
|
|
557
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
558
|
+
{ title: "Message", type: FieldType.Text, key: "message" },
|
|
559
|
+
{
|
|
560
|
+
title: "Recurrence",
|
|
561
|
+
type: FieldType.Text,
|
|
562
|
+
key: "name",
|
|
563
|
+
hideOnMobile: true,
|
|
564
|
+
wrapContent: true,
|
|
565
|
+
wrapMaxWidthClassName: "max-w-xs",
|
|
566
|
+
},
|
|
567
|
+
]);
|
|
568
|
+
const cells: Array<HTMLElement> = getBodyCells(container);
|
|
569
|
+
|
|
570
|
+
expect(cells.length).toBe(3);
|
|
571
|
+
expect(cells[0]).toHaveClass("pr-3");
|
|
572
|
+
expect(cells[1]).toHaveClass("pr-3");
|
|
573
|
+
expect(cells[2]).toHaveClass("pr-6");
|
|
574
|
+
expect(cells[2]).not.toHaveClass("pr-3");
|
|
575
|
+
expect(getContentWrapper(cells[2]!).getAttribute("class")).toBe("max-w-xs");
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
test("an actions column still gets a bare right-aligned button row", () => {
|
|
579
|
+
/*
|
|
580
|
+
* The actions container now composes onto the same string the content
|
|
581
|
+
* wrapper uses. A column that declares nothing must still produce exactly
|
|
582
|
+
* "flex justify-end": a width cap leaking in here would squeeze the Edit
|
|
583
|
+
* and Delete buttons of every table in the product.
|
|
584
|
+
*/
|
|
585
|
+
const { container } = renderTable([
|
|
586
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
587
|
+
{ title: "Actions", type: FieldType.Actions, key: null },
|
|
588
|
+
]);
|
|
589
|
+
const cell: HTMLElement = getBodyCells(container)[1]!;
|
|
590
|
+
|
|
591
|
+
expect(getContentWrapper(cell).getAttribute("class")).toBe(
|
|
592
|
+
"flex justify-end",
|
|
593
|
+
);
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
/*
|
|
598
|
+
* Mobile is a different layout entirely - cards, not a table - and it declares
|
|
599
|
+
* no nowrap of its own, so it never had #3585 and needs neither new option. It
|
|
600
|
+
* deliberately reads neither wrapContent nor contentClassName, which is why the
|
|
601
|
+
* assertions here are about text rather than classes: what must hold is that
|
|
602
|
+
* the label and the whole sentence are on screen.
|
|
603
|
+
*/
|
|
604
|
+
describe("the mobile card", () => {
|
|
605
|
+
test("renders no table cells, and shows the wrapping column in full", () => {
|
|
606
|
+
setViewportWidth(375);
|
|
607
|
+
|
|
608
|
+
renderTable([
|
|
609
|
+
{ title: "Network", type: FieldType.Text, key: "name" },
|
|
610
|
+
{
|
|
611
|
+
title: "Responded Hosts",
|
|
612
|
+
type: FieldType.Element,
|
|
613
|
+
key: "message",
|
|
614
|
+
wrapContent: true,
|
|
615
|
+
getElement: (item: Row): ReactElement => {
|
|
616
|
+
return <div className="text-xs text-gray-500">{item.message}</div>;
|
|
617
|
+
},
|
|
618
|
+
},
|
|
619
|
+
]);
|
|
620
|
+
|
|
621
|
+
expect(document.querySelectorAll("td").length).toBe(0);
|
|
622
|
+
expect(screen.getByText("Responded Hosts")).toBeInTheDocument();
|
|
623
|
+
expect(screen.getByText(STATUS_MESSAGE)).toBeInTheDocument();
|
|
624
|
+
});
|
|
625
|
+
});
|