Class: Collavre::Creatives::Reorderer
- Inherits:
-
Object
- Object
- Collavre::Creatives::Reorderer
- Defined in:
- app/services/collavre/creatives/reorderer.rb
Defined Under Namespace
Classes: Error, LinkDropResult
Instance Method Summary collapse
-
#initialize(user:) ⇒ Reorderer
constructor
A new instance of Reorderer.
- #link_drop(dragged_id:, target_id:, direction:) ⇒ Object
- #reorder(dragged_id:, target_id:, direction:) ⇒ Object
- #reorder_multiple(dragged_ids:, target_id:, direction:) ⇒ Object
Constructor Details
#initialize(user:) ⇒ Reorderer
Returns a new instance of Reorderer.
8 9 10 |
# File 'app/services/collavre/creatives/reorderer.rb', line 8 def initialize(user:) @user = user end |
Instance Method Details
#link_drop(dragged_id:, target_id:, direction:) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'app/services/collavre/creatives/reorderer.rb', line 58 def link_drop(dragged_id:, target_id:, direction:) dragged, target = fetch_creatives(dragged_id, target_id) validate_direction!(direction) raise Error, "Invalid creatives" unless dragged && target origin = dragged.effective_origin new_parent = direction == "child" ? target : target.parent if new_parent.present? origin_descendant_ids = origin.self_and_descendants.pluck(:id) new_parent.self_and_ancestors.each do |ancestor| ancestor_origin_id = ancestor.origin_id.presence || ancestor.id if origin_descendant_ids.include?(ancestor_origin_id) raise Error, "Invalid creatives" end end end new_creative = nil Creative.transaction do new_creative = Creative.create!( origin_id: origin.id, parent: new_parent, user: new_parent&.user || user ) siblings = sibling_scope(new_parent) siblings.reject! { |s| s.id == new_creative.id } if direction == "child" siblings << new_creative else target_index = siblings.index { |s| s.id == target.id } || 0 insert_index = direction == "up" ? target_index : target_index + 1 insert_index = [ [ insert_index, 0 ].max, siblings.size ].min siblings.insert(insert_index, new_creative) end resequence!(siblings) end LinkDropResult.new(new_creative: new_creative, parent: new_parent, direction: direction) rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved => e raise Error, e. end |
#reorder(dragged_id:, target_id:, direction:) ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'app/services/collavre/creatives/reorderer.rb', line 12 def reorder(dragged_id:, target_id:, direction:) dragged, target = fetch_creatives(dragged_id, target_id) validate_direction!(direction) raise Error, "Invalid creatives" unless dragged && target if direction == "child" reorder_as_child(dragged, target) else reorder_as_sibling(dragged, target, direction) end true end |
#reorder_multiple(dragged_ids:, target_id:, direction:) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'app/services/collavre/creatives/reorderer.rb', line 26 def reorder_multiple(dragged_ids:, target_id:, direction:) ids = Array(dragged_ids).map(&:presence).compact validate_direction!(direction) raise Error, "Invalid creatives" if ids.empty? target = Creative.find_by(id: target_id) raise Error, "Invalid creatives" unless target dragged_lookup = Creative.where(id: ids).index_by { |creative| creative.id.to_s } ordered_dragged = ids.map { |id| dragged_lookup[id.to_s] }.compact raise Error, "Invalid creatives" unless ordered_dragged.size == ids.size if ordered_dragged.any? { |creative| creative.id == target.id } raise Error, "Invalid creatives" end target_ancestor_ids = target.ancestors.pluck(:id) if ordered_dragged.any? { |creative| target_ancestor_ids.include?(creative.id) } raise Error, "Invalid creatives" end if direction == "child" reorder_multiple_as_child(ordered_dragged, target) else reorder_multiple_as_sibling(ordered_dragged, target, direction) end true rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved => e raise Error, e. end |