@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
@@ -12,6 +12,7 @@ import {
12
12
  Line,
13
13
  Legend as RechartsLegend,
14
14
  LineChart as RechartsLineChart,
15
+ ReferenceArea,
15
16
  ReferenceDot,
16
17
  ReferenceLine,
17
18
  ResponsiveContainer,
@@ -22,6 +23,9 @@ import {
22
23
  import ChartReferenceLineProps from "../../Types/ReferenceLineProps";
23
24
  import ExemplarPoint from "../../Types/ExemplarPoint";
24
25
  import FormattedExemplarPoint from "../Types/FormattedExemplarPoint";
26
+ import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
27
+ import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
28
+ import { CHART_DATA_POINT_DATE_KEY } from "../Types/ChartDataPoint";
25
29
  import { AxisDomain } from "recharts/types/util/types";
26
30
 
27
31
  import { useOnWindowResize } from "../Utils/UseWindowOnResize";
@@ -38,6 +42,15 @@ import { getYAxisDomain } from "../Utils/GetYAxisDomain";
38
42
  import { hasOnlyOneValueForKey } from "../Utils/HasOnlyOneValueForKey";
39
43
  import ChartCurve from "../../Types/ChartCurve";
40
44
 
45
+ /*
46
+ * Incident/alert time markers each label at the same "insideTop" band, so
47
+ * several events in one window pile their labels into an unreadable stack.
48
+ * A single marker keeps the classic horizontal top label; a handful get
49
+ * rotated to run along their lines; past this cap inline labels are hidden
50
+ * entirely (the dashed lines and their click-through remain).
51
+ */
52
+ const MAX_LABELED_TIME_REFERENCE_LINES: number = 6;
53
+
41
54
  //#region Legend
42
55
 
43
56
  interface LegendItemProps {
@@ -559,6 +572,15 @@ type BaseEventProps = {
559
572
 
560
573
  type LineChartEventProps = BaseEventProps | null | undefined;
561
574
 
575
+ /*
576
+ * Subset of the recharts MouseHandlerDataParam passed to chart-level
577
+ * mouse handlers — just the fields range selection needs.
578
+ */
579
+ type RangeSelectionChartState = {
580
+ activeTooltipIndex?: number | string | null | undefined;
581
+ activeLabel?: string | number | undefined;
582
+ };
583
+
562
584
  interface LineChartProps extends React.HTMLAttributes<HTMLDivElement> {
563
585
  data: Record<string, any>[];
564
586
  index: string;
@@ -589,8 +611,11 @@ interface LineChartProps extends React.HTMLAttributes<HTMLDivElement> {
589
611
  customTooltip?: React.ComponentType<TooltipProps>;
590
612
  syncid?: string | undefined;
591
613
  referenceLines?: Array<ChartReferenceLineProps> | undefined;
614
+ formattedTimeReferenceLines?: Array<FormattedTimeReferenceLine> | undefined;
615
+ formattedReferenceRegions?: Array<FormattedReferenceRegion> | undefined;
592
616
  formattedExemplarPoints?: Array<FormattedExemplarPoint> | undefined;
593
617
  onExemplarClick?: ((exemplar: ExemplarPoint) => void) | undefined;
618
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
594
619
  }
595
620
 
596
621
  const LineChart: React.ForwardRefExoticComponent<
@@ -627,6 +652,9 @@ const LineChart: React.ForwardRefExoticComponent<
627
652
  legendPosition = "right",
628
653
  tooltipCallback,
629
654
  customTooltip,
655
+ formattedTimeReferenceLines,
656
+ formattedReferenceRegions,
657
+ onTimeRangeSelect,
630
658
  ...other
631
659
  } = props;
632
660
  const CustomTooltip: React.ComponentType<TooltipProps> | undefined =
@@ -640,8 +668,27 @@ const LineChart: React.ForwardRefExoticComponent<
640
668
  const [activeLegend, setActiveLegend] = React.useState<string | undefined>(
641
669
  undefined,
642
670
  );
671
+ const hasOnTimeRangeSelect: boolean = Boolean(onTimeRangeSelect);
672
+ const [rangeSelectionStart, setRangeSelectionStart] = React.useState<
673
+ string | null
674
+ >(null);
675
+ const [rangeSelectionEnd, setRangeSelectionEnd] = React.useState<
676
+ string | null
677
+ >(null);
678
+ const isRangeSelecting: React.MutableRefObject<boolean> =
679
+ React.useRef<boolean>(false);
680
+ const rangeSelectionStartIndexRef: React.MutableRefObject<number | null> =
681
+ React.useRef<number | null>(null);
682
+ const rangeSelectionEndIndexRef: React.MutableRefObject<number | null> =
683
+ React.useRef<number | null>(null);
684
+ const suppressNextClickRef: React.MutableRefObject<boolean> =
685
+ React.useRef<boolean>(false);
643
686
  const categoryColors: Map<string, ChartColorValue> =
644
687
  constructCategoryColors(categories, colors);
688
+ const timeReferenceLineCount: number =
689
+ formattedTimeReferenceLines?.length || 0;
690
+ const showTimeReferenceLineLabels: boolean =
691
+ timeReferenceLineCount <= MAX_LABELED_TIME_REFERENCE_LINES;
645
692
 
646
693
  const yAxisDomain: (number | "auto")[] = getYAxisDomain(
647
694
  autoMinValue,
@@ -657,6 +704,11 @@ const LineChart: React.ForwardRefExoticComponent<
657
704
  function onDotClick(itemData: any, event: React.MouseEvent): void {
658
705
  event.stopPropagation();
659
706
 
707
+ // Ignore the click that immediately follows a drag-to-select.
708
+ if (suppressNextClickRef.current) {
709
+ return;
710
+ }
711
+
660
712
  if (!hasOnValueChange) {
661
713
  return;
662
714
  }
@@ -685,6 +737,10 @@ const LineChart: React.ForwardRefExoticComponent<
685
737
  }
686
738
 
687
739
  function onCategoryClick(dataKey: string): void {
740
+ // Ignore the click that immediately follows a drag-to-select.
741
+ if (suppressNextClickRef.current) {
742
+ return;
743
+ }
688
744
  if (!hasOnValueChange) {
689
745
  return;
690
746
  }
@@ -706,15 +762,179 @@ const LineChart: React.ForwardRefExoticComponent<
706
762
  setActiveDot(undefined);
707
763
  }
708
764
 
765
+ function getRowIndexFromChartState(
766
+ chartState: RangeSelectionChartState,
767
+ ): number | null {
768
+ const activeTooltipIndex: number | string | null | undefined =
769
+ chartState.activeTooltipIndex;
770
+ const numericIndex: number =
771
+ typeof activeTooltipIndex === "number"
772
+ ? activeTooltipIndex
773
+ : Number(activeTooltipIndex);
774
+ if (
775
+ activeTooltipIndex !== undefined &&
776
+ activeTooltipIndex !== null &&
777
+ Number.isInteger(numericIndex) &&
778
+ numericIndex >= 0 &&
779
+ numericIndex < data.length
780
+ ) {
781
+ return numericIndex;
782
+ }
783
+ // Fall back to matching activeLabel against the row labels.
784
+ if (chartState.activeLabel !== undefined) {
785
+ const rowIndex: number = data.findIndex(
786
+ (row: Record<string, unknown>) => {
787
+ return row[index] === chartState.activeLabel;
788
+ },
789
+ );
790
+ return rowIndex >= 0 ? rowIndex : null;
791
+ }
792
+ return null;
793
+ }
794
+
795
+ function getBucketDateAtIndex(rowIndex: number): Date | null {
796
+ const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
797
+ return typeof rawDate === "number" ? new Date(rawDate) : null;
798
+ }
799
+
800
+ function handleRangeSelectMouseDown(
801
+ chartState: RangeSelectionChartState,
802
+ ): void {
803
+ if (!hasOnTimeRangeSelect) {
804
+ return;
805
+ }
806
+ const rowIndex: number | null = getRowIndexFromChartState(chartState);
807
+ if (rowIndex === null) {
808
+ return;
809
+ }
810
+ const rowLabel: unknown = data[rowIndex]?.[index];
811
+ if (typeof rowLabel !== "string") {
812
+ return;
813
+ }
814
+ isRangeSelecting.current = true;
815
+ rangeSelectionStartIndexRef.current = rowIndex;
816
+ rangeSelectionEndIndexRef.current = rowIndex;
817
+ setRangeSelectionStart(rowLabel);
818
+ setRangeSelectionEnd(null);
819
+ }
820
+
821
+ function handleRangeSelectMouseMove(
822
+ chartState: RangeSelectionChartState,
823
+ mouseEvent: React.MouseEvent<SVGGraphicsElement>,
824
+ ): void {
825
+ if (!isRangeSelecting.current) {
826
+ return;
827
+ }
828
+ // Button was released outside the chart — abandon the selection.
829
+ if (mouseEvent.buttons === 0) {
830
+ isRangeSelecting.current = false;
831
+ rangeSelectionStartIndexRef.current = null;
832
+ rangeSelectionEndIndexRef.current = null;
833
+ setRangeSelectionStart(null);
834
+ setRangeSelectionEnd(null);
835
+ return;
836
+ }
837
+ const rowIndex: number | null = getRowIndexFromChartState(chartState);
838
+ if (rowIndex === null) {
839
+ return;
840
+ }
841
+ const rowLabel: unknown = data[rowIndex]?.[index];
842
+ if (typeof rowLabel !== "string") {
843
+ return;
844
+ }
845
+ rangeSelectionEndIndexRef.current = rowIndex;
846
+ setRangeSelectionEnd(rowLabel);
847
+ }
848
+
849
+ function handleRangeSelectMouseUp(): void {
850
+ if (!isRangeSelecting.current) {
851
+ return;
852
+ }
853
+ isRangeSelecting.current = false;
854
+
855
+ const startIndex: number | null = rangeSelectionStartIndexRef.current;
856
+ const endIndex: number | null = rangeSelectionEndIndexRef.current;
857
+ rangeSelectionStartIndexRef.current = null;
858
+ rangeSelectionEndIndexRef.current = null;
859
+ setRangeSelectionStart(null);
860
+ setRangeSelectionEnd(null);
861
+
862
+ /*
863
+ * A plain click (pointer never left the starting bucket) must keep
864
+ * behaving exactly as before — only a real drag selects a range.
865
+ */
866
+ if (startIndex === null || endIndex === null || startIndex === endIndex) {
867
+ return;
868
+ }
869
+
870
+ /*
871
+ * The browser fires a click right after mouseup; swallow it so a
872
+ * drag doesn't also toggle legend/dot selection. Cleared on a
873
+ * timeout so a never-delivered click can't suppress a later one.
874
+ */
875
+ suppressNextClickRef.current = true;
876
+ setTimeout(() => {
877
+ suppressNextClickRef.current = false;
878
+ }, 0);
879
+
880
+ if (!onTimeRangeSelect) {
881
+ return;
882
+ }
883
+
884
+ const lowerIndex: number = Math.min(startIndex, endIndex);
885
+ const upperIndex: number = Math.max(startIndex, endIndex);
886
+ const startDate: Date | null = getBucketDateAtIndex(lowerIndex);
887
+ const lastBucketDate: Date | null = getBucketDateAtIndex(upperIndex);
888
+ if (!startDate || !lastBucketDate) {
889
+ return;
890
+ }
891
+
892
+ /*
893
+ * Cover the full final bucket: its end is its start plus one
894
+ * bucket width, derived from adjacent row dates.
895
+ */
896
+ const adjacentDate: Date | null =
897
+ upperIndex > 0
898
+ ? getBucketDateAtIndex(upperIndex - 1)
899
+ : getBucketDateAtIndex(upperIndex + 1);
900
+ const bucketWidthInMs: number = adjacentDate
901
+ ? Math.abs(lastBucketDate.getTime() - adjacentDate.getTime())
902
+ : 0;
903
+ const endDate: Date = new Date(
904
+ lastBucketDate.getTime() + bucketWidthInMs,
905
+ );
906
+
907
+ onTimeRangeSelect(startDate, endDate);
908
+ }
909
+
709
910
  return (
710
- <div ref={ref} className={cx("flex-1 w-full", className)} {...other}>
911
+ <div
912
+ ref={ref}
913
+ className={cx(
914
+ "flex-1 w-full",
915
+ hasOnTimeRangeSelect && "cursor-crosshair",
916
+ className,
917
+ )}
918
+ {...other}
919
+ >
711
920
  <ResponsiveContainer>
712
921
  <RechartsLineChart
713
922
  data={data}
714
923
  syncId={props.syncid?.toString() || ""}
924
+ {...(hasOnTimeRangeSelect
925
+ ? {
926
+ onMouseDown: handleRangeSelectMouseDown,
927
+ onMouseMove: handleRangeSelectMouseMove,
928
+ onMouseUp: handleRangeSelectMouseUp,
929
+ }
930
+ : {})}
715
931
  onClick={
716
932
  hasOnValueChange && (activeLegend || activeDot)
717
933
  ? () => {
934
+ // Ignore the click that follows a drag-to-select.
935
+ if (suppressNextClickRef.current) {
936
+ return;
937
+ }
718
938
  setActiveDot(undefined);
719
939
  setActiveLegend(undefined);
720
940
  onValueChange?.(null);
@@ -1051,6 +1271,98 @@ const LineChart: React.ForwardRefExoticComponent<
1051
1271
  );
1052
1272
  },
1053
1273
  )}
1274
+ {/* Time-anchored shaded regions (e.g. incident/maintenance windows) */}
1275
+ {formattedReferenceRegions?.map(
1276
+ (region: FormattedReferenceRegion, regionIndex: number) => {
1277
+ const regionColor: string = region.original.color || "#6366f1";
1278
+ return (
1279
+ <ReferenceArea
1280
+ key={`ref-region-${regionIndex}`}
1281
+ x1={region.formattedX1}
1282
+ x2={region.formattedX2}
1283
+ fill={regionColor}
1284
+ fillOpacity={0.12}
1285
+ stroke={regionColor}
1286
+ strokeOpacity={0.35}
1287
+ strokeWidth={1}
1288
+ {...(region.original.onClick
1289
+ ? {
1290
+ style: { cursor: "pointer" as const },
1291
+ onClick: (): void => {
1292
+ if (suppressNextClickRef.current) {
1293
+ return;
1294
+ }
1295
+ region.original.onClick?.();
1296
+ },
1297
+ }
1298
+ : {})}
1299
+ >
1300
+ {region.original.label && (
1301
+ <Label
1302
+ value={region.original.label}
1303
+ position="insideTop"
1304
+ fill={regionColor}
1305
+ fontSize={10}
1306
+ fontWeight={500}
1307
+ />
1308
+ )}
1309
+ </ReferenceArea>
1310
+ );
1311
+ },
1312
+ )}
1313
+ {/* Time-anchored vertical event markers (e.g. deploys, incidents) */}
1314
+ {formattedTimeReferenceLines?.map(
1315
+ (
1316
+ timeRefLine: FormattedTimeReferenceLine,
1317
+ timeRefIndex: number,
1318
+ ) => {
1319
+ const lineColor: string =
1320
+ timeRefLine.original.color || "#f59e0b";
1321
+ return (
1322
+ <ReferenceLine
1323
+ key={`time-ref-${timeRefIndex}`}
1324
+ x={timeRefLine.formattedX}
1325
+ stroke={lineColor}
1326
+ strokeDasharray={
1327
+ timeRefLine.original.strokeDasharray || "4 4"
1328
+ }
1329
+ strokeWidth={1.5}
1330
+ {...(timeRefLine.original.onClick
1331
+ ? {
1332
+ style: { cursor: "pointer" as const },
1333
+ onClick: (): void => {
1334
+ if (suppressNextClickRef.current) {
1335
+ return;
1336
+ }
1337
+ timeRefLine.original.onClick?.();
1338
+ },
1339
+ }
1340
+ : {})}
1341
+ >
1342
+ {timeRefLine.original.label &&
1343
+ showTimeReferenceLineLabels && (
1344
+ <Label
1345
+ value={timeRefLine.original.label}
1346
+ {...(timeReferenceLineCount > 1
1347
+ ? {
1348
+ /*
1349
+ * Several markers: run each label down its
1350
+ * own line so labels at different x stop
1351
+ * sharing one horizontal band.
1352
+ */
1353
+ position: "insideTopLeft" as const,
1354
+ angle: 90,
1355
+ }
1356
+ : { position: "insideTop" as const })}
1357
+ fill={lineColor}
1358
+ fontSize={10}
1359
+ fontWeight={500}
1360
+ />
1361
+ )}
1362
+ </ReferenceLine>
1363
+ );
1364
+ },
1365
+ )}
1054
1366
  {/* Exemplar dots - clickable markers linking to traces */}
1055
1367
  {props.formattedExemplarPoints?.map(
1056
1368
  (exemplar: FormattedExemplarPoint, exemplarIndex: number) => {
@@ -1065,6 +1377,10 @@ const LineChart: React.ForwardRefExoticComponent<
1065
1377
  strokeWidth={2}
1066
1378
  style={{ cursor: "pointer" }}
1067
1379
  onClick={() => {
1380
+ // Ignore the click that follows a drag-to-select.
1381
+ if (suppressNextClickRef.current) {
1382
+ return;
1383
+ }
1068
1384
  props.onExemplarClick?.(exemplar.original);
1069
1385
  }}
1070
1386
  >
@@ -1083,6 +1399,17 @@ const LineChart: React.ForwardRefExoticComponent<
1083
1399
  );
1084
1400
  },
1085
1401
  )}
1402
+ {/* Live drag-to-select highlight */}
1403
+ {rangeSelectionStart && rangeSelectionEnd ? (
1404
+ <ReferenceArea
1405
+ x1={rangeSelectionStart}
1406
+ x2={rangeSelectionEnd}
1407
+ fill="rgba(99,102,241,0.12)"
1408
+ stroke="rgba(99,102,241,0.5)"
1409
+ strokeWidth={1}
1410
+ radius={2}
1411
+ />
1412
+ ) : null}
1086
1413
  </RechartsLineChart>
1087
1414
  </ResponsiveContainer>
1088
1415
  </div>
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Hidden per-row field carrying the raw bucket start as ms since epoch.
3
+ * Underscore-prefixed so it cannot collide with real series names, and it
4
+ * is never rendered as a series (only `categories` keys are drawn).
5
+ */
6
+ export const CHART_DATA_POINT_DATE_KEY: string = "__date";
7
+
1
8
  export default interface ChartDataPoint {
2
9
  [x: string]: number | string;
3
10
  }
@@ -0,0 +1,15 @@
1
+ import ChartReferenceRegionProps from "../../Types/ReferenceRegionProps";
2
+
3
+ /**
4
+ * A time-anchored shaded region whose endpoints have been formatted to
5
+ * (and clamped onto) the chart's categorical x-axis labels. Used
6
+ * internally by chart library components.
7
+ */
8
+ export default interface FormattedReferenceRegion {
9
+ /** The formatted x-axis label of the region start bucket */
10
+ formattedX1: string;
11
+ /** The formatted x-axis label of the region end bucket */
12
+ formattedX2: string;
13
+ /** The original annotation for label/color/click handling */
14
+ original: ChartReferenceRegionProps;
15
+ }
@@ -0,0 +1,13 @@
1
+ import ChartTimeReferenceLineProps from "../../Types/TimeReferenceLineProps";
2
+
3
+ /**
4
+ * A time-anchored vertical reference line whose x value has been formatted
5
+ * to match the chart's categorical x-axis labels. Used internally by chart
6
+ * library components.
7
+ */
8
+ export default interface FormattedTimeReferenceLine {
9
+ /** The formatted x-axis label (e.g. "12:30", "22 Feb") */
10
+ formattedX: string;
11
+ /** The original annotation for label/color/click handling */
12
+ original: ChartTimeReferenceLineProps;
13
+ }
@@ -15,8 +15,13 @@ import YAxis from "../Types/YAxis/YAxis";
15
15
  import ChartCurve from "../Types/ChartCurve";
16
16
  import ChartDataPoint from "../ChartLibrary/Types/ChartDataPoint";
17
17
  import FormattedExemplarPoint from "../ChartLibrary/Types/FormattedExemplarPoint";
18
+ import FormattedReferenceRegion from "../ChartLibrary/Types/FormattedReferenceRegion";
19
+ import FormattedTimeReferenceLine from "../ChartLibrary/Types/FormattedTimeReferenceLine";
18
20
  import DataPointUtil from "../Utils/DataPoint";
21
+ import TimeAnnotationUtil from "../Utils/TimeAnnotation";
19
22
  import ChartReferenceLineProps from "../Types/ReferenceLineProps";
23
+ import ChartReferenceRegionProps from "../Types/ReferenceRegionProps";
24
+ import ChartTimeReferenceLineProps from "../Types/TimeReferenceLineProps";
20
25
  import ExemplarPoint from "../Types/ExemplarPoint";
21
26
  import XAxisUtil from "../Utils/XAxis";
22
27
  import NoDataMessage from "../ChartGroup/NoDataMessage";
@@ -41,8 +46,20 @@ export interface ComponentProps {
41
46
  sync: boolean;
42
47
  heightInPx?: number | undefined;
43
48
  referenceLines?: Array<ChartReferenceLineProps> | undefined;
49
+ /*
50
+ * Time-anchored annotations: vertical event markers and shaded regions.
51
+ * Dates are snapped onto the categorical x-axis buckets; annotations
52
+ * outside the charted window are dropped (regions clamp to the edge).
53
+ */
54
+ timeReferenceLines?: Array<ChartTimeReferenceLineProps> | undefined;
55
+ referenceRegions?: Array<ChartReferenceRegionProps> | undefined;
44
56
  exemplarPoints?: Array<ExemplarPoint> | undefined;
45
57
  onExemplarClick?: ((exemplar: ExemplarPoint) => void) | undefined;
58
+ /*
59
+ * When provided, the chart supports drag-to-select: dragging across
60
+ * buckets calls back with the [start, end) of the selected time range.
61
+ */
62
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
46
63
  showLegend?: boolean | undefined;
47
64
  /*
48
65
  * Optional per-series color override (named palette keys or hex strings).
@@ -95,6 +112,29 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
95
112
  });
96
113
  }, [props.exemplarPoints, props.xAxis]);
97
114
 
115
+ // Snap time annotations onto the categorical x-axis bucket labels
116
+ const formattedTimeReferenceLines: Array<FormattedTimeReferenceLine> =
117
+ useMemo(() => {
118
+ if (!props.timeReferenceLines || props.timeReferenceLines.length === 0) {
119
+ return [];
120
+ }
121
+ return TimeAnnotationUtil.formatTimeReferenceLines({
122
+ timeReferenceLines: props.timeReferenceLines,
123
+ xAxis: props.xAxis,
124
+ });
125
+ }, [props.timeReferenceLines, props.xAxis]);
126
+
127
+ const formattedReferenceRegions: Array<FormattedReferenceRegion> =
128
+ useMemo(() => {
129
+ if (!props.referenceRegions || props.referenceRegions.length === 0) {
130
+ return [];
131
+ }
132
+ return TimeAnnotationUtil.formatReferenceRegions({
133
+ referenceRegions: props.referenceRegions,
134
+ xAxis: props.xAxis,
135
+ });
136
+ }, [props.referenceRegions, props.xAxis]);
137
+
98
138
  const hasNoData: boolean =
99
139
  !props.data ||
100
140
  props.data.length === 0 ||
@@ -144,10 +184,21 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
144
184
  {...maxValueProp}
145
185
  onValueChange={() => {}}
146
186
  referenceLines={props.referenceLines}
187
+ formattedTimeReferenceLines={
188
+ formattedTimeReferenceLines.length > 0
189
+ ? formattedTimeReferenceLines
190
+ : undefined
191
+ }
192
+ formattedReferenceRegions={
193
+ formattedReferenceRegions.length > 0
194
+ ? formattedReferenceRegions
195
+ : undefined
196
+ }
147
197
  formattedExemplarPoints={
148
198
  formattedExemplars.length > 0 ? formattedExemplars : undefined
149
199
  }
150
200
  onExemplarClick={props.onExemplarClick}
201
+ onTimeRangeSelect={props.onTimeRangeSelect}
151
202
  />
152
203
  {hasNoData && <NoDataMessage />}
153
204
  </div>
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A time-anchored shaded region (e.g. an incident or maintenance window).
3
+ * Endpoints are clamped to the nearest in-window x-axis buckets, so a
4
+ * region overlapping the window edge is trimmed rather than dropped.
5
+ */
6
+ export default interface ChartReferenceRegionProps {
7
+ startDate: Date;
8
+ endDate: Date;
9
+ label?: string | undefined;
10
+ color?: string | undefined; // CSS color, e.g. "#6366f1" or "red"
11
+ onClick?: (() => void) | undefined;
12
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A time-anchored vertical event marker (e.g. a deploy or an incident
3
+ * start). The date is snapped to the chart's categorical x-axis buckets
4
+ * before rendering.
5
+ */
6
+ export default interface ChartTimeReferenceLineProps {
7
+ date: Date;
8
+ label?: string | undefined;
9
+ color?: string | undefined; // CSS color, e.g. "#f59e0b" or "red"
10
+ strokeDasharray?: string | undefined; // e.g. "4 4" for dashed
11
+ onClick?: (() => void) | undefined;
12
+ }
@@ -6,6 +6,7 @@ enum XAxisPrecision {
6
6
  EVERY_MINUTE = "minute",
7
7
  EVERY_FIVE_MINUTES = "fiveMinutes",
8
8
  EVERY_TEN_MINUTES = "tenMinutes",
9
+ EVERY_FIFTEEN_MINUTES = "fifteenMinutes",
9
10
  EVERY_THIRTY_MINUTES = "thirtyMinutes",
10
11
  EVERY_HOUR = "hour",
11
12
  EVERY_TWO_HOURS = "twoHours",