@oneuptime/common 12.0.22 → 12.0.24
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/DatabaseModels/DetectionRule.ts +55 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/NetworkDevice.ts +44 -0
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +584 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +105 -0
- package/Models/DatabaseModels/Project.ts +68 -0
- package/Models/DatabaseModels/User.ts +68 -0
- package/Server/API/TelemetryAPI.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.ts +60 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/GzipRequestBody.ts +311 -0
- package/Server/Middleware/MultipartFormData.ts +87 -3
- package/Server/Services/DetectionRuleService.ts +73 -6
- package/Server/Services/Index.ts +207 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +917 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +181 -0
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
- package/Server/Services/NetworkDeviceService.ts +148 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
- package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
- package/Server/Services/ProjectService.ts +29 -19
- package/Server/Services/SecurityEventService.ts +90 -13
- package/Server/Services/StatusPageResourceService.ts +223 -0
- package/Server/Services/TelemetryAttributeService.ts +17 -0
- package/Server/Services/UserService.ts +4 -6
- package/Server/Types/Markdown.ts +161 -67
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
- package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
- package/Server/Utils/Attribution.ts +4 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +39 -1
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
- package/Server/Utils/StartServer.ts +12 -32
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
- package/Server/Utils/Telemetry/LlmMetricSpend.ts +130 -0
- package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
- package/Server/Views/Partials/Head.ejs +2 -1
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
- package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
- package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
- package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
- package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
- package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
- package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
- package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
- package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
- package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
- package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +205 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +933 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
- package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
- package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
- package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
- package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +97 -1
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +368 -4
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +245 -0
- package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
- package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
- package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
- package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +193 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
- package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
- package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
- package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
- package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
- package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
- package/Tests/UI/Components/SideOver.test.tsx +1 -1
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
- package/Tests/UI/Components/Toggle.test.tsx +25 -0
- package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +516 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +272 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
- package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +164 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
- package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +472 -0
- package/Types/Code/YamlSyntax.ts +396 -0
- package/Types/Exception/ExceptionCode.ts +1 -0
- package/Types/Exception/PayloadTooLargeException.ts +8 -0
- package/Types/Marketing/Attribution.ts +10 -0
- package/Types/Marketing/MarketingEvent.ts +4 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
- package/Types/NetworkAutomation/RuleRunResult.ts +84 -0
- package/Types/Permission.ts +47 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
- package/Types/Telemetry/LlmMetricConventions.ts +124 -0
- package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
- package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
- package/UI/Components/Detail/Detail.tsx +10 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
- package/UI/Components/Forms/Fields/FormField.tsx +31 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
- package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
- package/UI/Components/Forms/Validation.ts +46 -0
- package/UI/Components/Input/Input.tsx +3 -0
- package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
- package/UI/Components/ModelTable/Column.ts +8 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
- package/UI/Components/SideOver/SideOver.tsx +5 -5
- package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
- package/UI/Components/StatusPage/ResourceList.tsx +197 -38
- package/UI/Components/Toggle/Toggle.tsx +9 -1
- package/UI/Components/Types/FieldType.ts +1 -0
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +257 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +183 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +95 -0
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +66 -0
- package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +82 -0
- package/Utils/StatusPage/ResourceExplorer.ts +258 -0
- package/Utils/Telemetry/LlmMetricQuery.ts +204 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +45 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +609 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +97 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +76 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +76 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +17 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js +35 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.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/Middleware/GzipRequestBody.js +224 -0
- package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
- package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +49 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +206 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +711 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +155 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +25 -45
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +57 -5
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +2 -12
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +147 -61
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +26 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -21
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +102 -0
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
- package/build/dist/Types/Code/YamlSyntax.js +212 -0
- package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +10 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +24 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/Permission.js +41 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +98 -0
- package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
- package/build/dist/UI/Components/Detail/Detail.js +9 -0
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +27 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Types/FieldType.js +1 -0
- package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +149 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +121 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +75 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +59 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +60 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js +119 -0
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/tsconfig.json +2 -1
- package/Tests/UI/Components/Toast.test.tsx +0 -197
- package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
- package/UI/Components/Toast/Toast.tsx +0 -189
- package/UI/Components/Toast/ToastInit.tsx +0 -110
- package/build/dist/UI/Components/Toast/Toast.js +0 -123
- package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
- package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import ToastLayout, {
|
|
2
|
-
ShowToastNotification,
|
|
3
|
-
} from "../../../UI/Components/Toast/ToastInit";
|
|
4
|
-
import { ToastType } from "../../../UI/Components/Toast/Toast";
|
|
5
|
-
import "@testing-library/jest-dom";
|
|
6
|
-
import {
|
|
7
|
-
act,
|
|
8
|
-
cleanup,
|
|
9
|
-
fireEvent,
|
|
10
|
-
render,
|
|
11
|
-
screen,
|
|
12
|
-
waitFor,
|
|
13
|
-
} from "@testing-library/react";
|
|
14
|
-
import React from "react";
|
|
15
|
-
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
16
|
-
|
|
17
|
-
/*
|
|
18
|
-
* ToastInit used to render every toast as its own fixed strip at top-0 (the
|
|
19
|
-
* index prop that was supposed to offset them was never passed), so stacked
|
|
20
|
-
* toasts painted on top of each other and only the last one was readable.
|
|
21
|
-
* The contract pinned here: ONE fixed region, cards stacked in a flex column
|
|
22
|
-
* in insertion order.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
type ShowToastFunction = (title: string, onClose?: () => void) => void;
|
|
26
|
-
|
|
27
|
-
const showToast: ShowToastFunction = (
|
|
28
|
-
title: string,
|
|
29
|
-
onClose?: () => void,
|
|
30
|
-
): void => {
|
|
31
|
-
act(() => {
|
|
32
|
-
ShowToastNotification({
|
|
33
|
-
title,
|
|
34
|
-
description: `${title} description`,
|
|
35
|
-
type: ToastType.SUCCESS,
|
|
36
|
-
onClose,
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
describe("Toast stacking", () => {
|
|
42
|
-
afterEach(() => {
|
|
43
|
-
cleanup();
|
|
44
|
-
jest.clearAllMocks();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test("renders one fixed region that keeps its slot in the z-index ladder", () => {
|
|
48
|
-
render(<ToastLayout />);
|
|
49
|
-
|
|
50
|
-
const region: HTMLElement = screen.getByTestId("toast-region");
|
|
51
|
-
|
|
52
|
-
/*
|
|
53
|
-
* z-40 is deliberate: above SideOver (z-30), below Modal (z-50). The
|
|
54
|
-
* region itself takes no pointer events; only the cards inside do.
|
|
55
|
-
*/
|
|
56
|
-
expect(region).toHaveClass(
|
|
57
|
-
"pointer-events-none",
|
|
58
|
-
"fixed",
|
|
59
|
-
"z-40",
|
|
60
|
-
"top-0",
|
|
61
|
-
"left-0",
|
|
62
|
-
"right-0",
|
|
63
|
-
);
|
|
64
|
-
expect(region).toHaveClass("sm:items-start", "sm:p-6");
|
|
65
|
-
expect(region).toHaveAttribute("aria-live", "assertive");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test("stacks multiple toasts in one region, in insertion order", () => {
|
|
69
|
-
render(<ToastLayout />);
|
|
70
|
-
|
|
71
|
-
showToast("First");
|
|
72
|
-
showToast("Second");
|
|
73
|
-
showToast("Third");
|
|
74
|
-
|
|
75
|
-
const toasts: Array<HTMLElement> = screen.getAllByTestId("toast");
|
|
76
|
-
|
|
77
|
-
expect(toasts).toHaveLength(3);
|
|
78
|
-
|
|
79
|
-
// All three cards live inside the ONE region, not three fixed strips.
|
|
80
|
-
const region: HTMLElement = screen.getByTestId("toast-region");
|
|
81
|
-
|
|
82
|
-
for (const toast of toasts) {
|
|
83
|
-
expect(region).toContainElement(toast);
|
|
84
|
-
expect(toast).not.toHaveClass("fixed");
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// The stack is a flex column with a gap, so cards never overlap.
|
|
88
|
-
const stack: HTMLElement = toasts[0]?.parentElement as HTMLElement;
|
|
89
|
-
|
|
90
|
-
expect(stack).toHaveClass("flex", "flex-col", "gap-4");
|
|
91
|
-
expect(toasts[1]?.parentElement).toBe(stack);
|
|
92
|
-
expect(toasts[2]?.parentElement).toBe(stack);
|
|
93
|
-
|
|
94
|
-
const titles: Array<string | null> = screen
|
|
95
|
-
.getAllByTestId("title")
|
|
96
|
-
.map((title: HTMLElement) => {
|
|
97
|
-
return title.textContent;
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
expect(titles).toEqual(["First", "Second", "Third"]);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("dismissing one toast removes only that toast and calls its onClose", async () => {
|
|
104
|
-
const onCloseFirst: () => void = jest.fn();
|
|
105
|
-
|
|
106
|
-
render(<ToastLayout />);
|
|
107
|
-
|
|
108
|
-
showToast("First", onCloseFirst);
|
|
109
|
-
showToast("Second");
|
|
110
|
-
|
|
111
|
-
const closeButtons: Array<HTMLElement> =
|
|
112
|
-
screen.getAllByTestId("close-button");
|
|
113
|
-
|
|
114
|
-
expect(closeButtons).toHaveLength(2);
|
|
115
|
-
|
|
116
|
-
fireEvent.click(closeButtons[0] as HTMLElement);
|
|
117
|
-
|
|
118
|
-
/*
|
|
119
|
-
* The exit fade delays the unmount, so removal is awaited rather than
|
|
120
|
-
* asserted synchronously.
|
|
121
|
-
*/
|
|
122
|
-
await waitFor(() => {
|
|
123
|
-
expect(screen.getAllByTestId("toast")).toHaveLength(1);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
expect(onCloseFirst).toHaveBeenCalledTimes(1);
|
|
127
|
-
expect(screen.getByTestId("title")).toHaveTextContent("Second");
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("a toast dispatched after a dismissal still stacks below the survivors", async () => {
|
|
131
|
-
render(<ToastLayout />);
|
|
132
|
-
|
|
133
|
-
showToast("First");
|
|
134
|
-
showToast("Second");
|
|
135
|
-
|
|
136
|
-
fireEvent.click(screen.getAllByTestId("close-button")[0] as HTMLElement);
|
|
137
|
-
|
|
138
|
-
await waitFor(() => {
|
|
139
|
-
expect(screen.getAllByTestId("toast")).toHaveLength(1);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
showToast("Third");
|
|
143
|
-
|
|
144
|
-
const titles: Array<string | null> = screen
|
|
145
|
-
.getAllByTestId("title")
|
|
146
|
-
.map((title: HTMLElement) => {
|
|
147
|
-
return title.textContent;
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
expect(titles).toEqual(["Second", "Third"]);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
/*
|
|
154
|
-
* Regression: dispatching a toast re-renders the whole stack, and the
|
|
155
|
-
* layout used to hand every card a freshly created onClose on each render.
|
|
156
|
-
* A dismissed card mid-exit-fade saw the new prop, cleared its unmount
|
|
157
|
-
* timer, and re-armed it — so a burst of toasts could keep an invisible
|
|
158
|
-
* pointer-events-auto card alive indefinitely, intercepting clicks.
|
|
159
|
-
*/
|
|
160
|
-
test("a toast dispatched during another toast's exit fade does not restart its unmount timer", () => {
|
|
161
|
-
jest.useFakeTimers();
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
const onCloseFirst: () => void = jest.fn();
|
|
165
|
-
|
|
166
|
-
render(<ToastLayout />);
|
|
167
|
-
|
|
168
|
-
showToast("First", onCloseFirst);
|
|
169
|
-
|
|
170
|
-
fireEvent.click(screen.getByTestId("close-button"));
|
|
171
|
-
|
|
172
|
-
// 100ms into the 150ms exit fade a second toast re-renders the stack.
|
|
173
|
-
act(() => {
|
|
174
|
-
jest.advanceTimersByTime(100);
|
|
175
|
-
});
|
|
176
|
-
showToast("Second");
|
|
177
|
-
|
|
178
|
-
expect(screen.getAllByTestId("toast")).toHaveLength(2);
|
|
179
|
-
|
|
180
|
-
// The ORIGINAL 150ms deadline holds: 50ms later the first card is gone.
|
|
181
|
-
act(() => {
|
|
182
|
-
jest.advanceTimersByTime(50);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
expect(onCloseFirst).toHaveBeenCalledTimes(1);
|
|
186
|
-
|
|
187
|
-
const titles: Array<string | null> = screen
|
|
188
|
-
.getAllByTestId("title")
|
|
189
|
-
.map((title: HTMLElement) => {
|
|
190
|
-
return title.textContent;
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
expect(titles).toEqual(["Second"]);
|
|
194
|
-
} finally {
|
|
195
|
-
jest.useRealTimers();
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
});
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
FunctionComponent,
|
|
3
|
-
ReactElement,
|
|
4
|
-
useEffect,
|
|
5
|
-
useRef,
|
|
6
|
-
useState,
|
|
7
|
-
} from "react";
|
|
8
|
-
import Icon from "../Icon/Icon";
|
|
9
|
-
import IconProp from "../../../Types/Icon/IconProp";
|
|
10
|
-
import useTranslateValue from "../../Utils/Translation";
|
|
11
|
-
|
|
12
|
-
export enum ToastType {
|
|
13
|
-
DANGER,
|
|
14
|
-
SUCCESS,
|
|
15
|
-
INFO,
|
|
16
|
-
WARNING,
|
|
17
|
-
NORMAL,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface ComponentProps {
|
|
21
|
-
title: string;
|
|
22
|
-
description: string;
|
|
23
|
-
onClose?: undefined | (() => void);
|
|
24
|
-
type?: undefined | ToastType;
|
|
25
|
-
icon?: IconProp | undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* How long the exit fade runs before the toast actually unmounts. */
|
|
29
|
-
const EXIT_DURATION_IN_MS: number = 150;
|
|
30
|
-
|
|
31
|
-
const Component: FunctionComponent<ComponentProps> = (
|
|
32
|
-
props: ComponentProps,
|
|
33
|
-
): ReactElement => {
|
|
34
|
-
const { translateString } = useTranslateValue();
|
|
35
|
-
const [show, setShow] = useState<boolean>(true);
|
|
36
|
-
|
|
37
|
-
/*
|
|
38
|
-
* The toast is mounted in its closed state (faded, nudged down) and flipped
|
|
39
|
-
* open one frame later so the browser has something to transition from —
|
|
40
|
-
* the same pattern Modal uses for its entrance.
|
|
41
|
-
*/
|
|
42
|
-
const [hasEntered, setHasEntered] = useState<boolean>(false);
|
|
43
|
-
|
|
44
|
-
/*
|
|
45
|
-
* Dismissal fades the card out first and only unmounts (and notifies the
|
|
46
|
-
* owner) once the fade has finished, so the toast never blinks away.
|
|
47
|
-
*/
|
|
48
|
-
const [isLeaving, setIsLeaving] = useState<boolean>(false);
|
|
49
|
-
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
const open: () => void = (): void => {
|
|
52
|
-
setHasEntered(true);
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const frame: number = requestAnimationFrame(open);
|
|
56
|
-
|
|
57
|
-
/*
|
|
58
|
-
* A hidden or throttled tab never runs an animation frame; the timer
|
|
59
|
-
* skips the transition rather than leaving the toast at zero opacity.
|
|
60
|
-
*/
|
|
61
|
-
const fallbackTimer: ReturnType<typeof setTimeout> = setTimeout(open, 80);
|
|
62
|
-
|
|
63
|
-
return () => {
|
|
64
|
-
cancelAnimationFrame(frame);
|
|
65
|
-
clearTimeout(fallbackTimer);
|
|
66
|
-
};
|
|
67
|
-
}, []);
|
|
68
|
-
|
|
69
|
-
/*
|
|
70
|
-
* The latest onClose lives in a ref so the exit effect can depend on
|
|
71
|
-
* isLeaving alone. Owners may recreate onClose every render, and a dep on
|
|
72
|
-
* it would restart the unmount timer whenever a sibling toast re-renders
|
|
73
|
-
* the stack mid-exit — leaving an invisible pointer-events-auto card
|
|
74
|
-
* intercepting clicks past its original deadline.
|
|
75
|
-
*/
|
|
76
|
-
const onCloseRef: React.MutableRefObject<(() => void) | undefined> = useRef<
|
|
77
|
-
(() => void) | undefined
|
|
78
|
-
>(props.onClose);
|
|
79
|
-
onCloseRef.current = props.onClose;
|
|
80
|
-
|
|
81
|
-
useEffect(() => {
|
|
82
|
-
if (!isLeaving) {
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const exitTimer: ReturnType<typeof setTimeout> = setTimeout(() => {
|
|
87
|
-
setShow(false);
|
|
88
|
-
if (onCloseRef.current) {
|
|
89
|
-
onCloseRef.current();
|
|
90
|
-
}
|
|
91
|
-
}, EXIT_DURATION_IN_MS);
|
|
92
|
-
|
|
93
|
-
return () => {
|
|
94
|
-
clearTimeout(exitTimer);
|
|
95
|
-
};
|
|
96
|
-
}, [isLeaving]);
|
|
97
|
-
|
|
98
|
-
let typeCssClass: string = "text-gray-400";
|
|
99
|
-
let iconType: IconProp = IconProp.Info;
|
|
100
|
-
|
|
101
|
-
if (props.type === ToastType.NORMAL) {
|
|
102
|
-
typeCssClass = "text-gray-400";
|
|
103
|
-
iconType = IconProp.Info;
|
|
104
|
-
}
|
|
105
|
-
if (props.type === ToastType.DANGER) {
|
|
106
|
-
typeCssClass = "text-red-400";
|
|
107
|
-
iconType = IconProp.Error;
|
|
108
|
-
}
|
|
109
|
-
if (props.type === ToastType.WARNING) {
|
|
110
|
-
typeCssClass = "text-yellow-400";
|
|
111
|
-
iconType = IconProp.Alert;
|
|
112
|
-
}
|
|
113
|
-
if (props.type === ToastType.SUCCESS) {
|
|
114
|
-
typeCssClass = "text-green-400";
|
|
115
|
-
iconType = IconProp.CheckCircle;
|
|
116
|
-
}
|
|
117
|
-
if (props.type === ToastType.INFO) {
|
|
118
|
-
typeCssClass = "text-blue-400";
|
|
119
|
-
iconType = IconProp.Info;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (props.icon) {
|
|
123
|
-
iconType = props.icon;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/*
|
|
127
|
-
* Settled state carries no transform class at all — leaving a translate on
|
|
128
|
-
* the card would make it the containing block for position:fixed
|
|
129
|
-
* descendants (the Modal invariant).
|
|
130
|
-
*/
|
|
131
|
-
let motionClassName: string = "translate-y-2 opacity-0";
|
|
132
|
-
|
|
133
|
-
if (isLeaving) {
|
|
134
|
-
motionClassName = "opacity-0";
|
|
135
|
-
} else if (hasEntered) {
|
|
136
|
-
motionClassName = "opacity-100";
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (show) {
|
|
140
|
-
return (
|
|
141
|
-
<div
|
|
142
|
-
data-testid="toast"
|
|
143
|
-
className={`pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black ring-opacity-5 transition duration-150 ease-out motion-reduce:transition-none ${motionClassName}`}
|
|
144
|
-
>
|
|
145
|
-
<div className="p-4">
|
|
146
|
-
<div className="flex items-start">
|
|
147
|
-
<div className="flex-shrink-0">
|
|
148
|
-
<Icon
|
|
149
|
-
className={`h-6 w-6 ${typeCssClass}`}
|
|
150
|
-
data-testid="toast-icon"
|
|
151
|
-
icon={iconType}
|
|
152
|
-
/>
|
|
153
|
-
</div>
|
|
154
|
-
<div className="ml-3 w-0 flex-1 pt-0.5">
|
|
155
|
-
<p
|
|
156
|
-
data-testid="title"
|
|
157
|
-
className="text-sm font-medium text-gray-900"
|
|
158
|
-
>
|
|
159
|
-
{translateString(props.title)}
|
|
160
|
-
</p>
|
|
161
|
-
<p
|
|
162
|
-
data-testid="description"
|
|
163
|
-
className="mt-1 text-sm text-gray-500"
|
|
164
|
-
>
|
|
165
|
-
{translateString(props.description)}
|
|
166
|
-
</p>
|
|
167
|
-
</div>
|
|
168
|
-
<div className="ml-4 flex flex-shrink-0">
|
|
169
|
-
<button
|
|
170
|
-
onClick={() => {
|
|
171
|
-
setIsLeaving(true);
|
|
172
|
-
}}
|
|
173
|
-
data-testid="close-button"
|
|
174
|
-
type="button"
|
|
175
|
-
className="inline-flex rounded-md bg-white text-gray-400 transition-colors duration-150 ease-out hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
176
|
-
>
|
|
177
|
-
<span className="sr-only">Close</span>
|
|
178
|
-
<Icon className={`h-5 w-5`} icon={IconProp.Close} />
|
|
179
|
-
</button>
|
|
180
|
-
</div>
|
|
181
|
-
</div>
|
|
182
|
-
</div>
|
|
183
|
-
</div>
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
return <></>;
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
export default Component;
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
FunctionComponent,
|
|
3
|
-
ReactElement,
|
|
4
|
-
useEffect,
|
|
5
|
-
useRef,
|
|
6
|
-
} from "react";
|
|
7
|
-
import Toast, { ComponentProps as ToastComponentProps } from "./Toast";
|
|
8
|
-
import GlobalEvents from "../../Utils/GlobalEvents";
|
|
9
|
-
|
|
10
|
-
type ShowToastNotificationFunction = (toast: ToastComponentProps) => void;
|
|
11
|
-
|
|
12
|
-
export const ShowToastNotification: ShowToastNotificationFunction = (
|
|
13
|
-
toast: ToastComponentProps,
|
|
14
|
-
): void => {
|
|
15
|
-
GlobalEvents.dispatchEvent("toast", toast as any);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/*
|
|
19
|
-
* Each queued toast gets a stable id so removals key correctly — keying by
|
|
20
|
-
* array index would re-key (and so re-mount and re-animate) every toast below
|
|
21
|
-
* the one that was dismissed.
|
|
22
|
-
*/
|
|
23
|
-
interface ToastEntry {
|
|
24
|
-
id: number;
|
|
25
|
-
toast: ToastComponentProps;
|
|
26
|
-
/*
|
|
27
|
-
* Built once at dispatch and stable for the toast's lifetime: recreating
|
|
28
|
-
* onClose per render would hand every Toast a fresh prop on each stack
|
|
29
|
-
* re-render, which used to restart the exit-unmount timer of any toast
|
|
30
|
-
* mid-fade.
|
|
31
|
-
*/
|
|
32
|
-
onClose: () => void;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const ToastLayout: FunctionComponent = (): ReactElement => {
|
|
36
|
-
const [currentToasts, setCurrentToasts] = React.useState<Array<ToastEntry>>(
|
|
37
|
-
[],
|
|
38
|
-
);
|
|
39
|
-
const nextToastIdRef: React.MutableRefObject<number> = useRef<number>(0);
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
const addToastNotification: (event: CustomEvent) => void = (
|
|
43
|
-
event: CustomEvent,
|
|
44
|
-
): void => {
|
|
45
|
-
const toast: ToastComponentProps = event.detail;
|
|
46
|
-
const id: number = nextToastIdRef.current;
|
|
47
|
-
nextToastIdRef.current += 1;
|
|
48
|
-
|
|
49
|
-
// setCurrentToasts is stable, so this closure never goes stale.
|
|
50
|
-
const onClose: () => void = (): void => {
|
|
51
|
-
if (toast.onClose) {
|
|
52
|
-
toast.onClose();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
setCurrentToasts((toasts: Array<ToastEntry>) => {
|
|
56
|
-
return toasts.filter((candidate: ToastEntry) => {
|
|
57
|
-
return candidate.id !== id;
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/*
|
|
63
|
-
* Functional update: this listener is registered once, so reading
|
|
64
|
-
* currentToasts from its closure would always see the mount-time empty
|
|
65
|
-
* array and every new toast would clobber the ones before it.
|
|
66
|
-
*/
|
|
67
|
-
setCurrentToasts((toasts: Array<ToastEntry>) => {
|
|
68
|
-
return [...toasts, { id, toast, onClose }];
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
GlobalEvents.addEventListener("toast", addToastNotification);
|
|
73
|
-
|
|
74
|
-
return () => {
|
|
75
|
-
GlobalEvents.removeEventListener("toast", addToastNotification);
|
|
76
|
-
};
|
|
77
|
-
}, []);
|
|
78
|
-
|
|
79
|
-
/*
|
|
80
|
-
* ONE fixed container for every toast. Each toast used to render its own
|
|
81
|
-
* fixed strip at top-0 (the index prop that offset them was never passed),
|
|
82
|
-
* so stacked toasts painted on top of each other. A single region stacking
|
|
83
|
-
* cards with flex-col gap makes the order self-evident and keeps the
|
|
84
|
-
* z-index ladder in exactly one place (Toast z-40, under Modal z-50).
|
|
85
|
-
*/
|
|
86
|
-
return (
|
|
87
|
-
<div
|
|
88
|
-
data-testid="toast-region"
|
|
89
|
-
aria-live="assertive"
|
|
90
|
-
className="pointer-events-none fixed z-40 top-0 left-0 right-0 flex items-end px-4 py-6 sm:items-start sm:p-6"
|
|
91
|
-
>
|
|
92
|
-
<div className="flex w-full flex-col items-center gap-4 sm:items-end">
|
|
93
|
-
{currentToasts.map((entry: ToastEntry) => {
|
|
94
|
-
return (
|
|
95
|
-
<Toast
|
|
96
|
-
key={entry.id}
|
|
97
|
-
title={entry.toast.title}
|
|
98
|
-
description={entry.toast.description}
|
|
99
|
-
type={entry.toast.type}
|
|
100
|
-
icon={entry.toast.icon}
|
|
101
|
-
onClose={entry.onClose}
|
|
102
|
-
/>
|
|
103
|
-
);
|
|
104
|
-
})}
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export default ToastLayout;
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useState, } from "react";
|
|
2
|
-
import Icon from "../Icon/Icon";
|
|
3
|
-
import IconProp from "../../../Types/Icon/IconProp";
|
|
4
|
-
import useTranslateValue from "../../Utils/Translation";
|
|
5
|
-
export var ToastType;
|
|
6
|
-
(function (ToastType) {
|
|
7
|
-
ToastType[ToastType["DANGER"] = 0] = "DANGER";
|
|
8
|
-
ToastType[ToastType["SUCCESS"] = 1] = "SUCCESS";
|
|
9
|
-
ToastType[ToastType["INFO"] = 2] = "INFO";
|
|
10
|
-
ToastType[ToastType["WARNING"] = 3] = "WARNING";
|
|
11
|
-
ToastType[ToastType["NORMAL"] = 4] = "NORMAL";
|
|
12
|
-
})(ToastType || (ToastType = {}));
|
|
13
|
-
/* How long the exit fade runs before the toast actually unmounts. */
|
|
14
|
-
const EXIT_DURATION_IN_MS = 150;
|
|
15
|
-
const Component = (props) => {
|
|
16
|
-
const { translateString } = useTranslateValue();
|
|
17
|
-
const [show, setShow] = useState(true);
|
|
18
|
-
/*
|
|
19
|
-
* The toast is mounted in its closed state (faded, nudged down) and flipped
|
|
20
|
-
* open one frame later so the browser has something to transition from —
|
|
21
|
-
* the same pattern Modal uses for its entrance.
|
|
22
|
-
*/
|
|
23
|
-
const [hasEntered, setHasEntered] = useState(false);
|
|
24
|
-
/*
|
|
25
|
-
* Dismissal fades the card out first and only unmounts (and notifies the
|
|
26
|
-
* owner) once the fade has finished, so the toast never blinks away.
|
|
27
|
-
*/
|
|
28
|
-
const [isLeaving, setIsLeaving] = useState(false);
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
const open = () => {
|
|
31
|
-
setHasEntered(true);
|
|
32
|
-
};
|
|
33
|
-
const frame = requestAnimationFrame(open);
|
|
34
|
-
/*
|
|
35
|
-
* A hidden or throttled tab never runs an animation frame; the timer
|
|
36
|
-
* skips the transition rather than leaving the toast at zero opacity.
|
|
37
|
-
*/
|
|
38
|
-
const fallbackTimer = setTimeout(open, 80);
|
|
39
|
-
return () => {
|
|
40
|
-
cancelAnimationFrame(frame);
|
|
41
|
-
clearTimeout(fallbackTimer);
|
|
42
|
-
};
|
|
43
|
-
}, []);
|
|
44
|
-
/*
|
|
45
|
-
* The latest onClose lives in a ref so the exit effect can depend on
|
|
46
|
-
* isLeaving alone. Owners may recreate onClose every render, and a dep on
|
|
47
|
-
* it would restart the unmount timer whenever a sibling toast re-renders
|
|
48
|
-
* the stack mid-exit — leaving an invisible pointer-events-auto card
|
|
49
|
-
* intercepting clicks past its original deadline.
|
|
50
|
-
*/
|
|
51
|
-
const onCloseRef = useRef(props.onClose);
|
|
52
|
-
onCloseRef.current = props.onClose;
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
if (!isLeaving) {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
const exitTimer = setTimeout(() => {
|
|
58
|
-
setShow(false);
|
|
59
|
-
if (onCloseRef.current) {
|
|
60
|
-
onCloseRef.current();
|
|
61
|
-
}
|
|
62
|
-
}, EXIT_DURATION_IN_MS);
|
|
63
|
-
return () => {
|
|
64
|
-
clearTimeout(exitTimer);
|
|
65
|
-
};
|
|
66
|
-
}, [isLeaving]);
|
|
67
|
-
let typeCssClass = "text-gray-400";
|
|
68
|
-
let iconType = IconProp.Info;
|
|
69
|
-
if (props.type === ToastType.NORMAL) {
|
|
70
|
-
typeCssClass = "text-gray-400";
|
|
71
|
-
iconType = IconProp.Info;
|
|
72
|
-
}
|
|
73
|
-
if (props.type === ToastType.DANGER) {
|
|
74
|
-
typeCssClass = "text-red-400";
|
|
75
|
-
iconType = IconProp.Error;
|
|
76
|
-
}
|
|
77
|
-
if (props.type === ToastType.WARNING) {
|
|
78
|
-
typeCssClass = "text-yellow-400";
|
|
79
|
-
iconType = IconProp.Alert;
|
|
80
|
-
}
|
|
81
|
-
if (props.type === ToastType.SUCCESS) {
|
|
82
|
-
typeCssClass = "text-green-400";
|
|
83
|
-
iconType = IconProp.CheckCircle;
|
|
84
|
-
}
|
|
85
|
-
if (props.type === ToastType.INFO) {
|
|
86
|
-
typeCssClass = "text-blue-400";
|
|
87
|
-
iconType = IconProp.Info;
|
|
88
|
-
}
|
|
89
|
-
if (props.icon) {
|
|
90
|
-
iconType = props.icon;
|
|
91
|
-
}
|
|
92
|
-
/*
|
|
93
|
-
* Settled state carries no transform class at all — leaving a translate on
|
|
94
|
-
* the card would make it the containing block for position:fixed
|
|
95
|
-
* descendants (the Modal invariant).
|
|
96
|
-
*/
|
|
97
|
-
let motionClassName = "translate-y-2 opacity-0";
|
|
98
|
-
if (isLeaving) {
|
|
99
|
-
motionClassName = "opacity-0";
|
|
100
|
-
}
|
|
101
|
-
else if (hasEntered) {
|
|
102
|
-
motionClassName = "opacity-100";
|
|
103
|
-
}
|
|
104
|
-
if (show) {
|
|
105
|
-
return (React.createElement("div", { "data-testid": "toast", className: `pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black ring-opacity-5 transition duration-150 ease-out motion-reduce:transition-none ${motionClassName}` },
|
|
106
|
-
React.createElement("div", { className: "p-4" },
|
|
107
|
-
React.createElement("div", { className: "flex items-start" },
|
|
108
|
-
React.createElement("div", { className: "flex-shrink-0" },
|
|
109
|
-
React.createElement(Icon, { className: `h-6 w-6 ${typeCssClass}`, "data-testid": "toast-icon", icon: iconType })),
|
|
110
|
-
React.createElement("div", { className: "ml-3 w-0 flex-1 pt-0.5" },
|
|
111
|
-
React.createElement("p", { "data-testid": "title", className: "text-sm font-medium text-gray-900" }, translateString(props.title)),
|
|
112
|
-
React.createElement("p", { "data-testid": "description", className: "mt-1 text-sm text-gray-500" }, translateString(props.description))),
|
|
113
|
-
React.createElement("div", { className: "ml-4 flex flex-shrink-0" },
|
|
114
|
-
React.createElement("button", { onClick: () => {
|
|
115
|
-
setIsLeaving(true);
|
|
116
|
-
}, "data-testid": "close-button", type: "button", className: "inline-flex rounded-md bg-white text-gray-400 transition-colors duration-150 ease-out hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2" },
|
|
117
|
-
React.createElement("span", { className: "sr-only" }, "Close"),
|
|
118
|
-
React.createElement(Icon, { className: `h-5 w-5`, icon: IconProp.Close })))))));
|
|
119
|
-
}
|
|
120
|
-
return React.createElement(React.Fragment, null);
|
|
121
|
-
};
|
|
122
|
-
export default Component;
|
|
123
|
-
//# sourceMappingURL=Toast.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../../../UI/Components/Toast/Toast.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useRef, } from "react";
|
|
2
|
-
import Toast from "./Toast";
|
|
3
|
-
import GlobalEvents from "../../Utils/GlobalEvents";
|
|
4
|
-
export const ShowToastNotification = (toast) => {
|
|
5
|
-
GlobalEvents.dispatchEvent("toast", toast);
|
|
6
|
-
};
|
|
7
|
-
const ToastLayout = () => {
|
|
8
|
-
const [currentToasts, setCurrentToasts] = React.useState([]);
|
|
9
|
-
const nextToastIdRef = useRef(0);
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
const addToastNotification = (event) => {
|
|
12
|
-
const toast = event.detail;
|
|
13
|
-
const id = nextToastIdRef.current;
|
|
14
|
-
nextToastIdRef.current += 1;
|
|
15
|
-
// setCurrentToasts is stable, so this closure never goes stale.
|
|
16
|
-
const onClose = () => {
|
|
17
|
-
if (toast.onClose) {
|
|
18
|
-
toast.onClose();
|
|
19
|
-
}
|
|
20
|
-
setCurrentToasts((toasts) => {
|
|
21
|
-
return toasts.filter((candidate) => {
|
|
22
|
-
return candidate.id !== id;
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
/*
|
|
27
|
-
* Functional update: this listener is registered once, so reading
|
|
28
|
-
* currentToasts from its closure would always see the mount-time empty
|
|
29
|
-
* array and every new toast would clobber the ones before it.
|
|
30
|
-
*/
|
|
31
|
-
setCurrentToasts((toasts) => {
|
|
32
|
-
return [...toasts, { id, toast, onClose }];
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
GlobalEvents.addEventListener("toast", addToastNotification);
|
|
36
|
-
return () => {
|
|
37
|
-
GlobalEvents.removeEventListener("toast", addToastNotification);
|
|
38
|
-
};
|
|
39
|
-
}, []);
|
|
40
|
-
/*
|
|
41
|
-
* ONE fixed container for every toast. Each toast used to render its own
|
|
42
|
-
* fixed strip at top-0 (the index prop that offset them was never passed),
|
|
43
|
-
* so stacked toasts painted on top of each other. A single region stacking
|
|
44
|
-
* cards with flex-col gap makes the order self-evident and keeps the
|
|
45
|
-
* z-index ladder in exactly one place (Toast z-40, under Modal z-50).
|
|
46
|
-
*/
|
|
47
|
-
return (React.createElement("div", { "data-testid": "toast-region", "aria-live": "assertive", className: "pointer-events-none fixed z-40 top-0 left-0 right-0 flex items-end px-4 py-6 sm:items-start sm:p-6" },
|
|
48
|
-
React.createElement("div", { className: "flex w-full flex-col items-center gap-4 sm:items-end" }, currentToasts.map((entry) => {
|
|
49
|
-
return (React.createElement(Toast, { key: entry.id, title: entry.toast.title, description: entry.toast.description, type: entry.toast.type, icon: entry.toast.icon, onClose: entry.onClose }));
|
|
50
|
-
}))));
|
|
51
|
-
};
|
|
52
|
-
export default ToastLayout;
|
|
53
|
-
//# sourceMappingURL=ToastInit.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToastInit.js","sourceRoot":"","sources":["../../../../../UI/Components/Toast/ToastInit.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,SAAS,EACT,MAAM,GACP,MAAM,OAAO,CAAC;AACf,OAAO,KAAgD,MAAM,SAAS,CAAC;AACvE,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAIpD,MAAM,CAAC,MAAM,qBAAqB,GAAkC,CAClE,KAA0B,EACpB,EAAE;IACR,YAAY,CAAC,aAAa,CAAC,OAAO,EAAE,KAAY,CAAC,CAAC;AACpD,CAAC,CAAC;AAmBF,MAAM,WAAW,GAAsB,GAAiB,EAAE;IACxD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CACtD,EAAE,CACH,CAAC;IACF,MAAM,cAAc,GAAmC,MAAM,CAAS,CAAC,CAAC,CAAC;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,oBAAoB,GAAiC,CACzD,KAAkB,EACZ,EAAE;YACR,MAAM,KAAK,GAAwB,KAAK,CAAC,MAAM,CAAC;YAChD,MAAM,EAAE,GAAW,cAAc,CAAC,OAAO,CAAC;YAC1C,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC;YAE5B,gEAAgE;YAChE,MAAM,OAAO,GAAe,GAAS,EAAE;gBACrC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClB,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC;gBAED,gBAAgB,CAAC,CAAC,MAAyB,EAAE,EAAE;oBAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAqB,EAAE,EAAE;wBAC7C,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;oBAC7B,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF;;;;eAIG;YACH,gBAAgB,CAAC,CAAC,MAAyB,EAAE,EAAE;gBAC7C,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAE7D,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;;;;OAMG;IACH,OAAO,CACL,4CACc,cAAc,eAChB,WAAW,EACrB,SAAS,EAAC,oGAAoG;QAE9G,6BAAK,SAAS,EAAC,sDAAsD,IAClE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAiB,EAAE,EAAE;YACvC,OAAO,CACL,oBAAC,KAAK,IACJ,GAAG,EAAE,KAAK,CAAC,EAAE,EACb,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EACxB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EACpC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EACtB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EACtB,OAAO,EAAE,KAAK,CAAC,OAAO,GACtB,CACH,CAAC;QACJ,CAAC,CAAC,CACE,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
|