diff --git a/lib/closure_tree/hierarchy_maintenance.rb b/lib/closure_tree/hierarchy_maintenance.rb index 3103dc0..951fc14 100644 --- a/lib/closure_tree/hierarchy_maintenance.rb +++ b/lib/closure_tree/hierarchy_maintenance.rb @@ -49,7 +49,8 @@ def _ct_after_save _ct_reorder_prior_siblings_if_parent_changed _ct_reorder_siblings elsif saved_changes[_ct.order_column_sym] - _ct_reorder_siblings(saved_changes[_ct.order_column_sym].min) + min = saved_changes[_ct.order_column_sym].min + _ct_reorder_siblings(min.negative? ? nil : min) end end if saved_changes[_ct.parent_column_name] && !@was_new_record diff --git a/test/closure_tree/label_order_value_test.rb b/test/closure_tree/label_order_value_test.rb index 968a332..2496101 100644 --- a/test/closure_tree/label_order_value_test.rb +++ b/test/closure_tree/label_order_value_test.rb @@ -38,6 +38,24 @@ def setup assert_equal 1, c.reload.order_value end + test 'prepend_child should produce 0-based order values when reordering within the same parent' do + root = Label.create(name: 'root') + a = root.children.create(name: 'a') + b = root.children.create(name: 'b') + c = root.children.create(name: 'c') + + assert_equal 0, a.order_value + assert_equal 1, b.order_value + assert_equal 2, c.order_value + + # Move c to be the first child (same parent, reorder only) + root.prepend_child(c) + + assert_equal 0, c.reload.order_value + assert_equal 1, a.reload.order_value + assert_equal 2, b.reload.order_value + end + test 'should set order_value on roots for LabelWithoutRootOrdering' do root = LabelWithoutRootOrdering.create(name: 'root') assert_nil root.order_value