From 1773be565cb8fd785b0da81bab5f367e5d1f930e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 21 Dec 2008 09:45:39 +0000 Subject: [PATCH] Project#set_parents! inserts children or root projects in alphabetical order. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/work@2160 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- nested_projects/app/models/project.rb | 21 +++++++++++++++++-- nested_projects/test/unit/project_test.rb | 25 +++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/nested_projects/app/models/project.rb b/nested_projects/app/models/project.rb index 92f29f2f1..98a796d15 100644 --- a/nested_projects/app/models/project.rb +++ b/nested_projects/app/models/project.rb @@ -197,12 +197,29 @@ class Project < ActiveRecord::Base return false unless p end end - if p == parent + if p == parent && !p.nil? + # Nothing to do true elsif p.nil? || (p.active? && move_possible?(p)) - move_to_child_of(p) + # Insert the project so that target's children or root projects stay alphabetically sorted + sibs = (p.nil? ? self.class.roots : p.children) + to_be_inserted_before = sibs.detect {|c| c.name.to_s.downcase > name.to_s.downcase } + if to_be_inserted_before + move_to_left_of(to_be_inserted_before) + elsif p.nil? + if sibs.empty? + # move_to_root adds the project in first (ie. left) position + move_to_root + else + move_to_right_of(sibs.last) unless self == sibs.last + end + else + # move_to_child_of adds the project in last (ie.right) position + move_to_child_of(p) + end true else + # Can not move to the given target false end end diff --git a/nested_projects/test/unit/project_test.rb b/nested_projects/test/unit/project_test.rb index 0f56330cf..229944832 100644 --- a/nested_projects/test/unit/project_test.rb +++ b/nested_projects/test/unit/project_test.rb @@ -118,6 +118,31 @@ class ProjectTest < Test::Unit::TestCase assert !(sub.set_parent!(Project.find(3))) end + def test_set_parent_should_add_roots_in_alphabetical_order + ProjectCustomField.delete_all + Project.delete_all + Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(nil) + Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(nil) + Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(nil) + Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(nil) + + assert_equal 4, Project.count + assert_equal Project.all.sort_by(&:name), Project.all.sort_by(&:lft) + end + + def test_set_parent_should_add_children_in_alphabetical_order + ProjectCustomField.delete_all + parent = Project.create!(:name => 'Parent', :identifier => 'parent') + Project.create!(:name => 'Project C', :identifier => 'project-c').set_parent!(parent) + Project.create!(:name => 'Project B', :identifier => 'project-b').set_parent!(parent) + Project.create!(:name => 'Project D', :identifier => 'project-d').set_parent!(parent) + Project.create!(:name => 'Project A', :identifier => 'project-a').set_parent!(parent) + + parent.reload + assert_equal 4, parent.children.size + assert_equal parent.children.sort_by(&:name), parent.children + end + def test_rebuild_should_sort_children_alphabetically ProjectCustomField.delete_all parent = Project.create!(:name => 'Parent', :identifier => 'parent')