@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,751 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ cleanup,
4
+ configure,
5
+ fireEvent,
6
+ render,
7
+ screen,
8
+ waitFor,
9
+ } from "@testing-library/react";
10
+ import React from "react";
11
+ import {
12
+ afterEach,
13
+ beforeEach,
14
+ describe,
15
+ expect,
16
+ jest,
17
+ test,
18
+ } from "@jest/globals";
19
+
20
+ /*
21
+ * Rendering a real table several times over comfortably outruns the 1s
22
+ * default when the whole suite is competing for the same box.
23
+ */
24
+ configure({ asyncUtilTimeout: 15000 });
25
+
26
+ /*
27
+ * Bulk-deleting the rows you selected.
28
+ *
29
+ * Issue #3559 came from Network -> Devices: 916 devices selected out of 7,489,
30
+ * "Bulk Actions" open, and every action in it except the one the user wanted -
31
+ * Add/Remove Labels, Set/Clear OID Template, Archive, Export CSV. Deleting a
32
+ * batch of stale or duplicated devices meant deleting them one at a time.
33
+ *
34
+ * The action is not written per page: ModelTable adds a default "Delete" to
35
+ * any table that already offers bulk actions, for anyone the model lets
36
+ * delete. What is asserted here is that behaviour end to end - it is offered,
37
+ * it asks first, it deletes exactly what was selected - plus the two things
38
+ * that only matter once the selection is large:
39
+ *
40
+ * - the confirmation can carry what else leaves with the rows
41
+ * (`deleteConfirmationWarning`), because a devices page knows things the
42
+ * generic sentence cannot;
43
+ * - a delete that FAILS is reported. Failures used to be collected but
44
+ * never handed to the progress modal unless a later row happened to
45
+ * succeed, so a run whose trailing rows failed under-reported, and a run
46
+ * where everything failed - a permission or FK problem, which is what a
47
+ * 900-row delete actually hits - finished looking like it had done
48
+ * nothing at all.
49
+ */
50
+
51
+ let isMasterAdminForTest: boolean = false;
52
+ let permissionsForTest: Array<unknown> = [];
53
+
54
+ jest.mock("../../../../UI/Utils/Permission", () => {
55
+ return {
56
+ __esModule: true,
57
+ default: {
58
+ getAllPermissions: (): Array<unknown> => {
59
+ return permissionsForTest;
60
+ },
61
+ getProjectPermissions: (): null => {
62
+ return null;
63
+ },
64
+ getGlobalPermissions: (): null => {
65
+ return null;
66
+ },
67
+ },
68
+ };
69
+ });
70
+
71
+ jest.mock("../../../../UI/Utils/User", () => {
72
+ return {
73
+ __esModule: true,
74
+ default: {
75
+ isMasterAdmin: (): boolean => {
76
+ return isMasterAdminForTest;
77
+ },
78
+ getUserId: (): null => {
79
+ return null;
80
+ },
81
+ },
82
+ };
83
+ });
84
+
85
+ jest.mock("../../../../UI/Utils/Translation", () => {
86
+ return {
87
+ __esModule: true,
88
+ default: () => {
89
+ return {
90
+ translateString: (value: string | undefined): string | undefined => {
91
+ return value;
92
+ },
93
+ translateValue: (value: unknown): unknown => {
94
+ return value;
95
+ },
96
+ };
97
+ },
98
+ };
99
+ });
100
+
101
+ import BaseModelTable, {
102
+ BaseTableCallbacks,
103
+ ComponentProps as BaseModelTableProps,
104
+ } from "../../../../UI/Components/ModelTable/BaseModelTable";
105
+ import TableFilterUrlState from "../../../../UI/Utils/TableFilterUrlState";
106
+ import PermissionGate from "../../../../UI/Utils/PermissionGate";
107
+ import FieldType from "../../../../UI/Components/Types/FieldType";
108
+ import { ButtonStyleType } from "../../../../UI/Components/Button/Button";
109
+ import NetworkDevice from "../../../../Models/DatabaseModels/NetworkDevice";
110
+ import Permission from "../../../../Types/Permission";
111
+ import ListResult from "../../../../Types/BaseDatabase/ListResult";
112
+ import { JSONObject } from "../../../../Types/JSON";
113
+
114
+ type Row = {
115
+ _id: string;
116
+ name: string;
117
+ };
118
+
119
+ const ROWS: Array<Row> = [
120
+ { _id: "device-1", name: "core-router-1" },
121
+ { _id: "device-2", name: "core-router-2" },
122
+ { _id: "device-3", name: "core-router-3" },
123
+ ];
124
+
125
+ const ARCHIVE_ACTION: unknown = {
126
+ title: "Archive",
127
+ buttonStyleType: ButtonStyleType.NORMAL,
128
+ onClick: async (): Promise<void> => {
129
+ return Promise.resolve();
130
+ },
131
+ };
132
+
133
+ const DEVICE_DELETE_WARNING: string =
134
+ "Their interfaces, links, endpoints and any monitor OneUptime created for them are deleted too.";
135
+
136
+ type TableOptions = {
137
+ bulkActionButtons?: Array<unknown> | undefined;
138
+ deleteConfirmationWarning?: string | undefined;
139
+ deleteItem?: ((item: NetworkDevice) => Promise<void>) | undefined;
140
+ };
141
+
142
+ describe("BaseModelTable bulk Delete", () => {
143
+ let deletedIds: Array<string> = [];
144
+ let getListCallCount: number = 0;
145
+
146
+ type MakePropsFunction = (
147
+ options: TableOptions,
148
+ ) => BaseModelTableProps<NetworkDevice>;
149
+
150
+ const makeProps: MakePropsFunction = (
151
+ options: TableOptions,
152
+ ): BaseModelTableProps<NetworkDevice> => {
153
+ const callbacks: BaseTableCallbacks<NetworkDevice> = {
154
+ deleteItem: async (item: NetworkDevice): Promise<void> => {
155
+ if (options.deleteItem) {
156
+ await options.deleteItem(item);
157
+ }
158
+
159
+ deletedIds.push(String((item as unknown as Row)._id));
160
+ },
161
+ getModelFromJSON: (item: JSONObject): NetworkDevice => {
162
+ return item as unknown as NetworkDevice;
163
+ },
164
+ getJSONFromModel: (item: NetworkDevice): JSONObject => {
165
+ return item as unknown as JSONObject;
166
+ },
167
+ addSlugToSelect: (select: unknown): unknown => {
168
+ return select;
169
+ },
170
+ getList: async (data: {
171
+ skip: number;
172
+ limit: number;
173
+ }): Promise<ListResult<NetworkDevice>> => {
174
+ getListCallCount++;
175
+
176
+ return {
177
+ data: ROWS as unknown as Array<NetworkDevice>,
178
+ count: ROWS.length,
179
+ skip: data.skip,
180
+ limit: data.limit,
181
+ };
182
+ },
183
+ toJSONArray: (): Array<JSONObject> => {
184
+ return [];
185
+ },
186
+ updateById: async (): Promise<void> => {
187
+ return undefined;
188
+ },
189
+ showCreateEditModal: (): React.ReactElement => {
190
+ return <div data-testid="create-edit-modal" />;
191
+ },
192
+ } as unknown as BaseTableCallbacks<NetworkDevice>;
193
+
194
+ return {
195
+ modelType: NetworkDevice,
196
+ id: "network-devices-table",
197
+ name: "Network Devices",
198
+ userPreferencesKey: "network-devices-bulk-delete-table",
199
+ urlStateKey: "network-devices-bulk-delete-table",
200
+ columns: [{ field: { name: true }, title: "Name", type: FieldType.Text }],
201
+ filters: [],
202
+ cardProps: {
203
+ title: "Network Devices",
204
+ description: "Every device in this project",
205
+ },
206
+ /*
207
+ * Exactly how the Devices page is configured: no per-row Delete button.
208
+ * Bulk deletion is deliberately not tied to that flag - `isDeleteable`
209
+ * is about the Actions column, not about the selection bar.
210
+ */
211
+ isCreateable: true,
212
+ isEditable: false,
213
+ isDeleteable: false,
214
+ isViewable: true,
215
+ callbacks: callbacks,
216
+ bulkActions: {
217
+ buttons: options.bulkActionButtons ?? [ARCHIVE_ACTION],
218
+ ...(options.deleteConfirmationWarning
219
+ ? { deleteConfirmationWarning: options.deleteConfirmationWarning }
220
+ : {}),
221
+ },
222
+ } as unknown as BaseModelTableProps<NetworkDevice>;
223
+ };
224
+
225
+ type RenderTableFunction = (
226
+ options?: TableOptions | undefined,
227
+ ) => ReturnType<typeof render>;
228
+
229
+ const renderTable: RenderTableFunction = (
230
+ options?: TableOptions | undefined,
231
+ ): ReturnType<typeof render> => {
232
+ return render(
233
+ <BaseModelTable<NetworkDevice> {...makeProps(options || {})} />,
234
+ );
235
+ };
236
+
237
+ type SelectRowsFunction = (
238
+ container: HTMLElement,
239
+ count: number,
240
+ ) => Promise<void>;
241
+
242
+ /* Ticks the first `count` row checkboxes, skipping the header's select-all. */
243
+ const selectRows: SelectRowsFunction = async (
244
+ container: HTMLElement,
245
+ count: number,
246
+ ): Promise<void> => {
247
+ await waitFor(() => {
248
+ expect(
249
+ container.querySelectorAll('input[type="checkbox"]:not([disabled])')
250
+ .length,
251
+ ).toBeGreaterThan(ROWS.length);
252
+ });
253
+
254
+ const checkboxes: Array<HTMLInputElement> = Array.from(
255
+ container.querySelectorAll<HTMLInputElement>('input[type="checkbox"]'),
256
+ );
257
+
258
+ /*
259
+ * The header carries its own select-all box, so the row boxes are the
260
+ * trailing ones. Taking them from the end keeps this independent of where
261
+ * the header box sits in the DOM.
262
+ */
263
+ const rowCheckboxes: Array<HTMLInputElement> = checkboxes.slice(
264
+ checkboxes.length - ROWS.length,
265
+ );
266
+
267
+ for (let index: number = 0; index < count; index++) {
268
+ fireEvent.click(rowCheckboxes[index]!);
269
+ }
270
+ };
271
+
272
+ type OpenBulkMenuFunction = () => Promise<void>;
273
+
274
+ const openBulkMenu: OpenBulkMenuFunction = async (): Promise<void> => {
275
+ await waitFor(() => {
276
+ expect(screen.getByText("Bulk Actions")).toBeInTheDocument();
277
+ });
278
+
279
+ fireEvent.click(screen.getByText("Bulk Actions"));
280
+
281
+ await waitFor(() => {
282
+ expect(
283
+ document.querySelectorAll('[role="menuitem"]').length,
284
+ ).toBeGreaterThan(0);
285
+ });
286
+ };
287
+
288
+ type FindMenuItemFunction = (label: string) => HTMLElement | undefined;
289
+
290
+ const findMenuItem: FindMenuItemFunction = (
291
+ label: string,
292
+ ): HTMLElement | undefined => {
293
+ return Array.from(
294
+ document.querySelectorAll<HTMLElement>('[role="menuitem"]'),
295
+ ).find((item: HTMLElement) => {
296
+ return (item.textContent || "").trim() === label;
297
+ });
298
+ };
299
+
300
+ type MenuItemLabelsFunction = () => Array<string>;
301
+
302
+ const menuItemLabels: MenuItemLabelsFunction = (): Array<string> => {
303
+ return Array.from(
304
+ document.querySelectorAll<HTMLElement>('[role="menuitem"]'),
305
+ ).map((item: HTMLElement) => {
306
+ return (item.textContent || "").trim();
307
+ });
308
+ };
309
+
310
+ type ConfirmFunction = () => Promise<void>;
311
+
312
+ /* Presses the danger button in the confirmation dialog's footer. */
313
+ const confirmDelete: ConfirmFunction = async (): Promise<void> => {
314
+ await waitFor(() => {
315
+ expect(
316
+ document.querySelector('[data-testid="modal-footer"]'),
317
+ ).not.toBeNull();
318
+ });
319
+
320
+ const footer: HTMLElement = document.querySelector<HTMLElement>(
321
+ '[data-testid="modal-footer"]',
322
+ )!;
323
+
324
+ const submitButton: HTMLButtonElement | undefined = Array.from(
325
+ footer.querySelectorAll<HTMLButtonElement>("button"),
326
+ ).find((button: HTMLButtonElement) => {
327
+ return (button.textContent || "").trim() === "Delete";
328
+ });
329
+
330
+ expect(submitButton).toBeDefined();
331
+
332
+ fireEvent.click(submitButton!);
333
+ };
334
+
335
+ type CloseProgressModalFunction = () => Promise<void>;
336
+
337
+ /*
338
+ * The results modal stays up until the user dismisses it - that is when the
339
+ * table drops the selection and refetches.
340
+ */
341
+ const closeProgressModal: CloseProgressModalFunction =
342
+ async (): Promise<void> => {
343
+ await waitFor(() => {
344
+ expect(
345
+ Array.from(
346
+ document.querySelectorAll<HTMLButtonElement>(
347
+ '[data-testid="modal-footer"] button',
348
+ ),
349
+ ).find((button: HTMLButtonElement) => {
350
+ return (
351
+ (button.textContent || "").trim() === "Close" && !button.disabled
352
+ );
353
+ }),
354
+ ).toBeDefined();
355
+ });
356
+
357
+ const closeButton: HTMLButtonElement = Array.from(
358
+ document.querySelectorAll<HTMLButtonElement>(
359
+ '[data-testid="modal-footer"] button',
360
+ ),
361
+ ).find((button: HTMLButtonElement) => {
362
+ return (
363
+ (button.textContent || "").trim() === "Close" && !button.disabled
364
+ );
365
+ })!;
366
+
367
+ fireEvent.click(closeButton);
368
+ };
369
+
370
+ type StartBulkDeleteFunction = (
371
+ options?: TableOptions | undefined,
372
+ ) => Promise<ReturnType<typeof render>>;
373
+
374
+ /* Select two rows, open the menu, click Delete. Stops before confirming. */
375
+ const startBulkDelete: StartBulkDeleteFunction = async (
376
+ options?: TableOptions | undefined,
377
+ ): Promise<ReturnType<typeof render>> => {
378
+ const result: ReturnType<typeof render> = renderTable(options);
379
+
380
+ await selectRows(result.container, 2);
381
+ await openBulkMenu();
382
+
383
+ fireEvent.click(findMenuItem("Delete")!);
384
+
385
+ return result;
386
+ };
387
+
388
+ type ConfirmationTextFunction = () => string;
389
+
390
+ const confirmationText: ConfirmationTextFunction = (): string => {
391
+ return (
392
+ document.querySelector('[data-testid="confirm-modal-description"]')
393
+ ?.textContent || ""
394
+ );
395
+ };
396
+
397
+ beforeEach(() => {
398
+ isMasterAdminForTest = false;
399
+ permissionsForTest = [Permission.ProjectAdmin];
400
+ deletedIds = [];
401
+ getListCallCount = 0;
402
+ PermissionGate.clearPermissionPropsCache();
403
+ window.history.replaceState(
404
+ window.history.state,
405
+ "",
406
+ "/dashboard/network-devices",
407
+ );
408
+ TableFilterUrlState.resetClaimedKeys();
409
+ window.localStorage.clear();
410
+ });
411
+
412
+ afterEach(() => {
413
+ cleanup();
414
+ jest.restoreAllMocks();
415
+ });
416
+
417
+ describe("the action is offered", () => {
418
+ /*
419
+ * The report itself: a devices table whose bulk menu had Archive and
420
+ * Export CSV in it and no way to delete anything.
421
+ */
422
+ test("Delete sits in the bulk menu alongside the page's own actions", async () => {
423
+ const { container } = renderTable();
424
+
425
+ await selectRows(container, 1);
426
+ await openBulkMenu();
427
+
428
+ expect(menuItemLabels()).toEqual(
429
+ expect.arrayContaining(["Archive", "Export CSV", "Delete"]),
430
+ );
431
+ expect(findMenuItem("Delete")).not.toBeDisabled();
432
+ });
433
+
434
+ /* `isDeleteable={false}` is about the row's Actions column, nothing else. */
435
+ test("is offered even though the table has no per-row Delete button", async () => {
436
+ const { container } = renderTable();
437
+
438
+ await selectRows(container, 1);
439
+
440
+ const rowDeleteButton: HTMLButtonElement | undefined = Array.from(
441
+ container.querySelectorAll<HTMLButtonElement>("button"),
442
+ ).find((button: HTMLButtonElement) => {
443
+ return (button.textContent || "").trim() === "Delete";
444
+ });
445
+
446
+ expect(rowDeleteButton).toBeUndefined();
447
+
448
+ await openBulkMenu();
449
+
450
+ expect(findMenuItem("Delete")).toBeDefined();
451
+ });
452
+
453
+ /* One Delete, whoever supplied it - not the page's plus an injected one. */
454
+ test("is not duplicated when the page supplies its own Delete", async () => {
455
+ const { container } = renderTable({
456
+ bulkActionButtons: [
457
+ ARCHIVE_ACTION,
458
+ {
459
+ title: "Delete",
460
+ buttonStyleType: ButtonStyleType.DANGER,
461
+ onClick: async (): Promise<void> => {
462
+ return Promise.resolve();
463
+ },
464
+ },
465
+ ],
466
+ });
467
+
468
+ await selectRows(container, 1);
469
+ await openBulkMenu();
470
+
471
+ expect(
472
+ menuItemLabels().filter((label: string) => {
473
+ return label === "Delete";
474
+ }).length,
475
+ ).toBe(1);
476
+ });
477
+ });
478
+
479
+ describe("the confirmation", () => {
480
+ test("names the count and the model, and warns it cannot be undone", async () => {
481
+ await startBulkDelete();
482
+
483
+ await waitFor(() => {
484
+ expect(confirmationText()).not.toBe("");
485
+ });
486
+
487
+ expect(confirmationText()).toContain("delete 2 Network Devices");
488
+ expect(confirmationText()).toContain("cannot be undone");
489
+ });
490
+
491
+ test("uses the singular when one row is selected", async () => {
492
+ const { container } = renderTable();
493
+
494
+ await selectRows(container, 1);
495
+ await openBulkMenu();
496
+
497
+ fireEvent.click(findMenuItem("Delete")!);
498
+
499
+ await waitFor(() => {
500
+ expect(confirmationText()).not.toBe("");
501
+ });
502
+
503
+ expect(confirmationText()).toContain("delete 1 Network Device?");
504
+ });
505
+
506
+ /*
507
+ * A devices page knows what leaves with a device - its interfaces, links
508
+ * and auto-created monitor - and that Archive is the reversible option.
509
+ * The default sentence cannot know any of that.
510
+ */
511
+ test("carries the table's own warning when it sets one", async () => {
512
+ await startBulkDelete({
513
+ deleteConfirmationWarning: DEVICE_DELETE_WARNING,
514
+ });
515
+
516
+ await waitFor(() => {
517
+ expect(confirmationText()).not.toBe("");
518
+ });
519
+
520
+ expect(confirmationText()).toContain("cannot be undone");
521
+ expect(confirmationText()).toContain(DEVICE_DELETE_WARNING);
522
+ });
523
+
524
+ test("says nothing extra when the table sets no warning", async () => {
525
+ await startBulkDelete();
526
+
527
+ await waitFor(() => {
528
+ expect(confirmationText()).not.toBe("");
529
+ });
530
+
531
+ expect(confirmationText().trim()).toBe(
532
+ "Are you sure you want to delete 2 Network Devices? This action cannot be undone.",
533
+ );
534
+ });
535
+
536
+ test("deletes nothing until it is confirmed", async () => {
537
+ await startBulkDelete();
538
+
539
+ await waitFor(() => {
540
+ expect(confirmationText()).not.toBe("");
541
+ });
542
+
543
+ expect(deletedIds).toEqual([]);
544
+ });
545
+ });
546
+
547
+ describe("running the delete", () => {
548
+ test("deletes every selected row, and only those", async () => {
549
+ await startBulkDelete();
550
+ await confirmDelete();
551
+
552
+ await waitFor(() => {
553
+ expect(deletedIds.length).toBe(2);
554
+ });
555
+
556
+ expect(deletedIds.sort()).toEqual(["device-1", "device-2"]);
557
+ });
558
+
559
+ test("reloads the table once the results are dismissed", async () => {
560
+ await startBulkDelete();
561
+ await confirmDelete();
562
+
563
+ await waitFor(() => {
564
+ expect(deletedIds.length).toBe(2);
565
+ });
566
+
567
+ const callsBefore: number = getListCallCount;
568
+
569
+ await closeProgressModal();
570
+
571
+ await waitFor(() => {
572
+ expect(getListCallCount).toBeGreaterThan(callsBefore);
573
+ });
574
+ });
575
+
576
+ test("reports how many succeeded", async () => {
577
+ await startBulkDelete();
578
+ await confirmDelete();
579
+
580
+ await waitFor(() => {
581
+ expect(screen.queryByText(/succeeded/)).not.toBeNull();
582
+ });
583
+
584
+ expect(
585
+ screen.getByText("2 Network Devices succeeded"),
586
+ ).toBeInTheDocument();
587
+ });
588
+ });
589
+
590
+ describe("reporting failures", () => {
591
+ type FailingDeleteFunction = (
592
+ failingIds: Array<string>,
593
+ ) => (item: NetworkDevice) => Promise<void>;
594
+
595
+ const failFor: FailingDeleteFunction = (
596
+ failingIds: Array<string>,
597
+ ): ((item: NetworkDevice) => Promise<void>) => {
598
+ return (item: NetworkDevice): Promise<void> => {
599
+ if (failingIds.includes(String((item as unknown as Row)._id))) {
600
+ return Promise.reject(
601
+ new Error("Device is referenced by a monitor you cannot delete"),
602
+ );
603
+ }
604
+
605
+ return Promise.resolve();
606
+ };
607
+ };
608
+
609
+ test("names the failures and their reason alongside the successes", async () => {
610
+ await startBulkDelete({ deleteItem: failFor(["device-1"]) });
611
+ await confirmDelete();
612
+
613
+ await waitFor(() => {
614
+ expect(screen.queryByText(/failed/)).not.toBeNull();
615
+ });
616
+
617
+ expect(screen.getByText("1 Network Device failed")).toBeInTheDocument();
618
+ expect(
619
+ screen.getByText("1 Network Device succeeded"),
620
+ ).toBeInTheDocument();
621
+ expect(
622
+ screen.getByText("Device is referenced by a monitor you cannot delete"),
623
+ ).toBeInTheDocument();
624
+ });
625
+
626
+ /*
627
+ * A trailing failure used to reach the modal only by accident: the
628
+ * progress info handed React the live `failed` array, so a push after the
629
+ * last report mutated the snapshot already in state. The fix hands out
630
+ * copies, which is the honest thing to do and removes that accident - so
631
+ * this case now depends entirely on reporting from the catch, and is
632
+ * pinned here.
633
+ */
634
+ test("reports a failure on the last row of the run", async () => {
635
+ await startBulkDelete({ deleteItem: failFor(["device-2"]) });
636
+ await confirmDelete();
637
+
638
+ await waitFor(() => {
639
+ expect(screen.queryByText(/failed/)).not.toBeNull();
640
+ });
641
+
642
+ expect(screen.getByText("1 Network Device failed")).toBeInTheDocument();
643
+ });
644
+
645
+ /*
646
+ * The shape that was plainly broken: with nothing succeeding, the progress
647
+ * info was never reported at all, so the modal fell back on the snapshot
648
+ * taken before the run and finished completely blank - no successes, no
649
+ * failures, no explanation of why nothing had been deleted.
650
+ */
651
+ test("reports failures when every row fails", async () => {
652
+ await startBulkDelete({
653
+ deleteItem: failFor(["device-1", "device-2"]),
654
+ });
655
+ await confirmDelete();
656
+
657
+ await waitFor(() => {
658
+ expect(screen.queryByText(/failed/)).not.toBeNull();
659
+ });
660
+
661
+ expect(screen.getByText("2 Network Devices failed")).toBeInTheDocument();
662
+ expect(screen.queryByText(/succeeded/)).toBeNull();
663
+ });
664
+
665
+ test("keeps deleting the rest of the selection after one fails", async () => {
666
+ await startBulkDelete({ deleteItem: failFor(["device-1"]) });
667
+ await confirmDelete();
668
+
669
+ await waitFor(() => {
670
+ expect(deletedIds).toEqual(["device-2"]);
671
+ });
672
+ });
673
+ });
674
+
675
+ describe("permission", () => {
676
+ test("is locked, with a reason, for someone who may not delete", async () => {
677
+ permissionsForTest = [Permission.Viewer];
678
+
679
+ const { container } = renderTable();
680
+
681
+ await selectRows(container, 1);
682
+ await openBulkMenu();
683
+
684
+ const deleteItem: HTMLElement | undefined = findMenuItem("Delete");
685
+
686
+ expect(deleteItem).toBeDefined();
687
+ expect(deleteItem).toBeDisabled();
688
+
689
+ fireEvent.mouseEnter(deleteItem!.parentElement as HTMLElement);
690
+
691
+ expect(screen.getByRole("tooltip")).toHaveTextContent(
692
+ "You do not have permission to delete this Network Device.",
693
+ );
694
+ });
695
+
696
+ /*
697
+ * A master admin is allowed everything by the gate, but holds no project
698
+ * permission for the model-level check to find - so the menu offered them
699
+ * every action except the one they were most entitled to.
700
+ */
701
+ test("is offered to a master admin holding no project permissions", async () => {
702
+ isMasterAdminForTest = true;
703
+ permissionsForTest = [];
704
+
705
+ const { container } = renderTable();
706
+
707
+ await selectRows(container, 1);
708
+ await openBulkMenu();
709
+
710
+ expect(findMenuItem("Delete")).toBeDefined();
711
+ expect(findMenuItem("Delete")).not.toBeDisabled();
712
+ });
713
+
714
+ /*
715
+ * The row checkboxes exist only because the table has bulk actions at all,
716
+ * so a table with none must not grow a selection column just because
717
+ * somebody may delete. This is the reason the gate is not consulted on its
718
+ * own, and it holds for a master admin too.
719
+ */
720
+ test("is not injected into a table that offers no bulk actions", async () => {
721
+ isMasterAdminForTest = true;
722
+ permissionsForTest = [];
723
+
724
+ const { container } = renderTable({ bulkActionButtons: [] });
725
+
726
+ await waitFor(() => {
727
+ expect(screen.getByText("core-router-1")).toBeInTheDocument();
728
+ });
729
+
730
+ expect(container.querySelectorAll('input[type="checkbox"]').length).toBe(
731
+ 0,
732
+ );
733
+ });
734
+
735
+ test("a locked Delete does not open the confirmation", async () => {
736
+ permissionsForTest = [Permission.Viewer];
737
+
738
+ const { container } = renderTable();
739
+
740
+ await selectRows(container, 1);
741
+ await openBulkMenu();
742
+
743
+ fireEvent.click(findMenuItem("Delete")!);
744
+
745
+ expect(
746
+ document.querySelector('[data-testid="confirm-modal-description"]'),
747
+ ).toBeNull();
748
+ expect(deletedIds).toEqual([]);
749
+ });
750
+ });
751
+ });