@oneuptime/common 11.5.8 → 11.5.10
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/Index.ts +13 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +178 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +179 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +179 -0
- package/Models/AnalyticsModels/NetworkFlow.ts +397 -0
- package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +15 -6
- package/Models/DatabaseModels/AIRun.ts +37 -0
- package/Models/DatabaseModels/AIRunEvent.ts +34 -1
- package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +18 -0
- package/Models/DatabaseModels/GlobalConfig.ts +36 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/MarketingConversion.ts +198 -0
- package/Models/DatabaseModels/MetricSavedView.ts +34 -0
- package/Models/DatabaseModels/MetricType.ts +74 -0
- package/Models/DatabaseModels/NetworkDevice.ts +332 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +328 -0
- package/Models/DatabaseModels/NetworkInterface.ts +58 -0
- package/Models/DatabaseModels/Project.ts +62 -0
- package/Models/DatabaseModels/StatusPage.ts +42 -0
- package/Models/DatabaseModels/User.ts +37 -0
- package/Server/API/AIAgentTaskAPI.ts +38 -12
- package/Server/API/AIAgentTaskLogAPI.ts +49 -0
- package/Server/API/AIChatAPI.ts +16 -0
- package/Server/API/AIReadinessAPI.ts +84 -0
- package/Server/API/BaseAnalyticsAPI.ts +23 -0
- package/Server/API/CodeFixRunAPI.ts +182 -0
- package/Server/API/EnterpriseLicenseAPI.ts +14 -0
- package/Server/API/TelemetryExceptionAPI.ts +6 -1
- package/Server/EnvironmentConfig.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.ts +95 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.ts +52 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Services/AIRunEventService.ts +15 -1
- package/Server/Services/AIRunService.ts +38 -1
- package/Server/Services/AnalyticsDatabaseService.ts +70 -1
- package/Server/Services/IncidentService.ts +13 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/LlmProviderService.ts +2 -0
- package/Server/Services/MarketingConversionService.ts +10 -0
- package/Server/Services/MetricItemAggMV1mByContainerService.ts +31 -0
- package/Server/Services/MetricItemAggMV1mByK8sClusterService.ts +31 -0
- package/Server/Services/MetricItemAggMV1mByServiceService.ts +31 -0
- package/Server/Services/MetricService.ts +970 -122
- package/Server/Services/MonitorService.ts +14 -0
- package/Server/Services/NetworkDeviceOwnerTeamService.ts +42 -0
- package/Server/Services/NetworkDeviceOwnerUserService.ts +106 -0
- package/Server/Services/NetworkFlowService.ts +11 -0
- package/Server/Services/OnCallDutyPolicyService.ts +11 -1
- package/Server/Services/ProjectService.ts +178 -0
- package/Server/Services/SpanService.ts +13 -9
- package/Server/Services/StatusPageService.ts +97 -0
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TelemetryExceptionService.ts +19 -90
- package/Server/Services/UserService.ts +59 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
- package/Server/Types/Markdown.ts +9 -9
- package/Server/Types/MarkdownSlugify.ts +47 -0
- package/Server/Utils/AI/AIRunTranscript.ts +240 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +9 -0
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +119 -5
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +75 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +235 -0
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +2 -3
- package/Server/Utils/AI/Toolbox/CodeTools.ts +883 -0
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +519 -0
- package/Server/Utils/AI/Toolbox/Index.ts +27 -0
- package/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.ts +279 -0
- package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +19 -1
- package/Server/Utils/Attribution.ts +99 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +600 -0
- package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +7 -2
- package/Server/Utils/LLM/LLMService.ts +397 -18
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +103 -0
- package/Server/Utils/Marketing/ConversionUploadProviders.ts +22 -0
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +270 -0
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +147 -0
- package/Server/Utils/Marketing/Providers/Meta.ts +148 -0
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +196 -0
- package/Server/Utils/Marketing/Providers/Reddit.ts +178 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +71 -7
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +31 -19
- package/Server/Utils/Monitor/MonitorIncident.ts +71 -7
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +57 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +94 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +19 -11
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +125 -14
- package/Server/Utils/ProductAnalytics.ts +133 -0
- package/Server/Utils/Telemetry/Telemetry.ts +39 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +21 -0
- package/Tests/Models/StatusPageEnableMcpServer.test.ts +125 -0
- package/Tests/Server/API/BaseAnalyticsAPI.test.ts +72 -0
- package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +9 -1
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +21 -2
- package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +173 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +1391 -0
- package/Tests/Server/Services/NetworkDeviceOwnerServices.test.ts +260 -0
- package/Tests/Server/Services/StatusPageServiceMcp.test.ts +223 -0
- package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +26 -3
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +12 -0
- package/Tests/Server/Types/Markdown.test.ts +106 -0
- package/Tests/Server/Utils/AI/AIRunTranscript.test.ts +182 -0
- package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +411 -0
- package/Tests/Server/Utils/AI/CodeTools.test.ts +596 -0
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +475 -0
- package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +548 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +142 -0
- package/Tests/Server/Utils/AI/ScheduledMaintenanceTools.test.ts +176 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +63 -0
- package/Tests/Server/Utils/GitHubGetFileContent.test.ts +197 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +502 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -0
- package/Tests/Types/AI/AIAgentTaskStatus.test.ts +7 -6
- package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
- package/Tests/Types/AI/AIRunStatus.test.ts +42 -0
- package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +111 -2
- package/Tests/Types/Database/EndsWith.test.ts +64 -0
- package/Tests/Types/Database/GreaterThan.test.ts +62 -0
- package/Tests/Types/Database/GreaterThanOrEqual.test.ts +65 -0
- package/Tests/Types/Database/GreaterThanOrNull.test.ts +63 -0
- package/Tests/Types/Database/Includes.test.ts +65 -0
- package/Tests/Types/Database/IncludesAll.test.ts +65 -0
- package/Tests/Types/Database/IncludesNone.test.ts +65 -0
- package/Tests/Types/Database/IsNull.test.ts +44 -0
- package/Tests/Types/Database/LessThan.test.ts +62 -0
- package/Tests/Types/Database/LessThanOrEqual.test.ts +62 -0
- package/Tests/Types/Database/LessThanOrNull.test.ts +62 -0
- package/Tests/Types/Database/MultiSearch.test.ts +81 -0
- package/Tests/Types/Database/NotContains.test.ts +64 -0
- package/Tests/Types/Database/NotNull.test.ts +44 -0
- package/Tests/Types/Database/StartsWith.test.ts +64 -0
- package/Tests/Types/Log/LogSeverity.test.ts +78 -0
- package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +83 -1
- package/Tests/Types/Monitor/SnmpV3EnumParsing.test.ts +247 -0
- package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +263 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +167 -0
- package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +66 -0
- package/Tests/UI/Components/XAxis.test.ts +5 -3
- package/Tests/UI/Utils/AIChatExport/ChatWidgetData.test.ts +319 -0
- package/Tests/UI/Utils/AIChatExport/ChatWidgetMarkdown.test.ts +188 -0
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +76 -0
- package/Tests/Utils/Metrics/MetricExplorerUrl.test.ts +622 -0
- package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +474 -0
- package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +52 -4
- package/Types/AI/AIAgentTaskStatus.ts +13 -0
- package/Types/AI/AIChatPageContext.ts +137 -0
- package/Types/AI/AIChatTypes.ts +44 -0
- package/Types/AI/AIFixReadiness.ts +46 -0
- package/Types/AI/AIRunStatus.ts +11 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +11 -0
- package/Types/BaseDatabase/AggregateBy.ts +31 -2
- package/Types/BaseDatabase/AggregatedResult.ts +22 -0
- package/Types/BaseDatabase/AggregationInterval.ts +11 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +30 -5
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +16 -0
- package/Types/Email/EmailTemplateType.ts +3 -0
- package/Types/Log/LogSeverity.ts +61 -0
- package/Types/Marketing/MarketingConversion.ts +11 -0
- package/Types/Metrics/MetricQueryConfigData.ts +21 -0
- package/Types/Metrics/MetricQueryData.ts +8 -0
- package/Types/Metrics/MetricViewData.ts +8 -0
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +9 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +12 -0
- package/Types/Monitor/MonitorType.ts +2 -1
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +17 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +13 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +37 -3
- package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +46 -0
- package/Types/Monitor/SnmpMonitor/SnmpEntityInfo.ts +15 -0
- package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +8 -0
- package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +17 -8
- package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +53 -0
- package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +43 -0
- package/Types/Monitor/SnmpMonitor/SnmpSystemInfo.ts +16 -0
- package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +119 -3
- package/Types/Monitor/SnmpMonitor/SnmpVersion.ts +40 -0
- package/Types/NetFlow/NetworkFlowRecord.ts +25 -0
- package/Types/Syslog/SyslogMessage.ts +18 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -0
- package/Types/Telemetry/TelemetrySavedViewType.ts +12 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +51 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +51 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +97 -26
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +336 -3
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +118 -1
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +336 -3
- package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +7 -0
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +15 -0
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +51 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +12 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +12 -0
- package/UI/Components/Charts/Types/XAxis/XAxisPrecision.ts +1 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +0 -0
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +169 -0
- package/UI/Components/Charts/Utils/XAxis.ts +28 -4
- package/UI/Components/Forms/BasicForm.tsx +26 -8
- package/UI/Components/Icon/Icon.tsx +33 -13
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +9 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +67 -0
- package/UI/Components/Page/ModelPage.tsx +6 -1
- package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +33 -4
- package/UI/Styles/Theme.css +1324 -0
- package/UI/Utils/AIChatExport/ChatWidgetData.ts +316 -0
- package/UI/Utils/AIChatExport/ChatWidgetMarkdown.ts +349 -0
- package/UI/Utils/AIChatExport/ConversationMarkdown.ts +177 -0
- package/UI/Utils/AIChatExport/MarkdownBlocks.ts +327 -0
- package/UI/Utils/AIChatExport/MarkdownSafety.ts +215 -0
- package/UI/Utils/DownloadFile.ts +54 -0
- package/UI/Utils/User.ts +41 -2
- package/Utils/Analytics.ts +8 -6
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +74 -0
- package/Utils/Metrics/MetricExplorerUrl.ts +771 -0
- package/Utils/Metrics/MetricFormulaEvaluator.ts +410 -46
- package/Utils/Monitor/NetworkTopologyUtil.ts +261 -49
- package/Utils/ValueFormatter.ts +22 -1
- package/build/dist/Models/AnalyticsModels/Index.js +13 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +159 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +158 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +160 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +351 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +15 -7
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIRun.js +38 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIRunEvent.js +31 -0
- package/build/dist/Models/DatabaseModels/AIRunEvent.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +19 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +38 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +219 -0
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js +35 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +76 -0
- package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +341 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +341 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +60 -0
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +65 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +43 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +38 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskAPI.js +37 -11
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +32 -7
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +9 -0
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +57 -0
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -0
- package/build/dist/Server/API/BaseAnalyticsAPI.js +19 -0
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +142 -0
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +8 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +4 -0
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +51 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.js +80 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784124919694-AddAITaskNumberAndRunTranscript.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.js +37 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784135099754-AllowNullAiAgentOnPullRequest.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784137457184-AddEnableMcpServerToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784200000000-AddSnmpV3ColumnsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js +47 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunEventService.js +8 -0
- package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +29 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +58 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +12 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmProviderService.js +2 -0
- package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
- package/build/dist/Server/Services/MarketingConversionService.js +9 -0
- package/build/dist/Server/Services/MarketingConversionService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +761 -125
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +18 -5
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +44 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +88 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/NetworkFlowService.js +9 -0
- package/build/dist/Server/Services/NetworkFlowService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +15 -6
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +146 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +8 -6
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +91 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +11 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +14 -61
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +52 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +33 -7
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +8 -8
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/MarkdownSlugify.js +47 -0
- package/build/dist/Server/Types/MarkdownSlugify.js.map +1 -0
- package/build/dist/Server/Utils/AI/AIRunTranscript.js +180 -0
- package/build/dist/Server/Utils/AI/AIRunTranscript.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +1 -0
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +103 -5
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +55 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +211 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +654 -0
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +389 -0
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +19 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.js +239 -0
- package/build/dist/Server/Utils/AI/Toolbox/ScheduledMaintenanceTools.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +19 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +74 -0
- package/build/dist/Server/Utils/Attribution.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +439 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +1 -1
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +275 -19
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +40 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +20 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +177 -0
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +113 -0
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +109 -0
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +130 -0
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +126 -0
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +53 -9
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -10
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +54 -11
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +43 -3
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +68 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +17 -11
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +100 -15
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/ProductAnalytics.js +111 -0
- package/build/dist/Server/Utils/ProductAnalytics.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +32 -5
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/AI/AIAgentTaskStatus.js +12 -0
- package/build/dist/Types/AI/AIAgentTaskStatus.js.map +1 -1
- package/build/dist/Types/AI/AIChatPageContext.js +101 -0
- package/build/dist/Types/AI/AIChatPageContext.js.map +1 -0
- package/build/dist/Types/AI/AIChatTypes.js +2 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/AI/AIFixReadiness.js +9 -0
- package/build/dist/Types/AI/AIFixReadiness.js.map +1 -0
- package/build/dist/Types/AI/AIRunStatus.js +11 -0
- package/build/dist/Types/AI/AIRunStatus.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +11 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationInterval.js +11 -0
- package/build/dist/Types/BaseDatabase/AggregationInterval.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +33 -5
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Log/LogSeverity.js +56 -0
- package/build/dist/Types/Log/LogSeverity.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingConversion.js +13 -0
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +3 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +2 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +41 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +48 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +38 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +96 -3
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js +38 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js.map +1 -1
- package/build/dist/Types/NetFlow/NetworkFlowRecord.js +2 -0
- package/build/dist/Types/NetFlow/NetworkFlowRecord.js.map +1 -0
- package/build/dist/Types/Syslog/SyslogMessage.js +2 -0
- package/build/dist/Types/Syslog/SyslogMessage.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySavedViewState.js +0 -7
- package/build/dist/Types/Telemetry/TelemetrySavedViewState.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetrySavedViewType.js +13 -0
- package/build/dist/Types/Telemetry/TelemetrySavedViewType.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +25 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +26 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +36 -12
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +217 -8
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +55 -4
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +217 -8
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +6 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js +2 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js +2 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +25 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js +2 -0
- package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js.map +1 -0
- package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js +2 -0
- package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js.map +1 -0
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js +1 -0
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +0 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +121 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +27 -4
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +24 -6
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +15 -8
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +58 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +7 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +10 -4
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Utils/AIChatExport/ChatWidgetData.js +217 -0
- package/build/dist/UI/Utils/AIChatExport/ChatWidgetData.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/ChatWidgetMarkdown.js +234 -0
- package/build/dist/UI/Utils/AIChatExport/ChatWidgetMarkdown.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +111 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/MarkdownBlocks.js +233 -0
- package/build/dist/UI/Utils/AIChatExport/MarkdownBlocks.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/MarkdownSafety.js +134 -0
- package/build/dist/UI/Utils/AIChatExport/MarkdownSafety.js.map +1 -0
- package/build/dist/UI/Utils/DownloadFile.js +41 -0
- package/build/dist/UI/Utils/DownloadFile.js.map +1 -0
- package/build/dist/UI/Utils/User.js +35 -2
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/build/dist/Utils/Analytics.js +8 -5
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +57 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +418 -0
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +296 -37
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +176 -40
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +20 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +6 -2
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
Dot,
|
|
12
12
|
Label,
|
|
13
13
|
Legend as RechartsLegend,
|
|
14
|
+
ReferenceArea,
|
|
14
15
|
ReferenceDot,
|
|
15
16
|
ReferenceLine,
|
|
16
17
|
ResponsiveContainer,
|
|
@@ -21,6 +22,9 @@ import {
|
|
|
21
22
|
import ChartReferenceLineProps from "../../Types/ReferenceLineProps";
|
|
22
23
|
import ExemplarPoint from "../../Types/ExemplarPoint";
|
|
23
24
|
import FormattedExemplarPoint from "../Types/FormattedExemplarPoint";
|
|
25
|
+
import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
|
|
26
|
+
import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
|
|
27
|
+
import { CHART_DATA_POINT_DATE_KEY } from "../Types/ChartDataPoint";
|
|
24
28
|
import { AxisDomain } from "recharts/types/util/types";
|
|
25
29
|
|
|
26
30
|
import { useOnWindowResize } from "../Utils/UseWindowOnResize";
|
|
@@ -37,6 +41,15 @@ import { getYAxisDomain } from "../Utils/GetYAxisDomain";
|
|
|
37
41
|
import { hasOnlyOneValueForKey } from "../Utils/HasOnlyOneValueForKey";
|
|
38
42
|
import ChartCurve from "../../Types/ChartCurve";
|
|
39
43
|
|
|
44
|
+
/*
|
|
45
|
+
* Incident/alert time markers each label at the same "insideTop" band, so
|
|
46
|
+
* several events in one window pile their labels into an unreadable stack.
|
|
47
|
+
* A single marker keeps the classic horizontal top label; a handful get
|
|
48
|
+
* rotated to run along their lines; past this cap inline labels are hidden
|
|
49
|
+
* entirely (the dashed lines and their click-through remain).
|
|
50
|
+
*/
|
|
51
|
+
const MAX_LABELED_TIME_REFERENCE_LINES: number = 6;
|
|
52
|
+
|
|
40
53
|
//#region Legend
|
|
41
54
|
|
|
42
55
|
interface LegendItemProps {
|
|
@@ -540,6 +553,15 @@ type BaseEventProps = {
|
|
|
540
553
|
|
|
541
554
|
type AreaChartEventProps = BaseEventProps | null | undefined;
|
|
542
555
|
|
|
556
|
+
/*
|
|
557
|
+
* Subset of the recharts MouseHandlerDataParam passed to chart-level
|
|
558
|
+
* mouse handlers — just the fields range selection needs.
|
|
559
|
+
*/
|
|
560
|
+
type RangeSelectionChartState = {
|
|
561
|
+
activeTooltipIndex?: number | string | null | undefined;
|
|
562
|
+
activeLabel?: string | number | undefined;
|
|
563
|
+
};
|
|
564
|
+
|
|
543
565
|
interface AreaChartProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
544
566
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
545
567
|
data: Record<string, any>[];
|
|
@@ -571,8 +593,11 @@ interface AreaChartProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
571
593
|
customTooltip?: React.ComponentType<TooltipProps>;
|
|
572
594
|
syncid?: string | undefined;
|
|
573
595
|
referenceLines?: Array<ChartReferenceLineProps> | undefined;
|
|
596
|
+
formattedTimeReferenceLines?: Array<FormattedTimeReferenceLine> | undefined;
|
|
597
|
+
formattedReferenceRegions?: Array<FormattedReferenceRegion> | undefined;
|
|
574
598
|
formattedExemplarPoints?: Array<FormattedExemplarPoint> | undefined;
|
|
575
599
|
onExemplarClick?: ((exemplar: ExemplarPoint) => void) | undefined;
|
|
600
|
+
onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
|
|
576
601
|
/**
|
|
577
602
|
* Render a shaded "expected range" band underneath the data lines.
|
|
578
603
|
* Both keys must already be present on every entry of `data` (the
|
|
@@ -618,6 +643,9 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
618
643
|
legendPosition = "right",
|
|
619
644
|
tooltipCallback,
|
|
620
645
|
customTooltip,
|
|
646
|
+
formattedTimeReferenceLines,
|
|
647
|
+
formattedReferenceRegions,
|
|
648
|
+
onTimeRangeSelect,
|
|
621
649
|
...other
|
|
622
650
|
} = props;
|
|
623
651
|
const CustomTooltip: React.ComponentType<TooltipProps> | undefined =
|
|
@@ -631,8 +659,27 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
631
659
|
const [activeLegend, setActiveLegend] = React.useState<string | undefined>(
|
|
632
660
|
undefined,
|
|
633
661
|
);
|
|
662
|
+
const hasOnTimeRangeSelect: boolean = Boolean(onTimeRangeSelect);
|
|
663
|
+
const [rangeSelectionStart, setRangeSelectionStart] = React.useState<
|
|
664
|
+
string | null
|
|
665
|
+
>(null);
|
|
666
|
+
const [rangeSelectionEnd, setRangeSelectionEnd] = React.useState<
|
|
667
|
+
string | null
|
|
668
|
+
>(null);
|
|
669
|
+
const isRangeSelecting: React.MutableRefObject<boolean> =
|
|
670
|
+
React.useRef<boolean>(false);
|
|
671
|
+
const rangeSelectionStartIndexRef: React.MutableRefObject<number | null> =
|
|
672
|
+
React.useRef<number | null>(null);
|
|
673
|
+
const rangeSelectionEndIndexRef: React.MutableRefObject<number | null> =
|
|
674
|
+
React.useRef<number | null>(null);
|
|
675
|
+
const suppressNextClickRef: React.MutableRefObject<boolean> =
|
|
676
|
+
React.useRef<boolean>(false);
|
|
634
677
|
const categoryColors: Map<string, ChartColorValue> =
|
|
635
678
|
constructCategoryColors(categories, colors);
|
|
679
|
+
const timeReferenceLineCount: number =
|
|
680
|
+
formattedTimeReferenceLines?.length || 0;
|
|
681
|
+
const showTimeReferenceLineLabels: boolean =
|
|
682
|
+
timeReferenceLineCount <= MAX_LABELED_TIME_REFERENCE_LINES;
|
|
636
683
|
|
|
637
684
|
const yAxisDomain: (number | "auto")[] = getYAxisDomain(
|
|
638
685
|
autoMinValue,
|
|
@@ -650,6 +697,11 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
650
697
|
function onDotClick(itemData: any, event: React.MouseEvent): void {
|
|
651
698
|
event.stopPropagation();
|
|
652
699
|
|
|
700
|
+
// Ignore the click that immediately follows a drag-to-select.
|
|
701
|
+
if (suppressNextClickRef.current) {
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
|
|
653
705
|
if (!hasOnValueChange) {
|
|
654
706
|
return;
|
|
655
707
|
}
|
|
@@ -678,6 +730,10 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
678
730
|
}
|
|
679
731
|
|
|
680
732
|
function onCategoryClick(dataKey: string): void {
|
|
733
|
+
// Ignore the click that immediately follows a drag-to-select.
|
|
734
|
+
if (suppressNextClickRef.current) {
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
681
737
|
if (!hasOnValueChange) {
|
|
682
738
|
return;
|
|
683
739
|
}
|
|
@@ -699,15 +755,179 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
699
755
|
setActiveDot(undefined);
|
|
700
756
|
}
|
|
701
757
|
|
|
758
|
+
function getRowIndexFromChartState(
|
|
759
|
+
chartState: RangeSelectionChartState,
|
|
760
|
+
): number | null {
|
|
761
|
+
const activeTooltipIndex: number | string | null | undefined =
|
|
762
|
+
chartState.activeTooltipIndex;
|
|
763
|
+
const numericIndex: number =
|
|
764
|
+
typeof activeTooltipIndex === "number"
|
|
765
|
+
? activeTooltipIndex
|
|
766
|
+
: Number(activeTooltipIndex);
|
|
767
|
+
if (
|
|
768
|
+
activeTooltipIndex !== undefined &&
|
|
769
|
+
activeTooltipIndex !== null &&
|
|
770
|
+
Number.isInteger(numericIndex) &&
|
|
771
|
+
numericIndex >= 0 &&
|
|
772
|
+
numericIndex < data.length
|
|
773
|
+
) {
|
|
774
|
+
return numericIndex;
|
|
775
|
+
}
|
|
776
|
+
// Fall back to matching activeLabel against the row labels.
|
|
777
|
+
if (chartState.activeLabel !== undefined) {
|
|
778
|
+
const rowIndex: number = data.findIndex(
|
|
779
|
+
(row: Record<string, unknown>) => {
|
|
780
|
+
return row[index] === chartState.activeLabel;
|
|
781
|
+
},
|
|
782
|
+
);
|
|
783
|
+
return rowIndex >= 0 ? rowIndex : null;
|
|
784
|
+
}
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
function getBucketDateAtIndex(rowIndex: number): Date | null {
|
|
789
|
+
const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
|
|
790
|
+
return typeof rawDate === "number" ? new Date(rawDate) : null;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
function handleRangeSelectMouseDown(
|
|
794
|
+
chartState: RangeSelectionChartState,
|
|
795
|
+
): void {
|
|
796
|
+
if (!hasOnTimeRangeSelect) {
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
const rowIndex: number | null = getRowIndexFromChartState(chartState);
|
|
800
|
+
if (rowIndex === null) {
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
const rowLabel: unknown = data[rowIndex]?.[index];
|
|
804
|
+
if (typeof rowLabel !== "string") {
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
807
|
+
isRangeSelecting.current = true;
|
|
808
|
+
rangeSelectionStartIndexRef.current = rowIndex;
|
|
809
|
+
rangeSelectionEndIndexRef.current = rowIndex;
|
|
810
|
+
setRangeSelectionStart(rowLabel);
|
|
811
|
+
setRangeSelectionEnd(null);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
function handleRangeSelectMouseMove(
|
|
815
|
+
chartState: RangeSelectionChartState,
|
|
816
|
+
mouseEvent: React.MouseEvent<SVGGraphicsElement>,
|
|
817
|
+
): void {
|
|
818
|
+
if (!isRangeSelecting.current) {
|
|
819
|
+
return;
|
|
820
|
+
}
|
|
821
|
+
// Button was released outside the chart — abandon the selection.
|
|
822
|
+
if (mouseEvent.buttons === 0) {
|
|
823
|
+
isRangeSelecting.current = false;
|
|
824
|
+
rangeSelectionStartIndexRef.current = null;
|
|
825
|
+
rangeSelectionEndIndexRef.current = null;
|
|
826
|
+
setRangeSelectionStart(null);
|
|
827
|
+
setRangeSelectionEnd(null);
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
const rowIndex: number | null = getRowIndexFromChartState(chartState);
|
|
831
|
+
if (rowIndex === null) {
|
|
832
|
+
return;
|
|
833
|
+
}
|
|
834
|
+
const rowLabel: unknown = data[rowIndex]?.[index];
|
|
835
|
+
if (typeof rowLabel !== "string") {
|
|
836
|
+
return;
|
|
837
|
+
}
|
|
838
|
+
rangeSelectionEndIndexRef.current = rowIndex;
|
|
839
|
+
setRangeSelectionEnd(rowLabel);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function handleRangeSelectMouseUp(): void {
|
|
843
|
+
if (!isRangeSelecting.current) {
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
846
|
+
isRangeSelecting.current = false;
|
|
847
|
+
|
|
848
|
+
const startIndex: number | null = rangeSelectionStartIndexRef.current;
|
|
849
|
+
const endIndex: number | null = rangeSelectionEndIndexRef.current;
|
|
850
|
+
rangeSelectionStartIndexRef.current = null;
|
|
851
|
+
rangeSelectionEndIndexRef.current = null;
|
|
852
|
+
setRangeSelectionStart(null);
|
|
853
|
+
setRangeSelectionEnd(null);
|
|
854
|
+
|
|
855
|
+
/*
|
|
856
|
+
* A plain click (pointer never left the starting bucket) must keep
|
|
857
|
+
* behaving exactly as before — only a real drag selects a range.
|
|
858
|
+
*/
|
|
859
|
+
if (startIndex === null || endIndex === null || startIndex === endIndex) {
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
/*
|
|
864
|
+
* The browser fires a click right after mouseup; swallow it so a
|
|
865
|
+
* drag doesn't also toggle legend/dot selection. Cleared on a
|
|
866
|
+
* timeout so a never-delivered click can't suppress a later one.
|
|
867
|
+
*/
|
|
868
|
+
suppressNextClickRef.current = true;
|
|
869
|
+
setTimeout(() => {
|
|
870
|
+
suppressNextClickRef.current = false;
|
|
871
|
+
}, 0);
|
|
872
|
+
|
|
873
|
+
if (!onTimeRangeSelect) {
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
const lowerIndex: number = Math.min(startIndex, endIndex);
|
|
878
|
+
const upperIndex: number = Math.max(startIndex, endIndex);
|
|
879
|
+
const startDate: Date | null = getBucketDateAtIndex(lowerIndex);
|
|
880
|
+
const lastBucketDate: Date | null = getBucketDateAtIndex(upperIndex);
|
|
881
|
+
if (!startDate || !lastBucketDate) {
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/*
|
|
886
|
+
* Cover the full final bucket: its end is its start plus one
|
|
887
|
+
* bucket width, derived from adjacent row dates.
|
|
888
|
+
*/
|
|
889
|
+
const adjacentDate: Date | null =
|
|
890
|
+
upperIndex > 0
|
|
891
|
+
? getBucketDateAtIndex(upperIndex - 1)
|
|
892
|
+
: getBucketDateAtIndex(upperIndex + 1);
|
|
893
|
+
const bucketWidthInMs: number = adjacentDate
|
|
894
|
+
? Math.abs(lastBucketDate.getTime() - adjacentDate.getTime())
|
|
895
|
+
: 0;
|
|
896
|
+
const endDate: Date = new Date(
|
|
897
|
+
lastBucketDate.getTime() + bucketWidthInMs,
|
|
898
|
+
);
|
|
899
|
+
|
|
900
|
+
onTimeRangeSelect(startDate, endDate);
|
|
901
|
+
}
|
|
902
|
+
|
|
702
903
|
return (
|
|
703
|
-
<div
|
|
904
|
+
<div
|
|
905
|
+
ref={ref}
|
|
906
|
+
className={cx(
|
|
907
|
+
"flex-1 w-full",
|
|
908
|
+
hasOnTimeRangeSelect && "cursor-crosshair",
|
|
909
|
+
className,
|
|
910
|
+
)}
|
|
911
|
+
{...other}
|
|
912
|
+
>
|
|
704
913
|
<ResponsiveContainer>
|
|
705
914
|
<RechartsAreaChart
|
|
706
915
|
data={data}
|
|
707
916
|
syncId={props.syncid?.toString() || ""}
|
|
917
|
+
{...(hasOnTimeRangeSelect
|
|
918
|
+
? {
|
|
919
|
+
onMouseDown: handleRangeSelectMouseDown,
|
|
920
|
+
onMouseMove: handleRangeSelectMouseMove,
|
|
921
|
+
onMouseUp: handleRangeSelectMouseUp,
|
|
922
|
+
}
|
|
923
|
+
: {})}
|
|
708
924
|
onClick={
|
|
709
925
|
hasOnValueChange && (activeLegend || activeDot)
|
|
710
926
|
? () => {
|
|
927
|
+
// Ignore the click that follows a drag-to-select.
|
|
928
|
+
if (suppressNextClickRef.current) {
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
711
931
|
setActiveDot(undefined);
|
|
712
932
|
setActiveLegend(undefined);
|
|
713
933
|
onValueChange?.(null);
|
|
@@ -762,6 +982,7 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
762
982
|
transform: "translate(0, 6)",
|
|
763
983
|
fontSize: 10,
|
|
764
984
|
fontWeight: 500,
|
|
985
|
+
fill: "var(--ou-chart-tick)",
|
|
765
986
|
}}
|
|
766
987
|
ticks={
|
|
767
988
|
startEndOnly
|
|
@@ -802,6 +1023,7 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
802
1023
|
transform: "translate(-4, 0)",
|
|
803
1024
|
fontSize: 10,
|
|
804
1025
|
fontWeight: 500,
|
|
1026
|
+
fill: "var(--ou-chart-tick)",
|
|
805
1027
|
}}
|
|
806
1028
|
fill=""
|
|
807
1029
|
stroke=""
|
|
@@ -822,7 +1044,7 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
822
1044
|
)}
|
|
823
1045
|
</YAxis>
|
|
824
1046
|
<Tooltip
|
|
825
|
-
wrapperStyle={{ outline: "none" }}
|
|
1047
|
+
wrapperStyle={{ outline: "none", zIndex: 10 }}
|
|
826
1048
|
isAnimationActive={true}
|
|
827
1049
|
animationDuration={100}
|
|
828
1050
|
cursor={{
|
|
@@ -1056,6 +1278,98 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1056
1278
|
);
|
|
1057
1279
|
},
|
|
1058
1280
|
)}
|
|
1281
|
+
{/* Time-anchored shaded regions (e.g. incident/maintenance windows) */}
|
|
1282
|
+
{formattedReferenceRegions?.map(
|
|
1283
|
+
(region: FormattedReferenceRegion, regionIndex: number) => {
|
|
1284
|
+
const regionColor: string = region.original.color || "#6366f1";
|
|
1285
|
+
return (
|
|
1286
|
+
<ReferenceArea
|
|
1287
|
+
key={`ref-region-${regionIndex}`}
|
|
1288
|
+
x1={region.formattedX1}
|
|
1289
|
+
x2={region.formattedX2}
|
|
1290
|
+
fill={regionColor}
|
|
1291
|
+
fillOpacity={0.12}
|
|
1292
|
+
stroke={regionColor}
|
|
1293
|
+
strokeOpacity={0.35}
|
|
1294
|
+
strokeWidth={1}
|
|
1295
|
+
{...(region.original.onClick
|
|
1296
|
+
? {
|
|
1297
|
+
style: { cursor: "pointer" as const },
|
|
1298
|
+
onClick: (): void => {
|
|
1299
|
+
if (suppressNextClickRef.current) {
|
|
1300
|
+
return;
|
|
1301
|
+
}
|
|
1302
|
+
region.original.onClick?.();
|
|
1303
|
+
},
|
|
1304
|
+
}
|
|
1305
|
+
: {})}
|
|
1306
|
+
>
|
|
1307
|
+
{region.original.label && (
|
|
1308
|
+
<Label
|
|
1309
|
+
value={region.original.label}
|
|
1310
|
+
position="insideTop"
|
|
1311
|
+
fill={regionColor}
|
|
1312
|
+
fontSize={10}
|
|
1313
|
+
fontWeight={500}
|
|
1314
|
+
/>
|
|
1315
|
+
)}
|
|
1316
|
+
</ReferenceArea>
|
|
1317
|
+
);
|
|
1318
|
+
},
|
|
1319
|
+
)}
|
|
1320
|
+
{/* Time-anchored vertical event markers (e.g. deploys, incidents) */}
|
|
1321
|
+
{formattedTimeReferenceLines?.map(
|
|
1322
|
+
(
|
|
1323
|
+
timeRefLine: FormattedTimeReferenceLine,
|
|
1324
|
+
timeRefIndex: number,
|
|
1325
|
+
) => {
|
|
1326
|
+
const lineColor: string =
|
|
1327
|
+
timeRefLine.original.color || "#f59e0b";
|
|
1328
|
+
return (
|
|
1329
|
+
<ReferenceLine
|
|
1330
|
+
key={`time-ref-${timeRefIndex}`}
|
|
1331
|
+
x={timeRefLine.formattedX}
|
|
1332
|
+
stroke={lineColor}
|
|
1333
|
+
strokeDasharray={
|
|
1334
|
+
timeRefLine.original.strokeDasharray || "4 4"
|
|
1335
|
+
}
|
|
1336
|
+
strokeWidth={1.5}
|
|
1337
|
+
{...(timeRefLine.original.onClick
|
|
1338
|
+
? {
|
|
1339
|
+
style: { cursor: "pointer" as const },
|
|
1340
|
+
onClick: (): void => {
|
|
1341
|
+
if (suppressNextClickRef.current) {
|
|
1342
|
+
return;
|
|
1343
|
+
}
|
|
1344
|
+
timeRefLine.original.onClick?.();
|
|
1345
|
+
},
|
|
1346
|
+
}
|
|
1347
|
+
: {})}
|
|
1348
|
+
>
|
|
1349
|
+
{timeRefLine.original.label &&
|
|
1350
|
+
showTimeReferenceLineLabels && (
|
|
1351
|
+
<Label
|
|
1352
|
+
value={timeRefLine.original.label}
|
|
1353
|
+
{...(timeReferenceLineCount > 1
|
|
1354
|
+
? {
|
|
1355
|
+
/*
|
|
1356
|
+
* Several markers: run each label down its
|
|
1357
|
+
* own line so labels at different x stop
|
|
1358
|
+
* sharing one horizontal band.
|
|
1359
|
+
*/
|
|
1360
|
+
position: "insideTopLeft" as const,
|
|
1361
|
+
angle: 90,
|
|
1362
|
+
}
|
|
1363
|
+
: { position: "insideTop" as const })}
|
|
1364
|
+
fill={lineColor}
|
|
1365
|
+
fontSize={10}
|
|
1366
|
+
fontWeight={500}
|
|
1367
|
+
/>
|
|
1368
|
+
)}
|
|
1369
|
+
</ReferenceLine>
|
|
1370
|
+
);
|
|
1371
|
+
},
|
|
1372
|
+
)}
|
|
1059
1373
|
{/* Exemplar dots - clickable markers linking to traces */}
|
|
1060
1374
|
{props.formattedExemplarPoints?.map(
|
|
1061
1375
|
(exemplar: FormattedExemplarPoint, exemplarIndex: number) => {
|
|
@@ -1070,13 +1384,21 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1070
1384
|
strokeWidth={2}
|
|
1071
1385
|
style={{ cursor: "pointer" }}
|
|
1072
1386
|
onClick={() => {
|
|
1387
|
+
// Ignore the click that follows a drag-to-select.
|
|
1388
|
+
if (suppressNextClickRef.current) {
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1073
1391
|
props.onExemplarClick?.(exemplar.original);
|
|
1074
1392
|
}}
|
|
1075
1393
|
>
|
|
1076
1394
|
<Label
|
|
1077
1395
|
value="E"
|
|
1078
1396
|
position="center"
|
|
1079
|
-
|
|
1397
|
+
/*
|
|
1398
|
+
* Sits on the dot's purple, not on the surface, so it must
|
|
1399
|
+
* not follow the ring token that flips dark with the theme.
|
|
1400
|
+
*/
|
|
1401
|
+
fill="#ffffff"
|
|
1080
1402
|
fontSize={8}
|
|
1081
1403
|
fontWeight={700}
|
|
1082
1404
|
/>
|
|
@@ -1084,6 +1406,17 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1084
1406
|
);
|
|
1085
1407
|
},
|
|
1086
1408
|
)}
|
|
1409
|
+
{/* Live drag-to-select highlight */}
|
|
1410
|
+
{rangeSelectionStart && rangeSelectionEnd ? (
|
|
1411
|
+
<ReferenceArea
|
|
1412
|
+
x1={rangeSelectionStart}
|
|
1413
|
+
x2={rangeSelectionEnd}
|
|
1414
|
+
fill="rgba(99,102,241,0.12)"
|
|
1415
|
+
stroke="rgba(99,102,241,0.5)"
|
|
1416
|
+
strokeWidth={1}
|
|
1417
|
+
radius={2}
|
|
1418
|
+
/>
|
|
1419
|
+
) : null}
|
|
1087
1420
|
</RechartsAreaChart>
|
|
1088
1421
|
</ResponsiveContainer>
|
|
1089
1422
|
</div>
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
Label,
|
|
12
12
|
BarChart as RechartsBarChart,
|
|
13
13
|
Legend as RechartsLegend,
|
|
14
|
+
ReferenceArea,
|
|
14
15
|
ReferenceLine,
|
|
15
16
|
ResponsiveContainer,
|
|
16
17
|
Tooltip,
|
|
@@ -18,6 +19,8 @@ import {
|
|
|
18
19
|
YAxis,
|
|
19
20
|
} from "recharts";
|
|
20
21
|
import ChartReferenceLineProps from "../../Types/ReferenceLineProps";
|
|
22
|
+
import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
|
|
23
|
+
import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
|
|
21
24
|
import type { AxisDomain } from "recharts/types/util/types";
|
|
22
25
|
|
|
23
26
|
import {
|
|
@@ -32,6 +35,15 @@ import { cx } from "../Utils/Cx";
|
|
|
32
35
|
import { getYAxisDomain } from "../Utils/GetYAxisDomain";
|
|
33
36
|
import { useOnWindowResize } from "../Utils/UseWindowOnResize";
|
|
34
37
|
|
|
38
|
+
/*
|
|
39
|
+
* Incident/alert time markers each label at the same "insideTop" band, so
|
|
40
|
+
* several events in one window pile their labels into an unreadable stack.
|
|
41
|
+
* A single marker keeps the classic horizontal top label; a handful get
|
|
42
|
+
* rotated to run along their lines; past this cap inline labels are hidden
|
|
43
|
+
* entirely (the dashed lines and their click-through remain).
|
|
44
|
+
*/
|
|
45
|
+
const MAX_LABELED_TIME_REFERENCE_LINES: number = 6;
|
|
46
|
+
|
|
35
47
|
//#region Shape
|
|
36
48
|
|
|
37
49
|
function deepEqual<T>(obj1: T, obj2: T): boolean {
|
|
@@ -667,6 +679,8 @@ interface BarChartProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
667
679
|
customTooltip?: React.ComponentType<TooltipProps>;
|
|
668
680
|
syncid?: string | undefined;
|
|
669
681
|
referenceLines?: Array<ChartReferenceLineProps> | undefined;
|
|
682
|
+
formattedTimeReferenceLines?: Array<FormattedTimeReferenceLine> | undefined;
|
|
683
|
+
formattedReferenceRegions?: Array<FormattedReferenceRegion> | undefined;
|
|
670
684
|
}
|
|
671
685
|
|
|
672
686
|
const BarChart: React.ForwardRefExoticComponent<
|
|
@@ -708,6 +722,8 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
708
722
|
legendPosition = "right",
|
|
709
723
|
tooltipCallback,
|
|
710
724
|
customTooltip,
|
|
725
|
+
formattedTimeReferenceLines,
|
|
726
|
+
formattedReferenceRegions,
|
|
711
727
|
...other
|
|
712
728
|
} = props;
|
|
713
729
|
const CustomTooltip: React.ComponentType<any> | undefined = customTooltip;
|
|
@@ -719,6 +735,10 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
719
735
|
);
|
|
720
736
|
const categoryColors: Map<string, ChartColorValue> =
|
|
721
737
|
constructCategoryColors(categories, colors);
|
|
738
|
+
const timeReferenceLineCount: number =
|
|
739
|
+
formattedTimeReferenceLines?.length || 0;
|
|
740
|
+
const showTimeReferenceLineLabels: boolean =
|
|
741
|
+
timeReferenceLineCount <= MAX_LABELED_TIME_REFERENCE_LINES;
|
|
722
742
|
const [activeBar, setActiveBar] = React.useState<any | undefined>(
|
|
723
743
|
undefined,
|
|
724
744
|
);
|
|
@@ -836,6 +856,7 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
836
856
|
layout !== "vertical" ? "translate(0, 6)" : undefined,
|
|
837
857
|
fontSize: 10,
|
|
838
858
|
fontWeight: 500,
|
|
859
|
+
fill: "var(--ou-chart-tick)",
|
|
839
860
|
}}
|
|
840
861
|
fill=""
|
|
841
862
|
stroke=""
|
|
@@ -904,6 +925,7 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
904
925
|
: "translate(0, 0)",
|
|
905
926
|
fontSize: 10,
|
|
906
927
|
fontWeight: 500,
|
|
928
|
+
fill: "var(--ou-chart-tick)",
|
|
907
929
|
}}
|
|
908
930
|
{...(layout !== "vertical"
|
|
909
931
|
? {
|
|
@@ -940,7 +962,7 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
940
962
|
)}
|
|
941
963
|
</YAxis>
|
|
942
964
|
<Tooltip
|
|
943
|
-
wrapperStyle={{ outline: "none" }}
|
|
965
|
+
wrapperStyle={{ outline: "none", zIndex: 10 }}
|
|
944
966
|
isAnimationActive={true}
|
|
945
967
|
animationDuration={100}
|
|
946
968
|
cursor={{
|
|
@@ -1068,6 +1090,101 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
1068
1090
|
);
|
|
1069
1091
|
},
|
|
1070
1092
|
)}
|
|
1093
|
+
{/*
|
|
1094
|
+
* Time annotations need the x-axis to be the category axis,
|
|
1095
|
+
* which is only true in horizontal layout.
|
|
1096
|
+
*/}
|
|
1097
|
+
{/* Time-anchored shaded regions (e.g. incident/maintenance windows) */}
|
|
1098
|
+
{layout !== "vertical"
|
|
1099
|
+
? formattedReferenceRegions?.map(
|
|
1100
|
+
(region: FormattedReferenceRegion, regionIndex: number) => {
|
|
1101
|
+
const regionColor: string =
|
|
1102
|
+
region.original.color || "#6366f1";
|
|
1103
|
+
return (
|
|
1104
|
+
<ReferenceArea
|
|
1105
|
+
key={`ref-region-${regionIndex}`}
|
|
1106
|
+
x1={region.formattedX1}
|
|
1107
|
+
x2={region.formattedX2}
|
|
1108
|
+
fill={regionColor}
|
|
1109
|
+
fillOpacity={0.12}
|
|
1110
|
+
stroke={regionColor}
|
|
1111
|
+
strokeOpacity={0.35}
|
|
1112
|
+
strokeWidth={1}
|
|
1113
|
+
{...(region.original.onClick
|
|
1114
|
+
? {
|
|
1115
|
+
style: { cursor: "pointer" as const },
|
|
1116
|
+
onClick: (): void => {
|
|
1117
|
+
region.original.onClick?.();
|
|
1118
|
+
},
|
|
1119
|
+
}
|
|
1120
|
+
: {})}
|
|
1121
|
+
>
|
|
1122
|
+
{region.original.label && (
|
|
1123
|
+
<Label
|
|
1124
|
+
value={region.original.label}
|
|
1125
|
+
position="insideTop"
|
|
1126
|
+
fill={regionColor}
|
|
1127
|
+
fontSize={10}
|
|
1128
|
+
fontWeight={500}
|
|
1129
|
+
/>
|
|
1130
|
+
)}
|
|
1131
|
+
</ReferenceArea>
|
|
1132
|
+
);
|
|
1133
|
+
},
|
|
1134
|
+
)
|
|
1135
|
+
: null}
|
|
1136
|
+
{/* Time-anchored vertical event markers (e.g. deploys, incidents) */}
|
|
1137
|
+
{layout !== "vertical"
|
|
1138
|
+
? formattedTimeReferenceLines?.map(
|
|
1139
|
+
(
|
|
1140
|
+
timeRefLine: FormattedTimeReferenceLine,
|
|
1141
|
+
timeRefIndex: number,
|
|
1142
|
+
) => {
|
|
1143
|
+
const lineColor: string =
|
|
1144
|
+
timeRefLine.original.color || "#f59e0b";
|
|
1145
|
+
return (
|
|
1146
|
+
<ReferenceLine
|
|
1147
|
+
key={`time-ref-${timeRefIndex}`}
|
|
1148
|
+
x={timeRefLine.formattedX}
|
|
1149
|
+
stroke={lineColor}
|
|
1150
|
+
strokeDasharray={
|
|
1151
|
+
timeRefLine.original.strokeDasharray || "4 4"
|
|
1152
|
+
}
|
|
1153
|
+
strokeWidth={1.5}
|
|
1154
|
+
{...(timeRefLine.original.onClick
|
|
1155
|
+
? {
|
|
1156
|
+
style: { cursor: "pointer" as const },
|
|
1157
|
+
onClick: (): void => {
|
|
1158
|
+
timeRefLine.original.onClick?.();
|
|
1159
|
+
},
|
|
1160
|
+
}
|
|
1161
|
+
: {})}
|
|
1162
|
+
>
|
|
1163
|
+
{timeRefLine.original.label &&
|
|
1164
|
+
showTimeReferenceLineLabels && (
|
|
1165
|
+
<Label
|
|
1166
|
+
value={timeRefLine.original.label}
|
|
1167
|
+
{...(timeReferenceLineCount > 1
|
|
1168
|
+
? {
|
|
1169
|
+
/*
|
|
1170
|
+
* Several markers: run each label down
|
|
1171
|
+
* its own line so labels at different x
|
|
1172
|
+
* stop sharing one horizontal band.
|
|
1173
|
+
*/
|
|
1174
|
+
position: "insideTopLeft" as const,
|
|
1175
|
+
angle: 90,
|
|
1176
|
+
}
|
|
1177
|
+
: { position: "insideTop" as const })}
|
|
1178
|
+
fill={lineColor}
|
|
1179
|
+
fontSize={10}
|
|
1180
|
+
fontWeight={500}
|
|
1181
|
+
/>
|
|
1182
|
+
)}
|
|
1183
|
+
</ReferenceLine>
|
|
1184
|
+
);
|
|
1185
|
+
},
|
|
1186
|
+
)
|
|
1187
|
+
: null}
|
|
1071
1188
|
</RechartsBarChart>
|
|
1072
1189
|
</ResponsiveContainer>
|
|
1073
1190
|
</div>
|