From 70a89a7c342dfabbee0756cdeb8e78b8bdeb7558 Mon Sep 17 00:00:00 2001 From: Nikith Sai <53569379+pr1sm8@users.noreply.github.com> Date: Wed, 4 Nov 2026 10:12:58 +0000 Subject: [PATCH] feat(license): gate features by license in the UI (#16233) Co-authored-by: sai nikhil kethe Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Shrinath Rao --- scripts/translations/.translation_state.json | 35 ++ web/src/components/Header.spec.ts | 20 + web/src/components/Header.vue | 63 +++- web/src/components/MenuLink.spec.ts | 32 ++ web/src/components/MenuLink.vue | 23 +- .../components/O2AIChat.navigation.spec.ts | 24 ++ web/src/components/O2AIChat.navigation.ts | 10 + web/src/components/QueryEditor.vue | 2 +- .../ai-assistant/chat/O2AIChatMessage.spec.ts | 44 +++ .../ai-assistant/chat/O2AIChatMessage.vue | 50 ++- .../chat/O2AIChatToolCallBlock.vue | 25 +- .../alertLibrary/LibraryCard.spec.ts | 12 + .../components/alertLibrary/LibraryCard.vue | 31 +- .../alertLibrary/LibraryInstallDialog.spec.ts | 17 + .../AlertCalibrationDigestDetail.spec.ts | 112 ++++++ .../AlertCalibrationDigestDetail.vue | 25 +- web/src/components/alerts/AddAlert.spec.ts | 17 + web/src/components/alerts/AddAlert.vue | 17 +- .../alerts/AlertDestinationsField.vue | 21 +- web/src/components/alerts/AlertList.spec.ts | 78 ++++ web/src/components/alerts/AlertList.vue | 205 +++++++++-- .../alerts/AlertSectionTabs.spec.ts | 56 ++- .../components/alerts/AlertSectionTabs.vue | 73 ++-- .../alerts/AlertTargetsSelect.spec.ts | 17 + .../components/alerts/AlertTargetsSelect.vue | 17 +- .../alerts/AlertsDestinationList.vue | 5 +- .../alerts/CreateAlertAction.spec.ts | 57 ++- .../components/alerts/CreateAlertAction.vue | 64 +++- .../alerts/CreateAlertDialogProvider.spec.ts | 15 + .../alerts/CreateAlertDialogProvider.vue | 13 +- .../alerts/DependencyUsageCell.spec.ts | 13 + .../components/alerts/DependencyUsageCell.vue | 16 +- .../alerts/ExternalAlertSourcesList.vue | 5 +- .../alerts/IncidentDetailDrawer.spec.ts | 51 +++ .../alerts/IncidentDetailDrawer.vue | 44 ++- .../components/alerts/IncidentList.spec.ts | 12 + web/src/components/alerts/IncidentList.vue | 6 +- .../alerts/PipelinesDestinationList.vue | 5 +- web/src/components/alerts/TemplateList.vue | 3 +- .../alerts/downtimes/AddDowntime.spec.ts | 52 +++ .../alerts/downtimes/AddDowntime.vue | 28 +- .../alerts/downtimes/DowntimeDetail.spec.ts | 17 + .../alerts/downtimes/DowntimeDetail.vue | 6 +- .../alerts/downtimes/DowntimeList.spec.ts | 22 ++ .../alerts/downtimes/DowntimeList.vue | 14 +- .../downtimes/DowntimeResourcePicker.spec.ts | 13 + .../downtimes/DowntimeResourcePicker.vue | 5 +- .../downtimes/DowntimeTargetCard.spec.ts | 31 +- .../alerts/downtimes/DowntimeTargetCard.vue | 20 +- .../alerts/rca/RcaBlindSpots.spec.ts | 21 ++ .../components/alerts/rca/RcaBlindSpots.vue | 41 ++- .../alerts/rca/RcaEvidenceCard.spec.ts | 40 ++ .../components/alerts/rca/RcaEvidenceCard.vue | 23 +- .../alerts/rca/RcaVerdictCard.spec.ts | 33 +- .../components/alerts/rca/RcaVerdictCard.vue | 24 +- .../autoobserve/CoverageServiceDrawer.spec.ts | 82 +++++ .../autoobserve/CoverageServiceDrawer.vue | 53 ++- .../components/common/FeatureLockBoundary.vue | 77 ++++ .../components/common/FeatureLockExempt.vue | 30 ++ .../components/common/FeatureLocked.spec.ts | 48 +++ web/src/components/common/FeatureLocked.vue | 42 +++ .../components/common/LicenseDeniedState.vue | 42 +++ web/src/components/common/SectionHub.spec.ts | 58 +++ web/src/components/common/SectionHub.vue | 11 +- web/src/components/common/SectionRail.spec.ts | 58 ++- web/src/components/common/SectionRail.vue | 22 +- .../sidebar/InlineSelectFolderDropdown.vue | 6 +- .../dashboards/AlertContextMenu.spec.ts | 25 ++ .../dashboards/AlertContextMenu.vue | 119 ++++-- .../dashboards/DashboardLogDrawer.spec.ts | 92 +++++ .../dashboards/DashboardLogDrawer.vue | 48 ++- .../dashboards/PanelContainer.spec.ts | 64 ++++ .../components/dashboards/PanelContainer.vue | 27 +- .../PanelEditor/PanelEditor.spec.ts | 25 +- .../dashboards/PanelEditor/PanelEditor.vue | 30 +- .../dashboards/PanelSchemaRenderer.spec.ts | 108 ++++++ .../dashboards/PanelSchemaRenderer.vue | 36 ++ .../dashboards/exemplars/ExemplarCard.spec.ts | 34 ++ .../dashboards/exemplars/ExemplarCard.vue | 30 +- web/src/components/dbm/DbmMetricPanel.spec.ts | 67 ++++ web/src/components/dbm/DbmMetricPanel.vue | 24 +- web/src/components/dbm/DbmRowActions.spec.ts | 54 +++ web/src/components/dbm/DbmRowActions.vue | 46 ++- web/src/components/dbm/DbmSectionTabs.spec.ts | 45 +++ web/src/components/dbm/DbmSectionTabs.vue | 81 ++-- .../components/dbm/DbmSuggestFixButton.vue | 17 +- web/src/components/flow/NodePalette.vue | 2 +- web/src/components/functions/FunctionList.vue | 28 +- .../components/functions/FunctionsToolbar.vue | 2 +- web/src/components/iam/IngestionTokens.vue | 3 +- web/src/components/iam/groups/AppGroups.vue | 3 +- .../components/iam/groups/EditGroup.spec.ts | 21 ++ web/src/components/iam/groups/EditGroup.vue | 3 + web/src/components/iam/quota/Quota.spec.js | 144 ++++++++ web/src/components/iam/quota/Quota.vue | 47 ++- web/src/components/iam/roles/AppRoles.vue | 3 +- web/src/components/iam/roles/EditRole.spec.js | 15 + web/src/components/iam/roles/EditRole.vue | 12 + .../components/iam/roles/RoleSummary.spec.ts | 28 ++ web/src/components/iam/roles/RoleSummary.vue | 17 +- web/src/components/iam/roles/RoleTable.vue | 3 +- .../serviceAccounts/AddServiceAccount.spec.ts | 28 ++ .../iam/serviceAccounts/AddServiceAccount.vue | 99 +++-- .../serviceAccounts/ServiceAccountsList.vue | 14 +- web/src/components/iam/users/AddUser.spec.ts | 14 + web/src/components/iam/users/AddUser.vue | 80 ++-- .../components/iam/users/InvitationList.vue | 5 +- web/src/components/iam/users/User.spec.ts | 34 ++ web/src/components/iam/users/User.vue | 8 +- web/src/components/ingestion/Custom.spec.ts | 40 ++ web/src/components/ingestion/Custom.vue | 100 ++--- .../ingestion/FirstDataNotice.spec.ts | 46 +++ .../components/ingestion/FirstDataNotice.vue | 29 +- .../ingestion/FirstDataPanel.spec.ts | 16 + .../components/ingestion/FirstDataPanel.vue | 30 +- .../ingestion/FirstEventStatus.spec.ts | 25 ++ .../components/ingestion/FirstEventStatus.vue | 52 ++- .../ingestion/FirstSourcePickGroup.vue | 2 + web/src/components/ingestion/McpCrossLink.vue | 24 +- .../components/ingestion/Recommended.spec.ts | 74 ++++ web/src/components/ingestion/Recommended.vue | 64 +++- .../ingestion/ai/McpServerCard.spec.ts | 33 ++ .../components/ingestion/ai/McpServerCard.vue | 31 ++ .../recommended/AWSIntegrationTile.spec.ts | 16 + .../recommended/AWSIntegrationTile.vue | 25 +- .../setupCard/DataSourceSetupCard.spec.ts | 48 ++- .../setupCard/DataSourceSetupCard.vue | 39 +- .../setupCard/SetupCardRenderer.spec.ts | 26 ++ .../ingestion/setupCard/SetupCardRenderer.vue | 14 + .../components/ingestion/setupCard/types.ts | 2 + web/src/components/login/GetStarted.spec.ts | 42 ++- web/src/components/login/GetStarted.vue | 95 +++-- .../login/firstSourceOptions.spec.ts | 14 + .../components/login/firstSourceOptions.ts | 12 + web/src/components/logstream/schema.vue | 2 +- .../components/oncall/OnCallOwnership.spec.ts | 45 +++ web/src/components/oncall/OnCallOwnership.vue | 22 +- .../components/oncall/OnCallPhoneCard.spec.ts | 18 + web/src/components/oncall/OnCallPhoneCard.vue | 6 +- .../components/oncall/OnCallRuleEditor.vue | 27 +- .../components/pipeline/PipelineEditor.vue | 2 +- .../pipeline/PipelineSectionTabs.spec.ts | 95 +++++ .../pipeline/PipelineSectionTabs.vue | 66 ++-- web/src/components/pipeline/PipelinesList.vue | 3 +- .../components/pipelines/BackfillJobsList.vue | 5 +- .../components/pipelines/PipelineHistory.vue | 5 +- web/src/components/queries/RunningQueries.vue | 5 +- .../components/queries/RunningQueriesList.vue | 5 +- web/src/components/queries/SummaryList.vue | 5 +- web/src/components/reports/CreateReport.vue | 30 +- web/src/components/reports/ReportList.vue | 3 +- .../rum/EventDetailDrawerContent.spec.ts | 35 ++ .../rum/EventDetailDrawerContent.vue | 27 +- .../productAnalytics/AnalyticsFunnels.spec.ts | 44 +++ .../rum/productAnalytics/AnalyticsFunnels.vue | 18 +- .../AnalyticsSessionsTable.spec.ts | 86 +++++ .../AnalyticsSessionsTable.vue | 19 +- .../RetentionCellDrawer.spec.ts | 99 +++++ .../productAnalytics/RetentionCellDrawer.vue | 16 + .../rum/productAnalytics/TrendsPanel.spec.ts | 17 + .../rum/productAnalytics/TrendsPanel.vue | 11 +- .../components/settings/AiToolsets.spec.ts | 52 ++- web/src/components/settings/AiToolsets.vue | 18 +- web/src/components/settings/CipherKeys.vue | 3 +- .../settings/CorrelationSettings.spec.ts | 52 ++- .../settings/CorrelationSettings.vue | 43 ++- .../settings/DiscoveredServices.vue | 18 +- .../settings/DomainManagement.spec.ts | 39 ++ .../components/settings/DomainManagement.vue | 26 +- web/src/components/settings/General.vue | 6 +- web/src/components/settings/License.spec.ts | 300 +++++++++++++++ web/src/components/settings/License.vue | 64 +++- .../settings/LicenseFeatures.spec.ts | 103 ++++++ .../components/settings/LicenseFeatures.vue | 229 ++++++++++++ .../settings/LlmProvidersSettings.vue | 11 +- .../components/settings/ModelPricingList.vue | 3 +- web/src/components/settings/Nodes.spec.ts | 36 ++ web/src/components/settings/Nodes.vue | 50 ++- .../settings/OrganizationManagement.spec.ts | 40 +- .../settings/OrganizationManagement.vue | 24 +- .../components/settings/RegexPatternList.vue | 3 +- web/src/components/settings/index.spec.ts | 78 ++++ web/src/components/settings/index.vue | 46 ++- .../components/slos/SloAlertCondition.spec.ts | 15 + web/src/components/slos/SloAlertCondition.vue | 4 +- .../components/slos/SloAlertPreview.spec.ts | 10 + web/src/components/slos/SloAlertPreview.vue | 4 +- .../synthetic-monitoring/MonitorTable.vue | 3 +- .../variables/SyntheticsVariablesList.vue | 3 + .../variables/SyntheticsVariablesTab.spec.ts | 11 + .../variables/SyntheticsVariablesTab.vue | 5 + .../components/workflows/WorkflowEditor.vue | 39 +- web/src/components/workflows/WorkflowRuns.vue | 85 ++--- .../components/workflows/WorkflowsList.vue | 5 +- .../useAlertCalibrationEnabled.spec.ts | 6 + .../useAlertCalibrationEnabled.ts | 7 +- .../alerts/useAlertCreation.spec.ts | 18 + .../composables/alerts/useAlertCreation.ts | 4 + .../alerts/useAlertLibrary.spec.ts | 20 + web/src/composables/alerts/useAlertLibrary.ts | 7 +- .../alerts/useDependencyGraph.spec.ts | 37 ++ .../composables/alerts/useDependencyGraph.ts | 8 +- .../dashboard/usePanelDrilldown.spec.ts | 126 ++++++- .../dashboard/usePanelDrilldown.ts | 38 +- .../composables/dbm/useDbmListPage.spec.ts | 11 + web/src/composables/dbm/useDbmListPage.ts | 7 +- .../downtimes/useDowntimeItems.spec.ts | 75 ++++ .../composables/downtimes/useDowntimeItems.ts | 23 +- .../iam/useRoleEntityLoaders.spec.ts | 56 ++- .../composables/iam/useRoleEntityLoaders.ts | 27 +- .../metrics/useMetricDrilldown.spec.ts | 32 ++ .../composables/metrics/useMetricDrilldown.ts | 16 +- .../composables/rum/useRumSpanBuilder.spec.ts | 14 + web/src/composables/rum/useRumSpanBuilder.ts | 7 +- .../composables/shared/oncallRouteGuard.ts | 5 +- web/src/composables/shared/router.spec.ts | 204 +++++++++++ web/src/composables/shared/router.ts | 103 +++++- .../shared/useEnterpriseRoutes.spec.ts | 77 ++++ .../composables/shared/useEnterpriseRoutes.ts | 136 +++---- .../shared/useIngestionRoutes.spec.ts | 27 ++ .../composables/shared/useIngestionRoutes.ts | 13 +- .../shared/useManagementRoutes.spec.ts | 26 +- .../composables/shared/useManagementRoutes.ts | 124 ++++--- .../useCorrelationDefaultSlug.spec.ts | 15 + .../composables/useCorrelationDefaultSlug.ts | 5 + web/src/composables/useFeatureLock.spec.ts | 318 ++++++++++++++++ web/src/composables/useFeatureLock.ts | 123 +++++++ web/src/composables/useLicenseDenials.spec.ts | 68 ++++ web/src/composables/useLicenseDenials.ts | 46 +++ web/src/composables/useLogs.ts | 8 +- .../composables/useLogs/logsAutoRun.spec.ts | 15 + web/src/composables/useLogs/logsAutoRun.ts | 7 +- web/src/composables/useLogs/logsUtils.ts | 8 +- .../composables/useLogs/useSearchBar.spec.ts | 50 +++ web/src/composables/useLogs/useSearchBar.ts | 8 + .../useLogs/useSearchQuery.spec.ts | 33 +- web/src/composables/useLogs/useSearchQuery.ts | 7 +- .../useLogs/useViewTraceAction.spec.ts | 27 +- .../composables/useLogs/useViewTraceAction.ts | 4 + web/src/composables/useMcpCredential.spec.ts | 46 +++ web/src/composables/useMcpCredential.ts | 6 + web/src/composables/useRateLimiter.ts | 9 +- .../composables/useServiceCorrelation.spec.ts | 15 + web/src/composables/useServiceCorrelation.ts | 3 + .../components/AIObservability/AiScopeBar.vue | 7 +- .../AIObservability/ExperimentForm.vue | 6 +- .../ExperimentRowDetailDrawer.spec.ts | 36 +- .../ExperimentRowDetailDrawer.vue | 53 ++- .../components/billings/plans.spec.ts | 13 + .../enterprise/components/billings/plans.vue | 3 + .../billings/usage/UsageView.spec.ts | 8 + .../components/billings/usage/UsageView.vue | 2 + .../components/onlineEvals/EvalJobList.vue | 3 +- .../components/onlineEvals/QualityPage.vue | 123 ++++--- .../onlineEvals/ScoreConfigList.vue | 3 +- .../components/onlineEvals/ScorerList.vue | 3 +- .../composables/useOnlineEvalsData.ts | 13 +- .../forms/EvalJobDetail.licenseLock.spec.ts | 100 +++++ .../onlineEvals/forms/EvalJobDetail.vue | 40 +- .../quality/QualityScorePane.spec.ts | 25 ++ .../onlineEvals/quality/QualityScorePane.vue | 52 ++- web/src/enterprise/composables/router.spec.ts | 10 + web/src/enterprise/composables/router.ts | 11 +- .../AgentSignalDetailPanel.spec.ts | 62 +++- .../AgentSignalDetailPanel.vue | 28 +- .../views/AIObservability/DatasetsPage.vue | 3 +- .../AIObservability/DiscoveryPage.spec.ts | 34 +- .../views/AIObservability/DiscoveryPage.vue | 95 +++-- .../views/AIObservability/Index.vue | 1 + .../QueueWorkbenchPage.nav.spec.ts | 48 ++- .../AIObservability/QueueWorkbenchPage.vue | 25 +- .../views/AIObservability/QueuesPage.vue | 3 +- .../views/AIObservability/RemoteTasksPage.vue | 5 +- web/src/layouts/MainLayout.nav.spec.ts | 215 ++++++++++- web/src/layouts/MainLayout.spec.ts | 45 +-- web/src/layouts/MainLayout.vue | 270 ++++++++------ web/src/lib/core/Badge/OLockBadge.spec.ts | 22 ++ web/src/lib/core/Badge/OLockBadge.vue | 31 ++ web/src/lib/core/Button/OButton.spec.ts | 54 ++- web/src/lib/core/Button/OButton.vue | 37 +- .../EmptyState/EmptyStateActionCard.spec.ts | 7 + .../core/EmptyState/EmptyStateActionCard.vue | 3 +- .../EmptyStateIngestionChip.spec.ts | 39 ++ .../EmptyState/EmptyStateIngestionChip.vue | 48 ++- web/src/lib/core/Navbar/ONavGroup.spec.ts | 180 ++++++++- web/src/lib/core/Navbar/ONavGroup.vue | 98 +++-- web/src/lib/core/Navbar/ONavbar.types.ts | 9 + web/src/lib/core/Navbar/navGroups.spec.ts | 61 ++++ web/src/lib/core/Navbar/navGroups.ts | 88 ++++- web/src/lib/core/Navbar/useNavGateContext.ts | 2 + web/src/lib/core/PageHeader/OPageHeader.vue | 97 +++-- .../lib/core/PageLayout/OPageLayout.spec.ts | 17 + web/src/lib/core/PageLayout/OPageLayout.vue | 33 +- .../core/PageLayout/OPageLockedBody.spec.ts | 43 +++ .../lib/core/PageLayout/OPageLockedBody.vue | 36 ++ web/src/lib/core/Table/OTable.spec.ts | 9 + web/src/lib/core/Table/OTable.types.ts | 5 +- web/src/lib/core/Table/OTable.vue | 20 +- .../core/ToggleGroup/OToggleGroupItem.spec.ts | 6 + .../lib/core/ToggleGroup/OToggleGroupItem.vue | 43 ++- web/src/lib/feedback/Toast/useToast.ts | 4 + web/src/lib/forms/Checkbox/OCheckbox.vue | 3 +- web/src/lib/forms/Color/OColor.vue | 12 +- web/src/lib/forms/Combobox/OCombobox.vue | 8 +- web/src/lib/forms/Date/ODate.vue | 8 +- .../forms/DateTimeRange/ODateTimeRange.vue | 38 +- .../lib/forms/EmojiPicker/OEmojiPicker.vue | 8 +- web/src/lib/forms/File/OFile.vue | 17 +- web/src/lib/forms/InlineEdit/OInlineEdit.vue | 12 +- web/src/lib/forms/Input/OInput.vue | 11 +- web/src/lib/forms/Input/OTextarea.vue | 9 +- .../lib/forms/OptionGroup/OOptionGroup.vue | 13 +- web/src/lib/forms/Radio/ORadio.vue | 9 +- web/src/lib/forms/Range/ORange.vue | 45 +-- web/src/lib/forms/Select/OSelect.vue | 22 +- web/src/lib/forms/Slider/OSlider.vue | 15 +- web/src/lib/forms/Switch/OSwitch.vue | 21 +- web/src/lib/forms/Time/OTime.vue | 16 +- .../lib/navigation/Pagination/OPagination.vue | 16 +- web/src/lib/navigation/Tabs/OTab.spec.ts | 40 +- web/src/lib/navigation/Tabs/OTab.types.ts | 2 + web/src/lib/navigation/Tabs/OTab.vue | 26 +- .../overlay/ContextMenu/OContextMenuItem.vue | 10 +- .../ODropdownItem.unavailable.spec.ts | 17 + .../lib/overlay/Dropdown/ODropdownItem.vue | 17 +- web/src/lib/styles/tokens/colorMath.spec.ts | 4 +- web/src/lib/styles/tokens/dark.css | 1 + web/src/lib/styles/tokens/semantic.css | 2 + web/src/locales/languages/ar-SA.json | 35 ++ web/src/locales/languages/de-DE.json | 35 ++ web/src/locales/languages/en-US.json | 35 ++ web/src/locales/languages/es-ES.json | 35 ++ web/src/locales/languages/fr-FR.json | 35 ++ web/src/locales/languages/it-IT.json | 35 ++ web/src/locales/languages/ja-JP.json | 35 ++ web/src/locales/languages/ko-KR.json | 35 ++ web/src/locales/languages/nl-NL.json | 35 ++ web/src/locales/languages/pl-PL.json | 35 ++ web/src/locales/languages/pt-PT.json | 35 ++ web/src/locales/languages/ru-RU.json | 35 ++ web/src/locales/languages/th-TH.json | 35 ++ web/src/locales/languages/tr-TR.json | 35 ++ web/src/locales/languages/vi-VN.json | 35 ++ web/src/locales/languages/zh-CN.json | 35 ++ web/src/locales/languages/zh-TW.json | 35 ++ web/src/main.ts | 3 + .../TelemetryCorrelationDashboard.spec.ts | 38 ++ .../TelemetryCorrelationDashboard.vue | 39 +- web/src/plugins/logs/DetailTable.spec.ts | 40 ++ web/src/plugins/logs/DetailTable.vue | 81 ++-- web/src/plugins/logs/Index.autoRun.spec.ts | 10 + web/src/plugins/logs/Index.vue | 16 +- .../plugins/logs/IndexList.typeSwitch.spec.ts | 47 +++ web/src/plugins/logs/IndexList.vue | 32 +- web/src/plugins/logs/JsonPreview.spec.ts | 99 +++++ web/src/plugins/logs/JsonPreview.vue | 96 +++-- .../plugins/logs/SearchBar.regionLock.spec.ts | 83 +++++ .../logs/SearchBar.toolbarSpacing.spec.ts | 26 ++ web/src/plugins/logs/SearchBar.vue | 73 +++- web/src/plugins/logs/SearchHistory.vue | 5 +- web/src/plugins/logs/SearchResult.spec.ts | 9 + web/src/plugins/logs/SearchResult.vue | 4 +- web/src/plugins/logs/SearchSchedulersList.vue | 5 +- web/src/plugins/logs/VisualizeLogsQuery.vue | 6 +- .../patterns/PatternDetailsDialog.spec.ts | 23 ++ .../logs/patterns/PatternDetailsDialog.vue | 26 +- .../plugins/metrics/AddToDashboard.spec.ts | 26 ++ web/src/plugins/metrics/AddToDashboard.vue | 7 +- .../metrics/explorer/MetricBreakdown.spec.ts | 19 + .../metrics/explorer/MetricBreakdown.vue | 28 ++ .../metrics/explorer/MetricDetailView.spec.ts | 36 ++ .../metrics/explorer/MetricDetailView.vue | 44 ++- .../metrics/explorer/MetricUsageList.spec.ts | 15 + .../metrics/explorer/MetricUsageList.vue | 23 +- .../metrics/explorer/MetricsExplorer.spec.ts | 36 +- .../metrics/explorer/MetricsExplorer.vue | 30 +- web/src/plugins/traces/DbSpanDetails.spec.ts | 30 ++ web/src/plugins/traces/DbSpanDetails.vue | 24 +- .../plugins/traces/LLMInsightsDashboard.vue | 37 +- .../traces/ServiceGraphNodeSidePanel.spec.ts | 94 ++++- .../traces/ServiceGraphNodeSidePanel.vue | 152 ++++++-- .../plugins/traces/ServicesCatalog.spec.ts | 11 + web/src/plugins/traces/ServicesCatalog.vue | 19 +- web/src/plugins/traces/SessionDetails.vue | 49 ++- web/src/plugins/traces/TraceDetails.spec.ts | 95 +++++ web/src/plugins/traces/TraceDetails.vue | 95 ++++- .../traces/TraceDetailsSidebar.spec.ts | 95 +++++ .../plugins/traces/TraceDetailsSidebar.vue | 88 ++++- web/src/plugins/traces/TraceTree.spec.ts | 18 + web/src/plugins/traces/TraceTree.vue | 20 +- web/src/services/http.licenseLock.spec.ts | 235 ++++++++++++ web/src/services/http.spec.ts | 48 +++ web/src/services/http.ts | 5 + web/src/services/licenseDenialReceiver.ts | 50 +++ web/src/services/service_streams.spec.ts | 47 ++- web/src/services/service_streams.ts | 7 +- web/src/styles/utilities.css | 62 ++++ web/src/types/slack.ts | 2 +- web/src/types/vue-router.d.ts | 4 + web/src/utils/featureGate.spec.ts | 137 +++++++ web/src/utils/featureGate.ts | 141 +++++++ .../utils/incidents/rcaEvidenceLinks.spec.ts | 14 + web/src/utils/incidents/rcaEvidenceLinks.ts | 7 + web/src/views/AIObservability/PromptsPage.vue | 3 +- .../views/AlertLibrary/AlertLibrary.spec.ts | 37 ++ web/src/views/AlertLibrary/AlertLibrary.vue | 13 +- web/src/views/Dashboards/Dashboards.vue | 5 +- web/src/views/Dashboards/ViewDashboard.vue | 28 +- .../Dashboards/addPanel/AddPanel.spec.ts | 22 +- .../views/Dashboards/addPanel/AddPanel.vue | 4 + .../views/Dashboards/viewDashboard.spec.ts | 36 ++ .../DatabaseMonitoring/DatabasesPage.vue | 2 + .../views/DatabaseMonitoring/QueriesPage.vue | 22 +- .../DatabaseMonitoring/QueryDetailPage.vue | 123 +++++-- .../views/DatabaseMonitoring/SamplesPage.vue | 33 +- .../dbmQueryDetailNotFound.spec.ts | 8 +- .../dbmTracesLicenseLock.spec.ts | 76 ++++ web/src/views/HomeNoDataState.spec.ts | 24 ++ web/src/views/HomeNoDataState.vue | 18 +- web/src/views/HomeView.spec.ts | 75 ++++ web/src/views/HomeView.vue | 43 ++- .../views/IdentityAccessManagement.spec.ts | 93 +++++ web/src/views/IdentityAccessManagement.vue | 25 +- .../kubernetes2/ClusterOverview.spec.ts | 19 +- .../kubernetes2/ClusterOverview.vue | 34 +- .../kubernetes2/K8sDetailsDrawer.spec.ts | 19 + .../kubernetes2/K8sDetailsDrawer.vue | 50 ++- .../kubernetes2/K8sLogsPanel.spec.ts | 24 +- .../kubernetes2/K8sLogsPanel.vue | 21 ++ .../kubernetes2/K8sRowMenu.spec.ts | 35 ++ .../Infrastructure/kubernetes2/K8sRowMenu.vue | 49 ++- .../kubernetes2/K8sSignalCards.vue | 31 +- .../kubernetes2/KubernetesPage.spec.ts | 12 + .../kubernetes2/KubernetesPage.vue | 3 + .../kubernetes2/useOverviewSignals.ts | 27 +- web/src/views/Ingestion.spec.ts | 89 ++++- web/src/views/Ingestion.vue | 215 +++++------ web/src/views/LogStream.spec.ts | 55 +++ web/src/views/LogStream.vue | 23 +- web/src/views/OnCall/OnCallPolicies.vue | 10 + web/src/views/OnCall/OnCallResponses.vue | 10 + web/src/views/OnCall/OnCallRouting.spec.ts | 37 ++ web/src/views/OnCall/OnCallRouting.vue | 22 +- web/src/views/OnCall/OnCallTeams.spec.ts | 23 +- web/src/views/OnCall/OnCallTeams.vue | 10 + web/src/views/OverviewTab.spec.ts | 154 ++++++++ web/src/views/OverviewTab.vue | 302 +++++++++------ web/src/views/PinnedDashboardTab.spec.ts | 63 +++- web/src/views/PinnedDashboardTab.vue | 27 +- web/src/views/RUM/AppAnalytics.spec.ts | 9 + web/src/views/RUM/AppAnalytics.vue | 34 +- web/src/views/RUM/AppPerformance.vue | 36 +- web/src/views/RUM/NamedEventEditor.spec.ts | 18 + web/src/views/RUM/NamedEventEditor.vue | 26 ++ web/src/views/RUM/RealUserMonitoring.spec.ts | 20 +- web/src/views/RUM/RealUserMonitoring.vue | 22 +- web/src/views/RUM/SourceMaps.vue | 5 +- web/src/views/SyntheticMonitoring.spec.ts | 29 ++ web/src/views/SyntheticMonitoring.vue | 60 +-- web/src/views/UsageTab.spec.ts | 50 +++ web/src/views/UsageTab.vue | 345 +++++++++--------- web/src/views/alerts/AlertDetail.spec.ts | 27 ++ web/src/views/alerts/AlertDetail.vue | 37 +- web/src/views/slos/SloList.vue | 19 +- web/src/views/slos/SloListLicense.spec.ts | 98 +++++ web/src/views/synthetics/MonitorRuns.vue | 19 +- web/src/views/synthetics/PrivateLocations.vue | 3 + web/src/views/synthetics/RunDetail.vue | 43 ++- .../status-pages/StatusPageImageField.vue | 2 +- .../status-pages/StatusPagesList.vue | 11 +- 470 files changed, 15650 insertions(+), 2219 deletions(-) create mode 100644 web/src/components/alert_calibration/AlertCalibrationDigestDetail.spec.ts create mode 100644 web/src/components/autoobserve/CoverageServiceDrawer.spec.ts create mode 100644 web/src/components/common/FeatureLockBoundary.vue create mode 100644 web/src/components/common/FeatureLockExempt.vue create mode 100644 web/src/components/common/FeatureLocked.spec.ts create mode 100644 web/src/components/common/FeatureLocked.vue create mode 100644 web/src/components/common/LicenseDeniedState.vue create mode 100644 web/src/components/common/SectionHub.spec.ts create mode 100644 web/src/components/dashboards/DashboardLogDrawer.spec.ts create mode 100644 web/src/components/dbm/DbmMetricPanel.spec.ts create mode 100644 web/src/components/dbm/DbmRowActions.spec.ts create mode 100644 web/src/components/iam/quota/Quota.spec.js create mode 100644 web/src/components/ingestion/FirstDataNotice.spec.ts create mode 100644 web/src/components/pipeline/PipelineSectionTabs.spec.ts create mode 100644 web/src/components/rum/productAnalytics/AnalyticsSessionsTable.spec.ts create mode 100644 web/src/components/rum/productAnalytics/RetentionCellDrawer.spec.ts create mode 100644 web/src/components/settings/LicenseFeatures.spec.ts create mode 100644 web/src/components/settings/LicenseFeatures.vue create mode 100644 web/src/composables/downtimes/useDowntimeItems.spec.ts create mode 100644 web/src/composables/useFeatureLock.spec.ts create mode 100644 web/src/composables/useFeatureLock.ts create mode 100644 web/src/composables/useLicenseDenials.spec.ts create mode 100644 web/src/composables/useLicenseDenials.ts create mode 100644 web/src/enterprise/components/onlineEvals/forms/EvalJobDetail.licenseLock.spec.ts create mode 100644 web/src/lib/core/Badge/OLockBadge.spec.ts create mode 100644 web/src/lib/core/Badge/OLockBadge.vue create mode 100644 web/src/lib/core/EmptyState/EmptyStateIngestionChip.spec.ts create mode 100644 web/src/lib/core/PageLayout/OPageLockedBody.spec.ts create mode 100644 web/src/lib/core/PageLayout/OPageLockedBody.vue create mode 100644 web/src/plugins/logs/SearchBar.regionLock.spec.ts create mode 100644 web/src/services/http.licenseLock.spec.ts create mode 100644 web/src/services/licenseDenialReceiver.ts create mode 100644 web/src/utils/featureGate.spec.ts create mode 100644 web/src/utils/featureGate.ts create mode 100644 web/src/views/DatabaseMonitoring/dbmTracesLicenseLock.spec.ts create mode 100644 web/src/views/slos/SloListLicense.spec.ts diff --git a/scripts/translations/.translation_state.json b/scripts/translations/.translation_state.json index 9e528430ed..30ab7590ea 100644 --- a/scripts/translations/.translation_state.json +++ b/scripts/translations/.translation_state.json @@ -252,6 +252,22 @@ "feature_traces": "998741a58ed2b411", "feature_vrl_functions": "4484dd94e9355480", "feature_workload_management": "8004f04c30d8bddc", + "features": "5697d03daef4de9c", + "features_all_unlocked": "0791a3840eb6061a", + "features_filter_all": "a52ace420f2175d0", + "features_filter_free": "f411a1fb62758b4c", + "features_filter_new": "18fdd549b2ed367a", + "features_free_heading": "5892004a2a606ee5", + "features_group_heading": "98bb11ae86a0c557", + "features_missing": "694943b3db420a2e", + "features_new": "d9fe8aa562864fe0", + "features_no_match": "c7655586749bb9b3", + "features_none": "6b474f2c0cba33e7", + "features_paid_ratio": "3257b4364ee32149", + "features_request_access": "22d6edf4b21d5e25", + "features_search": "55e327604647ce88", + "features_summary": "5d2957d8f8c9d8e7", + "features_unlocked": "531c7b28abf27600", "foreverNoLimits": "c4e4f35814b1022b", "fullyManaged": "49964f86a467ca7b", "gbPerDay": "dd9d1b63afeb0945", @@ -13059,6 +13075,19 @@ "tabLabel": "cb702378f31507ef", "title": "2a932f90172e99ea" }, + "featureLock": { + "bannerMessage": "2ad54d7dcf939937", + "bannerMessageGeneric": "9e4736ff1b60331d", + "contactSales": "604abea32b499a4c", + "description": "052f7504abd2c39a", + "headerLocked": "ce0f1697c8a3a6d5", + "routeTitle": "694943b3db420a2e", + "thisFeature": "2598604c06f0d223", + "title": "84027eb92891f1fd", + "toastMessage": "b17241a153486b9c", + "toastMessageGeneric": "4cf1f345d3caeb96", + "toastTitle": "feff10da75dad3ed" + }, "fleet": { "addCollector": "6d30a69cb01ed55a", "audit": { @@ -20331,8 +20360,14 @@ "allClear": "22d352f617758292", "allClearDesc": "bfe3044f55b21533", "allClearDescScoped": "7c66a0cc083a98ba", + "allClearPartial": "f5a637211cc64316", + "allClearPartialDesc": "e5ed97f9af61f860", "anomalyDetectedDescription": "67a554a9305c968d", "anomalyDetectedTitle": "42b3e5f78e8b2967", + "areaAlerts": "f62e9267d196c761", + "areaAnomalies": "a0a660cc9daa76b9", + "areaIncidents": "bfe868931580fb3b", + "areaServices": "604dce445e326d95", "colErrorRate": "33a224722fc7b1e4", "colLatency": "e0e7d293043c8cf6", "colReqs": "61985debc6417c53", diff --git a/web/src/components/Header.spec.ts b/web/src/components/Header.spec.ts index 94e9f4b65c..cb89ab87be 100644 --- a/web/src/components/Header.spec.ts +++ b/web/src/components/Header.spec.ts @@ -17,6 +17,7 @@ import { afterEach, describe, expect, it, beforeEach, vi } from "vitest"; import { mount, shallowMount } from "@vue/test-utils"; import { computed, nextTick } from "vue"; import i18n from "@/locales"; +import OLockBadge from "@/lib/core/Badge/OLockBadge.vue"; import Header from "@/components/Header.vue"; import * as cookies from "@/utils/cookies"; import { chartColor } from "@/utils/chartTheme"; @@ -521,6 +522,25 @@ describe("Header Component", () => { aiWrapper.unmount(); }); + it("keeps the AI logo with a lock badge and under a locked license", async () => { + const aiWrapper = createWrapper({ + mountType: "mount", + storeOverrides: { + state: { zoConfig: { ai_enabled: true, features: { ai_assistant: "locked" } } }, + }, + configOverrides: { isEnterprise: "true" }, + stubsOverrides: {}, + }); + await aiWrapper.vm.$nextTick(); + + const aiButton = aiWrapper.find('[data-test="menu-link-ai-locked"]'); + expect(aiButton.exists()).toBe(true); + expect(aiButton.find("img").exists()).toBe(true); + expect(aiButton.findComponent(OLockBadge).exists()).toBe(true); + expect(aiButton.attributes("aria-label")).toContain("Locked: needs"); + aiWrapper.unmount(); + }); + it("should not display AI button if ai_enabled is false", async () => { const aiWrapper = createWrapper({ mountType: "mount", diff --git a/web/src/components/Header.vue b/web/src/components/Header.vue index 1b5cd4ef08..6d28880ae5 100644 --- a/web/src/components/Header.vue +++ b/web/src/components/Header.vue @@ -230,15 +230,21 @@ along with this program. If not, see . Leads the utility-icon cluster, set off by a separator from the org selector so it reads as the primary action in this group. Shown locked (not hidden) in builds that don't unlock it. --> -