@@ -92,27 +92,28 @@ def position # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
9292 respond_to do |format |
9393 format . html { redirect_to request . referer || checklist_path ( @checklist ) , notice : t ( 'flash.generic.updated' ) }
9494 format . turbo_stream do
95- # Move the LI node: remove the moved element and insert before/after the sibling
96- begin
97- a = @checklist_item
98- b = sibling
99- streams = [ ]
100- streams << turbo_stream . remove ( helpers . dom_id ( a ) )
101-
102- # If direction is up, insert before sibling; if down, insert after sibling
103- if direction == 'up'
104- streams << turbo_stream . before ( helpers . dom_id ( b ) , partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : a , checklist : @checklist , moved : true } )
105- else
106- streams << turbo_stream . after ( helpers . dom_id ( b ) , partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : a , checklist : @checklist , moved : true } )
107- end
95+ # Move the LI node: remove the moved element and insert before/after the sibling
96+
97+ a = @checklist_item
98+ b = sibling
99+ streams = [ ]
100+ streams << turbo_stream . remove ( helpers . dom_id ( a ) )
101+
102+ # If direction is up, insert before sibling; if down, insert after sibling
103+ if direction == 'up'
104+ streams << turbo_stream . before ( helpers . dom_id ( b ) ,
105+ partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : a , checklist : @checklist , moved : true } )
106+ else
107+ streams << turbo_stream . after ( helpers . dom_id ( b ) ,
108+ partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : a , checklist : @checklist , moved : true } )
109+ end
108110
109- render turbo_stream : streams
110- rescue StandardError
111- # Fallback: update only the inner list contents
112- render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
113- partial : 'better_together/checklist_items/list_contents' ,
114- locals : { checklist : @checklist } )
115- end
111+ render turbo_stream : streams
112+ rescue StandardError
113+ # Fallback: update only the inner list contents
114+ render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
115+ partial : 'better_together/checklist_items/list_contents' ,
116+ locals : { checklist : @checklist } )
116117 end
117118 end
118119 end
@@ -141,60 +142,57 @@ def reorder # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
141142 respond_to do |format |
142143 format . json { head :no_content }
143144 format . turbo_stream do
144- # Try a minimal DOM update: if exactly one item moved, remove it and insert before/after the neighbor.
145- begin
146- ordered = params [ :ordered_ids ] . map ( &:to_i )
147- # previous_order holds the order before we updated positions
148- current_before = previous_order
149-
150- # If nothing changed, no content
151- if ordered == current_before
152- head :no_content and return
153- end
154-
155- # Detect single moved id (difference between arrays)
156- moved = ( ordered - current_before )
157- removed = ( current_before - ordered )
158-
159- if moved . size == 1 && removed . size == 1
160- moved_id = moved . first
161- moved_item = @checklist . checklist_items . find_by ( id : moved_id )
162- # Safety: if item not found, fallback
163- unless moved_item
164- raise 'moved-missing'
165- end
166-
167- # Where did it land?
168- new_index = ordered . index ( moved_id )
169-
170- streams = [ ]
171- # Remove original node first
172- streams << turbo_stream . remove ( helpers . dom_id ( moved_item ) )
173-
174- # Append after the next element (neighbor at new_index + 1)
175- neighbor_id = ordered [ new_index + 1 ] if new_index
176- if neighbor_id
177- neighbor = @checklist . checklist_items . find_by ( id : neighbor_id )
178- if neighbor
179- streams << turbo_stream . after ( helpers . dom_id ( neighbor ) , partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : moved_item , checklist : @checklist , moved : true } )
180- render turbo_stream : streams and return
181- end
182- end
183-
184- # If neighbor not found (moved to end), append to the UL
185- streams << turbo_stream . append ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } ul" , partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : moved_item , checklist : @checklist , moved : true } )
145+ # Try a minimal DOM update: if exactly one item moved, remove it and insert before/after the neighbor.
146+
147+ ordered = params [ :ordered_ids ] . map ( &:to_i )
148+ # previous_order holds the order before we updated positions
149+ current_before = previous_order
150+
151+ # If nothing changed, no content
152+ head :no_content and return if ordered == current_before
153+
154+ # Detect single moved id (difference between arrays)
155+ moved = ( ordered - current_before )
156+ removed = ( current_before - ordered )
157+
158+ if moved . size == 1 && removed . size == 1
159+ moved_id = moved . first
160+ moved_item = @checklist . checklist_items . find_by ( id : moved_id )
161+ # Safety: if item not found, fallback
162+ raise 'moved-missing' unless moved_item
163+
164+ # Where did it land?
165+ new_index = ordered . index ( moved_id )
166+
167+ streams = [ ]
168+ # Remove original node first
169+ streams << turbo_stream . remove ( helpers . dom_id ( moved_item ) )
170+
171+ # Append after the next element (neighbor at new_index + 1)
172+ neighbor_id = ordered [ new_index + 1 ] if new_index
173+ if neighbor_id
174+ neighbor = @checklist . checklist_items . find_by ( id : neighbor_id )
175+ if neighbor
176+ streams << turbo_stream . after ( helpers . dom_id ( neighbor ) ,
177+ partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : moved_item , checklist : @checklist , moved : true } )
186178 render turbo_stream : streams and return
187179 end
188-
189- # Fallback: update inner contents for complex reorders
190- render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
191- partial : 'better_together/checklist_items/list_contents' ,
192- locals : { checklist : @checklist } )
193- rescue StandardError
194- render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
195- partial : 'better_together/checklist_items/list_contents' ,
196- locals : { checklist : @checklist } )
197180 end
181+
182+ # If neighbor not found (moved to end), append to the UL
183+ streams << turbo_stream . append ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } ul" ,
184+ partial : 'better_together/checklist_items/checklist_item' , locals : { checklist_item : moved_item , checklist : @checklist , moved : true } )
185+ render turbo_stream : streams and return
186+ end
187+
188+ # Fallback: update inner contents for complex reorders
189+ render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
190+ partial : 'better_together/checklist_items/list_contents' ,
191+ locals : { checklist : @checklist } )
192+ rescue StandardError
193+ render turbo_stream : turbo_stream . update ( "#{ helpers . dom_id ( @checklist , :checklist_items ) } " ,
194+ partial : 'better_together/checklist_items/list_contents' ,
195+ locals : { checklist : @checklist } )
198196 end
199197 end
200198 end
0 commit comments