diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-12-21 09:45:39 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2008-12-21 09:45:39 +0000 |
commit | 1773be565cb8fd785b0da81bab5f367e5d1f930e (patch) | |
tree | 6355b2c5def3a48804a5f60195e1d32f71523969 | |
parent | 2891ba29335fb6f50d82c9a38f732c040d3697b1 (diff) | |
download | redmine-1773be565cb8fd785b0da81bab5f367e5d1f930e.tar.gz redmine-1773be565cb8fd785b0da81bab5f367e5d1f930e.zip |
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
-rw-r--r-- | nested_projects/app/models/project.rb | 21 | ||||
-rw-r--r-- | 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')
|