@oneuptime/common 11.5.9 → 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/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 +113 -0
- package/Models/DatabaseModels/NetworkInterface.ts +58 -0
- package/Models/DatabaseModels/Project.ts +37 -0
- package/Models/DatabaseModels/User.ts +37 -0
- package/Server/API/BaseAnalyticsAPI.ts +23 -0
- package/Server/API/EnterpriseLicenseAPI.ts +14 -0
- package/Server/EnvironmentConfig.ts +84 -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/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 +12 -0
- package/Server/Services/AnalyticsDatabaseService.ts +70 -1
- package/Server/Services/IncidentService.ts +13 -0
- package/Server/Services/Index.ts +10 -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 +136 -0
- package/Server/Services/SpanService.ts +13 -9
- package/Server/Services/StatusPageService.ts +10 -0
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/UserService.ts +59 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
- package/Server/Utils/Attribution.ts +99 -0
- 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 +15 -0
- 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/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/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -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/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/XAxis.test.ts +5 -3
- 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/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/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/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 +328 -1
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +115 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +328 -1
- 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/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 +10 -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/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 +116 -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 +38 -0
- package/build/dist/Models/DatabaseModels/Project.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/BaseAnalyticsAPI.js +19 -0
- package/build/dist/Server/API/BaseAnalyticsAPI.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/EnvironmentConfig.js +51 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- 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/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 +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/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 +107 -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 +10 -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/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/Utils/Attribution.js +74 -0
- package/build/dist/Server/Utils/Attribution.js.map +1 -0
- 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 +15 -0
- 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/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/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/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 +208 -6
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +52 -3
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +208 -6
- 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/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/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 +2 -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);
|
|
@@ -1058,6 +1278,98 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1058
1278
|
);
|
|
1059
1279
|
},
|
|
1060
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
|
+
)}
|
|
1061
1373
|
{/* Exemplar dots - clickable markers linking to traces */}
|
|
1062
1374
|
{props.formattedExemplarPoints?.map(
|
|
1063
1375
|
(exemplar: FormattedExemplarPoint, exemplarIndex: number) => {
|
|
@@ -1072,6 +1384,10 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1072
1384
|
strokeWidth={2}
|
|
1073
1385
|
style={{ cursor: "pointer" }}
|
|
1074
1386
|
onClick={() => {
|
|
1387
|
+
// Ignore the click that follows a drag-to-select.
|
|
1388
|
+
if (suppressNextClickRef.current) {
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1075
1391
|
props.onExemplarClick?.(exemplar.original);
|
|
1076
1392
|
}}
|
|
1077
1393
|
>
|
|
@@ -1090,6 +1406,17 @@ const AreaChart: React.ForwardRefExoticComponent<
|
|
|
1090
1406
|
);
|
|
1091
1407
|
},
|
|
1092
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}
|
|
1093
1420
|
</RechartsAreaChart>
|
|
1094
1421
|
</ResponsiveContainer>
|
|
1095
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
|
);
|
|
@@ -1070,6 +1090,101 @@ const BarChart: React.ForwardRefExoticComponent<
|
|
|
1070
1090
|
);
|
|
1071
1091
|
},
|
|
1072
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}
|
|
1073
1188
|
</RechartsBarChart>
|
|
1074
1189
|
</ResponsiveContainer>
|
|
1075
1190
|
</div>
|