@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.
Files changed (376) hide show
  1. package/Models/AnalyticsModels/Index.ts +13 -0
  2. package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +178 -0
  3. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +179 -0
  4. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +179 -0
  5. package/Models/AnalyticsModels/NetworkFlow.ts +397 -0
  6. package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +18 -0
  7. package/Models/DatabaseModels/GlobalConfig.ts +36 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/MarketingConversion.ts +198 -0
  10. package/Models/DatabaseModels/MetricSavedView.ts +34 -0
  11. package/Models/DatabaseModels/MetricType.ts +74 -0
  12. package/Models/DatabaseModels/NetworkDevice.ts +332 -0
  13. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +113 -0
  14. package/Models/DatabaseModels/NetworkInterface.ts +58 -0
  15. package/Models/DatabaseModels/Project.ts +37 -0
  16. package/Models/DatabaseModels/User.ts +37 -0
  17. package/Server/API/BaseAnalyticsAPI.ts +23 -0
  18. package/Server/API/EnterpriseLicenseAPI.ts +14 -0
  19. package/Server/EnvironmentConfig.ts +84 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.ts +38 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.ts +28 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.ts +108 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.ts +31 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.ts +29 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.ts +35 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  27. package/Server/Services/AnalyticsDatabaseService.ts +70 -1
  28. package/Server/Services/IncidentService.ts +13 -0
  29. package/Server/Services/Index.ts +10 -0
  30. package/Server/Services/MarketingConversionService.ts +10 -0
  31. package/Server/Services/MetricItemAggMV1mByContainerService.ts +31 -0
  32. package/Server/Services/MetricItemAggMV1mByK8sClusterService.ts +31 -0
  33. package/Server/Services/MetricItemAggMV1mByServiceService.ts +31 -0
  34. package/Server/Services/MetricService.ts +970 -122
  35. package/Server/Services/MonitorService.ts +14 -0
  36. package/Server/Services/NetworkDeviceOwnerTeamService.ts +42 -0
  37. package/Server/Services/NetworkDeviceOwnerUserService.ts +106 -0
  38. package/Server/Services/NetworkFlowService.ts +11 -0
  39. package/Server/Services/OnCallDutyPolicyService.ts +11 -1
  40. package/Server/Services/ProjectService.ts +136 -0
  41. package/Server/Services/SpanService.ts +13 -9
  42. package/Server/Services/StatusPageService.ts +10 -0
  43. package/Server/Services/TeamMemberService.ts +11 -0
  44. package/Server/Services/UserService.ts +59 -0
  45. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
  46. package/Server/Utils/Attribution.ts +99 -0
  47. package/Server/Utils/Marketing/ConversionUploadProvider.ts +103 -0
  48. package/Server/Utils/Marketing/ConversionUploadProviders.ts +22 -0
  49. package/Server/Utils/Marketing/Providers/GoogleAds.ts +270 -0
  50. package/Server/Utils/Marketing/Providers/LinkedIn.ts +147 -0
  51. package/Server/Utils/Marketing/Providers/Meta.ts +148 -0
  52. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +196 -0
  53. package/Server/Utils/Marketing/Providers/Reddit.ts +178 -0
  54. package/Server/Utils/Monitor/MonitorAlert.ts +71 -7
  55. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +31 -19
  56. package/Server/Utils/Monitor/MonitorIncident.ts +71 -7
  57. package/Server/Utils/Monitor/MonitorMetricUtil.ts +57 -0
  58. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +94 -0
  59. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +15 -0
  60. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +125 -14
  61. package/Server/Utils/ProductAnalytics.ts +133 -0
  62. package/Server/Utils/Telemetry/Telemetry.ts +39 -0
  63. package/Server/Utils/Telemetry/TelemetryEntity.ts +21 -0
  64. package/Tests/Server/API/BaseAnalyticsAPI.test.ts +72 -0
  65. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +9 -1
  66. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +21 -2
  67. package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +173 -0
  68. package/Tests/Server/Services/MetricServiceAggregate.test.ts +1391 -0
  69. package/Tests/Server/Services/NetworkDeviceOwnerServices.test.ts +260 -0
  70. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
  71. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -0
  72. package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +111 -2
  73. package/Tests/Types/Database/EndsWith.test.ts +64 -0
  74. package/Tests/Types/Database/GreaterThan.test.ts +62 -0
  75. package/Tests/Types/Database/GreaterThanOrEqual.test.ts +65 -0
  76. package/Tests/Types/Database/GreaterThanOrNull.test.ts +63 -0
  77. package/Tests/Types/Database/Includes.test.ts +65 -0
  78. package/Tests/Types/Database/IncludesAll.test.ts +65 -0
  79. package/Tests/Types/Database/IncludesNone.test.ts +65 -0
  80. package/Tests/Types/Database/IsNull.test.ts +44 -0
  81. package/Tests/Types/Database/LessThan.test.ts +62 -0
  82. package/Tests/Types/Database/LessThanOrEqual.test.ts +62 -0
  83. package/Tests/Types/Database/LessThanOrNull.test.ts +62 -0
  84. package/Tests/Types/Database/MultiSearch.test.ts +81 -0
  85. package/Tests/Types/Database/NotContains.test.ts +64 -0
  86. package/Tests/Types/Database/NotNull.test.ts +44 -0
  87. package/Tests/Types/Database/StartsWith.test.ts +64 -0
  88. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +83 -1
  89. package/Tests/Types/Monitor/SnmpV3EnumParsing.test.ts +247 -0
  90. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +263 -0
  91. package/Tests/UI/Components/XAxis.test.ts +5 -3
  92. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +76 -0
  93. package/Tests/Utils/Metrics/MetricExplorerUrl.test.ts +622 -0
  94. package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +474 -0
  95. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +52 -4
  96. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +11 -0
  97. package/Types/BaseDatabase/AggregateBy.ts +31 -2
  98. package/Types/BaseDatabase/AggregatedResult.ts +22 -0
  99. package/Types/BaseDatabase/AggregationInterval.ts +11 -0
  100. package/Types/BaseDatabase/AggregationIntervalUtil.ts +30 -5
  101. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +16 -0
  102. package/Types/Email/EmailTemplateType.ts +3 -0
  103. package/Types/Marketing/MarketingConversion.ts +11 -0
  104. package/Types/Metrics/MetricQueryConfigData.ts +21 -0
  105. package/Types/Metrics/MetricQueryData.ts +8 -0
  106. package/Types/Metrics/MetricViewData.ts +8 -0
  107. package/Types/Monitor/MonitorMetricType.ts +8 -0
  108. package/Types/Monitor/MonitorStep.ts +9 -0
  109. package/Types/Monitor/MonitorStepSqlMonitor.ts +12 -0
  110. package/Types/Monitor/MonitorType.ts +2 -1
  111. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +17 -12
  112. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +13 -0
  113. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +37 -3
  114. package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +46 -0
  115. package/Types/Monitor/SnmpMonitor/SnmpEntityInfo.ts +15 -0
  116. package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +8 -0
  117. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +17 -8
  118. package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +53 -0
  119. package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +43 -0
  120. package/Types/Monitor/SnmpMonitor/SnmpSystemInfo.ts +16 -0
  121. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +119 -3
  122. package/Types/NetFlow/NetworkFlowRecord.ts +25 -0
  123. package/Types/Syslog/SyslogMessage.ts +18 -0
  124. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -0
  125. package/Types/Telemetry/TelemetrySavedViewType.ts +12 -0
  126. package/UI/Components/Charts/Area/AreaChart.tsx +51 -0
  127. package/UI/Components/Charts/Bar/BarChart.tsx +51 -1
  128. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +97 -26
  129. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +328 -1
  130. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +115 -0
  131. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +328 -1
  132. package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +7 -0
  133. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +15 -0
  134. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +13 -0
  135. package/UI/Components/Charts/Line/LineChart.tsx +51 -0
  136. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +12 -0
  137. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +12 -0
  138. package/UI/Components/Charts/Types/XAxis/XAxisPrecision.ts +1 -0
  139. package/UI/Components/Charts/Utils/DataPoint.ts +0 -0
  140. package/UI/Components/Charts/Utils/TimeAnnotation.ts +169 -0
  141. package/UI/Components/Charts/Utils/XAxis.ts +28 -4
  142. package/UI/Components/Icon/Icon.tsx +33 -13
  143. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +9 -0
  144. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +67 -0
  145. package/UI/Components/Page/ModelPage.tsx +6 -1
  146. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +33 -4
  147. package/UI/Styles/Theme.css +10 -0
  148. package/UI/Utils/User.ts +41 -2
  149. package/Utils/Analytics.ts +8 -6
  150. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +74 -0
  151. package/Utils/Metrics/MetricExplorerUrl.ts +771 -0
  152. package/Utils/Metrics/MetricFormulaEvaluator.ts +410 -46
  153. package/Utils/Monitor/NetworkTopologyUtil.ts +261 -49
  154. package/Utils/ValueFormatter.ts +22 -1
  155. package/build/dist/Models/AnalyticsModels/Index.js +13 -0
  156. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  157. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +159 -0
  158. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -0
  159. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +158 -0
  160. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -0
  161. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +160 -0
  162. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -0
  163. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +351 -0
  164. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -0
  165. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +19 -0
  166. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/GlobalConfig.js +38 -0
  168. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  170. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/MarketingConversion.js +219 -0
  172. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -0
  173. package/build/dist/Models/DatabaseModels/MetricSavedView.js +35 -0
  174. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/MetricType.js +76 -0
  176. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/NetworkDevice.js +341 -0
  178. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +116 -0
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/NetworkInterface.js +60 -0
  182. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/Project.js +38 -0
  184. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/User.js +38 -0
  186. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  187. package/build/dist/Server/API/BaseAnalyticsAPI.js +19 -0
  188. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  189. package/build/dist/Server/API/EnterpriseLicenseAPI.js +8 -0
  190. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  191. package/build/dist/Server/EnvironmentConfig.js +51 -0
  192. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  193. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js +27 -0
  194. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js.map +1 -0
  195. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js +21 -0
  196. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js.map +1 -0
  197. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js +47 -0
  198. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js.map +1 -0
  199. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js +16 -0
  200. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js.map +1 -0
  201. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js +18 -0
  202. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js.map +1 -0
  203. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js +20 -0
  204. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js.map +1 -0
  205. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  206. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  207. package/build/dist/Server/Services/AnalyticsDatabaseService.js +58 -4
  208. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  209. package/build/dist/Server/Services/IncidentService.js +12 -0
  210. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  211. package/build/dist/Server/Services/Index.js +10 -0
  212. package/build/dist/Server/Services/Index.js.map +1 -1
  213. package/build/dist/Server/Services/MarketingConversionService.js +9 -0
  214. package/build/dist/Server/Services/MarketingConversionService.js.map +1 -0
  215. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js +29 -0
  216. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js.map +1 -0
  217. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js +29 -0
  218. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js.map +1 -0
  219. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js +29 -0
  220. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js.map +1 -0
  221. package/build/dist/Server/Services/MetricService.js +761 -125
  222. package/build/dist/Server/Services/MetricService.js.map +1 -1
  223. package/build/dist/Server/Services/MonitorService.js +18 -5
  224. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  225. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +44 -0
  226. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -1
  227. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +88 -0
  228. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -1
  229. package/build/dist/Server/Services/NetworkFlowService.js +9 -0
  230. package/build/dist/Server/Services/NetworkFlowService.js.map +1 -0
  231. package/build/dist/Server/Services/OnCallDutyPolicyService.js +15 -6
  232. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  233. package/build/dist/Server/Services/ProjectService.js +107 -6
  234. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  235. package/build/dist/Server/Services/SpanService.js +8 -6
  236. package/build/dist/Server/Services/SpanService.js.map +1 -1
  237. package/build/dist/Server/Services/StatusPageService.js +10 -0
  238. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  239. package/build/dist/Server/Services/TeamMemberService.js +11 -0
  240. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  241. package/build/dist/Server/Services/UserService.js +52 -0
  242. package/build/dist/Server/Services/UserService.js.map +1 -1
  243. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +33 -7
  244. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  245. package/build/dist/Server/Utils/Attribution.js +74 -0
  246. package/build/dist/Server/Utils/Attribution.js.map +1 -0
  247. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +40 -0
  248. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -0
  249. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +20 -0
  250. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +1 -0
  251. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +177 -0
  252. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -0
  253. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +113 -0
  254. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -0
  255. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +109 -0
  256. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -0
  257. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +130 -0
  258. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -0
  259. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +126 -0
  260. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -0
  261. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +53 -9
  262. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  263. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -10
  264. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  265. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +54 -11
  266. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  267. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +43 -3
  268. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  269. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +68 -0
  270. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  271. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +15 -0
  272. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  273. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +100 -15
  274. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  275. package/build/dist/Server/Utils/ProductAnalytics.js +111 -0
  276. package/build/dist/Server/Utils/ProductAnalytics.js.map +1 -0
  277. package/build/dist/Server/Utils/Telemetry/Telemetry.js +32 -5
  278. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  279. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -0
  280. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  281. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +11 -0
  282. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  283. package/build/dist/Types/BaseDatabase/AggregationInterval.js +11 -0
  284. package/build/dist/Types/BaseDatabase/AggregationInterval.js.map +1 -1
  285. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +33 -5
  286. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  287. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  288. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  289. package/build/dist/Types/Marketing/MarketingConversion.js +13 -0
  290. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -0
  291. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  292. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  293. package/build/dist/Types/Monitor/MonitorStep.js +6 -0
  294. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  295. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +3 -0
  296. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  297. package/build/dist/Types/Monitor/MonitorType.js +2 -1
  298. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  299. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js +2 -0
  300. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js.map +1 -0
  301. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +41 -0
  302. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -1
  303. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js +2 -0
  304. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js.map +1 -0
  305. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +48 -0
  306. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -1
  307. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +38 -0
  308. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -1
  309. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js +2 -0
  310. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js.map +1 -0
  311. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +96 -3
  312. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  313. package/build/dist/Types/NetFlow/NetworkFlowRecord.js +2 -0
  314. package/build/dist/Types/NetFlow/NetworkFlowRecord.js.map +1 -0
  315. package/build/dist/Types/Syslog/SyslogMessage.js +2 -0
  316. package/build/dist/Types/Syslog/SyslogMessage.js.map +1 -0
  317. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js +0 -7
  318. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js.map +1 -1
  319. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js +13 -0
  320. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js.map +1 -0
  321. package/build/dist/UI/Components/Charts/Area/AreaChart.js +25 -1
  322. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  323. package/build/dist/UI/Components/Charts/Bar/BarChart.js +26 -2
  324. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  325. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +36 -12
  326. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  327. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +208 -6
  328. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  329. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +52 -3
  330. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  331. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +208 -6
  332. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  333. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +6 -1
  334. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
  335. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js +2 -0
  336. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js.map +1 -0
  337. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js +2 -0
  338. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js.map +1 -0
  339. package/build/dist/UI/Components/Charts/Line/LineChart.js +25 -1
  340. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  341. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js +2 -0
  342. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js.map +1 -0
  343. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js +2 -0
  344. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js.map +1 -0
  345. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js +1 -0
  346. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js.map +1 -1
  347. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +0 -0
  348. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  349. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +121 -0
  350. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -0
  351. package/build/dist/UI/Components/Charts/Utils/XAxis.js +27 -4
  352. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  353. package/build/dist/UI/Components/Icon/Icon.js +15 -8
  354. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  355. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  356. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +58 -0
  357. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  358. package/build/dist/UI/Components/Page/ModelPage.js +7 -1
  359. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  360. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +10 -4
  361. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  362. package/build/dist/UI/Utils/User.js +35 -2
  363. package/build/dist/UI/Utils/User.js.map +1 -1
  364. package/build/dist/Utils/Analytics.js +8 -5
  365. package/build/dist/Utils/Analytics.js.map +1 -1
  366. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +57 -0
  367. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  368. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +418 -0
  369. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -0
  370. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +296 -37
  371. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -1
  372. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +176 -40
  373. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  374. package/build/dist/Utils/ValueFormatter.js +20 -1
  375. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  376. 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 ref={ref} className={cx("flex-1 w-full", className)} {...other}>
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>