@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
@@ -32,6 +32,7 @@ import {
32
32
  BulkActionOnClickProps,
33
33
  } from "../BulkUpdate/BulkUpdateForm";
34
34
  import Button, { ButtonSize, ButtonStyleType } from "../Button/Button";
35
+ import CopyTextButton from "../CopyTextButton/CopyTextButton";
35
36
  import MoreMenu from "../MoreMenu/MoreMenu";
36
37
  import MoreMenuItem from "../MoreMenu/MoreMenuItem";
37
38
  import Card, {
@@ -200,6 +201,13 @@ export enum ModalTableBulkDefaultActions {
200
201
  export interface BulkActionProps<T extends BaseModel | AnalyticsBaseModel> {
201
202
  buttons: Array<BulkActionButtonSchema<T> | ModalTableBulkDefaultActions>;
202
203
  matchBulkSelectedItemByField?: keyof T | undefined; // which field to use to match selected items. For exmaple this could be '_id'
204
+ /**
205
+ * Appended to the bulk Delete confirmation, for a surface where deleting the
206
+ * selected rows also removes records the user did not select, or where a
207
+ * reversible alternative exists. The default sentence only says the deletion
208
+ * cannot be undone - it cannot know what else goes with it.
209
+ */
210
+ deleteConfirmationWarning?: string | undefined;
203
211
  }
204
212
 
205
213
  export interface BaseTableProps<
@@ -418,6 +426,72 @@ export enum ModalType {
418
426
  Edit,
419
427
  }
420
428
 
429
+ /*
430
+ * The fields a row is worth naming itself by, in the order a human would pick
431
+ * one. `title` is not decoration here: incidents, alerts and scheduled
432
+ * maintenance key on `title` rather than `name`, and those are exactly the
433
+ * tables where deleting the row next to the one you meant hurts most.
434
+ *
435
+ * Only the fields the table already selected are present on the row, so this
436
+ * reads whatever is there and gives up quietly rather than guessing.
437
+ */
438
+ const ITEM_LABEL_FIELDS: Array<string> = [
439
+ "name",
440
+ "title",
441
+ "slug",
442
+ "email",
443
+ "username",
444
+ "domain",
445
+ ];
446
+
447
+ type ReadLabelFieldFunction = (value: unknown) => string;
448
+
449
+ /*
450
+ * Some of these fields arrive as objects with a meaningful toString - Name,
451
+ * Email, ObjectID all define one. Anything that does not is skipped rather
452
+ * than rendered as "[object Object]".
453
+ */
454
+ const readLabelField: ReadLabelFieldFunction = (value: unknown): string => {
455
+ if (typeof value === "string") {
456
+ return value.trim();
457
+ }
458
+
459
+ if (value === null || value === undefined) {
460
+ return "";
461
+ }
462
+
463
+ const text: string = String(value);
464
+
465
+ return text === "[object Object]" ? "" : text.trim();
466
+ };
467
+
468
+ type GetItemLabelFunction = (item: unknown) => string;
469
+
470
+ /*
471
+ * Every per-row Delete in the product opened the same dialog: "Are you sure
472
+ * you want to delete this monitor?" - a sentence equally true of the row that
473
+ * was clicked and of the twenty either side of it. That is precisely the
474
+ * moment a user wants to be told which one, and the one moment the dialog
475
+ * would not say.
476
+ */
477
+ const getItemLabel: GetItemLabelFunction = (item: unknown): string => {
478
+ if (!item || typeof item !== "object") {
479
+ return "";
480
+ }
481
+
482
+ const record: Record<string, unknown> = item as Record<string, unknown>;
483
+
484
+ for (const field of ITEM_LABEL_FIELDS) {
485
+ const label: string = readLabelField(record[field]);
486
+
487
+ if (label) {
488
+ return label;
489
+ }
490
+ }
491
+
492
+ return "";
493
+ };
494
+
421
495
  const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
422
496
  props: ComponentProps<TBaseModel>,
423
497
  ) => ReactElement = <TBaseModel extends BaseModel | AnalyticsBaseModel>(
@@ -2856,7 +2930,12 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2856
2930
  items.length === 1
2857
2931
  ? props.singularName || model.singularName || "item"
2858
2932
  : props.pluralName || model.pluralName || "items";
2859
- return `Are you sure you want to delete ${items.length} ${itemLabel}? This action cannot be undone.`;
2933
+
2934
+ const warning: string = props.bulkActions?.deleteConfirmationWarning
2935
+ ? ` ${props.bulkActions.deleteConfirmationWarning}`
2936
+ : "";
2937
+
2938
+ return `Are you sure you want to delete ${items.length} ${itemLabel}? This action cannot be undone.${warning}`;
2860
2939
  },
2861
2940
  confirmTitle: (items: Array<TBaseModel>) => {
2862
2941
  const itemLabel: string =
@@ -2879,26 +2958,41 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2879
2958
  const failedItems: Array<BulkActionFailed<TBaseModel>> = [];
2880
2959
 
2881
2960
  for (let i: number = 0; i < items.length; i++) {
2882
- try {
2883
- const item: TBaseModel = items[i]!;
2884
- // remove items from inProgressItems
2885
- inProgressItems.splice(inProgressItems.indexOf(item), 1);
2961
+ const item: TBaseModel = items[i]!;
2962
+
2963
+ // remove items from inProgressItems
2964
+ inProgressItems.splice(inProgressItems.indexOf(item), 1);
2886
2965
 
2966
+ try {
2887
2967
  await props.callbacks.deleteItem(item);
2888
2968
  successItems.push(item);
2889
-
2890
- onProgressInfo({
2891
- inProgressItems: inProgressItems,
2892
- successItems: successItems,
2893
- failed: failedItems,
2894
- totalItems: items,
2895
- });
2896
2969
  } catch (err) {
2897
2970
  failedItems.push({
2898
- item: items[i]!,
2971
+ item: item,
2899
2972
  failedMessage: API.getFriendlyMessage(err),
2900
2973
  });
2901
2974
  }
2975
+
2976
+ /*
2977
+ * Reported after a failure as well as after a success. This used to
2978
+ * sit inside the `try`, so a row that failed moved neither the
2979
+ * progress bar nor the failure list until some later row succeeded
2980
+ * - and a run whose trailing rows all failed (or one where every
2981
+ * row failed, which is what a permission or constraint problem
2982
+ * looks like) ended with the modal still showing the counts from
2983
+ * before them. Deleting hundreds of rows at once is exactly where
2984
+ * partial failure is expected, so it has to be visible.
2985
+ *
2986
+ * Copies, not the live arrays: the progress info goes into React
2987
+ * state, and pushing into the same array reference leaves the
2988
+ * previous render's snapshot mutated underneath it.
2989
+ */
2990
+ onProgressInfo({
2991
+ inProgressItems: [...inProgressItems],
2992
+ successItems: [...successItems],
2993
+ failed: [...failedItems],
2994
+ totalItems: items,
2995
+ });
2902
2996
  }
2903
2997
 
2904
2998
  onBulkActionEnd();
@@ -2921,6 +3015,54 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2921
3015
  return isSearchActive() ? false : isLoading;
2922
3016
  };
2923
3017
 
3018
+ type HasFilterAppliedFunction = (
3019
+ dataToCheck: FilterData<TBaseModel>,
3020
+ ) => boolean;
3021
+
3022
+ /*
3023
+ * Lifted out of the onFilterChanged callback below, which is where this test
3024
+ * used to live inline. Two definitions of "a filter is applied" in one
3025
+ * component is exactly the kind of thing that drifts apart.
3026
+ */
3027
+ const hasFilterApplied: HasFilterAppliedFunction = (
3028
+ dataToCheck: FilterData<TBaseModel>,
3029
+ ): boolean => {
3030
+ for (const key in dataToCheck) {
3031
+ if (dataToCheck[key]) {
3032
+ return true;
3033
+ }
3034
+ }
3035
+
3036
+ return false;
3037
+ };
3038
+
3039
+ type GetNoItemsMessageFunction = () => string | ReactElement;
3040
+
3041
+ /*
3042
+ * An empty table has two quite different causes and used to have one
3043
+ * sentence for both. A monitors table with nothing in it said "No monitor"
3044
+ * - ungrammatical, and worse, it said the same thing after a search that
3045
+ * matched nothing, so a typo in the search box looked exactly like an empty
3046
+ * project. A caller's own noItemsMessage is deliberately overridden while a
3047
+ * search or filter is active: those are usually "create your first X"
3048
+ * panels, and offering one to someone whose search just missed is wrong.
3049
+ */
3050
+ const getNoItemsMessage: GetNoItemsMessageFunction = ():
3051
+ | string
3052
+ | ReactElement => {
3053
+ const plural: string = (
3054
+ props.pluralName ||
3055
+ model.pluralName ||
3056
+ "items"
3057
+ ).toLocaleLowerCase();
3058
+
3059
+ if (isSearchActive() || hasFilterApplied(filterData)) {
3060
+ return `${tx("No")} ${plural} ${tx("match your search or filters.")}`;
3061
+ }
3062
+
3063
+ return props.noItemsMessage || `${tx("No")} ${plural} ${tx("yet.")}`;
3064
+ };
3065
+
2924
3066
  const getTable: GetReactElementFunction = (): ReactElement => {
2925
3067
  return (
2926
3068
  <Table
@@ -2929,17 +3071,8 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2929
3071
  setTableView(null);
2930
3072
 
2931
3073
  // check if there's anything in the filter data and update the isFilterApplied prop.
2932
- let isFilterApplied: boolean = false;
2933
-
2934
- for (const key in filterData) {
2935
- if (filterData[key]) {
2936
- isFilterApplied = true;
2937
- break;
2938
- }
2939
- }
2940
-
2941
3074
  if (props.onFilterApplied) {
2942
- props.onFilterApplied(isFilterApplied);
3075
+ props.onFilterApplied(hasFilterApplied(filterData));
2943
3076
  }
2944
3077
  }}
2945
3078
  filterData={filterData}
@@ -3010,9 +3143,17 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
3010
3143
  },
3011
3144
  );
3012
3145
 
3146
+ /*
3147
+ * On a table that already offers bulk actions the gate decides on
3148
+ * its own, because there is no selection column left to grow: the
3149
+ * row checkboxes are already there. That covers the locked case, and
3150
+ * it also covers a master admin - allowed everything by the gate, but
3151
+ * holding no project permission for `userCanDelete` to find, so the
3152
+ * Delete they are entitled to used to be missing from a menu whose
3153
+ * every other action worked (issue #3559).
3154
+ */
3013
3155
  const canAutoInjectDelete: boolean =
3014
- userCanDelete ||
3015
- (bulkDeleteGate.disabled && sourceButtons.length > 0);
3156
+ userCanDelete || (bulkDeleteGate.show && sourceButtons.length > 0);
3016
3157
 
3017
3158
  if (canAutoInjectDelete && !alreadyHasDeleteAction) {
3018
3159
  sourceButtons.push(ModalTableBulkDefaultActions.Delete);
@@ -3127,9 +3268,8 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
3127
3268
  matchBulkSelectedItemByField={matchBulkSelectedItemByField || "_id"}
3128
3269
  bulkItemToString={(item: TBaseModel) => {
3129
3270
  const label: string = props.singularName || item.singularName || "";
3130
- const name: string =
3131
- (item as unknown as Record<string, unknown>)["name"]?.toString() ||
3132
- "";
3271
+ // Same deriver the delete confirmation uses, so the two cannot drift.
3272
+ const name: string = getItemLabel(item);
3133
3273
  if (name) {
3134
3274
  return label ? `${label}: ${name}` : name;
3135
3275
  }
@@ -3200,7 +3340,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
3200
3340
 
3201
3341
  setItemsOnPage(newItemsOnPage);
3202
3342
  }}
3203
- noItemsMessage={props.noItemsMessage || ""}
3343
+ noItemsMessage={getNoItemsMessage()}
3204
3344
  onRefreshClick={async () => {
3205
3345
  await fetchItems();
3206
3346
  }}
@@ -3256,7 +3396,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
3256
3396
  shouldAddItemInTheEnd={
3257
3397
  props.orderedStatesListProps.shouldAddItemInTheEnd
3258
3398
  }
3259
- noItemsMessage={props.noItemsMessage || ""}
3399
+ noItemsMessage={getNoItemsMessage()}
3260
3400
  onRefreshClick={async () => {
3261
3401
  await fetchItems();
3262
3402
  }}
@@ -3343,7 +3483,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
3343
3483
 
3344
3484
  setItemsOnPage(newItemsOnPage);
3345
3485
  }}
3346
- noItemsMessage={props.noItemsMessage || ""}
3486
+ noItemsMessage={getNoItemsMessage()}
3347
3487
  onRefreshClick={async () => {
3348
3488
  await fetchItems();
3349
3489
  }}
@@ -4498,11 +4638,18 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
4498
4638
  {showDeleteConfirmModal && (
4499
4639
  <ConfirmModal
4500
4640
  title={`Delete ${props.singularName || model.singularName}`}
4501
- description={`Are you sure you want to delete this ${(
4502
- props.singularName ||
4503
- model.singularName ||
4504
- "item"
4505
- )?.toLowerCase()}?`}
4641
+ description={((): string => {
4642
+ const label: string = (
4643
+ props.singularName ||
4644
+ model.singularName ||
4645
+ "item"
4646
+ ).toLowerCase();
4647
+ const name: string = getItemLabel(currentDeleteableItem);
4648
+
4649
+ return `Are you sure you want to delete ${
4650
+ name ? `"${name}"` : `this ${label}`
4651
+ }? This action cannot be undone.`;
4652
+ })()}
4506
4653
  onClose={() => {
4507
4654
  setShowDeleteConfirmModal(false);
4508
4655
  }}
@@ -4535,10 +4682,24 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
4535
4682
  description={
4536
4683
  <div>
4537
4684
  <span>
4538
- ID of this {props.singularName || model.singularName || ""}:{" "}
4539
- {viewId}
4685
+ ID of this {props.singularName || model.singularName || ""}:
4540
4686
  </span>
4541
- <br />
4687
+ {/*
4688
+ * Handing over the id is the entire point of this dialog, and it
4689
+ * used to be inline prose the user had to select by hand - an
4690
+ * awkward drag over a 36-character UUID, and easy to clip a
4691
+ * character. It gets its own row and a copy button now.
4692
+ */}
4693
+ <div className="mt-2 flex items-center gap-2 rounded-md border border-gray-200 bg-gray-50 px-3 py-2">
4694
+ <code className="flex-1 break-all font-mono text-xs text-gray-800">
4695
+ {viewId}
4696
+ </code>
4697
+ <CopyTextButton
4698
+ textToBeCopied={viewId || ""}
4699
+ size="sm"
4700
+ title="Copy ID to clipboard"
4701
+ />
4702
+ </div>
4542
4703
  <br />
4543
4704
 
4544
4705
  <span>
@@ -66,11 +66,11 @@ export interface ComponentProps {
66
66
  link: URL;
67
67
  };
68
68
  /*
69
- * When true, the document-level Cmd/Ctrl+K shortcut that toggles the
70
- * products menu is not registered — for apps where another surface (e.g. a
71
- * command palette) owns that shortcut. The menu itself stays fully usable
72
- * via its trigger button. Defaults to false: existing consumers keep the
73
- * shortcut.
69
+ * When true, Cmd/Ctrl+K never opens or toggles the products menu — for apps
70
+ * where another surface (e.g. a command palette) owns that shortcut. The
71
+ * menu itself stays usable via its trigger button; if it is already open,
72
+ * the owner's chord dismisses it without consuming the event. Defaults to
73
+ * false so existing consumers keep the products shortcut.
74
74
  */
75
75
  disableCommandKShortcut?: boolean | undefined;
76
76
  className?: string;
@@ -85,6 +85,22 @@ export interface ComponentProps {
85
85
  const MOBILE_MENU_BOTTOM_GAP_IN_PX: number = 16;
86
86
  const MOBILE_MENU_MIN_HEIGHT_IN_PX: number = 160;
87
87
 
88
+ /*
89
+ * Keep the products-menu shortcut and the dashboard command palette on the
90
+ * same definition of Cmd/Ctrl+K. In particular, modified chords such as
91
+ * Cmd+Shift+K must be left alone for the browser or another feature.
92
+ */
93
+ const isCommandKShortcut: (event: KeyboardEvent) => boolean = (
94
+ event: KeyboardEvent,
95
+ ): boolean => {
96
+ return (
97
+ (event.metaKey || event.ctrlKey) &&
98
+ !event.shiftKey &&
99
+ !event.altKey &&
100
+ event.key.toLowerCase() === "k"
101
+ );
102
+ };
103
+
88
104
  const Navbar: FunctionComponent<ComponentProps> = (
89
105
  props: ComponentProps,
90
106
  ): ReactElement => {
@@ -96,6 +112,9 @@ const Navbar: FunctionComponent<ComponentProps> = (
96
112
  const [mobileMenuMaxHeight, setMobileMenuMaxHeight] = useState<
97
113
  number | undefined
98
114
  >(undefined);
115
+ const hasMoreMenu: boolean = Boolean(
116
+ !props.children && props.moreMenuItems && props.moreMenuItems.length > 0,
117
+ );
99
118
 
100
119
  // Use the existing outside click hook for mobile menu
101
120
  const {
@@ -173,27 +192,56 @@ const Navbar: FunctionComponent<ComponentProps> = (
173
192
 
174
193
  // Open/close the products menu with Cmd/Ctrl + K from anywhere.
175
194
  useEffect(() => {
176
- if (props.disableCommandKShortcut) {
177
- // Another surface (e.g. a command palette) owns Cmd/Ctrl+K.
195
+ if (props.disableCommandKShortcut || !hasMoreMenu) {
196
+ // Another surface owns Cmd/Ctrl+K, or there is no products menu to open.
178
197
  return;
179
198
  }
180
199
 
181
200
  const handleGlobalKeyDown: (event: KeyboardEvent) => void = (
182
201
  event: KeyboardEvent,
183
202
  ): void => {
184
- if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") {
185
- event.preventDefault();
186
- setIsMoreMenuVisible((visible: boolean) => {
187
- return !visible;
188
- });
203
+ if (!isCommandKShortcut(event) || event.defaultPrevented) {
204
+ return;
189
205
  }
206
+
207
+ event.preventDefault();
208
+ setIsMoreMenuVisible((visible: boolean) => {
209
+ return !visible;
210
+ });
190
211
  };
191
212
 
192
213
  document.addEventListener("keydown", handleGlobalKeyDown);
193
214
  return () => {
194
215
  document.removeEventListener("keydown", handleGlobalKeyDown);
195
216
  };
196
- }, [props.disableCommandKShortcut]);
217
+ }, [hasMoreMenu, props.disableCommandKShortcut]);
218
+
219
+ /*
220
+ * When the dashboard has surrendered Cmd/Ctrl+K to its command palette, an
221
+ * already-open products modal must get out of the way before the palette
222
+ * opens. This close-only listener deliberately does not prevent or stop the
223
+ * event: the real shortcut owner still needs to receive the same keydown.
224
+ * It also ignores defaultPrevented so the result is deterministic regardless
225
+ * of which document listener React registered first.
226
+ */
227
+ useEffect(() => {
228
+ if (!props.disableCommandKShortcut || !hasMoreMenu || !isMoreMenuVisible) {
229
+ return;
230
+ }
231
+
232
+ const closeProductsOnCommandK: (event: KeyboardEvent) => void = (
233
+ event: KeyboardEvent,
234
+ ): void => {
235
+ if (isCommandKShortcut(event)) {
236
+ setIsMoreMenuVisible(false);
237
+ }
238
+ };
239
+
240
+ document.addEventListener("keydown", closeProductsOnCommandK);
241
+ return () => {
242
+ document.removeEventListener("keydown", closeProductsOnCommandK);
243
+ };
244
+ }, [hasMoreMenu, isMoreMenuVisible, props.disableCommandKShortcut]);
197
245
 
198
246
  // More menu open/close.
199
247
  const openMoreMenu: () => void = (): void => {
@@ -488,6 +536,7 @@ const Navbar: FunctionComponent<ComponentProps> = (
488
536
  footer={props.moreMenuFooter}
489
537
  searchPlaceholder={props.moreMenuSearchPlaceholder}
490
538
  noResultsText={props.moreMenuNoResultsText}
539
+ showCommandKShortcutHint={!props.disableCommandKShortcut}
491
540
  keyboardHint={props.moreMenuKeyboardHint}
492
541
  recentLabel={props.moreMenuRecentLabel}
493
542
  onClose={closeMoreMenu}
@@ -129,6 +129,11 @@ export interface ComponentProps {
129
129
  | undefined;
130
130
  searchPlaceholder?: string | undefined;
131
131
  noResultsText?: string | undefined;
132
+ /*
133
+ * Defaults to visible for direct/legacy consumers. Dashboard hides it when
134
+ * its command palette owns Cmd/Ctrl+K instead of this products menu.
135
+ */
136
+ showCommandKShortcutHint?: boolean | undefined;
132
137
  keyboardHint?: string | undefined;
133
138
  recentLabel?: string | undefined;
134
139
  onClose: () => void;
@@ -502,14 +507,14 @@ const NavBarMenuModal: FunctionComponent<ComponentProps> = (
502
507
  >
503
508
  <Icon icon={IconProp.Close} className="h-4 w-4" />
504
509
  </button>
505
- ) : (
510
+ ) : props.showCommandKShortcutHint !== false ? (
506
511
  /* OS-appropriate hint: ⌘ K on a Mac, Ctrl K elsewhere. */
507
512
  <KeyboardShortcut
508
513
  keys={[KeyboardKey.Mod, "K"]}
509
514
  size={KeyboardShortcutSize.Small}
510
515
  className="hidden sm:inline-flex"
511
516
  />
512
- )}
517
+ ) : null}
513
518
  </div>
514
519
 
515
520
  {/* Body */}
@@ -21,6 +21,7 @@ export const REFRESH_SIDEBAR_COUNT_EVENT: string = "REFRESH_SIDEBAR_COUNTS";
21
21
 
22
22
  export interface ComponentProps<TBaseModel extends BaseModel> {
23
23
  link: Link;
24
+ activeRoute?: Link["to"] | undefined;
24
25
  modelType?: { new (): TBaseModel } | undefined;
25
26
  badgeType?: BadgeType | undefined;
26
27
  countQuery?: Query<TBaseModel> | undefined;
@@ -136,6 +137,7 @@ const CountModelSideMenuItem: <TBaseModel extends BaseModel>(
136
137
  return (
137
138
  <SideMenuItem
138
139
  link={props.link}
140
+ activeRoute={props.activeRoute}
139
141
  badge={!isLoading && !error ? count : undefined}
140
142
  badgeType={props.badgeType}
141
143
  icon={props.icon}
@@ -20,6 +20,8 @@ import { RequestOptions } from "../../Utils/ModelAPI/ModelAPI";
20
20
 
21
21
  export interface SideMenuItemProps {
22
22
  link: Link;
23
+ // Use a different route for selection when the link target also changes query state.
24
+ activeRoute?: Link["to"] | undefined;
23
25
  showAlert?: boolean;
24
26
  showWarning?: boolean;
25
27
  badge?: number;
@@ -106,7 +108,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
106
108
  if (props.sections) {
107
109
  for (const section of props.sections) {
108
110
  for (const item of section.items) {
109
- if (Navigation.isOnThisPage(item.link.to)) {
111
+ if (Navigation.isOnThisPage(item.activeRoute || item.link.to)) {
110
112
  const result: {
111
113
  sectionTitle: string;
112
114
  itemTitle: string;
@@ -127,7 +129,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
127
129
  // Check direct items
128
130
  if (props.items) {
129
131
  for (const item of props.items) {
130
- if (Navigation.isOnThisPage(item.link.to)) {
132
+ if (Navigation.isOnThisPage(item.activeRoute || item.link.to)) {
131
133
  const result: {
132
134
  itemTitle: string;
133
135
  icon?: IconProp;
@@ -184,9 +186,13 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
184
186
  icon?: IconProp;
185
187
  defaultCollapsed?: boolean;
186
188
  collapsible?: boolean;
189
+ isActive: boolean;
187
190
  } = {
188
191
  key: `section-${sectionIndex}`,
189
192
  title: section.title,
193
+ isActive: section.items.some((item: SideMenuItemProps): boolean => {
194
+ return Navigation.isOnThisPage(item.activeRoute || item.link.to);
195
+ }),
190
196
  };
191
197
 
192
198
  if (section.icon) {
@@ -209,6 +215,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
209
215
  <CountModelSideMenuItem
210
216
  key={`section-${sectionIndex}-count-item-${itemIndex}`}
211
217
  link={item.link}
218
+ activeRoute={item.activeRoute}
212
219
  badgeType={item.badgeType}
213
220
  modelType={item.modelType as any}
214
221
  countQuery={item.countQuery as any}
@@ -225,6 +232,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
225
232
  <SideMenuItem
226
233
  key={`section-${sectionIndex}-item-${itemIndex}`}
227
234
  link={item.link}
235
+ activeRoute={item.activeRoute}
228
236
  showAlert={item.showAlert}
229
237
  showWarning={item.showWarning}
230
238
  badge={item.badge}
@@ -252,6 +260,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
252
260
  <CountModelSideMenuItem
253
261
  key={`count-item-${itemIndex}`}
254
262
  link={item.link}
263
+ activeRoute={item.activeRoute}
255
264
  badgeType={item.badgeType}
256
265
  modelType={item.modelType as any}
257
266
  countQuery={item.countQuery as any}
@@ -267,6 +276,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
267
276
  <SideMenuItem
268
277
  key={`item-${itemIndex}`}
269
278
  link={item.link}
279
+ activeRoute={item.activeRoute}
270
280
  showAlert={item.showAlert}
271
281
  showWarning={item.showWarning}
272
282
  badge={item.badge}
@@ -9,6 +9,7 @@ import React, { FunctionComponent } from "react";
9
9
 
10
10
  export interface ComponentProps {
11
11
  link: Link;
12
+ activeRoute?: Link["to"] | undefined;
12
13
  showAlert?: undefined | boolean;
13
14
  showWarning?: undefined | boolean;
14
15
  badge?: undefined | number;
@@ -23,7 +24,9 @@ const SideMenuItem: FunctionComponent<ComponentProps> = (
23
24
  props: ComponentProps,
24
25
  ) => {
25
26
  const { translateString } = useTranslateValue();
26
- const isActive: boolean = Navigation.isOnThisPage(props.link.to);
27
+ const isActive: boolean = Navigation.isOnThisPage(
28
+ props.activeRoute || props.link.to,
29
+ );
27
30
  const isSubItemActive: boolean = props.subItemLink
28
31
  ? Navigation.isOnThisPage(props.subItemLink.to)
29
32
  : false;
@@ -1,7 +1,12 @@
1
1
  import Icon from "../Icon/Icon";
2
2
  import useTranslateValue from "../../Utils/Translation";
3
3
  import IconProp from "../../../Types/Icon/IconProp";
4
- import React, { FunctionComponent, ReactElement, useState } from "react";
4
+ import React, {
5
+ FunctionComponent,
6
+ ReactElement,
7
+ useEffect,
8
+ useState,
9
+ } from "react";
5
10
 
6
11
  export interface ComponentProps {
7
12
  title: string;
@@ -9,6 +14,7 @@ export interface ComponentProps {
9
14
  defaultCollapsed?: boolean;
10
15
  collapsible?: boolean;
11
16
  icon?: IconProp;
17
+ isActive?: boolean;
12
18
  }
13
19
 
14
20
  const SideMenuSection: FunctionComponent<ComponentProps> = (
@@ -16,12 +22,18 @@ const SideMenuSection: FunctionComponent<ComponentProps> = (
16
22
  ) => {
17
23
  const { translateString } = useTranslateValue();
18
24
  const [isCollapsed, setIsCollapsed] = useState<boolean>(
19
- props.defaultCollapsed || false,
25
+ Boolean(props.defaultCollapsed && !props.isActive),
20
26
  );
21
27
  const translatedTitle: string = translateString(props.title) || props.title;
22
28
 
23
29
  const isCollapsible: boolean = props.collapsible ?? true;
24
30
 
31
+ useEffect(() => {
32
+ if (props.isActive) {
33
+ setIsCollapsed(false);
34
+ }
35
+ }, [props.isActive]);
36
+
25
37
  const handleToggle: () => void = (): void => {
26
38
  if (isCollapsible) {
27
39
  setIsCollapsed(!isCollapsed);