diff options
Diffstat (limited to 'lib/sidebars/projects/menus/monitor_menu.rb')
-rw-r--r-- | lib/sidebars/projects/menus/monitor_menu.rb | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb new file mode 100644 index 00000000000..18c990d0e1f --- /dev/null +++ b/lib/sidebars/projects/menus/monitor_menu.rb @@ -0,0 +1,246 @@ +# frozen_string_literal: true + +module Sidebars + module Projects + module Menus + class MonitorMenu < ::Sidebars::Menu + override :configure_menu_items + def configure_menu_items + return false unless context.project.feature_available?(:operations, context.current_user) + + add_item(metrics_dashboard_menu_item) + add_item(logs_menu_item) + add_item(tracing_menu_item) + add_item(error_tracking_menu_item) + add_item(alert_management_menu_item) + add_item(incidents_menu_item) + add_item(serverless_menu_item) + add_item(terraform_menu_item) + add_item(kubernetes_menu_item) + add_item(environments_menu_item) + add_item(feature_flags_menu_item) + add_item(product_analytics_menu_item) + + true + end + + override :link + def link + if can?(context.current_user, :read_environment, context.project) + metrics_project_environments_path(context.project) + else + project_feature_flags_path(context.project) + end + end + + override :extra_container_html_options + def extra_container_html_options + { + class: Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? 'shortcuts-monitor' : 'shortcuts-operations' + } + end + + override :title + def title + Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? _('Monitor') : _('Operations') + end + + override :sprite_icon + def sprite_icon + Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? 'monitor' : 'cloud-gear' + end + + override :active_routes + def active_routes + { controller: [:user, :gcp] } + end + + private + + def metrics_dashboard_menu_item + unless can?(context.current_user, :metrics_dashboard, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :metrics) + end + + ::Sidebars::MenuItem.new( + title: _('Metrics'), + link: project_metrics_dashboard_path(context.project), + active_routes: { path: 'metrics_dashboard#show' }, + container_html_options: { class: 'shortcuts-metrics' }, + item_id: :metrics + ) + end + + def logs_menu_item + if !can?(context.current_user, :read_environment, context.project) || + !can?(context.current_user, :read_pod_logs, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :logs) + end + + ::Sidebars::MenuItem.new( + title: _('Logs'), + link: project_logs_path(context.project), + active_routes: { path: 'logs#index' }, + item_id: :logs + ) + end + + def tracing_menu_item + if !can?(context.current_user, :read_environment, context.project) || + !can?(context.current_user, :admin_project, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :tracing) + end + + ::Sidebars::MenuItem.new( + title: _('Tracing'), + link: project_tracing_path(context.project), + active_routes: { path: 'tracings#show' }, + item_id: :tracing + ) + end + + def error_tracking_menu_item + unless can?(context.current_user, :read_sentry_issue, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :error_tracking) + end + + ::Sidebars::MenuItem.new( + title: _('Error Tracking'), + link: project_error_tracking_index_path(context.project), + active_routes: { controller: :error_tracking }, + item_id: :error_tracking + ) + end + + def alert_management_menu_item + unless can?(context.current_user, :read_alert_management_alert, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :alert_management) + end + + ::Sidebars::MenuItem.new( + title: _('Alerts'), + link: project_alert_management_index_path(context.project), + active_routes: { controller: :alert_management }, + item_id: :alert_management + ) + end + + def incidents_menu_item + unless can?(context.current_user, :read_issue, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :incidents) + end + + ::Sidebars::MenuItem.new( + title: _('Incidents'), + link: project_incidents_path(context.project), + active_routes: { controller: [:incidents, :incident_management] }, + item_id: :incidents + ) + end + + def serverless_menu_item + if Feature.enabled?(:sidebar_refactor, context.current_user) || + !can?(context.current_user, :read_cluster, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :serverless) + end + + ::Sidebars::MenuItem.new( + title: _('Serverless'), + link: project_serverless_functions_path(context.project), + active_routes: { controller: :functions }, + item_id: :serverless + ) + end + + def terraform_menu_item + if Feature.enabled?(:sidebar_refactor, context.current_user) || + !can?(context.current_user, :read_terraform_state, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :terraform) + end + + ::Sidebars::MenuItem.new( + title: _('Terraform'), + link: project_terraform_index_path(context.project), + active_routes: { controller: :terraform }, + item_id: :terraform + ) + end + + def kubernetes_menu_item + if Feature.enabled?(:sidebar_refactor, context.current_user) || + !can?(context.current_user, :read_cluster, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :kubernetes) + end + + ::Sidebars::MenuItem.new( + title: _('Kubernetes'), + link: project_clusters_path(context.project), + active_routes: { controller: [:cluster_agents, :clusters] }, + container_html_options: { class: 'shortcuts-kubernetes' }, + hint_html_options: kubernetes_hint_html_options, + item_id: :kubernetes + ) + end + + def kubernetes_hint_html_options + return {} unless context.show_cluster_hint + + { disabled: true, + data: { trigger: 'manual', + container: 'body', + placement: 'right', + highlight: UserCalloutsHelper::GKE_CLUSTER_INTEGRATION, + highlight_priority: UserCallout.feature_names[:GKE_CLUSTER_INTEGRATION], + dismiss_endpoint: user_callouts_path, + auto_devops_help_path: help_page_path('topics/autodevops/index.md') } } + end + + def environments_menu_item + if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) || + !can?(context.current_user, :read_environment, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :environments) + end + + ::Sidebars::MenuItem.new( + title: _('Environments'), + link: project_environments_path(context.project), + active_routes: { controller: :environments }, + container_html_options: { class: 'shortcuts-environments' }, + item_id: :environments + ) + end + + def feature_flags_menu_item + if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) || + !can?(context.current_user, :read_feature_flag, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :feature_flags) + end + + ::Sidebars::MenuItem.new( + title: _('Feature Flags'), + link: project_feature_flags_path(context.project), + active_routes: { controller: :feature_flags }, + container_html_options: { class: 'shortcuts-feature-flags' }, + item_id: :feature_flags + ) + end + + def product_analytics_menu_item + if Feature.disabled?(:product_analytics, context.project) || + !can?(context.current_user, :read_product_analytics, context.project) + return ::Sidebars::NilMenuItem.new(item_id: :product_analytics) + end + + ::Sidebars::MenuItem.new( + title: _('Product Analytics'), + link: project_product_analytics_path(context.project), + active_routes: { controller: :product_analytics }, + item_id: :product_analytics + ) + end + end + end + end +end + +Sidebars::Projects::Menus::MonitorMenu.prepend_mod_with('Sidebars::Projects::Menus::MonitorMenu') |