@oneuptime/common 12.0.32 → 12.0.33
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/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// Components
|
|
2
|
+
import SideMenuSection from "../../../UI/Components/SideMenu/SideMenuSection";
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
4
|
+
import "@testing-library/jest-dom";
|
|
5
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
6
|
+
import React, { ReactElement } from "react";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The collapsible group every product side menu is built out of.
|
|
10
|
+
*
|
|
11
|
+
* Almost nothing here is about how the section looks. It is about the shape of
|
|
12
|
+
* the DOM it produces, because Common/Tests/App/Dashboard/SideMenuHarness.tsx
|
|
13
|
+
* walks exactly this shape -- h6 title, `div.mb-2` root, first <button> as the
|
|
14
|
+
* toggle, the toggle's immediate next sibling as the body -- and five product
|
|
15
|
+
* menu suites (alerts, incidents, scheduled maintenance and friends) read their
|
|
16
|
+
* menus through it. Break one of those four lookups and the harness does not
|
|
17
|
+
* throw: `linksIn()` quietly returns an empty list, so those five suites start
|
|
18
|
+
* asserting things about a menu they can no longer see, and the failure surfaces
|
|
19
|
+
* as five unrelated red suites with no hint that a section restyle caused it.
|
|
20
|
+
*
|
|
21
|
+
* Pinning the contract here means a restyle fails in one obvious place instead.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const SECTION_TITLE: string = "Monitors";
|
|
25
|
+
|
|
26
|
+
type MenuRowsFunction = () => Array<ReactElement>;
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Plain anchors rather than SideMenuItem: what is under test is the section's
|
|
30
|
+
* own wrapper, and a real menu row would drag Navigation into a suite that has
|
|
31
|
+
* no opinion about routing.
|
|
32
|
+
*/
|
|
33
|
+
const menuRows: MenuRowsFunction = (): Array<ReactElement> => {
|
|
34
|
+
return [
|
|
35
|
+
<a key="uptime" href="/uptime">
|
|
36
|
+
Uptime
|
|
37
|
+
</a>,
|
|
38
|
+
<a key="logs" href="/logs">
|
|
39
|
+
Logs
|
|
40
|
+
</a>,
|
|
41
|
+
];
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
type SectionHeadingFunction = () => HTMLElement;
|
|
45
|
+
|
|
46
|
+
const sectionHeading: SectionHeadingFunction = (): HTMLElement => {
|
|
47
|
+
const heading: HTMLHeadingElement | null = document.querySelector("h6");
|
|
48
|
+
|
|
49
|
+
if (!heading) {
|
|
50
|
+
throw new Error("The section rendered no <h6> title.");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return heading;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
type SectionRootFunction = () => HTMLElement;
|
|
57
|
+
|
|
58
|
+
const sectionRoot: SectionRootFunction = (): HTMLElement => {
|
|
59
|
+
const root: HTMLElement | null = sectionHeading().closest("div.mb-2");
|
|
60
|
+
|
|
61
|
+
if (!root) {
|
|
62
|
+
throw new Error('The section title is not inside a "div.mb-2" root.');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return root;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
type SectionToggleFunction = () => HTMLButtonElement;
|
|
69
|
+
|
|
70
|
+
const sectionToggle: SectionToggleFunction = (): HTMLButtonElement => {
|
|
71
|
+
const toggle: HTMLButtonElement | null =
|
|
72
|
+
sectionRoot().querySelector("button");
|
|
73
|
+
|
|
74
|
+
if (!toggle) {
|
|
75
|
+
throw new Error("The section has no collapse toggle.");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return toggle;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
type SectionBodyFunction = () => HTMLElement;
|
|
82
|
+
|
|
83
|
+
const sectionBody: SectionBodyFunction = (): HTMLElement => {
|
|
84
|
+
const body: Element | null = sectionToggle().nextElementSibling;
|
|
85
|
+
|
|
86
|
+
if (!body) {
|
|
87
|
+
throw new Error("The section toggle has no sibling body element.");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return body as HTMLElement;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
describe("SideMenuSection", () => {
|
|
94
|
+
describe("the DOM contract SideMenuHarness reads", () => {
|
|
95
|
+
/*
|
|
96
|
+
* `sectionTitlesInOrder()` in the harness is `querySelectorAll("h6")`. Move
|
|
97
|
+
* the title to an <h5> or a <div> and every product menu suite reports zero
|
|
98
|
+
* sections rather than a wrong one.
|
|
99
|
+
*/
|
|
100
|
+
test("the title renders in an <h6>", () => {
|
|
101
|
+
render(
|
|
102
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
expect(document.querySelectorAll("h6")).toHaveLength(1);
|
|
106
|
+
expect(sectionHeading().textContent?.trim()).toBe(SECTION_TITLE);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
* The harness climbs from the heading to the section with
|
|
111
|
+
* `closest("div.mb-2")`. It has to land on the section's own outermost
|
|
112
|
+
* element -- if `mb-2` moved to some inner wrapper, `linksIn()` would search
|
|
113
|
+
* a subtree that no longer holds the rows.
|
|
114
|
+
*/
|
|
115
|
+
test("the section root is the element carrying mb-2", () => {
|
|
116
|
+
const { container } = render(
|
|
117
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
expect(sectionRoot()).toHaveClass("mb-2");
|
|
121
|
+
expect(container.firstElementChild).toBe(sectionRoot());
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
/*
|
|
125
|
+
* `sectionToggle()` takes the FIRST button in the section, so the header has
|
|
126
|
+
* to be the only one. A second button in the header (a "collapse all", an
|
|
127
|
+
* overflow menu) would silently hand the harness the wrong element.
|
|
128
|
+
*/
|
|
129
|
+
test("the only button in the section is the collapse toggle, and it wraps the title", () => {
|
|
130
|
+
render(
|
|
131
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(sectionRoot().querySelectorAll("button")).toHaveLength(1);
|
|
135
|
+
expect(sectionToggle()).toContainElement(sectionHeading());
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* `isExpanded()` reads aria-expanded off that button -- which is also the
|
|
140
|
+
* only thing telling a screen reader whether the group is open.
|
|
141
|
+
*/
|
|
142
|
+
test("the toggle carries aria-expanded", () => {
|
|
143
|
+
render(
|
|
144
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "true");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* `sectionBody()` is `toggle.nextElementSibling` -- IMMEDIATE, not a
|
|
152
|
+
* descendant search. Wrapping the animated body in one more div would make
|
|
153
|
+
* the harness read the wrapper's classes and conclude every section is
|
|
154
|
+
* expanded.
|
|
155
|
+
*/
|
|
156
|
+
test("the collapsible body is the toggle's immediate next sibling and holds the rows", () => {
|
|
157
|
+
render(
|
|
158
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
const body: HTMLElement = sectionBody();
|
|
162
|
+
|
|
163
|
+
expect(body).toContainElement(screen.getByText("Uptime"));
|
|
164
|
+
expect(body).toContainElement(screen.getByText("Logs"));
|
|
165
|
+
expect(body).toHaveClass("overflow-hidden");
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe("collapse state", () => {
|
|
170
|
+
/*
|
|
171
|
+
* The class pair the harness (and the user's eye) reads collapse state
|
|
172
|
+
* from. There is no `hidden` attribute and no unmount to check instead, so
|
|
173
|
+
* if these two classes stop appearing together nothing else reports it.
|
|
174
|
+
*/
|
|
175
|
+
test("defaultCollapsed renders the section closed", () => {
|
|
176
|
+
render(
|
|
177
|
+
<SideMenuSection title={SECTION_TITLE} defaultCollapsed={true}>
|
|
178
|
+
{menuRows()}
|
|
179
|
+
</SideMenuSection>,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "false");
|
|
183
|
+
expect(sectionBody()).toHaveClass("max-h-0");
|
|
184
|
+
expect(sectionBody()).toHaveClass("opacity-0");
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("a section without defaultCollapsed renders open", () => {
|
|
188
|
+
render(
|
|
189
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "true");
|
|
193
|
+
expect(sectionBody()).toHaveClass("opacity-100");
|
|
194
|
+
expect(sectionBody()).not.toHaveClass("max-h-0");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
* Both directions, because a header that only ever closes is the worse
|
|
199
|
+
* failure: the user loses the rows and has no way to get them back without
|
|
200
|
+
* reloading the page.
|
|
201
|
+
*/
|
|
202
|
+
test("clicking the toggle closes the section and clicking again reopens it", () => {
|
|
203
|
+
render(
|
|
204
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
fireEvent.click(sectionToggle());
|
|
208
|
+
|
|
209
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "false");
|
|
210
|
+
expect(sectionBody()).toHaveClass("max-h-0");
|
|
211
|
+
expect(sectionBody()).toHaveClass("opacity-0");
|
|
212
|
+
|
|
213
|
+
fireEvent.click(sectionToggle());
|
|
214
|
+
|
|
215
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "true");
|
|
216
|
+
expect(sectionBody()).toHaveClass("opacity-100");
|
|
217
|
+
expect(sectionBody()).not.toHaveClass("max-h-0");
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
describe("collapsible={false}", () => {
|
|
222
|
+
/*
|
|
223
|
+
* A section that cannot collapse must not look like it can, to ANY user.
|
|
224
|
+
* The chevron and the pointer cursor cover the sighted half of that; the
|
|
225
|
+
* other half is that there must be no control at all. A <button
|
|
226
|
+
* aria-expanded="true"> whose handler returns immediately is invisible to
|
|
227
|
+
* a sighted user and, to everyone else, a tab stop announcing an expand
|
|
228
|
+
* control that does nothing when activated.
|
|
229
|
+
*/
|
|
230
|
+
test("renders no interactive control at all", () => {
|
|
231
|
+
const { container } = render(
|
|
232
|
+
<SideMenuSection title={SECTION_TITLE} collapsible={false}>
|
|
233
|
+
{menuRows()}
|
|
234
|
+
</SideMenuSection>,
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
expect(container.querySelector("button")).toBeNull();
|
|
238
|
+
expect(container.querySelector("[aria-expanded]")).toBeNull();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("renders no chevron and no pointer cursor", () => {
|
|
242
|
+
render(
|
|
243
|
+
<SideMenuSection title={SECTION_TITLE} collapsible={false}>
|
|
244
|
+
{menuRows()}
|
|
245
|
+
</SideMenuSection>,
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
const header: HTMLElement =
|
|
249
|
+
sectionHeading().parentElement!.parentElement!;
|
|
250
|
+
|
|
251
|
+
expect(header.querySelector("svg")).toBeNull();
|
|
252
|
+
expect(header).toHaveClass("cursor-default");
|
|
253
|
+
expect(header).not.toHaveClass("cursor-pointer");
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test("its rows render and stay rendered", () => {
|
|
257
|
+
render(
|
|
258
|
+
<SideMenuSection title={SECTION_TITLE} collapsible={false}>
|
|
259
|
+
{menuRows()}
|
|
260
|
+
</SideMenuSection>,
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
expect(screen.getByText("Uptime")).toBeInTheDocument();
|
|
264
|
+
expect(sectionHeading().textContent?.trim()).toBe(SECTION_TITLE);
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
describe("children stay mounted while collapsed", () => {
|
|
269
|
+
/*
|
|
270
|
+
* The reason the body animates a max-height instead of rendering `null`.
|
|
271
|
+
*
|
|
272
|
+
* Several menus badge their rows from a fetch fired on mount
|
|
273
|
+
* (CountModelSideMenuItem does exactly this). If a collapsed section
|
|
274
|
+
* unmounted its children, every one of those requests would be re-issued
|
|
275
|
+
* each time the user opened the section again -- a menu of ten counted rows
|
|
276
|
+
* turns one idle click into ten API calls, and the counts flash back to
|
|
277
|
+
* empty while they reload.
|
|
278
|
+
*/
|
|
279
|
+
test("a section collapsed from the start still has its rows in the document", () => {
|
|
280
|
+
render(
|
|
281
|
+
<SideMenuSection title={SECTION_TITLE} defaultCollapsed={true}>
|
|
282
|
+
{menuRows()}
|
|
283
|
+
</SideMenuSection>,
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
expect(screen.getByText("Uptime")).toBeInTheDocument();
|
|
287
|
+
expect(screen.getByText("Logs")).toBeInTheDocument();
|
|
288
|
+
expect(sectionRoot().querySelectorAll("a")).toHaveLength(2);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
/*
|
|
292
|
+
* Same DOM node before and after, not merely an element with the same text:
|
|
293
|
+
* a re-created node would mean React unmounted and remounted the row, which
|
|
294
|
+
* is exactly the fetch storm above.
|
|
295
|
+
*/
|
|
296
|
+
test("collapsing an open section keeps the very same row elements", () => {
|
|
297
|
+
render(
|
|
298
|
+
<SideMenuSection title={SECTION_TITLE}>{menuRows()}</SideMenuSection>,
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
const uptimeRowBeforeCollapse: HTMLElement = screen.getByText("Uptime");
|
|
302
|
+
|
|
303
|
+
fireEvent.click(sectionToggle());
|
|
304
|
+
|
|
305
|
+
expect(sectionToggle()).toHaveAttribute("aria-expanded", "false");
|
|
306
|
+
expect(screen.getByText("Uptime")).toBe(uptimeRowBeforeCollapse);
|
|
307
|
+
expect(screen.getByText("Logs")).toBeInTheDocument();
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import Modal from "../../../UI/Components/Modal/Modal";
|
|
2
|
+
import SideOver, {
|
|
3
|
+
ComponentProps,
|
|
4
|
+
} from "../../../UI/Components/SideOver/SideOver";
|
|
5
|
+
/*
|
|
6
|
+
* The main entry, not "/extend-expect": the latter no longer ships type
|
|
7
|
+
* declarations, so every jest-dom matcher in this file fails to typecheck and
|
|
8
|
+
* the whole suite is skipped before a single assertion runs.
|
|
9
|
+
*/
|
|
10
|
+
import "@testing-library/jest-dom";
|
|
11
|
+
import { resetPageScrollLockForTesting } from "../../../UI/Utils/PageScrollLock";
|
|
12
|
+
import {
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
RenderResult,
|
|
16
|
+
screen,
|
|
17
|
+
within,
|
|
18
|
+
} from "@testing-library/react";
|
|
19
|
+
import React, { ReactElement } from "react";
|
|
20
|
+
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
21
|
+
import getJestMockFunction, { MockFunction } from "../../../Tests/MockType";
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* The submit/close STATE of the panel — the two props a panel needs while it
|
|
25
|
+
* is running something it started. Everything else about SideOver lives in
|
|
26
|
+
* SideOver.test.tsx; this file exists because these two props are what stop a
|
|
27
|
+
* long-running panel from lying to the user about what it is doing.
|
|
28
|
+
*
|
|
29
|
+
* The behaviour being pinned came out of the recommendations batch-create
|
|
30
|
+
* panel, which spends the better part of a minute creating monitors one at a
|
|
31
|
+
* time. Before the props existed, every such caller hand-rolled the same two
|
|
32
|
+
* things badly: a submit button relabelled "Creating..." that stayed clickable
|
|
33
|
+
* and fired the whole batch a second time, and an `onClose` that quietly
|
|
34
|
+
* returned early — leaving a Close button that looks live, takes the click and
|
|
35
|
+
* does nothing, which reads as a frozen app rather than as a refusal.
|
|
36
|
+
*/
|
|
37
|
+
describe("SideOver submit and close state", () => {
|
|
38
|
+
const childElement: ReactElement = <div key={0}>child element</div>;
|
|
39
|
+
|
|
40
|
+
type MakePropsFunction = (data: {
|
|
41
|
+
onClose: MockFunction;
|
|
42
|
+
onSubmit: MockFunction;
|
|
43
|
+
}) => ComponentProps;
|
|
44
|
+
|
|
45
|
+
const makeProps: MakePropsFunction = (data: {
|
|
46
|
+
onClose: MockFunction;
|
|
47
|
+
onSubmit: MockFunction;
|
|
48
|
+
}): ComponentProps => {
|
|
49
|
+
return {
|
|
50
|
+
title: "Create monitors",
|
|
51
|
+
description: "From the recommendations you selected",
|
|
52
|
+
onClose: data.onClose,
|
|
53
|
+
onSubmit: data.onSubmit,
|
|
54
|
+
children: childElement,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* The submit button is the only one with this title, and its own text node
|
|
60
|
+
* sits directly inside the <button> — the spinner is a sibling svg, so the
|
|
61
|
+
* accessible text stays "Save" in both states and this query keeps working
|
|
62
|
+
* while loading.
|
|
63
|
+
*/
|
|
64
|
+
type GetSubmitButtonFunction = () => HTMLElement;
|
|
65
|
+
|
|
66
|
+
const getSubmitButton: GetSubmitButtonFunction = (): HTMLElement => {
|
|
67
|
+
return screen.getByText("Save");
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* The FOOTER Close, scoped deliberately: the header's × is also a close
|
|
72
|
+
* control, and the whole point of `closeButtonDisabled` is that the two do
|
|
73
|
+
* not behave the same.
|
|
74
|
+
*/
|
|
75
|
+
type GetFooterCloseButtonFunction = () => HTMLElement;
|
|
76
|
+
|
|
77
|
+
const getFooterCloseButton: GetFooterCloseButtonFunction =
|
|
78
|
+
(): HTMLElement => {
|
|
79
|
+
return within(screen.getByTestId("side-over-footer")).getByText("Close");
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
type GetHeaderCloseButtonFunction = () => HTMLElement;
|
|
83
|
+
|
|
84
|
+
const getHeaderCloseButton: GetHeaderCloseButtonFunction =
|
|
85
|
+
(): HTMLElement => {
|
|
86
|
+
return screen.getByTestId("close-button");
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
type HasSpinnerFunction = (button: HTMLElement) => boolean;
|
|
90
|
+
|
|
91
|
+
const hasSpinner: HasSpinnerFunction = (button: HTMLElement): boolean => {
|
|
92
|
+
return button.querySelector(".animate-spin") !== null;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* SideOver locks the page scrollbar while it is open, through a counter
|
|
97
|
+
* shared with Modal. Resetting it around every test keeps one test's
|
|
98
|
+
* unmount from being the thing that unlocks the page for the next.
|
|
99
|
+
*/
|
|
100
|
+
beforeEach(() => {
|
|
101
|
+
resetPageScrollLockForTesting();
|
|
102
|
+
document.body.style.overflow = "";
|
|
103
|
+
document.body.style.paddingRight = "";
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
afterEach(() => {
|
|
107
|
+
resetPageScrollLockForTesting();
|
|
108
|
+
document.body.style.overflow = "";
|
|
109
|
+
document.body.style.paddingRight = "";
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe("submitButtonIsLoading", () => {
|
|
113
|
+
/*
|
|
114
|
+
* A spinner alone is decoration. The disable is the part that matters: a
|
|
115
|
+
* second click on a batch-create submit runs the whole batch again, and
|
|
116
|
+
* `createOrUpdate` with FormType.Create does not de-duplicate, so the user
|
|
117
|
+
* ends up with two of every monitor.
|
|
118
|
+
*/
|
|
119
|
+
test("spins the submit button and disables it, so a long job cannot be started twice", () => {
|
|
120
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
121
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
122
|
+
|
|
123
|
+
render(
|
|
124
|
+
<SideOver
|
|
125
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
126
|
+
submitButtonIsLoading={true}
|
|
127
|
+
/>,
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const submitButton: HTMLElement = getSubmitButton();
|
|
131
|
+
|
|
132
|
+
expect(hasSpinner(submitButton)).toBe(true);
|
|
133
|
+
expect(submitButton).toBeDisabled();
|
|
134
|
+
|
|
135
|
+
fireEvent.click(submitButton);
|
|
136
|
+
|
|
137
|
+
expect(onSubmit).not.toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* The same affordance Modal has always forwarded to its footer. Asserted
|
|
142
|
+
* side by side rather than described in a comment, because "SideOver
|
|
143
|
+
* should behave like Modal here" is the entire reason the prop was added
|
|
144
|
+
* instead of each caller relabelling its own button.
|
|
145
|
+
*/
|
|
146
|
+
test("behaves the same way Modal's footer does for a loading submit", () => {
|
|
147
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
148
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
149
|
+
|
|
150
|
+
render(
|
|
151
|
+
<SideOver
|
|
152
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
153
|
+
submitButtonIsLoading={true}
|
|
154
|
+
/>,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
render(
|
|
158
|
+
<Modal
|
|
159
|
+
title="Create monitors"
|
|
160
|
+
onClose={onClose}
|
|
161
|
+
onSubmit={onSubmit}
|
|
162
|
+
submitButtonText="Save"
|
|
163
|
+
isLoading={true}
|
|
164
|
+
>
|
|
165
|
+
<div>modal child</div>
|
|
166
|
+
</Modal>,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const modalSubmitButton: HTMLElement = within(
|
|
170
|
+
screen.getByTestId("modal-footer"),
|
|
171
|
+
).getByText("Save");
|
|
172
|
+
const sideOverSubmitButton: HTMLElement = within(
|
|
173
|
+
screen.getByTestId("side-over-footer"),
|
|
174
|
+
).getByText("Save");
|
|
175
|
+
|
|
176
|
+
expect(hasSpinner(modalSubmitButton)).toBe(true);
|
|
177
|
+
expect(modalSubmitButton).toBeDisabled();
|
|
178
|
+
|
|
179
|
+
expect(hasSpinner(sideOverSubmitButton)).toBe(
|
|
180
|
+
hasSpinner(modalSubmitButton),
|
|
181
|
+
);
|
|
182
|
+
expect(sideOverSubmitButton).toBeDisabled();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("leaves the submit button alone when the panel is not loading", () => {
|
|
186
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
187
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
188
|
+
|
|
189
|
+
render(
|
|
190
|
+
<SideOver
|
|
191
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
192
|
+
submitButtonIsLoading={false}
|
|
193
|
+
/>,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const submitButton: HTMLElement = getSubmitButton();
|
|
197
|
+
|
|
198
|
+
expect(hasSpinner(submitButton)).toBe(false);
|
|
199
|
+
expect(submitButton).not.toBeDisabled();
|
|
200
|
+
|
|
201
|
+
fireEvent.click(submitButton);
|
|
202
|
+
|
|
203
|
+
expect(onSubmit).toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
describe("closeButtonDisabled", () => {
|
|
208
|
+
/*
|
|
209
|
+
* Half of a batch that has already written real records to the database
|
|
210
|
+
* cannot be abandoned, so the footer Close is genuinely unavailable while
|
|
211
|
+
* it runs. Disabling it is what makes that legible: the alternative every
|
|
212
|
+
* caller reached for was an `onClose` that returned early, which leaves a
|
|
213
|
+
* button that looks live, swallows the click and does nothing.
|
|
214
|
+
*/
|
|
215
|
+
test("disables the footer Close button and does not call onClose when it is pressed", () => {
|
|
216
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
217
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
218
|
+
|
|
219
|
+
render(
|
|
220
|
+
<SideOver
|
|
221
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
222
|
+
closeButtonDisabled={true}
|
|
223
|
+
/>,
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
const closeButton: HTMLElement = getFooterCloseButton();
|
|
227
|
+
|
|
228
|
+
expect(closeButton).toBeDisabled();
|
|
229
|
+
|
|
230
|
+
fireEvent.click(closeButton);
|
|
231
|
+
|
|
232
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
/*
|
|
236
|
+
* A panel must never trap the user. Whatever the panel is in the middle
|
|
237
|
+
* of, the × is the one way out that always works — a run that cannot be
|
|
238
|
+
* cancelled is still a run the user is allowed to stop watching.
|
|
239
|
+
*/
|
|
240
|
+
test("leaves the header × working, so the panel can never trap the user", () => {
|
|
241
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
242
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
243
|
+
|
|
244
|
+
render(
|
|
245
|
+
<SideOver
|
|
246
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
247
|
+
closeButtonDisabled={true}
|
|
248
|
+
/>,
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
const headerCloseButton: HTMLElement = getHeaderCloseButton();
|
|
252
|
+
|
|
253
|
+
expect(headerCloseButton).not.toBeDisabled();
|
|
254
|
+
|
|
255
|
+
fireEvent.click(headerCloseButton);
|
|
256
|
+
|
|
257
|
+
expect(onClose).toHaveBeenCalled();
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test("keeps the header × working while the submit button is also loading, which is the real state of a running panel", () => {
|
|
261
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
262
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
263
|
+
|
|
264
|
+
render(
|
|
265
|
+
<SideOver
|
|
266
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
267
|
+
submitButtonIsLoading={true}
|
|
268
|
+
closeButtonDisabled={true}
|
|
269
|
+
/>,
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
expect(getSubmitButton()).toBeDisabled();
|
|
273
|
+
expect(getFooterCloseButton()).toBeDisabled();
|
|
274
|
+
|
|
275
|
+
fireEvent.click(getHeaderCloseButton());
|
|
276
|
+
|
|
277
|
+
expect(onClose).toHaveBeenCalled();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test("leaves the footer Close button alone when the panel is not running anything", () => {
|
|
281
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
282
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
283
|
+
|
|
284
|
+
render(
|
|
285
|
+
<SideOver
|
|
286
|
+
{...makeProps({ onClose: onClose, onSubmit: onSubmit })}
|
|
287
|
+
closeButtonDisabled={false}
|
|
288
|
+
/>,
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const closeButton: HTMLElement = getFooterCloseButton();
|
|
292
|
+
|
|
293
|
+
expect(closeButton).not.toBeDisabled();
|
|
294
|
+
|
|
295
|
+
fireEvent.click(closeButton);
|
|
296
|
+
|
|
297
|
+
expect(onClose).toHaveBeenCalled();
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe("neither prop passed", () => {
|
|
302
|
+
/*
|
|
303
|
+
* Every existing caller passes neither, so both props defaulting to "no
|
|
304
|
+
* change at all" is what keeps this an additive change rather than a
|
|
305
|
+
* silent disabling of buttons across the app.
|
|
306
|
+
*/
|
|
307
|
+
test("leaves an ordinary panel exactly as it was", () => {
|
|
308
|
+
const onClose: MockFunction = getJestMockFunction();
|
|
309
|
+
const onSubmit: MockFunction = getJestMockFunction();
|
|
310
|
+
|
|
311
|
+
const rendered: RenderResult = render(
|
|
312
|
+
<SideOver {...makeProps({ onClose: onClose, onSubmit: onSubmit })} />,
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
const submitButton: HTMLElement = getSubmitButton();
|
|
316
|
+
|
|
317
|
+
expect(submitButton).not.toBeDisabled();
|
|
318
|
+
expect(hasSpinner(submitButton)).toBe(false);
|
|
319
|
+
|
|
320
|
+
fireEvent.click(submitButton);
|
|
321
|
+
|
|
322
|
+
expect(onSubmit).toHaveBeenCalled();
|
|
323
|
+
|
|
324
|
+
const closeButton: HTMLElement = getFooterCloseButton();
|
|
325
|
+
|
|
326
|
+
expect(closeButton).not.toBeDisabled();
|
|
327
|
+
|
|
328
|
+
fireEvent.click(closeButton);
|
|
329
|
+
|
|
330
|
+
expect(onClose).toHaveBeenCalled();
|
|
331
|
+
|
|
332
|
+
rendered.unmount();
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
});
|