diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index d743ea6aeea9ee774ee56b38357517735e373ec6..79546212bccc829ecdbd485a6f70b017c33b740e 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -410,7 +410,7 @@ def get_project_nav_tabs(project, current_user) nav_tabs << :pipelines end - if can?(current_user, :read_environment, project) || can?(current_user, :read_cluster, project) + if can_view_operations_tab?(current_user, project) nav_tabs << :operations end @@ -438,22 +438,29 @@ def external_nav_tabs(project) def tab_ability_map { - environments: :read_environment, - milestones: :read_milestone, - snippets: :read_snippet, - settings: :admin_project, - builds: :read_build, - clusters: :read_cluster, - serverless: :read_cluster, - error_tracking: :read_sentry_issue, - alert_management: :read_alert_management_alert, - labels: :read_label, - issues: :read_issue, - project_members: :read_project_member, - wiki: :read_wiki + environments: :read_environment, + metrics_dashboards: :metrics_dashboard, + milestones: :read_milestone, + snippets: :read_snippet, + settings: :admin_project, + builds: :read_build, + clusters: :read_cluster, + serverless: :read_cluster, + error_tracking: :read_sentry_issue, + alert_management: :read_alert_management_alert, + labels: :read_label, + issues: :read_issue, + project_members: :read_project_member, + wiki: :read_wiki } end + def can_view_operations_tab?(current_user, project) + [:read_environment, :read_cluster, :metrics_dashboard].any? do |ability| + can?(current_user, ability, project) + end + end + def search_tab_ability_map @search_tab_ability_map ||= tab_ability_map.merge( blobs: :download_code, diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index a67860e8e2eb3128c61ea3c951ca90f93a4f8f0b..c738493507f493633dc5c9d2c0977dfb4bd68b6b 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -216,7 +216,7 @@ = _('Operations') %li.divider.fly-out-top-item - - if project_nav_tab? :environments + - if project_nav_tab? :metrics_dashboards = nav_link(controller: :environments, action: [:metrics, :metrics_redirect]) do = link_to metrics_project_environments_path(@project), title: _('Metrics'), class: 'shortcuts-metrics', data: { qa_selector: 'operations_metrics_link' } do %span diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 189ab1a8354f8787f8e97404271ef99864e9a986..27dc8707bd8a9d9bd40436921f406c1d27ca529b 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -5,6 +5,9 @@ describe ProjectsHelper do include ProjectForksHelper + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + describe '#project_incident_management_setting' do let(:project) { create(:project) } @@ -500,6 +503,23 @@ end end + describe '#can_view_operations_tab?' do + before do + allow(helper).to receive(:current_user).and_return(user) + end + + subject { helper.send(:can_view_operations_tab?, user, project) } + + [:read_environment, :read_cluster, :metrics_dashboard].each do |ability| + it 'includes operations tab' do + allow(helper).to receive(:can?).and_return(false) + allow(helper).to receive(:can?).with(user, ability, project).and_return(true) + + is_expected.to be(true) + end + end + end + describe '#show_projects' do let(:projects) do create(:project)