diff options
author | Felipe Artur <felipefac@gmail.com> | 2017-10-11 16:52:21 -0300 |
---|---|---|
committer | Felipe Artur <felipefac@gmail.com> | 2017-10-11 16:52:21 -0300 |
commit | 32c9548e026e648404fd5932072ec1b2e1c80d6f (patch) | |
tree | f114d4720de426b5a8028ff07769426434391230 | |
parent | c194f22814dc57128d6d6b247afbd7e34ea397d2 (diff) | |
download | gitlab-ce-32c9548e026e648404fd5932072ec1b2e1c80d6f.tar.gz |
Allow promoting project milestones to group milestones
-rw-r--r-- | app/controllers/projects/milestones_controller.rb | 19 | ||||
-rw-r--r-- | app/models/milestone.rb | 4 | ||||
-rw-r--r-- | app/services/milestones/promote_service.rb | 11 | ||||
-rw-r--r-- | app/views/projects/milestones/show.html.haml | 6 | ||||
-rw-r--r-- | app/views/shared/milestones/_milestone.html.haml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/issue_38777.yml | 5 | ||||
-rw-r--r-- | config/routes/project.rb | 1 |
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 |