diff options
-rw-r--r-- | app/controllers/dashboard/milestones_controller.rb | 13 | ||||
-rw-r--r-- | app/helpers/milestones_helper.rb | 8 | ||||
-rw-r--r-- | app/models/dashboard_group_milestone.rb | 36 | ||||
-rw-r--r-- | app/models/global_milestone.rb | 2 | ||||
-rw-r--r-- | app/models/group_milestone.rb | 2 | ||||
-rw-r--r-- | app/views/dashboard/milestones/_milestone.html.haml | 2 | ||||
-rw-r--r-- | changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/cr-add-path-of-group-milestone.yml | 5 | ||||
-rw-r--r-- | spec/controllers/dashboard/milestones_controller_spec.rb | 19 |
9 files changed, 87 insertions, 5 deletions
diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb index 751dbbd8e96..0469e7e1e1f 100644 --- a/app/controllers/dashboard/milestones_controller.rb +++ b/app/controllers/dashboard/milestones_controller.rb @@ -21,8 +21,19 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController private + def group_milestones + groups = GroupsFinder.new(current_user, all_available: true).execute + + DashboardGroupMilestone.build_collection(groups) + end + + # See [#39545](https://gitlab.com/gitlab-org/gitlab-ce/issues/39545) for info about the deprecation of dynamic milestones + def dynamic_milestones + DashboardMilestone.build_collection(@projects, params) + end + def milestones - @milestones = DashboardMilestone.build_collection(@projects, params) + @milestones = group_milestones + dynamic_milestones end def milestone diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb index 15a15405f1d..95da8f00aff 100644 --- a/app/helpers/milestones_helper.rb +++ b/app/helpers/milestones_helper.rb @@ -233,4 +233,12 @@ module MilestonesHelper group_milestone_path(@group, milestone.iid, milestone: params) end end + + def group_or_dashboard_milestone_path(milestone) + if milestone.group_milestone? + group_milestone_path(milestone.group, milestone.iid, milestone: { title: milestone.title }) + else + dashboard_milestone_path(milestone.safe_title, title: milestone.title) + end + end end diff --git a/app/models/dashboard_group_milestone.rb b/app/models/dashboard_group_milestone.rb new file mode 100644 index 00000000000..13807d43265 --- /dev/null +++ b/app/models/dashboard_group_milestone.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true +# Dashboard Group Milestones are milestones that allow us to pull more info out for the UI that the Milestone object doesn't allow for +class DashboardGroupMilestone < GlobalMilestone + extend ::Gitlab::Utils::Override + + attr_reader :group_name + + override :initialize + def initialize(milestone) + super(milestone.title, Array(milestone)) + + @group_name = milestone.group.full_name + end + + def self.build_collection(groups) + MilestonesFinder.new(group_ids: groups.pluck(:id)).execute.map { |m| new(m) } + end + + override :group_milestone? + def group_milestone? + @first_milestone.group_milestone? + end + + override :milestoneish_ids + def milestoneish_ids + milestones.map(&:id) + end + + def group + @first_milestone.group + end + + def iid + @first_milestone.iid + end +end diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb index 2ddad9b6b0b..6e23e811b0e 100644 --- a/app/models/global_milestone.rb +++ b/app/models/global_milestone.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true - +# Global Milestones are milestones that can be shared across multiple projects class GlobalMilestone include Milestoneish diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb index d6ab32ea7c8..9dfaebacc83 100644 --- a/app/models/group_milestone.rb +++ b/app/models/group_milestone.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true - +# Group Milestones are milestones that can be shared among many projects within the same group class GroupMilestone < GlobalMilestone attr_accessor :group diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml index 6173ca6ab9b..b876d6fd1f3 100644 --- a/app/views/dashboard/milestones/_milestone.html.haml +++ b/app/views/dashboard/milestones/_milestone.html.haml @@ -1,5 +1,5 @@ = render 'shared/milestones/milestone', - milestone_path: dashboard_milestone_path(milestone.safe_title, title: milestone.title), + milestone_path: group_or_dashboard_milestone_path(milestone), issues_path: issues_dashboard_path(milestone_title: milestone.title), merge_requests_path: merge_requests_dashboard_path(milestone_title: milestone.title), milestone: milestone, diff --git a/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml b/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml new file mode 100644 index 00000000000..b87a1e5faf7 --- /dev/null +++ b/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml @@ -0,0 +1,5 @@ +--- +title: Adds the ability to view group milestones on the dashboard milestone page. +merge_request: 20618 +author: +type: fixed diff --git a/changelogs/unreleased/cr-add-path-of-group-milestone.yml b/changelogs/unreleased/cr-add-path-of-group-milestone.yml new file mode 100644 index 00000000000..5ce240110ef --- /dev/null +++ b/changelogs/unreleased/cr-add-path-of-group-milestone.yml @@ -0,0 +1,5 @@ +--- +title: Adds the project and group name to the return type for project and group milestones. +merge_request: 20890 +author: +type: changed diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb index ba2669a5ea7..505c040b5d5 100644 --- a/spec/controllers/dashboard/milestones_controller_spec.rb +++ b/spec/controllers/dashboard/milestones_controller_spec.rb @@ -2,8 +2,10 @@ require 'spec_helper' describe Dashboard::MilestonesController do let(:project) { create(:project) } - let(:user) { create(:user) } + let(:group) { create(:group) } + let(:user) { create(:user) } let(:project_milestone) { create(:milestone, project: project) } + let(:group_milestone) { create(:milestone, group: group) } let(:milestone) do DashboardMilestone.build( [project], @@ -11,13 +13,17 @@ describe Dashboard::MilestonesController do ) end let(:issue) { create(:issue, project: project, milestone: project_milestone) } + let(:group_issue) { create(:issue, milestone: group_milestone) } + let!(:label) { create(:label, project: project, title: 'Issue Label', issues: [issue]) } + let!(:group_label) { create(:group_label, group: group, title: 'Group Issue Label', issues: [group_issue]) } let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, milestone: project_milestone) } let(:milestone_path) { dashboard_milestone_path(milestone.safe_title, title: milestone.title) } before do sign_in(user) project.add_maintainer(user) + group.add_developer(user) end it_behaves_like 'milestone tabs' @@ -35,4 +41,15 @@ describe Dashboard::MilestonesController do expect(response).to have_gitlab_http_status(200) end end + + describe "#index" do + it 'should contain group and project milestones' do + get :index, format: :json + + expect(response).to have_gitlab_http_status(200) + expect(json_response.size).to eq(2) + expect(json_response.map { |i| i["first_milestone"]["id"] }).to include(group_milestone.id, project_milestone.id) + expect(json_response.map { |i| i["group_name"] }).to include(group.name) + end + end end |