From 9083abbd430d902a68c25bdab019961181940a8b Mon Sep 17 00:00:00 2001 From: Navaneeth Krishnan P <33243337+navaneethkp36@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:53:18 +0530 Subject: [PATCH 1/2] fix: prepend_child sets order_value -1 causing siblings to reorder from -1 --- lib/closure_tree/numeric_deterministic_ordering.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/closure_tree/numeric_deterministic_ordering.rb b/lib/closure_tree/numeric_deterministic_ordering.rb index e0e1644..172bba8 100644 --- a/lib/closure_tree/numeric_deterministic_ordering.rb +++ b/lib/closure_tree/numeric_deterministic_ordering.rb @@ -135,7 +135,7 @@ def append_child(child_node) end def prepend_child(child_node) - child_node.order_value = -1 + child_node.order_value = 0 child_node.parent = self if child_node.save child_node.reload From 73e6b5e68fbe0d2d7c22238b77ada88a35b8df4d Mon Sep 17 00:00:00 2001 From: Navaneeth Krishnan P <33243337+navaneethkp36@users.noreply.github.com> Date: Mon, 6 Apr 2026 19:38:29 +0530 Subject: [PATCH 2/2] fix: prepend_child causes negative order values when reordering within same parent --- lib/closure_tree/hierarchy_maintenance.rb | 3 ++- .../numeric_deterministic_ordering.rb | 2 +- test/closure_tree/label_order_value_test.rb | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) 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/lib/closure_tree/numeric_deterministic_ordering.rb b/lib/closure_tree/numeric_deterministic_ordering.rb index 172bba8..e0e1644 100644 --- a/lib/closure_tree/numeric_deterministic_ordering.rb +++ b/lib/closure_tree/numeric_deterministic_ordering.rb @@ -135,7 +135,7 @@ def append_child(child_node) end def prepend_child(child_node) - child_node.order_value = 0 + child_node.order_value = -1 child_node.parent = self if child_node.save child_node.reload 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