@oneuptime/common 12.0.15 → 12.0.16
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/Index.ts +10 -0
- package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
- package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
- package/Models/AnalyticsModels/Span.ts +29 -1
- package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
- package/Models/DatabaseModels/Alert.ts +42 -0
- package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
- package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
- package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
- package/Models/DatabaseModels/DetectionRule.ts +487 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
- package/Models/DatabaseModels/Incident.ts +42 -0
- package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
- package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Index.ts +20 -0
- package/Models/DatabaseModels/Label.ts +11 -0
- package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
- package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
- package/Models/DatabaseModels/LogSavedView.ts +87 -0
- package/Models/DatabaseModels/MarketingConversion.ts +210 -8
- package/Models/DatabaseModels/MetricSavedView.ts +59 -0
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Probe.ts +21 -0
- package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
- package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
- package/Models/DatabaseModels/TableView.ts +15 -0
- package/Models/DatabaseModels/Team.ts +13 -0
- package/Models/DatabaseModels/TeamMember.ts +8 -0
- package/Models/DatabaseModels/TraceSavedView.ts +52 -0
- package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
- package/Server/API/TelemetryAPI.ts +252 -6
- package/Server/API/UserAPI.ts +88 -0
- package/Server/EnvironmentConfig.ts +36 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/IdentityRateLimit.ts +672 -0
- package/Server/Services/AccessTokenService.ts +15 -2
- package/Server/Services/AlertMeasurementService.ts +302 -0
- package/Server/Services/AlertMeasurementValueService.ts +508 -0
- package/Server/Services/AlertService.ts +50 -0
- package/Server/Services/AlertStateTimelineService.ts +54 -0
- package/Server/Services/DetectionRuleService.ts +74 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
- package/Server/Services/IncidentMeasurementService.ts +304 -0
- package/Server/Services/IncidentMeasurementValueService.ts +523 -0
- package/Server/Services/IncidentService.ts +51 -0
- package/Server/Services/IncidentStateTimelineService.ts +54 -0
- package/Server/Services/Index.ts +30 -0
- package/Server/Services/LlmCostBudgetService.ts +93 -0
- package/Server/Services/LlmModelPriceService.ts +202 -0
- package/Server/Services/LogAggregationService.ts +1106 -2
- package/Server/Services/LogCountBaselineService.ts +163 -0
- package/Server/Services/MutableMetricService.ts +30 -9
- package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
- package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
- package/Server/Services/ScheduledMaintenanceService.ts +53 -0
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
- package/Server/Services/SecurityEventService.ts +104 -0
- package/Server/Services/SpanCountBaselineService.ts +173 -0
- package/Server/Services/StatusPageService.ts +4 -3
- package/Server/Services/TelemetryUsageBillingService.ts +17 -2
- package/Server/Services/UserService.ts +284 -51
- package/Server/Services/UserTotpAuthService.ts +27 -86
- package/Server/Services/UserWebAuthnService.ts +26 -86
- package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
- package/Server/Types/Database/QueryHelper.ts +1 -1
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Toolbox/Index.ts +6 -0
- package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
- package/Server/Utils/Attribution.ts +130 -34
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +98 -16
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +70 -7
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +54 -16
- package/Server/Utils/Marketing/Providers/Meta.ts +52 -18
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +37 -10
- package/Server/Utils/Marketing/Providers/Reddit.ts +45 -15
- package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
- package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
- package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
- package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
- package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/DataToProcess.ts +2 -0
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
- package/Server/Utils/Monitor/MonitorResource.ts +16 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +548 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
- package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
- package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
- package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
- package/Server/Utils/UserPermission/UserPermission.ts +57 -1
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
- package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
- package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
- package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
- package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
- package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
- package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
- package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
- package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
- package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
- package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
- package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
- package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
- package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
- package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
- package/Tests/Server/Utils/Attribution.test.ts +228 -1
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +153 -92
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +123 -6
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
- package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
- package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
- package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
- package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
- package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
- package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
- package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
- package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
- package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +660 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
- package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
- package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
- package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
- package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
- package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
- package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
- package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
- package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
- package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
- package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
- package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
- package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
- package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
- package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
- package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
- package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
- package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
- package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
- package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
- package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
- package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +285 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
- package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
- package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
- package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
- package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
- package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
- package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
- package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
- package/Types/AI/AIChatTypes.ts +1 -0
- package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
- package/Types/Alerts/AlertStateRole.ts +11 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
- package/Types/Dashboard/Chart/ChartType.ts +1 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
- package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
- package/Types/Incident/IncidentStateRole.ts +14 -0
- package/Types/Marketing/Attribution.ts +75 -0
- package/Types/Marketing/MarketingConversion.ts +37 -7
- package/Types/Measurement/MeasurementAggregationType.ts +43 -0
- package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
- package/Types/Measurement/MeasurementOccurrence.ts +14 -0
- package/Types/Measurement/MeasurementStatus.ts +34 -0
- package/Types/MeteredPlan/ProductType.ts +1 -0
- package/Types/Monitor/CriteriaFilter.ts +3 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
- package/Types/Monitor/MonitorStep.ts +28 -0
- package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
- package/Types/Monitor/MonitorType.ts +20 -0
- package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
- package/Types/Permission.ts +399 -2
- package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
- package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
- package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
- package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
- package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
- package/Types/SecurityEvent/SigmaRule.ts +70 -0
- package/Types/Telemetry/LlmConventions.ts +20 -1
- package/Types/Telemetry/LlmCostCatalog.ts +557 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
- package/Types/Telemetry/TelemetryType.ts +1 -0
- package/Types/TwoFactorAuthStatus.ts +42 -0
- package/Types/UserAuthenticationStatus.ts +18 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
- package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
- package/UI/Components/Button/Button.tsx +37 -2
- package/UI/Components/Card/Card.tsx +6 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
- package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
- package/UI/Components/Forms/ModelForm.tsx +54 -2
- package/UI/Components/List/ListRow.tsx +6 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
- package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
- package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
- package/UI/Components/ModelList/ModelList.tsx +21 -2
- package/UI/Components/ModelList/StaticModelList.tsx +11 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
- package/UI/Components/ModelTable/ModelTable.tsx +16 -10
- package/UI/Components/ModelTable/TableView.tsx +36 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
- package/UI/Components/OrderedStatesList/Item.tsx +6 -0
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
- package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
- package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
- package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
- package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
- package/UI/Components/Table/TableRow.tsx +12 -0
- package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
- package/UI/Types/UseComponentOutsideClick.ts +47 -0
- package/UI/Utils/PermissionGate.ts +277 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
- package/Utils/Dashboard/Components/Index.ts +14 -0
- package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
- package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +93 -11
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
- package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
- package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
- package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
- package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
- package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
- package/Utils/Telemetry/CrossSignalScope.ts +46 -9
- package/Utils/Telemetry/LogErrorPattern.ts +350 -0
- package/build/dist/Models/AnalyticsModels/Index.js +10 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Span.js +24 -1
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Alert.js +43 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +517 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +43 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +20 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Label.js +11 -0
- package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +224 -8
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +21 -0
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +15 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Team.js +13 -0
- package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
- package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +136 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +75 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.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/IdentityRateLimit.js +491 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AccessTokenService.js +13 -2
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
- package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +37 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +50 -0
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/IncidentService.js +41 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +30 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
- package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
- package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
- package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +709 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
- package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/MutableMetricService.js +28 -9
- package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +64 -0
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageService.js +4 -3
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +262 -42
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
- package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.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 +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +77 -33
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +46 -9
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +52 -8
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +41 -17
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +42 -18
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +24 -11
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +34 -15
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.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 +12 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +10 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +1 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
- package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
- package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
- package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +68 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -0
- package/build/dist/Types/Marketing/MarketingConversion.js +36 -7
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
- package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
- package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +17 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +19 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +347 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
- package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
- package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
- package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
- package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
- package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +40 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -1
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +8 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
- package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +164 -0
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +51 -10
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
- package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
- package/package.json +3 -1
|
@@ -2,6 +2,7 @@ import ActionButtonSchema from "../ActionButton/ActionButtonSchema";
|
|
|
2
2
|
import ErrorMessage from "../ErrorMessage/ErrorMessage";
|
|
3
3
|
import Icon, { SizeProp } from "../Icon/Icon";
|
|
4
4
|
import Item from "./Item";
|
|
5
|
+
import Tooltip from "../Tooltip/Tooltip";
|
|
5
6
|
import Skeleton from "../Skeleton/Skeleton";
|
|
6
7
|
import GenericObject from "../../../Types/GenericObject";
|
|
7
8
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
@@ -10,6 +11,12 @@ import React, { ReactElement } from "react";
|
|
|
10
11
|
export interface ComponentProps<T extends GenericObject> {
|
|
11
12
|
data: Array<T>;
|
|
12
13
|
onCreateNewItem?: ((order: number) => void) | undefined;
|
|
14
|
+
/*
|
|
15
|
+
* When set, the "Add New" affordances stay on screen but do nothing, and
|
|
16
|
+
* hovering one explains why - the same treatment a locked Create button
|
|
17
|
+
* gets on every other table.
|
|
18
|
+
*/
|
|
19
|
+
createDisabledReason?: string | undefined;
|
|
13
20
|
noItemsMessage?: string | ReactElement | undefined;
|
|
14
21
|
error?: string | undefined;
|
|
15
22
|
isLoading?: boolean | undefined;
|
|
@@ -40,6 +47,58 @@ const OrderedStatesList: OrderedStatesListFunction = <T extends GenericObject>(
|
|
|
40
47
|
const isRefetchingWithData: boolean =
|
|
41
48
|
Boolean(props.isLoading) && props.data.length > 0;
|
|
42
49
|
|
|
50
|
+
const isCreateDisabled: boolean = Boolean(props.createDisabledReason);
|
|
51
|
+
|
|
52
|
+
type RenderAddNewFunction = (
|
|
53
|
+
label: string,
|
|
54
|
+
order: number,
|
|
55
|
+
className: string,
|
|
56
|
+
contentClassName: string,
|
|
57
|
+
) => ReactElement;
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* These are clickable <div>s rather than buttons, so "disabled" has to be
|
|
61
|
+
* built by hand: drop the pointer cursor and the hover colours, ignore the
|
|
62
|
+
* click, and hang the reason off a tooltip wrapper.
|
|
63
|
+
*/
|
|
64
|
+
const renderAddNew: RenderAddNewFunction = (
|
|
65
|
+
label: string,
|
|
66
|
+
order: number,
|
|
67
|
+
className: string,
|
|
68
|
+
contentClassName: string,
|
|
69
|
+
): ReactElement => {
|
|
70
|
+
const affordance: ReactElement = (
|
|
71
|
+
<div
|
|
72
|
+
className={`${className} ${
|
|
73
|
+
isCreateDisabled
|
|
74
|
+
? "cursor-not-allowed opacity-50"
|
|
75
|
+
: "cursor-pointer hover:bg-gray-50 hover:text-gray-600"
|
|
76
|
+
}`}
|
|
77
|
+
aria-disabled={isCreateDisabled}
|
|
78
|
+
onClick={() => {
|
|
79
|
+
if (isCreateDisabled) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (props.onCreateNewItem) {
|
|
84
|
+
props.onCreateNewItem(order);
|
|
85
|
+
}
|
|
86
|
+
}}
|
|
87
|
+
>
|
|
88
|
+
<div className={contentClassName}>
|
|
89
|
+
<Icon icon={IconProp.Add} className="m-auto h-5 w-5" />
|
|
90
|
+
<span className="text-sm ml-2">{label}</span>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
if (!props.createDisabledReason) {
|
|
96
|
+
return affordance;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return <Tooltip text={props.createDisabledReason}>{affordance}</Tooltip>;
|
|
100
|
+
};
|
|
101
|
+
|
|
43
102
|
if (props.isLoading && props.data.length === 0) {
|
|
44
103
|
/*
|
|
45
104
|
* Three card-shaped placeholders where the ordered state cards will
|
|
@@ -100,19 +159,12 @@ const OrderedStatesList: OrderedStatesListFunction = <T extends GenericObject>(
|
|
|
100
159
|
)}
|
|
101
160
|
{props.onCreateNewItem && (
|
|
102
161
|
<div className="my-10">
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}}
|
|
110
|
-
>
|
|
111
|
-
<Icon icon={IconProp.Add} className="h-5 w-5" />
|
|
112
|
-
<span className="text-sm ml-2">
|
|
113
|
-
Add New {props.singularLabel}
|
|
114
|
-
</span>
|
|
115
|
-
</div>
|
|
162
|
+
{renderAddNew(
|
|
163
|
+
`Add New ${props.singularLabel}`,
|
|
164
|
+
1,
|
|
165
|
+
"m-auto inline-flex items-center text-gray-400 border rounded-full border-gray-300 p-5",
|
|
166
|
+
"flex items-center",
|
|
167
|
+
)}
|
|
116
168
|
</div>
|
|
117
169
|
)}
|
|
118
170
|
</div>
|
|
@@ -142,23 +194,14 @@ const OrderedStatesList: OrderedStatesListFunction = <T extends GenericObject>(
|
|
|
142
194
|
isBeginning &&
|
|
143
195
|
props.shouldAddItemInTheBeginning && (
|
|
144
196
|
<div className="text-center">
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
}}
|
|
156
|
-
>
|
|
157
|
-
<div className="flex text-center">
|
|
158
|
-
<Icon icon={IconProp.Add} className="m-auto h-5 w-5" />{" "}
|
|
159
|
-
<span className="text-sm ml-2">Add New Item</span>
|
|
160
|
-
</div>
|
|
161
|
-
</div>
|
|
197
|
+
{renderAddNew(
|
|
198
|
+
"Add New Item",
|
|
199
|
+
item[props.orderField]
|
|
200
|
+
? (item[props.orderField] as number) + 1
|
|
201
|
+
: 0,
|
|
202
|
+
"m-auto rounded-full items-center text-gray-400 border border-gray-300 p-5 w-fit",
|
|
203
|
+
"flex text-center",
|
|
204
|
+
)}
|
|
162
205
|
|
|
163
206
|
<div className="items-center m-10 ">
|
|
164
207
|
<Icon
|
|
@@ -189,23 +232,14 @@ const OrderedStatesList: OrderedStatesListFunction = <T extends GenericObject>(
|
|
|
189
232
|
{props.onCreateNewItem &&
|
|
190
233
|
((isEnd && props.shouldAddItemInTheEnd) || !isEnd) && (
|
|
191
234
|
<div className="text-center">
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
}}
|
|
203
|
-
>
|
|
204
|
-
<div className="flex items-center ">
|
|
205
|
-
<Icon icon={IconProp.Add} className="m-auto h-5 w-5" />{" "}
|
|
206
|
-
<span className="text-sm ml-2">Add New Item</span>
|
|
207
|
-
</div>
|
|
208
|
-
</div>
|
|
235
|
+
{renderAddNew(
|
|
236
|
+
"Add New Item",
|
|
237
|
+
item[props.orderField]
|
|
238
|
+
? (item[props.orderField] as number) + 1
|
|
239
|
+
: 0,
|
|
240
|
+
"m-auto items-center text-gray-400 border rounded-full border-gray-300 p-5 w-fit",
|
|
241
|
+
"flex items-center",
|
|
242
|
+
)}
|
|
209
243
|
{!isEnd && (
|
|
210
244
|
<div className="items-center m-10">
|
|
211
245
|
<Icon
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import API from "../../Utils/API/API";
|
|
2
2
|
import ModelAPI from "../../Utils/ModelAPI/ModelAPI";
|
|
3
3
|
import { ButtonStyleType } from "../Button/Button";
|
|
4
|
+
import PermissionGate, {
|
|
5
|
+
ModelAction,
|
|
6
|
+
PermissionGateResult,
|
|
7
|
+
} from "../../Utils/PermissionGate";
|
|
4
8
|
import Card from "../Card/Card";
|
|
5
9
|
import ConfirmModal from "../Modal/ConfirmModal";
|
|
6
10
|
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
@@ -62,6 +66,12 @@ const ResetObjectID: <TBaseModel extends BaseModel>(
|
|
|
62
66
|
const tableColumnName: string =
|
|
63
67
|
tableColumn?.title || (props.fieldName as string);
|
|
64
68
|
|
|
69
|
+
/* Resetting the id writes to the record, so it is an update. */
|
|
70
|
+
const updateGate: PermissionGateResult = PermissionGate.check(
|
|
71
|
+
model,
|
|
72
|
+
ModelAction.Update,
|
|
73
|
+
);
|
|
74
|
+
|
|
65
75
|
return (
|
|
66
76
|
<>
|
|
67
77
|
<Card
|
|
@@ -71,7 +81,13 @@ const ResetObjectID: <TBaseModel extends BaseModel>(
|
|
|
71
81
|
{
|
|
72
82
|
title: `${props.title}`,
|
|
73
83
|
buttonStyle: ButtonStyleType.NORMAL,
|
|
84
|
+
disabled: !updateGate.isAllowed,
|
|
85
|
+
tooltip: updateGate.disabledReason,
|
|
74
86
|
onClick: () => {
|
|
87
|
+
if (!updateGate.isAllowed) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
75
91
|
setShowModal(true);
|
|
76
92
|
},
|
|
77
93
|
isLoading: isLoading,
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
FunctionComponent,
|
|
3
|
+
ReactElement,
|
|
4
|
+
useEffect,
|
|
5
|
+
useMemo,
|
|
6
|
+
useState,
|
|
7
|
+
} from "react";
|
|
8
|
+
import Icon from "../Icon/Icon";
|
|
9
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
10
|
+
import SavedViewsSearchInput from "./SavedViewsSearchInput";
|
|
11
|
+
import SavedViewsShowMoreButton from "./SavedViewsShowMoreButton";
|
|
12
|
+
import {
|
|
13
|
+
SavedViewListItem,
|
|
14
|
+
VisibleSavedViews,
|
|
15
|
+
getVisibleSavedViews,
|
|
16
|
+
shouldShowSavedViewsSearch,
|
|
17
|
+
} from "./SavedViewsList";
|
|
18
|
+
|
|
19
|
+
export interface SavedViewsFacetSectionProps {
|
|
20
|
+
savedViews: Array<SavedViewListItem>;
|
|
21
|
+
selectedSavedViewId?: string | null | undefined;
|
|
22
|
+
onSelect?: ((viewId: string) => void) | undefined;
|
|
23
|
+
/*
|
|
24
|
+
* Toggling the applied view off has to clear it, not re-apply it. Sidebars
|
|
25
|
+
* whose host cannot express "no view" omit this, and clicking the applied
|
|
26
|
+
* row falls back to re-applying it, as it did before.
|
|
27
|
+
*/
|
|
28
|
+
onClear?: (() => void) | undefined;
|
|
29
|
+
title?: string | undefined;
|
|
30
|
+
initialVisibleCount?: number | undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const DEFAULT_TITLE: string = "Saved Views";
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* Issue 3319: the sidebar's saved views were a bare list with no search and no
|
|
37
|
+
* limit, sitting directly above facet sections that have both. Ten views in,
|
|
38
|
+
* the panel is a scroll. This gives the list the same chrome as the facets it
|
|
39
|
+
* lives with — collapse, search, "+N more" — so the sidebar reads as one thing
|
|
40
|
+
* rather than one special case followed by the real controls.
|
|
41
|
+
*/
|
|
42
|
+
const SavedViewsFacetSection: FunctionComponent<SavedViewsFacetSectionProps> = (
|
|
43
|
+
props: SavedViewsFacetSectionProps,
|
|
44
|
+
): ReactElement => {
|
|
45
|
+
const [isExpanded, setIsExpanded] = useState<boolean>(true);
|
|
46
|
+
const [showAll, setShowAll] = useState<boolean>(false);
|
|
47
|
+
const [searchText, setSearchText] = useState<string>("");
|
|
48
|
+
|
|
49
|
+
const title: string = props.title || DEFAULT_TITLE;
|
|
50
|
+
|
|
51
|
+
const showSearch: boolean = shouldShowSavedViewsSearch(
|
|
52
|
+
props.savedViews.length,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* A filter the user cannot see is a filter the user cannot cancel. The list
|
|
57
|
+
* can shrink under a live search — deleting a saved view refetches and
|
|
58
|
+
* re-renders this section in place — and once it drops below the threshold
|
|
59
|
+
* the search box unmounts. Reading the query through the box's own
|
|
60
|
+
* visibility means the surviving views come straight back instead of the
|
|
61
|
+
* section reporting "No matches found" over a list nothing on screen can
|
|
62
|
+
* clear.
|
|
63
|
+
*/
|
|
64
|
+
const activeSearchText: string = showSearch ? searchText : "";
|
|
65
|
+
|
|
66
|
+
// ...and the query itself goes, so re-growing the list cannot resurrect it.
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (!showSearch) {
|
|
69
|
+
setSearchText("");
|
|
70
|
+
}
|
|
71
|
+
}, [showSearch]);
|
|
72
|
+
|
|
73
|
+
const visible: VisibleSavedViews<SavedViewListItem> = useMemo(() => {
|
|
74
|
+
return getVisibleSavedViews<SavedViewListItem>({
|
|
75
|
+
savedViews: props.savedViews,
|
|
76
|
+
searchText: activeSearchText,
|
|
77
|
+
showAll: showAll,
|
|
78
|
+
visibleCount: props.initialVisibleCount,
|
|
79
|
+
selectedSavedViewId: props.selectedSavedViewId,
|
|
80
|
+
});
|
|
81
|
+
}, [
|
|
82
|
+
props.savedViews,
|
|
83
|
+
props.initialVisibleCount,
|
|
84
|
+
props.selectedSavedViewId,
|
|
85
|
+
activeSearchText,
|
|
86
|
+
showAll,
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
const appliedCount: number = props.savedViews.some(
|
|
90
|
+
(view: SavedViewListItem): boolean => {
|
|
91
|
+
return view.id === props.selectedSavedViewId;
|
|
92
|
+
},
|
|
93
|
+
)
|
|
94
|
+
? 1
|
|
95
|
+
: 0;
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<div className="border-b border-gray-100 py-2">
|
|
99
|
+
<button
|
|
100
|
+
type="button"
|
|
101
|
+
className="flex w-full items-center justify-between px-2 py-1 text-left"
|
|
102
|
+
aria-expanded={isExpanded}
|
|
103
|
+
onClick={() => {
|
|
104
|
+
setIsExpanded(!isExpanded);
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<div className="flex items-center gap-1.5">
|
|
108
|
+
<span className="text-[11px] font-semibold uppercase tracking-wider text-gray-500">
|
|
109
|
+
{title}
|
|
110
|
+
</span>
|
|
111
|
+
{appliedCount > 0 && (
|
|
112
|
+
<span className="inline-flex h-4 min-w-[1rem] items-center justify-center rounded-full bg-indigo-100 px-1 text-[10px] font-semibold text-indigo-600">
|
|
113
|
+
{appliedCount}
|
|
114
|
+
</span>
|
|
115
|
+
)}
|
|
116
|
+
</div>
|
|
117
|
+
<Icon
|
|
118
|
+
icon={isExpanded ? IconProp.ChevronDown : IconProp.ChevronRight}
|
|
119
|
+
className="h-3 w-3 text-gray-400"
|
|
120
|
+
/>
|
|
121
|
+
</button>
|
|
122
|
+
|
|
123
|
+
{isExpanded && (
|
|
124
|
+
<div className="mt-1 px-1">
|
|
125
|
+
{showSearch && (
|
|
126
|
+
<div className="mb-1 px-1">
|
|
127
|
+
<SavedViewsSearchInput
|
|
128
|
+
value={searchText}
|
|
129
|
+
label={`Search ${title.toLowerCase()}...`}
|
|
130
|
+
onChange={(text: string) => {
|
|
131
|
+
setSearchText(text);
|
|
132
|
+
}}
|
|
133
|
+
/>
|
|
134
|
+
</div>
|
|
135
|
+
)}
|
|
136
|
+
|
|
137
|
+
{visible.views.map((view: SavedViewListItem) => {
|
|
138
|
+
const isSelected: boolean = view.id === props.selectedSavedViewId;
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<div
|
|
142
|
+
key={view.id}
|
|
143
|
+
className="group flex items-center gap-2 py-0.5"
|
|
144
|
+
>
|
|
145
|
+
<button
|
|
146
|
+
type="button"
|
|
147
|
+
className={`flex min-w-0 flex-1 items-center gap-2 rounded px-1.5 py-0.5 text-left transition-colors ${
|
|
148
|
+
isSelected
|
|
149
|
+
? "bg-indigo-50 ring-1 ring-indigo-200"
|
|
150
|
+
: "hover:bg-gray-50"
|
|
151
|
+
}`}
|
|
152
|
+
/*
|
|
153
|
+
* Spelled out so the row announces as its own name — the
|
|
154
|
+
* "Default" pill beside it is decoration, and a screen
|
|
155
|
+
* reader should hear the word, not a stray badge.
|
|
156
|
+
*/
|
|
157
|
+
aria-label={
|
|
158
|
+
view.isDefault ? `${view.name} (default)` : view.name
|
|
159
|
+
}
|
|
160
|
+
/*
|
|
161
|
+
* The row behaves like a checkbox: clicking the applied
|
|
162
|
+
* view takes it off again rather than silently re-applying
|
|
163
|
+
* what is already on.
|
|
164
|
+
*/
|
|
165
|
+
aria-pressed={isSelected}
|
|
166
|
+
title={
|
|
167
|
+
isSelected
|
|
168
|
+
? `Clear saved view: ${view.name}`
|
|
169
|
+
: `Apply saved view: ${view.name}`
|
|
170
|
+
}
|
|
171
|
+
onClick={() => {
|
|
172
|
+
if (isSelected && props.onClear) {
|
|
173
|
+
props.onClear();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
props.onSelect?.(view.id);
|
|
178
|
+
}}
|
|
179
|
+
>
|
|
180
|
+
{isSelected ? (
|
|
181
|
+
<span className="flex h-3.5 w-3.5 flex-none items-center justify-center rounded bg-indigo-500">
|
|
182
|
+
<Icon
|
|
183
|
+
icon={IconProp.Check}
|
|
184
|
+
className="h-2.5 w-2.5 text-white"
|
|
185
|
+
/>
|
|
186
|
+
</span>
|
|
187
|
+
) : (
|
|
188
|
+
<Icon
|
|
189
|
+
icon={IconProp.Bookmark}
|
|
190
|
+
className="h-3.5 w-3.5 flex-none text-gray-400"
|
|
191
|
+
/>
|
|
192
|
+
)}
|
|
193
|
+
<span
|
|
194
|
+
className={`min-w-0 truncate text-[12px] ${
|
|
195
|
+
isSelected
|
|
196
|
+
? "font-medium text-indigo-700"
|
|
197
|
+
: "text-gray-700"
|
|
198
|
+
}`}
|
|
199
|
+
>
|
|
200
|
+
{view.name}
|
|
201
|
+
</span>
|
|
202
|
+
</button>
|
|
203
|
+
|
|
204
|
+
{view.isDefault && (
|
|
205
|
+
<span
|
|
206
|
+
aria-hidden="true"
|
|
207
|
+
className="flex-none rounded-full bg-amber-100 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-amber-700"
|
|
208
|
+
>
|
|
209
|
+
Default
|
|
210
|
+
</span>
|
|
211
|
+
)}
|
|
212
|
+
</div>
|
|
213
|
+
);
|
|
214
|
+
})}
|
|
215
|
+
|
|
216
|
+
{visible.views.length === 0 && (
|
|
217
|
+
<p className="px-1 py-2 text-[11px] text-gray-400">
|
|
218
|
+
{visible.isSearching ? "No matches found" : "No saved views yet."}
|
|
219
|
+
</p>
|
|
220
|
+
)}
|
|
221
|
+
|
|
222
|
+
{/*
|
|
223
|
+
* A search result is already the whole answer, so neither half of
|
|
224
|
+
* the toggle belongs beside it — "Show less" would collapse rows
|
|
225
|
+
* the user explicitly asked to see. hasMore says so on the list's
|
|
226
|
+
* behalf, and says the same when the list has shrunk to fit.
|
|
227
|
+
*/}
|
|
228
|
+
<SavedViewsShowMoreButton
|
|
229
|
+
hasMore={visible.hasMore}
|
|
230
|
+
hiddenCount={visible.hiddenCount}
|
|
231
|
+
isShowingAll={showAll}
|
|
232
|
+
onToggle={() => {
|
|
233
|
+
setShowAll(!showAll);
|
|
234
|
+
}}
|
|
235
|
+
/>
|
|
236
|
+
</div>
|
|
237
|
+
)}
|
|
238
|
+
</div>
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
export default SavedViewsFacetSection;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Saved views are listed on more than one surface — the logs facet sidebar,
|
|
3
|
+
* the logs toolbar dropdown, and the shared telemetry dropdown that traces and
|
|
4
|
+
* metrics mount. Issue 3319: every one of them rendered the whole list with no
|
|
5
|
+
* way to narrow it, which is fine at two views and unusable at twenty.
|
|
6
|
+
*
|
|
7
|
+
* The facet sections next to them already solved this: search once the list is
|
|
8
|
+
* long enough to need it, and collapse the tail behind "+N more". Those rules
|
|
9
|
+
* live here so all three surfaces behave identically and the behaviour can be
|
|
10
|
+
* tested once, on its own, instead of three times through three renderers.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// The minimum shape every saved-view surface hands to this module.
|
|
14
|
+
export interface SavedViewListItem {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
isDefault?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Below this many views the search box is noise — it costs a row of chrome to
|
|
22
|
+
* filter a list you can already read at a glance. Matches the facet sections'
|
|
23
|
+
* threshold so the two never disagree about when a list is "long".
|
|
24
|
+
*/
|
|
25
|
+
export const SAVED_VIEWS_SEARCH_THRESHOLD: number = 6;
|
|
26
|
+
|
|
27
|
+
// How many rows a collapsed list shows before the "+N more" toggle.
|
|
28
|
+
export const SAVED_VIEWS_DEFAULT_VISIBLE_COUNT: number = 5;
|
|
29
|
+
|
|
30
|
+
export function shouldShowSavedViewsSearch(totalViews: number): boolean {
|
|
31
|
+
return totalViews >= SAVED_VIEWS_SEARCH_THRESHOLD;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* Case-insensitive substring match on the view's name, same as the facet
|
|
36
|
+
* search. Whitespace-only input is not a search: it filters nothing rather
|
|
37
|
+
* than matching nothing.
|
|
38
|
+
*/
|
|
39
|
+
export function filterSavedViewsByName<T extends SavedViewListItem>(
|
|
40
|
+
savedViews: Array<T>,
|
|
41
|
+
searchText: string,
|
|
42
|
+
): Array<T> {
|
|
43
|
+
const query: string = searchText.trim().toLowerCase();
|
|
44
|
+
|
|
45
|
+
if (!query) {
|
|
46
|
+
return savedViews;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return savedViews.filter((view: T): boolean => {
|
|
50
|
+
return (view.name || "").toLowerCase().includes(query);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface GetVisibleSavedViewsInput<T extends SavedViewListItem> {
|
|
55
|
+
savedViews: Array<T>;
|
|
56
|
+
searchText: string;
|
|
57
|
+
showAll: boolean;
|
|
58
|
+
visibleCount?: number | undefined;
|
|
59
|
+
/*
|
|
60
|
+
* The currently applied view, if any. It is pinned into the collapsed slice
|
|
61
|
+
* even when it sorts past the cut, so a user who applied their twentieth
|
|
62
|
+
* view still sees which one is on without expanding the list first.
|
|
63
|
+
*/
|
|
64
|
+
selectedSavedViewId?: string | null | undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface VisibleSavedViews<T extends SavedViewListItem> {
|
|
68
|
+
// The rows to render, in list order.
|
|
69
|
+
views: Array<T>;
|
|
70
|
+
// Everything matching the search, whether or not it is currently shown.
|
|
71
|
+
matchedViews: Array<T>;
|
|
72
|
+
// True while a non-empty search is applied.
|
|
73
|
+
isSearching: boolean;
|
|
74
|
+
// Matching views the list is holding back right now — zero while expanded.
|
|
75
|
+
hiddenCount: number;
|
|
76
|
+
/*
|
|
77
|
+
* Whether the toggle has anything to do at all, in either direction: true
|
|
78
|
+
* when collapsing would hide rows, which is the same question as whether
|
|
79
|
+
* expanding revealed any. Unlike hiddenCount it does not go quiet once the
|
|
80
|
+
* list is expanded, so a consumer can render "Show less" from it and have
|
|
81
|
+
* that control disappear the moment the list is short enough to fit.
|
|
82
|
+
*/
|
|
83
|
+
hasMore: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function getVisibleSavedViews<T extends SavedViewListItem>(
|
|
87
|
+
input: GetVisibleSavedViewsInput<T>,
|
|
88
|
+
): VisibleSavedViews<T> {
|
|
89
|
+
const isSearching: boolean = input.searchText.trim().length > 0;
|
|
90
|
+
const matchedViews: Array<T> = filterSavedViewsByName(
|
|
91
|
+
input.savedViews,
|
|
92
|
+
input.searchText,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* A search is its own filter — collapsing its results behind "+N more"
|
|
97
|
+
* would hide the very rows the user just asked for. Same call the facet
|
|
98
|
+
* sections make, and with nothing held back there is no toggle to offer.
|
|
99
|
+
*/
|
|
100
|
+
if (isSearching) {
|
|
101
|
+
return {
|
|
102
|
+
views: matchedViews,
|
|
103
|
+
matchedViews: matchedViews,
|
|
104
|
+
isSearching: true,
|
|
105
|
+
hiddenCount: 0,
|
|
106
|
+
hasMore: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const visibleCount: number = Math.max(
|
|
111
|
+
0,
|
|
112
|
+
input.visibleCount ?? SAVED_VIEWS_DEFAULT_VISIBLE_COUNT,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const collapsedViews: Array<T> = matchedViews.slice(0, visibleCount);
|
|
116
|
+
|
|
117
|
+
if (input.selectedSavedViewId) {
|
|
118
|
+
const isSelectedVisible: boolean = collapsedViews.some(
|
|
119
|
+
(view: T): boolean => {
|
|
120
|
+
return view.id === input.selectedSavedViewId;
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (!isSelectedVisible) {
|
|
125
|
+
const selectedView: T | undefined = matchedViews.find(
|
|
126
|
+
(view: T): boolean => {
|
|
127
|
+
return view.id === input.selectedSavedViewId;
|
|
128
|
+
},
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (selectedView) {
|
|
132
|
+
collapsedViews.push(selectedView);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* How much the collapsed list holds back — computed whether or not the list
|
|
139
|
+
* is currently expanded, because that is the only honest answer to "would
|
|
140
|
+
* the toggle change anything". Reading it off the expanded state instead is
|
|
141
|
+
* what leaves a "Show less" sitting under a list that already fits: expand a
|
|
142
|
+
* twelve-view list, delete down to four, and the control has nothing left to
|
|
143
|
+
* collapse. Note it counts what a collapse would hide, so a pinned applied
|
|
144
|
+
* view — already on screen — is not counted, and a six-view list whose sixth
|
|
145
|
+
* is applied correctly offers no toggle at all.
|
|
146
|
+
*/
|
|
147
|
+
const hiddenWhenCollapsed: number =
|
|
148
|
+
matchedViews.length - collapsedViews.length;
|
|
149
|
+
const hasMore: boolean = hiddenWhenCollapsed > 0;
|
|
150
|
+
|
|
151
|
+
if (input.showAll) {
|
|
152
|
+
return {
|
|
153
|
+
views: matchedViews,
|
|
154
|
+
matchedViews: matchedViews,
|
|
155
|
+
isSearching: false,
|
|
156
|
+
hiddenCount: 0,
|
|
157
|
+
hasMore: hasMore,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
views: collapsedViews,
|
|
163
|
+
matchedViews: matchedViews,
|
|
164
|
+
isSearching: false,
|
|
165
|
+
hiddenCount: hiddenWhenCollapsed,
|
|
166
|
+
hasMore: hasMore,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { FunctionComponent, ReactElement } from "react";
|
|
2
|
+
|
|
3
|
+
export interface SavedViewsSearchInputProps {
|
|
4
|
+
value: string;
|
|
5
|
+
onChange: (searchText: string) => void;
|
|
6
|
+
// Overrides the default placeholder/accessible name, e.g. per surface.
|
|
7
|
+
label?: string | undefined;
|
|
8
|
+
className?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const DEFAULT_LABEL: string = "Search saved views...";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* One search box, shared by every saved-views surface, so the logs sidebar,
|
|
15
|
+
* the logs dropdown and the telemetry dropdown cannot drift apart in look or
|
|
16
|
+
* in accessible name. Styling deliberately matches the facet sections' search
|
|
17
|
+
* input — the sidebar renders the two side by side.
|
|
18
|
+
*/
|
|
19
|
+
const SavedViewsSearchInput: FunctionComponent<SavedViewsSearchInputProps> = (
|
|
20
|
+
props: SavedViewsSearchInputProps,
|
|
21
|
+
): ReactElement => {
|
|
22
|
+
const label: string = props.label || DEFAULT_LABEL;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<input
|
|
26
|
+
type="text"
|
|
27
|
+
/*
|
|
28
|
+
* A placeholder is not a label: it disappears the moment the user
|
|
29
|
+
* types, taking the field's only description with it. The aria-label
|
|
30
|
+
* carries it for anyone who cannot see the box.
|
|
31
|
+
*/
|
|
32
|
+
aria-label={label}
|
|
33
|
+
placeholder={label}
|
|
34
|
+
value={props.value}
|
|
35
|
+
onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
36
|
+
props.onChange(event.target.value);
|
|
37
|
+
}}
|
|
38
|
+
className={
|
|
39
|
+
props.className ||
|
|
40
|
+
"w-full rounded border border-gray-200 bg-gray-50 px-2 py-1 text-[11px] text-gray-700 placeholder-gray-400 outline-none focus:border-indigo-300 focus:bg-white focus:ring-1 focus:ring-indigo-200"
|
|
41
|
+
}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default SavedViewsSearchInput;
|