diff options
author | Brett Walker <bwalker@gitlab.com> | 2019-05-31 20:19:08 -0500 |
---|---|---|
committer | Brett Walker <bwalker@gitlab.com> | 2019-06-21 07:05:42 -0500 |
commit | 4a85e263b4afe2e1e64dcaf55856add6e7aed764 (patch) | |
tree | 91f9d823f7c1b3ecc45ae0b8c20bcd4bf8b69a42 /app | |
parent | 6fa900547dbd30b0db0070f87dbeb4b05d485b9b (diff) | |
download | gitlab-ce-4a85e263b4afe2e1e64dcaf55856add6e7aed764.tar.gz |
Add reorder action to Project IssuesControllerbw-issue-reorder
to support manual sorting on the frontend
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/projects/issues_controller.rb | 16 | ||||
-rw-r--r-- | app/services/boards/issues/move_service.rb | 6 | ||||
-rw-r--r-- | app/services/issues/reorder_service.rb | 48 | ||||
-rw-r--r-- | app/services/issues/update_service.rb | 1 |
4 files changed, 68 insertions, 3 deletions
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index b4d89db20c5..b16f3dd9d82 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -33,7 +33,7 @@ class Projects::IssuesController < Projects::ApplicationController before_action :authorize_create_issue!, only: [:new, :create] # Allow modify issue - before_action :authorize_update_issuable!, only: [:edit, :update, :move] + before_action :authorize_update_issuable!, only: [:edit, :update, :move, :reorder] # Allow create a new branch and empty WIP merge request from current issue before_action :authorize_create_merge_request_from!, only: [:create_merge_request] @@ -132,6 +132,16 @@ class Projects::IssuesController < Projects::ApplicationController render_conflict_response end + def reorder + service = Issues::ReorderService.new(project, current_user, reorder_params) + + if service.execute(issue) + head :ok + else + head :unprocessable_entity + end + end + def related_branches @related_branches = Issues::RelatedBranchesService.new(project, current_user).execute(issue) @@ -239,6 +249,10 @@ class Projects::IssuesController < Projects::ApplicationController ] + [{ label_ids: [], assignee_ids: [], update_task: [:index, :checked, :line_number, :line_source] }] end + def reorder_params + params.permit(:move_before_id, :move_after_id, :group_full_path) + end + def store_uri if request.get? && !request.xhr? store_location_for :user, request.fullpath diff --git a/app/services/boards/issues/move_service.rb b/app/services/boards/issues/move_service.rb index 834baeb9643..e27d34dbcab 100644 --- a/app/services/boards/issues/move_service.rb +++ b/app/services/boards/issues/move_service.rb @@ -79,9 +79,11 @@ module Boards # rubocop: enable CodeReuse/ActiveRecord def move_between_ids - return unless params[:move_after_id] || params[:move_before_id] + ids = [params[:move_after_id], params[:move_before_id]] + .map(&:to_i) + .map { |m| m.positive? ? m : nil } - [params[:move_after_id], params[:move_before_id]] + ids.any? ? ids : nil end end end diff --git a/app/services/issues/reorder_service.rb b/app/services/issues/reorder_service.rb new file mode 100644 index 00000000000..02c18d31b5e --- /dev/null +++ b/app/services/issues/reorder_service.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Issues + class ReorderService < Issues::BaseService + def execute(issue) + return false unless can?(current_user, :update_issue, issue) + return false if group && !can?(current_user, :read_group, group) + + attrs = issue_params(group) + return false if attrs.empty? + + update(issue, attrs) + end + + private + + def group + return unless params[:group_full_path] + + @group ||= Group.find_by_full_path(params[:group_full_path]) + end + + def update(issue, attrs) + ::Issues::UpdateService.new(project, current_user, attrs).execute(issue) + rescue ActiveRecord::RecordNotFound + false + end + + def issue_params(group) + attrs = {} + + if move_between_ids + attrs[:move_between_ids] = move_between_ids + attrs[:board_group_id] = group&.id + end + + attrs + end + + def move_between_ids + ids = [params[:move_after_id], params[:move_before_id]] + .map(&:to_i) + .map { |m| m.positive? ? m : nil } + + ids.any? ? ids : nil + end + end +end diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index cb2337d29d4..6b9f23f24cd 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -76,6 +76,7 @@ module Issues issue_before = get_issue_if_allowed(before_id, board_group_id) issue_after = get_issue_if_allowed(after_id, board_group_id) + raise ActiveRecord::RecordNotFound unless issue_before || issue_after issue.move_between(issue_before, issue_after) end |