@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
|
@@ -19,6 +19,10 @@ import buildQueryFromFilterData, {
|
|
|
19
19
|
sanitizeFilterData,
|
|
20
20
|
} from "./FilterDataToQuery";
|
|
21
21
|
import PermissionUtil from "../../Utils/Permission";
|
|
22
|
+
import PermissionGate, {
|
|
23
|
+
ModelAction,
|
|
24
|
+
PermissionGateResult,
|
|
25
|
+
} from "../../Utils/PermissionGate";
|
|
22
26
|
import ProjectUtil from "../../Utils/Project";
|
|
23
27
|
import User from "../../Utils/User";
|
|
24
28
|
import ActionButtonSchema from "../ActionButton/ActionButtonSchema";
|
|
@@ -389,6 +393,45 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
389
393
|
|
|
390
394
|
const model: TBaseModel = new props.modelType();
|
|
391
395
|
|
|
396
|
+
/*
|
|
397
|
+
* How a create / update / delete affordance should be rendered for this
|
|
398
|
+
* viewer. A user without the permission used to simply not see the button,
|
|
399
|
+
* which reads as "this feature does not exist" - and on the flows that route
|
|
400
|
+
* to a dedicated create page it did not even do that: the page opened, the
|
|
401
|
+
* form submitted, and the API refused it with a validation error about a
|
|
402
|
+
* field the user was never shown (issue #3306). The button now stays put and
|
|
403
|
+
* says which permission is missing.
|
|
404
|
+
*
|
|
405
|
+
* `show: false` is reserved for the two cases where there is nothing honest
|
|
406
|
+
* to say - the permission snapshot has not arrived yet, or the model has no
|
|
407
|
+
* permissions declared for the operation at all.
|
|
408
|
+
*/
|
|
409
|
+
interface ActionGate {
|
|
410
|
+
show: boolean;
|
|
411
|
+
disabled: boolean;
|
|
412
|
+
tooltip: string | undefined;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
type GetActionGateFunction = (action: ModelAction) => ActionGate;
|
|
416
|
+
|
|
417
|
+
const getActionGate: GetActionGateFunction = (
|
|
418
|
+
action: ModelAction,
|
|
419
|
+
): ActionGate => {
|
|
420
|
+
const result: PermissionGateResult = PermissionGate.check(model, action, {
|
|
421
|
+
singularName: props.singularName || model.singularName || undefined,
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
if (result.isAllowed) {
|
|
425
|
+
return { show: true, disabled: false, tooltip: undefined };
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (result.disabledReason) {
|
|
429
|
+
return { show: true, disabled: true, tooltip: result.disabledReason };
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return { show: false, disabled: false, tooltip: undefined };
|
|
433
|
+
};
|
|
434
|
+
|
|
392
435
|
const [bulkSelectedItems, setBulkSelectedItems] = useState<Array<TBaseModel>>(
|
|
393
436
|
[],
|
|
394
437
|
);
|
|
@@ -1247,30 +1290,22 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
1247
1290
|
}
|
|
1248
1291
|
}
|
|
1249
1292
|
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1293
|
+
/*
|
|
1294
|
+
* The column has to exist for a locked Edit / Delete button to have
|
|
1295
|
+
* somewhere to live, so it follows what the table author asked for rather
|
|
1296
|
+
* than what this particular viewer is allowed to do. View is the exception
|
|
1297
|
+
* - a disabled "View X" on a row would confirm a record the viewer is not
|
|
1298
|
+
* allowed to know about - so it still disappears without read permission.
|
|
1299
|
+
*/
|
|
1300
|
+
const showActionsColumn: boolean = Boolean(
|
|
1301
|
+
(props.isDeleteable && getActionGate(ModelAction.Delete).show) ||
|
|
1302
|
+
(props.isEditable && getActionGate(ModelAction.Update).show) ||
|
|
1303
|
+
(props.isViewable &&
|
|
1304
|
+
PermissionGate.check(model, ModelAction.Read).isAllowed) ||
|
|
1258
1305
|
(props.actionButtons && props.actionButtons.length > 0) ||
|
|
1259
1306
|
props.showViewIdButton,
|
|
1260
1307
|
);
|
|
1261
1308
|
|
|
1262
|
-
if (User.isMasterAdmin()) {
|
|
1263
|
-
if (
|
|
1264
|
-
(props.actionButtons && props.actionButtons.length > 0) ||
|
|
1265
|
-
props.showViewIdButton ||
|
|
1266
|
-
props.isDeleteable ||
|
|
1267
|
-
props.isEditable ||
|
|
1268
|
-
props.isViewable
|
|
1269
|
-
) {
|
|
1270
|
-
showActionsColumn = true;
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
|
|
1274
1309
|
if (showActionsColumn) {
|
|
1275
1310
|
columns.push({
|
|
1276
1311
|
title: tx("Actions"),
|
|
@@ -2126,22 +2161,19 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2126
2161
|
headerbuttons = [...headerbuttons, ...props.cardProps.buttons];
|
|
2127
2162
|
}
|
|
2128
2163
|
|
|
2129
|
-
const
|
|
2130
|
-
PermissionUtil.getAllPermissions();
|
|
2131
|
-
|
|
2132
|
-
let hasPermissionToCreate: boolean = false;
|
|
2133
|
-
|
|
2134
|
-
if (permissions) {
|
|
2135
|
-
hasPermissionToCreate =
|
|
2136
|
-
model.hasCreatePermissions(permissions) || User.isMasterAdmin();
|
|
2137
|
-
}
|
|
2164
|
+
const createGate: ActionGate = getActionGate(ModelAction.Create);
|
|
2138
2165
|
|
|
2139
2166
|
const showFilterButton: boolean = props.filters.length > 0;
|
|
2140
2167
|
|
|
2141
|
-
|
|
2168
|
+
/*
|
|
2169
|
+
* because ordered list add button is inside the table and not on the card
|
|
2170
|
+
* header. Without create permission the button is shown locked rather than
|
|
2171
|
+
* removed, so the user can see the action exists and read why it is not
|
|
2172
|
+
* available to them.
|
|
2173
|
+
*/
|
|
2142
2174
|
if (
|
|
2143
2175
|
props.isCreateable &&
|
|
2144
|
-
|
|
2176
|
+
createGate.show &&
|
|
2145
2177
|
showAs !== ShowAs.OrderedStatesList
|
|
2146
2178
|
) {
|
|
2147
2179
|
headerbuttons.push({
|
|
@@ -2151,7 +2183,13 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2151
2183
|
buttonStyle: ButtonStyleType.NORMAL,
|
|
2152
2184
|
buttonSize: ButtonSize.Normal,
|
|
2153
2185
|
className: "",
|
|
2186
|
+
disabled: createGate.disabled,
|
|
2187
|
+
tooltip: createGate.tooltip,
|
|
2154
2188
|
onClick: () => {
|
|
2189
|
+
if (createGate.disabled) {
|
|
2190
|
+
return;
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2155
2193
|
if (props.onCreateClick) {
|
|
2156
2194
|
props.onCreateClick();
|
|
2157
2195
|
return;
|
|
@@ -2346,8 +2384,14 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2346
2384
|
|
|
2347
2385
|
const getUserPermissions: GetUserPermissionsFunction =
|
|
2348
2386
|
(): Array<Permission> => {
|
|
2349
|
-
|
|
2350
|
-
|
|
2387
|
+
/*
|
|
2388
|
+
* A copy - Public is appended below, and pushing into the array the util
|
|
2389
|
+
* handed back mutates the snapshot every other permission check on the
|
|
2390
|
+
* page reads from.
|
|
2391
|
+
*/
|
|
2392
|
+
let userPermissions: Array<Permission> = [
|
|
2393
|
+
...(PermissionUtil.getGlobalPermissions()?.globalPermissions || []),
|
|
2394
|
+
];
|
|
2351
2395
|
if (
|
|
2352
2396
|
PermissionUtil.getProjectPermissions() &&
|
|
2353
2397
|
PermissionUtil.getProjectPermissions()?.permissions &&
|
|
@@ -2490,13 +2534,14 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2490
2534
|
});
|
|
2491
2535
|
}
|
|
2492
2536
|
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
) {
|
|
2537
|
+
const updateGate: ActionGate = getActionGate(ModelAction.Update);
|
|
2538
|
+
|
|
2539
|
+
if (props.isEditable && updateGate.show) {
|
|
2497
2540
|
actionsSchema.push({
|
|
2498
2541
|
title: tx(props.editButtonText || "Edit"),
|
|
2499
2542
|
buttonStyleType: ButtonStyleType.OUTLINE,
|
|
2543
|
+
disabled: updateGate.disabled,
|
|
2544
|
+
tooltip: updateGate.tooltip,
|
|
2500
2545
|
onClick: async (
|
|
2501
2546
|
item: TBaseModel,
|
|
2502
2547
|
onCompleteAction: VoidFunction,
|
|
@@ -2519,14 +2564,15 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2519
2564
|
});
|
|
2520
2565
|
}
|
|
2521
2566
|
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
) {
|
|
2567
|
+
const deleteGate: ActionGate = getActionGate(ModelAction.Delete);
|
|
2568
|
+
|
|
2569
|
+
if (props.isDeleteable && deleteGate.show) {
|
|
2526
2570
|
actionsSchema.push({
|
|
2527
2571
|
title: tx(props.deleteButtonText || "Delete"),
|
|
2528
2572
|
icon: IconProp.Trash,
|
|
2529
2573
|
buttonStyleType: ButtonStyleType.DANGER_OUTLINE,
|
|
2574
|
+
disabled: deleteGate.disabled,
|
|
2575
|
+
tooltip: deleteGate.tooltip,
|
|
2530
2576
|
onClick: async (
|
|
2531
2577
|
item: TBaseModel,
|
|
2532
2578
|
onCompleteAction: VoidFunction,
|
|
@@ -2723,10 +2769,20 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2723
2769
|
await getFilterDropdownItems();
|
|
2724
2770
|
}}
|
|
2725
2771
|
bulkActions={(() => {
|
|
2726
|
-
const
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2772
|
+
const bulkDeleteGate: ActionGate = getActionGate(ModelAction.Delete);
|
|
2773
|
+
|
|
2774
|
+
/*
|
|
2775
|
+
* Whether to auto-add the default Delete still follows the model
|
|
2776
|
+
* check alone, exactly as it did before. Folding the master-admin
|
|
2777
|
+
* short circuit in here would grow a row-selection column onto every
|
|
2778
|
+
* table a master admin opens without project permissions - Table
|
|
2779
|
+
* derives those checkboxes from this array being non-empty - which is
|
|
2780
|
+
* a layout change nobody asked for. The gate above still decides
|
|
2781
|
+
* whether the action, once present, is locked and what it says.
|
|
2782
|
+
*/
|
|
2783
|
+
const userCanDelete: boolean = model.hasDeletePermissions(
|
|
2784
|
+
PermissionUtil.getAllPermissions(),
|
|
2785
|
+
);
|
|
2730
2786
|
|
|
2731
2787
|
const sourceButtons: Array<
|
|
2732
2788
|
BulkActionButtonSchema<TBaseModel> | ModalTableBulkDefaultActions
|
|
@@ -2740,6 +2796,11 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2740
2796
|
* per-row Delete button in the Actions column, not bulk operations.
|
|
2741
2797
|
* The confirmation modal is wired up via the schema's confirmMessage
|
|
2742
2798
|
* / confirmTitle below. Skip if the table author already added it.
|
|
2799
|
+
*
|
|
2800
|
+
* Only auto-inject it when the table already offers bulk actions.
|
|
2801
|
+
* Table derives the row checkboxes from this array being non-empty,
|
|
2802
|
+
* so injecting a locked Delete into an otherwise empty array would
|
|
2803
|
+
* grow a selection column onto tables that have never had one.
|
|
2743
2804
|
*/
|
|
2744
2805
|
const alreadyHasDeleteAction: boolean = sourceButtons.some(
|
|
2745
2806
|
(
|
|
@@ -2762,26 +2823,64 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2762
2823
|
return false;
|
|
2763
2824
|
},
|
|
2764
2825
|
);
|
|
2765
|
-
|
|
2826
|
+
|
|
2827
|
+
const canAutoInjectDelete: boolean =
|
|
2828
|
+
userCanDelete ||
|
|
2829
|
+
(bulkDeleteGate.disabled && sourceButtons.length > 0);
|
|
2830
|
+
|
|
2831
|
+
if (canAutoInjectDelete && !alreadyHasDeleteAction) {
|
|
2766
2832
|
sourceButtons.push(ModalTableBulkDefaultActions.Delete);
|
|
2767
2833
|
}
|
|
2768
2834
|
|
|
2769
2835
|
return {
|
|
2770
|
-
buttons: sourceButtons
|
|
2771
|
-
(
|
|
2772
|
-
|
|
2836
|
+
buttons: sourceButtons
|
|
2837
|
+
.map(
|
|
2838
|
+
(
|
|
2839
|
+
action:
|
|
2840
|
+
| BulkActionButtonSchema<TBaseModel>
|
|
2841
|
+
| ModalTableBulkDefaultActions,
|
|
2842
|
+
):
|
|
2773
2843
|
| BulkActionButtonSchema<TBaseModel>
|
|
2774
|
-
| ModalTableBulkDefaultActions
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2844
|
+
| ModalTableBulkDefaultActions
|
|
2845
|
+
| null => {
|
|
2846
|
+
if (action !== ModalTableBulkDefaultActions.Delete) {
|
|
2847
|
+
return action;
|
|
2848
|
+
}
|
|
2849
|
+
|
|
2850
|
+
/*
|
|
2851
|
+
* A table author who asked for the default Delete but whose
|
|
2852
|
+
* viewer cannot delete used to leave the raw enum string in
|
|
2853
|
+
* the array, which then reached BulkUpdateForm as if it were
|
|
2854
|
+
* a button schema. Resolve it here, in every branch.
|
|
2855
|
+
*/
|
|
2856
|
+
if (!bulkDeleteGate.show) {
|
|
2857
|
+
return null;
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
const deleteAction: BulkActionButtonSchema<TBaseModel> =
|
|
2861
|
+
getDeleteBulkAction();
|
|
2862
|
+
|
|
2863
|
+
if (bulkDeleteGate.disabled) {
|
|
2864
|
+
return {
|
|
2865
|
+
...deleteAction,
|
|
2866
|
+
disabled: true,
|
|
2867
|
+
tooltip: bulkDeleteGate.tooltip,
|
|
2868
|
+
};
|
|
2869
|
+
}
|
|
2870
|
+
|
|
2871
|
+
return deleteAction;
|
|
2872
|
+
},
|
|
2873
|
+
)
|
|
2874
|
+
.filter(
|
|
2875
|
+
(
|
|
2876
|
+
action:
|
|
2877
|
+
| BulkActionButtonSchema<TBaseModel>
|
|
2878
|
+
| ModalTableBulkDefaultActions
|
|
2879
|
+
| null,
|
|
2880
|
+
): boolean => {
|
|
2881
|
+
return action !== null;
|
|
2882
|
+
},
|
|
2883
|
+
) as Array<BulkActionButtonSchema<TBaseModel>>,
|
|
2785
2884
|
};
|
|
2786
2885
|
})()}
|
|
2787
2886
|
onBulkActionEnd={async () => {
|
|
@@ -2976,7 +3075,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2976
3075
|
await fetchItems();
|
|
2977
3076
|
}}
|
|
2978
3077
|
onCreateNewItem={
|
|
2979
|
-
props.isCreateable
|
|
3078
|
+
props.isCreateable && getActionGate(ModelAction.Create).show
|
|
2980
3079
|
? (order: number) => {
|
|
2981
3080
|
setOrderedStatesListNewItemOrder(order);
|
|
2982
3081
|
setModalType(ModalType.Create);
|
|
@@ -2984,6 +3083,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2984
3083
|
}
|
|
2985
3084
|
: undefined
|
|
2986
3085
|
}
|
|
3086
|
+
createDisabledReason={getActionGate(ModelAction.Create).tooltip}
|
|
2987
3087
|
singularLabel={props.singularName || model.singularName || "Item"}
|
|
2988
3088
|
actionButtons={actionButtonSchema}
|
|
2989
3089
|
getTitleElement={getTitleElement}
|
|
@@ -3637,9 +3737,14 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
3637
3737
|
buttonSize={b.buttonSize}
|
|
3638
3738
|
className={b.className}
|
|
3639
3739
|
onClick={() => {
|
|
3740
|
+
if (b.disabled) {
|
|
3741
|
+
return;
|
|
3742
|
+
}
|
|
3743
|
+
|
|
3640
3744
|
b.onClick?.();
|
|
3641
3745
|
}}
|
|
3642
3746
|
disabled={b.disabled}
|
|
3747
|
+
tooltip={b.tooltip}
|
|
3643
3748
|
icon={b.icon}
|
|
3644
3749
|
shortcutKey={b.shortcutKey}
|
|
3645
3750
|
dataTestId="card-button"
|
|
@@ -3708,6 +3813,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
3708
3813
|
}
|
|
3709
3814
|
}}
|
|
3710
3815
|
isDisabled={b.disabled}
|
|
3816
|
+
tooltip={b.tooltip}
|
|
3711
3817
|
/>
|
|
3712
3818
|
);
|
|
3713
3819
|
},
|
|
@@ -4033,7 +4139,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
4033
4139
|
*/}
|
|
4034
4140
|
{tableColumns.length === 0 && allColumns.length > 0 ? (
|
|
4035
4141
|
<ErrorMessage
|
|
4036
|
-
message={`You are not authorized to view this table. You need any one of these permissions: ${
|
|
4142
|
+
message={`You are not authorized to view this table. You need any one of these permissions: ${PermissionGate.getPermissionTitles(
|
|
4037
4143
|
model.getReadPermissions(),
|
|
4038
4144
|
).join(", ")}`}
|
|
4039
4145
|
/>
|
|
@@ -3,8 +3,10 @@ import API from "../../Utils/API/API";
|
|
|
3
3
|
import ModelImportExportUtil, {
|
|
4
4
|
ImportResult,
|
|
5
5
|
} from "../../Utils/ModelImportExport";
|
|
6
|
-
import
|
|
7
|
-
|
|
6
|
+
import PermissionGate, {
|
|
7
|
+
ModelAction,
|
|
8
|
+
PermissionGateResult,
|
|
9
|
+
} from "../../Utils/PermissionGate";
|
|
8
10
|
import { FormType, ModelField } from "../Forms/ModelForm";
|
|
9
11
|
import ModelFormModal from "../ModelFormModal/ModelFormModal";
|
|
10
12
|
import BaseModelTable, {
|
|
@@ -28,7 +30,6 @@ import Dictionary from "../../../Types/Dictionary";
|
|
|
28
30
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
29
31
|
import { JSONObject } from "../../../Types/JSON";
|
|
30
32
|
import ObjectID from "../../../Types/ObjectID";
|
|
31
|
-
import Permission from "../../../Types/Permission";
|
|
32
33
|
import React, { ReactElement, useState } from "react";
|
|
33
34
|
import Query from "../../../Types/BaseDatabase/Query";
|
|
34
35
|
import GroupBy from "../../../Types/BaseDatabase/GroupBy";
|
|
@@ -129,14 +130,13 @@ const ModelTable: <TBaseModel extends BaseModel>(
|
|
|
129
130
|
buttons: [...(props.bulkActions?.buttons || []), getExportBulkAction()],
|
|
130
131
|
};
|
|
131
132
|
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
/* Importing writes new records, so it is gated on create permission. */
|
|
134
|
+
const createGate: PermissionGateResult = PermissionGate.check(
|
|
135
|
+
model,
|
|
136
|
+
ModelAction.Create,
|
|
137
|
+
);
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
? model.hasCreatePermissions(permissions) || User.isMasterAdmin()
|
|
137
|
-
: false;
|
|
138
|
-
|
|
139
|
-
if (hasPermissionToCreate) {
|
|
139
|
+
if (createGate.isAllowed || createGate.disabledReason) {
|
|
140
140
|
cardProps = {
|
|
141
141
|
...(props.cardProps || {}),
|
|
142
142
|
buttons: [
|
|
@@ -145,7 +145,13 @@ const ModelTable: <TBaseModel extends BaseModel>(
|
|
|
145
145
|
title: "Import JSON",
|
|
146
146
|
buttonStyle: ButtonStyleType.OUTLINE,
|
|
147
147
|
icon: IconProp.Upload,
|
|
148
|
+
disabled: !createGate.isAllowed,
|
|
149
|
+
tooltip: createGate.disabledReason,
|
|
148
150
|
onClick: () => {
|
|
151
|
+
if (!createGate.isAllowed) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
149
155
|
setShowImportModal(true);
|
|
150
156
|
},
|
|
151
157
|
},
|
|
@@ -56,6 +56,19 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
56
56
|
props: ComponentProps<T>,
|
|
57
57
|
): ReactElement => {
|
|
58
58
|
const [error, setError] = useState<string>("");
|
|
59
|
+
/*
|
|
60
|
+
* Kept apart from `error` because the two deserve different treatment.
|
|
61
|
+
* `error` is the result of something the user asked for - deleting a view -
|
|
62
|
+
* and is worth a modal. This one is the mount-time list fetch, which every
|
|
63
|
+
* table in the product runs whether or not anybody went looking for a saved
|
|
64
|
+
* view, so it must not put a dialog over a page the user came to read.
|
|
65
|
+
*
|
|
66
|
+
* Issue #3305 was that dialog: one permission list that a domain-scoped role
|
|
67
|
+
* could not satisfy, and every table in the dashboard opened onto
|
|
68
|
+
* "Something went wrong...". The permission list is fixed; this makes the
|
|
69
|
+
* next such gap cost the control rather than the page.
|
|
70
|
+
*/
|
|
71
|
+
const [loadError, setLoadError] = useState<string>("");
|
|
59
72
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
60
73
|
const [allTableViews, setAllTableViews] = useState<Array<TableView>>([]);
|
|
61
74
|
const [tableViewToDelete, setTableViewToDelete] = useState<
|
|
@@ -79,7 +92,7 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
79
92
|
// load all the filters for this user and for this project.
|
|
80
93
|
const fetchTableViews: PromiseVoidFunction = async (): Promise<void> => {
|
|
81
94
|
try {
|
|
82
|
-
|
|
95
|
+
setLoadError("");
|
|
83
96
|
setIsLoading(true);
|
|
84
97
|
|
|
85
98
|
const tableViews: ListResult<TableView> = await ModelAPI.getList({
|
|
@@ -106,7 +119,8 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
106
119
|
|
|
107
120
|
setAllTableViews(tableViews.data);
|
|
108
121
|
} catch (err) {
|
|
109
|
-
|
|
122
|
+
setAllTableViews([]);
|
|
123
|
+
setLoadError(API.getFriendlyErrorMessage(err as Error));
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
setIsLoading(false);
|
|
@@ -138,7 +152,7 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
138
152
|
|
|
139
153
|
useEffect(() => {
|
|
140
154
|
fetchTableViews().catch((err: Error) => {
|
|
141
|
-
|
|
155
|
+
setLoadError(API.getFriendlyErrorMessage(err as Error));
|
|
142
156
|
});
|
|
143
157
|
}, []);
|
|
144
158
|
|
|
@@ -250,9 +264,22 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
250
264
|
|
|
251
265
|
const elements: Array<ReactElement> = [];
|
|
252
266
|
|
|
267
|
+
/*
|
|
268
|
+
* Say why the list is empty rather than showing an empty menu. The reason
|
|
269
|
+
* lives inside the control it belongs to, so the rest of the page is
|
|
270
|
+
* untouched.
|
|
271
|
+
*/
|
|
272
|
+
if (loadError) {
|
|
273
|
+
elements.push(
|
|
274
|
+
<MoreMenuSection title="Saved Views" key={"saved-views-error"}>
|
|
275
|
+
<div className="px-3 pb-2 text-sm text-red-600">{loadError}</div>
|
|
276
|
+
</MoreMenuSection>,
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
253
280
|
if (allTableViews.length > 0) {
|
|
254
281
|
elements.push(
|
|
255
|
-
<MoreMenuSection title="Saved Views">
|
|
282
|
+
<MoreMenuSection title="Saved Views" key={"saved-views"}>
|
|
256
283
|
{getViewItems()}
|
|
257
284
|
</MoreMenuSection>,
|
|
258
285
|
);
|
|
@@ -495,6 +522,11 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
495
522
|
}
|
|
496
523
|
};
|
|
497
524
|
|
|
525
|
+
/*
|
|
526
|
+
* Nothing to offer and nothing to say: no saved views, nothing worth saving,
|
|
527
|
+
* and no view applied. A failed load is deliberately not a reason to render -
|
|
528
|
+
* a user who never opens the menu should not be told the menu is broken.
|
|
529
|
+
*/
|
|
498
530
|
if (
|
|
499
531
|
!isLoading &&
|
|
500
532
|
allTableViews.length === 0 &&
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { FunctionComponent, ReactElement } from "react";
|
|
2
2
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
3
3
|
import Icon from "../Icon/Icon";
|
|
4
|
+
import Tooltip from "../Tooltip/Tooltip";
|
|
4
5
|
|
|
5
6
|
export interface ComponentProps {
|
|
6
7
|
icon?: IconProp | undefined;
|
|
@@ -10,12 +11,18 @@ export interface ComponentProps {
|
|
|
10
11
|
className?: string | undefined;
|
|
11
12
|
iconClassName?: string | undefined;
|
|
12
13
|
isDisabled?: boolean | undefined;
|
|
14
|
+
/*
|
|
15
|
+
* Shown on hover - the place a locked menu item says why it is locked.
|
|
16
|
+
*/
|
|
17
|
+
tooltip?: string | undefined;
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
const MoreMenuItem: FunctionComponent<ComponentProps> = (
|
|
16
21
|
props: ComponentProps,
|
|
17
22
|
): ReactElement => {
|
|
18
|
-
|
|
23
|
+
const isDisabled: boolean = Boolean(props.isDisabled);
|
|
24
|
+
|
|
25
|
+
const menuItem: ReactElement = (
|
|
19
26
|
/*
|
|
20
27
|
* A button shrink-wraps its content whatever its display type, so the width
|
|
21
28
|
* has to be set explicitly or the hover background stops at the end of the
|
|
@@ -23,11 +30,13 @@ const MoreMenuItem: FunctionComponent<ComponentProps> = (
|
|
|
23
30
|
*/
|
|
24
31
|
<button
|
|
25
32
|
type="button"
|
|
26
|
-
className={`group mx-1 flex w-[calc(100%-0.5rem)] items-center rounded-md px-3 py-2 text-left text-sm text-gray-700 transition-colors duration-100 enabled:cursor-pointer enabled:hover:bg-indigo-50 enabled:hover:text-gray-900 disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
33
|
+
className={`group mx-1 flex w-[calc(100%-0.5rem)] items-center rounded-md px-3 py-2 text-left text-sm text-gray-700 transition-colors duration-100 enabled:cursor-pointer enabled:hover:bg-indigo-50 enabled:hover:text-gray-900 disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
34
|
+
isDisabled && props.tooltip ? "pointer-events-none " : ""
|
|
35
|
+
}${props.className || ""}`}
|
|
27
36
|
role="menuitem"
|
|
28
37
|
tabIndex={-1}
|
|
29
|
-
disabled={
|
|
30
|
-
aria-disabled={
|
|
38
|
+
disabled={isDisabled}
|
|
39
|
+
aria-disabled={isDisabled}
|
|
31
40
|
onClick={() => {
|
|
32
41
|
props.onClick();
|
|
33
42
|
}}
|
|
@@ -44,6 +53,29 @@ const MoreMenuItem: FunctionComponent<ComponentProps> = (
|
|
|
44
53
|
</div>
|
|
45
54
|
</button>
|
|
46
55
|
);
|
|
56
|
+
|
|
57
|
+
if (!props.tooltip) {
|
|
58
|
+
return menuItem;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* A disabled control dispatches no pointer events, so the tooltip has to
|
|
63
|
+
* hang off a wrapper that still receives them. Matches what Button does for
|
|
64
|
+
* the same reason - but tabIndex stays -1 here, because MoreMenu drives
|
|
65
|
+
* focus itself with a roving tabindex and a tabbable wrapper would add a
|
|
66
|
+
* stop it does not know about.
|
|
67
|
+
*/
|
|
68
|
+
if (isDisabled) {
|
|
69
|
+
return (
|
|
70
|
+
<Tooltip text={props.tooltip}>
|
|
71
|
+
<span className="flex w-full" tabIndex={-1}>
|
|
72
|
+
{menuItem}
|
|
73
|
+
</span>
|
|
74
|
+
</Tooltip>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return <Tooltip text={props.tooltip}>{menuItem}</Tooltip>;
|
|
47
79
|
};
|
|
48
80
|
|
|
49
81
|
export default MoreMenuItem;
|
|
@@ -103,7 +103,13 @@ const Item: ItemFunction = <T extends GenericObject>(
|
|
|
103
103
|
icon={button.icon}
|
|
104
104
|
buttonStyle={button.buttonStyleType}
|
|
105
105
|
isLoading={isButtonLoading[i]}
|
|
106
|
+
disabled={button.disabled}
|
|
107
|
+
tooltip={button.tooltip}
|
|
106
108
|
onClick={() => {
|
|
109
|
+
if (button.disabled) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
107
113
|
if (button.onClick) {
|
|
108
114
|
isButtonLoading[i] = true;
|
|
109
115
|
setIsButtonLoading(isButtonLoading);
|