@oneuptime/common 12.0.30 → 12.0.32

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 (645) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -0,0 +1,254 @@
1
+ /** @timezone UTC */
2
+
3
+ import { describe, expect, test } from "@jest/globals";
4
+ import ChartDataPoint, {
5
+ CHART_DATA_POINT_X_AXIS_KEY,
6
+ } from "../../../../UI/Components/Charts/ChartLibrary/Types/ChartDataPoint";
7
+ import DataPoint from "../../../../UI/Components/Charts/Types/DataPoint";
8
+ import DataPointUtil from "../../../../UI/Components/Charts/Utils/DataPoint";
9
+ import FormattedTimeReferenceLine from "../../../../UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine";
10
+ import TimeAnnotationUtil from "../../../../UI/Components/Charts/Utils/TimeAnnotation";
11
+ import XAxisUtil from "../../../../UI/Components/Charts/Utils/XAxis";
12
+ import {
13
+ XAxis,
14
+ XAxisAggregateType,
15
+ } from "../../../../UI/Components/Charts/Types/XAxis/XAxis";
16
+ import XAxisType from "../../../../UI/Components/Charts/Types/XAxis/XAxisType";
17
+ import YAxis, {
18
+ YAxisPrecision,
19
+ } from "../../../../UI/Components/Charts/Types/YAxis/YAxis";
20
+ import YAxisType from "../../../../UI/Components/Charts/Types/YAxis/YAxisType";
21
+
22
+ /*
23
+ * The x-axis label is the identity of a bucket on both sides of the chart:
24
+ * DataPointUtil puts a series row on the first row whose label matches, and
25
+ * TimeAnnotationUtil resolves an event marker to a bucket the same way.
26
+ *
27
+ * While sub-hour labels were bare wall-clock readings, a window of a day or
28
+ * more repeated them — so day two's data landed in day one's buckets
29
+ * (inflating Sum and Count, and drawing the series across only the first
30
+ * half of the chart) and day two's markers landed on day one's ticks.
31
+ *
32
+ * These are the end-to-end regressions for that. XAxis.test.ts holds the
33
+ * label-uniqueness property they depend on.
34
+ */
35
+
36
+ const HOUR_IN_MS: number = 60 * 60 * 1000;
37
+ const SERIES_NAME: string = "requests";
38
+ const WINDOW_START: Date = new Date("2026-03-02T00:00:00.000Z");
39
+
40
+ const Y_AXIS: YAxis = {
41
+ legend: "count",
42
+ options: {
43
+ type: YAxisType.Number,
44
+ min: "auto",
45
+ max: "auto",
46
+ precision: YAxisPrecision.NoDecimals,
47
+ formatter: (value: number): string => {
48
+ return String(value);
49
+ },
50
+ },
51
+ };
52
+
53
+ function buildXAxis(
54
+ hours: number,
55
+ aggregateType: XAxisAggregateType = XAxisAggregateType.Sum,
56
+ ): XAxis {
57
+ return {
58
+ legend: "Time",
59
+ options: {
60
+ type: XAxisType.Time,
61
+ min: WINDOW_START,
62
+ max: new Date(WINDOW_START.getTime() + hours * HOUR_IN_MS),
63
+ aggregateType,
64
+ },
65
+ };
66
+ }
67
+
68
+ /** One datapoint on the hour, every hour, each worth 1. */
69
+ function hourlyPoints(hours: number): Array<DataPoint> {
70
+ const points: Array<DataPoint> = [];
71
+ for (let hour: number = 0; hour < hours; hour++) {
72
+ points.push({
73
+ x: new Date(WINDOW_START.getTime() + hour * HOUR_IN_MS),
74
+ y: 1,
75
+ });
76
+ }
77
+ return points;
78
+ }
79
+
80
+ function chartRows(
81
+ xAxis: XAxis,
82
+ points: Array<DataPoint>,
83
+ ): Array<ChartDataPoint> {
84
+ return DataPointUtil.getChartDataPoints({
85
+ seriesPoints: [{ seriesName: SERIES_NAME, data: points }],
86
+ xAxis,
87
+ yAxis: Y_AXIS,
88
+ });
89
+ }
90
+
91
+ function rowsCarryingData(rows: Array<ChartDataPoint>): Array<ChartDataPoint> {
92
+ return rows.filter((row: ChartDataPoint): boolean => {
93
+ return row[SERIES_NAME] !== undefined;
94
+ });
95
+ }
96
+
97
+ describe("series data does not merge across days", () => {
98
+ test("48 hourly points land in 48 separate buckets, one each", () => {
99
+ /*
100
+ * Measured before the fix: 24 of the 48 points were folded onto the
101
+ * other 24, so the largest bucket summed to 2 and the last row
102
+ * carrying any data was index 46 of 96 — the series stopped halfway
103
+ * across the chart.
104
+ */
105
+ const xAxis: XAxis = buildXAxis(48);
106
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, hourlyPoints(48));
107
+ const withData: Array<ChartDataPoint> = rowsCarryingData(rows);
108
+
109
+ expect(rows).toHaveLength(97);
110
+ expect(withData).toHaveLength(48);
111
+
112
+ for (const row of withData) {
113
+ expect(row[SERIES_NAME]).toBe(1);
114
+ }
115
+ });
116
+
117
+ test("the series is drawn across the whole window, not just day one", () => {
118
+ const xAxis: XAxis = buildXAxis(48);
119
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, hourlyPoints(48));
120
+
121
+ const lastRowWithData: number = rows.reduce(
122
+ (last: number, row: ChartDataPoint, index: number): number => {
123
+ return row[SERIES_NAME] === undefined ? last : index;
124
+ },
125
+ -1,
126
+ );
127
+
128
+ // Hourly points on a half-hourly axis reach the second-to-last tick.
129
+ expect(lastRowWithData).toBe(rows.length - 3);
130
+ });
131
+
132
+ test("a Sum aggregate is not inflated by a merged day", () => {
133
+ const xAxis: XAxis = buildXAxis(48, XAxisAggregateType.Sum);
134
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, hourlyPoints(48));
135
+
136
+ const largestBucket: number = rowsCarryingData(rows).reduce(
137
+ (largest: number, row: ChartDataPoint): number => {
138
+ return Math.max(largest, Number(row[SERIES_NAME]));
139
+ },
140
+ 0,
141
+ );
142
+
143
+ // One point per bucket, so no bucket may sum to more than one point.
144
+ expect(largestBucket).toBe(1);
145
+ });
146
+
147
+ test("day two's points keep their own buckets, on their own labels", () => {
148
+ const xAxis: XAxis = buildXAxis(48);
149
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, hourlyPoints(48));
150
+
151
+ const labelsWithData: Array<string> = rowsCarryingData(rows).map(
152
+ (row: ChartDataPoint): string => {
153
+ return String(row[CHART_DATA_POINT_X_AXIS_KEY]);
154
+ },
155
+ );
156
+
157
+ expect(labelsWithData).toContain("02 Mar, 06:00");
158
+ expect(labelsWithData).toContain("03 Mar, 06:00");
159
+ expect(new Set(labelsWithData).size).toBe(labelsWithData.length);
160
+ });
161
+
162
+ test("a 24 hour window keeps its last point out of its first bucket", () => {
163
+ /*
164
+ * The narrower version of the same bug: only the first and last tick
165
+ * collided, so a datapoint at the very end of the window was added to
166
+ * the very first bucket.
167
+ */
168
+ const xAxis: XAxis = buildXAxis(24);
169
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, [
170
+ { x: WINDOW_START, y: 1 },
171
+ { x: new Date(WINDOW_START.getTime() + 24 * HOUR_IN_MS), y: 1 },
172
+ ]);
173
+
174
+ const withData: Array<ChartDataPoint> = rowsCarryingData(rows);
175
+
176
+ expect(withData).toHaveLength(2);
177
+ expect(withData[0]![SERIES_NAME]).toBe(1);
178
+ expect(withData[1]![SERIES_NAME]).toBe(1);
179
+ });
180
+
181
+ test("a window short enough to be unambiguous still buckets correctly", () => {
182
+ // The unchanged path, so the fix cannot have moved it.
183
+ const xAxis: XAxis = buildXAxis(6);
184
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, hourlyPoints(6));
185
+
186
+ expect(rowsCarryingData(rows)).toHaveLength(6);
187
+ expect(String(rows[0]![CHART_DATA_POINT_X_AXIS_KEY])).toBe("00:00");
188
+ });
189
+ });
190
+
191
+ describe("event markers do not merge across days", () => {
192
+ function bucketOfMarker(xAxis: XAxis, date: Date): number {
193
+ const formatted: Array<FormattedTimeReferenceLine> =
194
+ TimeAnnotationUtil.formatTimeReferenceLines({
195
+ timeReferenceLines: [{ date, label: "event" }],
196
+ xAxis,
197
+ });
198
+ expect(formatted).toHaveLength(1);
199
+ return formatted[0]!.bucketIndex;
200
+ }
201
+
202
+ test("a day-two marker resolves to a day-two bucket", () => {
203
+ const xAxis: XAxis = buildXAxis(48);
204
+
205
+ const dayOne: number = bucketOfMarker(
206
+ xAxis,
207
+ new Date(WINDOW_START.getTime() + 6 * HOUR_IN_MS),
208
+ );
209
+ const dayTwo: number = bucketOfMarker(
210
+ xAxis,
211
+ new Date(WINDOW_START.getTime() + 30 * HOUR_IN_MS),
212
+ );
213
+
214
+ expect(dayTwo).toBeGreaterThan(dayOne);
215
+ // 30h in, on a half-hourly axis, is the 60th interval.
216
+ expect(dayTwo).toBe(60);
217
+ });
218
+
219
+ test("a marker still lands on the bucket its own data lands in", () => {
220
+ /*
221
+ * The invariant both sides have to keep. It held before the fix too —
222
+ * they were consistently wrong together — and it has to keep holding
223
+ * now that they are consistently right.
224
+ */
225
+ const xAxis: XAxis = buildXAxis(48);
226
+ const labels: Array<string> = XAxisUtil.getPrecisionIntervals({
227
+ xAxisMin: xAxis.options.min,
228
+ xAxisMax: xAxis.options.max,
229
+ }).map(
230
+ XAxisUtil.getFormatter({
231
+ xAxisMin: xAxis.options.min,
232
+ xAxisMax: xAxis.options.max,
233
+ }),
234
+ );
235
+
236
+ for (const hoursIn of [0, 6, 23, 24, 30, 47]) {
237
+ const at: Date = new Date(WINDOW_START.getTime() + hoursIn * HOUR_IN_MS);
238
+
239
+ const rows: Array<ChartDataPoint> = chartRows(xAxis, [{ x: at, y: 1 }]);
240
+ const dataBucket: number = rows.findIndex(
241
+ (row: ChartDataPoint): boolean => {
242
+ return row[SERIES_NAME] !== undefined;
243
+ },
244
+ );
245
+
246
+ expect(dataBucket).toBeGreaterThanOrEqual(0);
247
+ expect(bucketOfMarker(xAxis, at)).toBe(dataBucket);
248
+ // And the label the renderer shows agrees with both.
249
+ expect(labels[dataBucket]).toBe(
250
+ String(rows[dataBucket]![CHART_DATA_POINT_X_AXIS_KEY]),
251
+ );
252
+ }
253
+ });
254
+ });
@@ -0,0 +1,221 @@
1
+ import "@testing-library/jest-dom";
2
+ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
3
+ import { act, cleanup, render } from "@testing-library/react";
4
+ import React from "react";
5
+ import getJestMockFunction, { MockFunction } from "../../../MockType";
6
+
7
+ /*
8
+ * A double-click is delivered as TWO plain clicks and only then a
9
+ * `dblclick`. On a dashboard panel a plain click already means something —
10
+ * it pins the bucket and opens the investigation inspector — so wiring
11
+ * double-click-to-reset naively would pop that inspector twice on the way
12
+ * to resetting the board, and leave it open on top of the result.
13
+ *
14
+ * The chart library solves it by holding the click open for
15
+ * DOUBLE_CLICK_DISAMBIGUATION_MS and cancelling it when the double-click
16
+ * lands. That delay is a real cost, so it is armed ONLY when a reset
17
+ * handler is supplied — every other chart in the product keeps instant
18
+ * clicks. These tests pin both halves of that bargain.
19
+ *
20
+ * recharts' own chart root is mocked here so the chart-level handlers can
21
+ * be invoked with a known active index: jsdom reports every element as
22
+ * 0x0, so a real click would never resolve to a bucket and the assertions
23
+ * would pass for the wrong reason. The wiring from recharts' DOM into
24
+ * these handlers is covered separately by ChartDoubleClickReset.test.tsx.
25
+ */
26
+
27
+ /*
28
+ * Deliberately NOT a React props interface: the mock chart below takes an
29
+ * untyped bag and this is just how the captured handlers are read back.
30
+ * Typing the mock's parameter would trip react/no-unused-prop-types, since
31
+ * the mock renders none of them.
32
+ */
33
+ type CapturedChartHandlers = {
34
+ onClick?: ((chartState: Record<string, unknown>) => void) | undefined;
35
+ onDoubleClick?: ((...args: Array<unknown>) => void) | undefined;
36
+ };
37
+
38
+ const mockChartPropsRef: { current: CapturedChartHandlers } = { current: {} };
39
+
40
+ jest.mock("recharts", () => {
41
+ const actual: Record<string, any> = jest.requireActual("recharts");
42
+ return {
43
+ ...actual,
44
+ ResponsiveContainer: ({ children }: { children: React.ReactElement }) => {
45
+ return children;
46
+ },
47
+ LineChart: (props: Record<string, unknown>): React.ReactElement => {
48
+ mockChartPropsRef.current = props as CapturedChartHandlers;
49
+ return React.createElement("div", { "data-testid": "chart-root" });
50
+ },
51
+ };
52
+ });
53
+
54
+ import { LineChart } from "../../../../UI/Components/Charts/ChartLibrary/LineChart/LineChart";
55
+ import { DOUBLE_CLICK_DISAMBIGUATION_MS } from "../../../../UI/Components/Charts/ChartLibrary/Utils/DoubleClick";
56
+ import {
57
+ CHART_DATA_POINT_DATE_KEY,
58
+ CHART_DATA_POINT_X_AXIS_KEY,
59
+ } from "../../../../UI/Components/Charts/ChartLibrary/Types/ChartDataPoint";
60
+
61
+ const BUCKET_MS: number = 60 * 1000;
62
+ const FIRST_BUCKET: Date = new Date("2026-08-10T00:00:00.000Z");
63
+ const CLICKED_ROW_INDEX: number = 2;
64
+
65
+ function buildRows(): Array<Record<string, number | string>> {
66
+ const rows: Array<Record<string, number | string>> = [];
67
+ for (let index: number = 0; index < 6; index++) {
68
+ const bucketDate: Date = new Date(
69
+ FIRST_BUCKET.getTime() + index * BUCKET_MS,
70
+ );
71
+ rows.push({
72
+ [CHART_DATA_POINT_X_AXIS_KEY]: bucketDate.toISOString(),
73
+ [CHART_DATA_POINT_DATE_KEY]: bucketDate.getTime(),
74
+ CPU: 10 + index,
75
+ });
76
+ }
77
+ return rows;
78
+ }
79
+
80
+ function renderChart(options: {
81
+ onBucketClick: MockFunction;
82
+ onTimeRangeReset?: MockFunction | undefined;
83
+ }): void {
84
+ render(
85
+ <LineChart
86
+ data={buildRows()}
87
+ index={CHART_DATA_POINT_X_AXIS_KEY}
88
+ categories={["CPU"]}
89
+ showLegend={false}
90
+ onBucketClick={
91
+ options.onBucketClick as unknown as (
92
+ bucketStart: Date,
93
+ bucketEnd: Date,
94
+ valuesAtBucket: Record<string, number | string>,
95
+ ) => void
96
+ }
97
+ onTimeRangeReset={
98
+ options.onTimeRangeReset as unknown as (() => void) | undefined
99
+ }
100
+ />,
101
+ );
102
+ }
103
+
104
+ function clickBucket(): void {
105
+ act(() => {
106
+ mockChartPropsRef.current.onClick?.({
107
+ activeTooltipIndex: CLICKED_ROW_INDEX,
108
+ });
109
+ });
110
+ }
111
+
112
+ function doubleClick(): void {
113
+ act(() => {
114
+ mockChartPropsRef.current.onDoubleClick?.({}, {});
115
+ });
116
+ }
117
+
118
+ function advancePastTheDoubleClickWindow(): void {
119
+ act(() => {
120
+ jest.advanceTimersByTime(DOUBLE_CLICK_DISAMBIGUATION_MS + 10);
121
+ });
122
+ }
123
+
124
+ beforeEach(() => {
125
+ jest.useFakeTimers();
126
+ mockChartPropsRef.current = {};
127
+ });
128
+
129
+ afterEach(() => {
130
+ cleanup();
131
+ jest.useRealTimers();
132
+ });
133
+
134
+ describe("chart click vs. double-click disambiguation", () => {
135
+ test("with no reset handler, a bucket click is delivered immediately", () => {
136
+ const onBucketClick: MockFunction = getJestMockFunction();
137
+ renderChart({ onBucketClick });
138
+
139
+ // No onDoubleClick is even handed to recharts when reset is off.
140
+ expect(mockChartPropsRef.current.onDoubleClick).toBeUndefined();
141
+
142
+ clickBucket();
143
+
144
+ expect(onBucketClick.mock.calls.length).toBe(1);
145
+ expect(onBucketClick.mock.calls[0]?.[0]).toEqual(
146
+ new Date(FIRST_BUCKET.getTime() + CLICKED_ROW_INDEX * BUCKET_MS),
147
+ );
148
+ // The bucket covers its full width, derived from the adjacent rows.
149
+ expect(onBucketClick.mock.calls[0]?.[1]).toEqual(
150
+ new Date(FIRST_BUCKET.getTime() + (CLICKED_ROW_INDEX + 1) * BUCKET_MS),
151
+ );
152
+ });
153
+
154
+ test("with a reset handler, a single click still reaches the bucket — just later", () => {
155
+ const onBucketClick: MockFunction = getJestMockFunction();
156
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
157
+ renderChart({ onBucketClick, onTimeRangeReset });
158
+
159
+ clickBucket();
160
+
161
+ // Held open, in case a second click is coming.
162
+ expect(onBucketClick.mock.calls.length).toBe(0);
163
+
164
+ advancePastTheDoubleClickWindow();
165
+
166
+ expect(onBucketClick.mock.calls.length).toBe(1);
167
+ expect(onTimeRangeReset.mock.calls.length).toBe(0);
168
+ });
169
+
170
+ test("a double-click resets and never pins a bucket", () => {
171
+ const onBucketClick: MockFunction = getJestMockFunction();
172
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
173
+ renderChart({ onBucketClick, onTimeRangeReset });
174
+
175
+ // Exactly what the browser delivers: click, click, then dblclick.
176
+ clickBucket();
177
+ clickBucket();
178
+ doubleClick();
179
+
180
+ expect(onTimeRangeReset.mock.calls.length).toBe(1);
181
+
182
+ advancePastTheDoubleClickWindow();
183
+
184
+ // Neither click may survive the reset.
185
+ expect(onBucketClick.mock.calls.length).toBe(0);
186
+ });
187
+
188
+ test("a click after a double-click still works", () => {
189
+ const onBucketClick: MockFunction = getJestMockFunction();
190
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
191
+ renderChart({ onBucketClick, onTimeRangeReset });
192
+
193
+ clickBucket();
194
+ clickBucket();
195
+ doubleClick();
196
+ advancePastTheDoubleClickWindow();
197
+
198
+ clickBucket();
199
+ advancePastTheDoubleClickWindow();
200
+
201
+ expect(onBucketClick.mock.calls.length).toBe(1);
202
+ expect(onTimeRangeReset.mock.calls.length).toBe(1);
203
+ });
204
+
205
+ test("unmounting mid-gesture drops the pending click instead of firing it", () => {
206
+ const onBucketClick: MockFunction = getJestMockFunction();
207
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
208
+ renderChart({ onBucketClick, onTimeRangeReset });
209
+
210
+ clickBucket();
211
+ cleanup();
212
+ advancePastTheDoubleClickWindow();
213
+
214
+ /*
215
+ * A widget can be unmounted by the very reset the user is performing
216
+ * (the board re-queries and re-renders); a timer that outlives it would
217
+ * call back into a dead component.
218
+ */
219
+ expect(onBucketClick.mock.calls.length).toBe(0);
220
+ });
221
+ });
@@ -0,0 +1,220 @@
1
+ import "@testing-library/jest-dom";
2
+ import { afterEach, describe, expect, test } from "@jest/globals";
3
+ import {
4
+ RenderResult,
5
+ cleanup,
6
+ fireEvent,
7
+ render,
8
+ } from "@testing-library/react";
9
+ import React from "react";
10
+ import getJestMockFunction, { MockFunction } from "../../../MockType";
11
+
12
+ /*
13
+ * ResponsiveContainer measures its parent, which is always 0x0 in jsdom, so
14
+ * the chart renders nothing — including no `.recharts-wrapper` for the
15
+ * events below to land on — without a fixed size. Same shim the other chart
16
+ * suites use.
17
+ */
18
+ jest.mock("recharts", () => {
19
+ const actual: Record<string, any> = jest.requireActual("recharts");
20
+ return {
21
+ ...actual,
22
+ ResponsiveContainer: ({ children }: { children: React.ReactElement }) => {
23
+ return React.cloneElement(children, { width: 600, height: 300 });
24
+ },
25
+ };
26
+ });
27
+
28
+ import AreaChartElement from "../../../../UI/Components/Charts/Area/AreaChart";
29
+ import BarChartElement from "../../../../UI/Components/Charts/Bar/BarChart";
30
+ import LineChartElement from "../../../../UI/Components/Charts/Line/LineChart";
31
+ import ChartCurve from "../../../../UI/Components/Charts/Types/ChartCurve";
32
+ import DataPoint from "../../../../UI/Components/Charts/Types/DataPoint";
33
+ import SeriesPoint from "../../../../UI/Components/Charts/Types/SeriesPoints";
34
+ import {
35
+ XAxis as ChartXAxis,
36
+ XAxisAggregateType,
37
+ } from "../../../../UI/Components/Charts/Types/XAxis/XAxis";
38
+ import XAxisType from "../../../../UI/Components/Charts/Types/XAxis/XAxisType";
39
+ import YAxis, {
40
+ YAxisPrecision,
41
+ } from "../../../../UI/Components/Charts/Types/YAxis/YAxis";
42
+ import YAxisType from "../../../../UI/Components/Charts/Types/YAxis/YAxisType";
43
+
44
+ /*
45
+ * Drag-to-select on a dashboard panel now retimes the WHOLE dashboard, so
46
+ * every panel needs a way back out of the zoom that does not depend on
47
+ * finding a particular widget: double-clicking any of them.
48
+ *
49
+ * That gesture is wired at the chart library, not at the widget card, for
50
+ * two reasons pinned here: it must reach recharts' own plot surface (the
51
+ * card sits under the edit overlay and the resize handles), and it must be
52
+ * OPT-IN — a chart handed no reset handler has to behave exactly as it did
53
+ * before, because a double-click is also two plain clicks and those still
54
+ * mean "pin this bucket" everywhere else in the product.
55
+ */
56
+
57
+ const START: Date = new Date("2026-08-10T00:00:00.000Z");
58
+ const END: Date = new Date("2026-08-10T01:00:00.000Z");
59
+
60
+ function buildPoints(): Array<DataPoint> {
61
+ const points: Array<DataPoint> = [];
62
+ for (let index: number = 0; index < 10; index++) {
63
+ points.push({
64
+ x: new Date(START.getTime() + index * 60 * 1000),
65
+ y: 90 + index,
66
+ });
67
+ }
68
+ return points;
69
+ }
70
+
71
+ function buildSeries(): Array<SeriesPoint> {
72
+ return [{ seriesName: "CPU", data: buildPoints() }];
73
+ }
74
+
75
+ const X_AXIS: ChartXAxis = {
76
+ legend: "Time",
77
+ options: {
78
+ type: XAxisType.Time,
79
+ min: START,
80
+ max: END,
81
+ aggregateType: XAxisAggregateType.Average,
82
+ },
83
+ };
84
+
85
+ const Y_AXIS: YAxis = {
86
+ legend: "%",
87
+ options: {
88
+ type: YAxisType.Number,
89
+ min: "auto",
90
+ max: 100,
91
+ precision: YAxisPrecision.TwoDecimals,
92
+ formatter: (value: number): string => {
93
+ return `${value}%`;
94
+ },
95
+ },
96
+ };
97
+
98
+ interface ChartUnderTest {
99
+ name: string;
100
+ render: (onTimeRangeReset: (() => void) | undefined) => React.ReactElement;
101
+ }
102
+
103
+ const CHARTS: Array<ChartUnderTest> = [
104
+ {
105
+ name: "LineChart",
106
+ render: (
107
+ onTimeRangeReset: (() => void) | undefined,
108
+ ): React.ReactElement => {
109
+ return (
110
+ <LineChartElement
111
+ data={buildSeries()}
112
+ xAxis={X_AXIS}
113
+ yAxis={Y_AXIS}
114
+ curve={ChartCurve.MONOTONE}
115
+ heightInPx={300}
116
+ showLegend={false}
117
+ sync={false}
118
+ syncid="double-click-reset-test"
119
+ onTimeRangeReset={onTimeRangeReset}
120
+ />
121
+ );
122
+ },
123
+ },
124
+ {
125
+ name: "AreaChart",
126
+ render: (
127
+ onTimeRangeReset: (() => void) | undefined,
128
+ ): React.ReactElement => {
129
+ return (
130
+ <AreaChartElement
131
+ data={buildSeries()}
132
+ xAxis={X_AXIS}
133
+ yAxis={Y_AXIS}
134
+ curve={ChartCurve.MONOTONE}
135
+ heightInPx={300}
136
+ showLegend={false}
137
+ sync={false}
138
+ syncid="double-click-reset-test"
139
+ onTimeRangeReset={onTimeRangeReset}
140
+ />
141
+ );
142
+ },
143
+ },
144
+ {
145
+ /*
146
+ * A bar panel cannot ORIGINATE a zoom — it has no drag-to-select — but
147
+ * it must still be able to end one, or a board whose only panel under
148
+ * the pointer is a bar chart would be a dead end.
149
+ */
150
+ name: "BarChart",
151
+ render: (
152
+ onTimeRangeReset: (() => void) | undefined,
153
+ ): React.ReactElement => {
154
+ return (
155
+ <BarChartElement
156
+ data={buildSeries()}
157
+ xAxis={X_AXIS}
158
+ yAxis={Y_AXIS}
159
+ heightInPx={300}
160
+ showLegend={false}
161
+ sync={false}
162
+ syncid="double-click-reset-test"
163
+ onTimeRangeReset={onTimeRangeReset}
164
+ />
165
+ );
166
+ },
167
+ },
168
+ ];
169
+
170
+ function plotSurface(rendered: RenderResult): Element {
171
+ const surface: Element | null =
172
+ rendered.container.querySelector(".recharts-wrapper");
173
+ if (!surface) {
174
+ throw new Error("chart did not render a plot surface");
175
+ }
176
+ return surface;
177
+ }
178
+
179
+ afterEach(() => {
180
+ cleanup();
181
+ });
182
+
183
+ describe("chart double-click to reset the time range", () => {
184
+ for (const chart of CHARTS) {
185
+ describe(chart.name, () => {
186
+ test("double-clicking the plot calls back exactly once", () => {
187
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
188
+ const rendered: RenderResult = render(
189
+ chart.render(onTimeRangeReset as unknown as () => void),
190
+ );
191
+
192
+ fireEvent.doubleClick(plotSurface(rendered));
193
+
194
+ expect(onTimeRangeReset.mock.calls.length).toBe(1);
195
+ });
196
+
197
+ test("a plain click is not a reset", () => {
198
+ const onTimeRangeReset: MockFunction = getJestMockFunction();
199
+ const rendered: RenderResult = render(
200
+ chart.render(onTimeRangeReset as unknown as () => void),
201
+ );
202
+
203
+ fireEvent.click(plotSurface(rendered));
204
+
205
+ expect(onTimeRangeReset.mock.calls.length).toBe(0);
206
+ });
207
+
208
+ test("a chart with no reset handler still renders and swallows the gesture", () => {
209
+ const rendered: RenderResult = render(chart.render(undefined));
210
+
211
+ // No handler wired, so this must be inert rather than throwing.
212
+ fireEvent.doubleClick(plotSurface(rendered));
213
+
214
+ expect(
215
+ rendered.container.querySelector(".recharts-wrapper"),
216
+ ).not.toBeNull();
217
+ });
218
+ });
219
+ }
220
+ });