summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2008-12-21 09:45:39 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2008-12-21 09:45:39 +0000
commit1773be565cb8fd785b0da81bab5f367e5d1f930e (patch)
tree6355b2c5def3a48804a5f60195e1d32f71523969
parent2891ba29335fb6f50d82c9a38f732c040d3697b1 (diff)
downloadredmine-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.rb21
-rw-r--r--nested_projects/test/unit/project_test.rb25
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')