diff --git a/modules/overviews/app/components/overviews/page_header_component.html.erb b/modules/overviews/app/components/overviews/page_header_component.html.erb index 7d98ae3a5a84..2cd91c9c7af4 100644 --- a/modules/overviews/app/components/overviews/page_header_component.html.erb +++ b/modules/overviews/app/components/overviews/page_header_component.html.erb @@ -48,19 +48,21 @@ tab_nav.with_tab( test_selector: "project-overview-tab", selected: current_page?(project_overview_path), - href: helpers.project_overview_path, + href: helpers.project_overview_path ) do |t| t.with_icon(icon: :"op-view-split") t.with_text { I18n.t("overviews.label_overview") } end - tab_nav.with_tab( - test_selector: "project-dashboard-tab", - selected: current_page?(dashboard_project_overview_path), - href: helpers.dashboard_project_overview_path, - ) do |t| - t.with_icon(icon: :"op-view-list") - t.with_text { I18n.t("overviews.label_dashboard") } + if current_user.allowed_in_project?(:manage_dashboards, project) + tab_nav.with_tab( + test_selector: "project-dashboard-tab", + selected: current_page?(dashboard_project_overview_path), + href: helpers.dashboard_project_overview_path + ) do |t| + t.with_icon(icon: :"op-view-list") + t.with_text { I18n.t("overviews.label_dashboard") } + end end end end diff --git a/modules/overviews/spec/components/overviews/page_header_component_spec.rb b/modules/overviews/spec/components/overviews/page_header_component_spec.rb index bba7af47fa09..716a912349a2 100644 --- a/modules/overviews/spec/components/overviews/page_header_component_spec.rb +++ b/modules/overviews/spec/components/overviews/page_header_component_spec.rb @@ -37,7 +37,7 @@ def render_component(...) let(:workspace_type) { :project } let(:project) { build_stubbed(:project, name: "Too big to fail", workspace_type:) } - let(:user) { build_stubbed(:user) } + let(:user) { build_stubbed(:admin) } current_user { user } @@ -135,7 +135,9 @@ def render_component(...) expect(rendered_component).to have_element "action-menu", "data-select-variant": "none" end - context "without manage permissions" do + context "without manage dashboard permissions" do + let(:user) { create(:user) } + it "renders action menu items", :aggregate_failures do expect(rendered_component).to have_menu do |menu| expect(menu).to have_selector :menuitem, count: 1 @@ -144,7 +146,7 @@ def render_component(...) end end - context "with manage permissions" do + context "with manage dashboard permissions" do let(:user) { build_stubbed(:admin) } it "renders action menu items", :aggregate_failures do @@ -159,27 +161,40 @@ def render_component(...) end describe "tab bar", with_flag: { new_project_overview: true } do - it "renders a tab bar" do - expect(rendered_component).to have_css ".PageHeader-tabNavBar" - end + context "when user has permission to manage dashboard" do + let(:user) { build_stubbed(:admin) } - it "renders 2 tabs", :aggregate_failures do - expect(rendered_component).to have_list class: "tabnav-tabs" do |list| - expect(list).to have_list_item count: 2 - expect(list).to have_list_item "Overview" - expect(list).to have_list_item "Dashboard" + it "renders a tab bar" do + expect(rendered_component).to have_css ".PageHeader-tabNavBar" + end + + it "renders 2 tabs", :aggregate_failures do + expect(rendered_component).to have_list class: "tabnav-tabs" do |list| + expect(list).to have_list_item count: 2 + expect(list).to have_list_item "Overview" + expect(list).to have_list_item "Dashboard" + end + end + + it "renders Overview tab link", :aggregate_failures do + expect(rendered_component).to have_link "Overview" do |link| + expect(link).to have_octicon :"op-view-split" + end end - end - it "renders Overview tab link", :aggregate_failures do - expect(rendered_component).to have_link "Overview" do |link| - expect(link).to have_octicon :"op-view-split" + it "renders Dashboard tab link", :aggregate_failures do + expect(rendered_component).to have_link "Dashboard" do |link| + expect(link).to have_octicon :"op-view-list" + end end end - it "renders Dashboard tab link", :aggregate_failures do - expect(rendered_component).to have_link "Dashboard" do |link| - expect(link).to have_octicon :"op-view-list" + context "when user does NOT have permission to manage dashboard" do + let(:user) { create(:user, member_with_permissions: { project => %i[view_work_packages edit_work_packages] }) } + + it "renders only the Overview tab", :aggregate_failures do + expect(rendered_component).to have_link "Overview" + expect(rendered_component).to have_no_link "Dashboard" end end end