@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.
- package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/AlertState.ts +0 -2
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/Domain.ts +1 -1
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/Incident.ts +1 -1
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/MetricType.ts +0 -2
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
- package/Models/DatabaseModels/MonitorTest.ts +0 -2
- package/Models/DatabaseModels/NetworkDevice.ts +234 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
- package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
- package/Models/DatabaseModels/StatusPageResource.ts +0 -2
- package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +112 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DatabaseService.ts +39 -9
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceRoleService.ts +90 -0
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProjectService.ts +85 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserNotificationSettingService.ts +0 -6
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
- package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
- package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/BasicCron.test.ts +283 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
- package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
- package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
- package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
- package/Tests/Utils/Slug.test.ts +61 -1
- package/Tests/jest.setup.ts +19 -0
- package/Types/Date.ts +39 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
- package/Types/Permission.ts +141 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
- package/UI/Components/Navbar/NavBar.tsx +62 -13
- package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
- package/UI/Components/SideMenu/SideMenu.tsx +12 -2
- package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
- package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
- package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
- package/Utils/Slug.ts +34 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
- package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
- package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +83 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +31 -5
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
- package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +65 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
- package/build/dist/Types/Permission.js +126 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
- package/build/dist/Utils/Slug.js +31 -1
- package/build/dist/Utils/Slug.js.map +1 -1
- package/jest.config.json +1 -0
- 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
|
+
});
|