summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Artur <felipefac@gmail.com>2017-10-11 16:52:21 -0300
committerFelipe Artur <felipefac@gmail.com>2017-10-11 16:52:21 -0300
commit32c9548e026e648404fd5932072ec1b2e1c80d6f (patch)
treef114d4720de426b5a8028ff07769426434391230
parentc194f22814dc57128d6d6b247afbd7e34ea397d2 (diff)
downloadgitlab-ce-32c9548e026e648404fd5932072ec1b2e1c80d6f.tar.gz
Allow promoting project milestones to group milestones
-rw-r--r--app/controllers/projects/milestones_controller.rb19
-rw-r--r--app/models/milestone.rb4
-rw-r--r--app/services/milestones/promote_service.rb11
-rw-r--r--app/views/projects/milestones/show.html.haml6
-rw-r--r--app/views/shared/milestones/_milestone.html.haml5
-rw-r--r--changelogs/unreleased/issue_38777.yml5
-rw-r--r--config/routes/project.rb1
7 files changed, 47 insertions, 4 deletions
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index c94384d2a1a..774fa82ed6f 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -2,13 +2,13 @@ class Projects::MilestonesController < Projects::ApplicationController
include MilestoneActions
before_action :check_issuables_available!
- before_action :milestone, only: [:edit, :update, :destroy, :show, :merge_requests, :participants, :labels]
+ before_action :milestone, only: [:edit, :update, :destroy, :show, :merge_requests, :participants, :labels, :promote]
# Allow read any milestone
before_action :authorize_read_milestone!
# Allow admin milestone
- before_action :authorize_admin_milestone!, except: [:index, :show, :merge_requests, :participants, :labels]
+ before_action :authorize_admin_milestone!, except: [:index, :show, :merge_requests, :participants, :labels, :promote]
respond_to :html
@@ -69,6 +69,21 @@ class Projects::MilestonesController < Projects::ApplicationController
end
end
+ def promote
+ @milestone = Milestones::PromoteService.new(project, current_user).execute(milestone)
+
+ respond_to do |format|
+ format.html do
+ if @milestone.valid?
+ flash[:notice] = "Milestone has been promoted to group milestone."
+ redirect_to group_milestone_path(project.group, @milestone.iid)
+ else
+ render :show
+ end
+ end
+ end
+ end
+
def destroy
return access_denied! unless can?(current_user, :admin_milestone, @project)
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 47e6b785c39..95bde3fc9e9 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -39,8 +39,8 @@ class Milestone < ActiveRecord::Base
where(conditions.reduce(:or))
end
- validates :group, presence: true, unless: :project
- validates :project, presence: true, unless: :group
+ validates :group_id, presence: true, unless: :project_id
+ validates :project_id, presence: true, unless: :group_id
validate :uniqueness_of_title, if: :title_changed?
validate :milestone_type_check
diff --git a/app/services/milestones/promote_service.rb b/app/services/milestones/promote_service.rb
new file mode 100644
index 00000000000..e9340284aeb
--- /dev/null
+++ b/app/services/milestones/promote_service.rb
@@ -0,0 +1,11 @@
+module Milestones
+ class PromoteService < Milestones::BaseService
+ def execute(milestone)
+ milestone.project_id = nil
+
+ milestone.save
+
+ milestone
+ end
+ end
+end
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index a5153df1159..9ceb231270d 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -28,6 +28,9 @@
- else
= link_to 'Reopen milestone', project_milestone_path(@project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-nr btn-grouped"
+ = link_to promote_project_milestone_path(@milestone.project, @milestone), title: "Promote to Group Milestone", class: 'btn btn-grouped', data: {confirm: "Promoting this milestone will make it available for all projects inside the group. Existing project milestones with the same name will be merged. Are you sure?", toggle: "tooltip"}, method: :post do
+ Promote
+
= link_to edit_project_milestone_path(@project, @milestone), class: "btn btn-grouped btn-nr" do
Edit
@@ -40,6 +43,9 @@
.detail-page-description.milestone-detail
%h2.title
= markdown_field(@milestone, :title)
+
+ = form_errors(@milestone)
+
%div
- if @milestone.description.present?
.description
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index 305e2542281..e10f20c9960 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -46,9 +46,14 @@
= render('shared/milestone_expired', milestone: milestone)
.col-sm-6.milestone-actions
- if can?(current_user, :admin_milestone, milestone.project) and milestone.active?
+ = link_to promote_project_milestone_path(milestone.project, milestone), title: "Promote to Group Milestone", class: 'btn btn-xs btn-grouped', data: {confirm: "Promoting this milestone will make it available for all projects inside the group. Existing project milestones with the same name will be merged. Are you sure?", toggle: "tooltip"}, method: :post do
+ Promote
+
= link_to edit_project_milestone_path(milestone.project, milestone), class: "btn btn-xs btn-grouped" do
Edit
\
= link_to 'Close Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-xs btn-close btn-grouped"
+
= link_to project_milestone_path(milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-xs btn-remove btn-grouped" do
Delete
+
diff --git a/changelogs/unreleased/issue_38777.yml b/changelogs/unreleased/issue_38777.yml
new file mode 100644
index 00000000000..5c49b2f7879
--- /dev/null
+++ b/changelogs/unreleased/issue_38777.yml
@@ -0,0 +1,5 @@
+---
+title: Allow promoting project milestones to group milestones
+merge_request:
+author:
+type: added
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 7f0e056c884..960d9ddf65d 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -288,6 +288,7 @@ constraints(ProjectUrlConstrainer.new) do
resources :milestones, constraints: { id: /\d+/ } do
member do
+ post :promote
put :sort_issues
put :sort_merge_requests
get :merge_requests