diff --git a/modules/grids/app/components/grids/widgets/project_timeline.rb b/modules/grids/app/components/grids/widgets/project_timeline.rb index af626d98b5eb..005bb687bf7c 100644 --- a/modules/grids/app/components/grids/widgets/project_timeline.rb +++ b/modules/grids/app/components/grids/widgets/project_timeline.rb @@ -44,7 +44,7 @@ def title end def phases_data - project.phases.active + active_project_phases .eager_load(definition: :color) .order("project_phase_definitions.position") .map { |phase| phase_data(phase) } @@ -52,11 +52,11 @@ def phases_data end def any_phases? - project.phases.active.with_timeline_content.exists? + active_project_phases.with_timeline_content.exists? end def render? - User.current.allowed_in_project?(:view_project_phases, project) + User.current.allowed_in_project?(:view_project_phases, project) && active_project_phases.any? end def wrapper_arguments @@ -78,6 +78,10 @@ def phase_data(phase) # rubocop:disable Metrics/AbcSize finishGateName: phase.definition.finish_gate_name } end + + def active_project_phases + @active_project_phases ||= project.phases.active + end end end end diff --git a/modules/grids/spec/components/grids/widgets/project_timeline_spec.rb b/modules/grids/spec/components/grids/widgets/project_timeline_spec.rb index 03aa00971ec5..a831b2573cc9 100644 --- a/modules/grids/spec/components/grids/widgets/project_timeline_spec.rb +++ b/modules/grids/spec/components/grids/widgets/project_timeline_spec.rb @@ -40,12 +40,26 @@ describe "#render?" do context "with view_project_phases permission" do - before { create(:member, user:, project:, roles: [role]) } + before do + create(:member, user:, project:, roles: [role]) + create(:project_phase, project:) + end it { expect(component.render?).to be(true) } end context "without permission" do + before { create(:project_phase, project:) } + + it { expect(component.render?).to be(false) } + end + + context "with only inactive phases" do + before do + create(:member, user:, project:, roles: [role]) + create(:project_phase, :inactive, project:) + end + it { expect(component.render?).to be(false) } end end @@ -108,7 +122,9 @@ describe "rendering" do before { create(:member, user:, project:, roles: [role]) } - context "with no phases" do + context "with phases without dates" do + before { create(:project_phase, project:, finish_date: nil, start_date: nil) } + it "renders a blankslate" do render_inline(component) expect(page).to have_test_selector("project-timeline-widget-empty")