Skip to content

Commit 824d2bf

Browse files
fix: prepend_child causes negative order values when reordering within same parent (#488)
1 parent 1f63e99 commit 824d2bf

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

lib/closure_tree/hierarchy_maintenance.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ def _ct_after_save
4949
_ct_reorder_prior_siblings_if_parent_changed
5050
_ct_reorder_siblings
5151
elsif saved_changes[_ct.order_column_sym]
52-
_ct_reorder_siblings(saved_changes[_ct.order_column_sym].min)
52+
min = saved_changes[_ct.order_column_sym].min
53+
_ct_reorder_siblings(min.negative? ? nil : min)
5354
end
5455
end
5556
if saved_changes[_ct.parent_column_name] && !@was_new_record

test/closure_tree/label_order_value_test.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@ def setup
3838
assert_equal 1, c.reload.order_value
3939
end
4040

41+
test 'prepend_child should produce 0-based order values when reordering within the same parent' do
42+
root = Label.create(name: 'root')
43+
a = root.children.create(name: 'a')
44+
b = root.children.create(name: 'b')
45+
c = root.children.create(name: 'c')
46+
47+
assert_equal 0, a.order_value
48+
assert_equal 1, b.order_value
49+
assert_equal 2, c.order_value
50+
51+
# Move c to be the first child (same parent, reorder only)
52+
root.prepend_child(c)
53+
54+
assert_equal 0, c.reload.order_value
55+
assert_equal 1, a.reload.order_value
56+
assert_equal 2, b.reload.order_value
57+
end
58+
4159
test 'should set order_value on roots for LabelWithoutRootOrdering' do
4260
root = LabelWithoutRootOrdering.create(name: 'root')
4361
assert_nil root.order_value

0 commit comments

Comments
 (0)