Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/boards/base_item_move_service.rb')
-rw-r--r--app/services/boards/base_item_move_service.rb22
1 files changed, 21 insertions, 1 deletions
diff --git a/app/services/boards/base_item_move_service.rb b/app/services/boards/base_item_move_service.rb
index 9d711d83fd2..c9da889c536 100644
--- a/app/services/boards/base_item_move_service.rb
+++ b/app/services/boards/base_item_move_service.rb
@@ -2,6 +2,8 @@
module Boards
class BaseItemMoveService < Boards::BaseService
+ LIST_END_POSITION = -1
+
def execute(issuable)
issuable_modification_params = issuable_params(issuable)
return if issuable_modification_params.empty?
@@ -32,7 +34,13 @@ module Boards
)
end
- reposition_ids = move_between_ids(params)
+ move_params = if params[:position_in_list].present?
+ move_params_from_list_position(params[:position_in_list])
+ else
+ params
+ end
+
+ reposition_ids = move_between_ids(move_params)
attrs.merge!(reposition_params(reposition_ids)) if reposition_ids
attrs
@@ -90,6 +98,18 @@ module Boards
::Label.ids_on_board(board.id)
end
+ def move_params_from_list_position(position)
+ if position == LIST_END_POSITION
+ { move_before_id: moving_to_list_items_relation.reverse_order.pick(:id), move_after_id: nil }
+ else
+ item_at_position = moving_to_list_items_relation.offset(position).pick(:id) # rubocop: disable CodeReuse/ActiveRecord
+
+ return move_params_from_list_position(LIST_END_POSITION) if item_at_position.nil?
+
+ { move_before_id: nil, move_after_id: item_at_position }
+ end
+ end
+
def move_between_ids(move_params)
ids = [move_params[:move_before_id], move_params[:move_after_id]]
.map(&:to_i)