]> source.dussan.org Git - redmine.git/commitdiff
Adds a "depth" option to the child_pages macro (#10789).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 16 Sep 2012 15:24:35 +0000 (15:24 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 16 Sep 2012 15:24:35 +0000 (15:24 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10401 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/plugins/acts_as_tree/lib/active_record/acts/tree.rb
lib/redmine/wiki_formatting/macros.rb
test/fixtures/wiki_pages.yml
test/unit/lib/redmine/wiki_formatting/macros_test.rb
test/unit/wiki_page_test.rb

index 79d16448549a4724c1aa04d8b56b954fe9056c0f..a1c83cf50d72130a6c7ed71f2749551a0f0e57d6 100644 (file)
@@ -73,15 +73,20 @@ module ActiveRecord
         # Returns list of descendants.
         #
         #   root.descendants # => [child1, subchild1, subchild2]
-        def descendants
-          children + children.collect(&:descendants).flatten
+        def descendants(depth=nil)
+          depth ||= 0
+          result = children.dup
+          unless depth == 1
+            result += children.collect {|child| child.descendants(depth-1)}.flatten
+          end
+          result
         end
 
         # Returns list of descendants and a reference to the current node.
         #
         #   root.self_and_descendants # => [root, child1, subchild1, subchild2]
-        def self_and_descendants
-          [self] + descendants
+        def self_and_descendants(depth=nil)
+          [self] + descendants(depth)
         end
 
         # Returns the root node of the tree.
index 23e6caf007cb41949efdb97e88e8cda40c9e2f0b..1ae86345b0faaa23df193122283eb716996768a5 100644 (file)
@@ -183,7 +183,9 @@ module Redmine
              "  !{{child_pages(Foo)}} -- lists all children of page Foo\n" +
              "  !{{child_pages(Foo, parent=1)}} -- same as above with a link to page Foo"
       macro :child_pages do |obj, args|
-        args, options = extract_macro_options(args, :parent)
+        args, options = extract_macro_options(args, :parent, :depth)
+        options[:depth] = options[:depth].to_i if options[:depth].present?
+
         page = nil
         if args.size > 0
           page = Wiki.find_page(args.first.to_s, :project => @project)
@@ -193,7 +195,7 @@ module Redmine
           raise 'With no argument, this macro can be called from wiki pages only.'
         end
         raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project)
-        pages = ([page] + page.descendants).group_by(&:parent_id)
+        pages = page.self_and_descendants(options[:depth]).group_by(&:parent_id)
         render_page_hierarchy(pages, options[:parent] ? page.parent_id : page.id)
       end
 
index 8a00e4af499d6d4d24d8dbf6342828703c13ca24..51fd8d633de971e39a59afec74cfcbe6d5612931 100644 (file)
@@ -76,3 +76,10 @@ wiki_pages_011:
   wiki_id: 1
   protected: false
   parent_id: 
+wiki_pages_012: 
+  created_on: 2007-03-08 00:18:07 +01:00
+  title: Child_1_1
+  id: 12
+  wiki_id: 1
+  protected: false
+  parent_id: 5
index 75376652a317e734c4a710b61693372177ae5884..53665d0173c500708bf6e08228dd956f396a90f9 100644 (file)
@@ -182,7 +182,8 @@ class Redmine::WikiFormatting::MacrosTest < ActionView::TestCase
 
   def test_macro_child_pages
     expected =  "<p><ul class=\"pages-hierarchy\">\n" +
-                 "<li><a href=\"/projects/ecookbook/wiki/Child_1\">Child 1</a></li>\n" +
+                 "<li><a href=\"/projects/ecookbook/wiki/Child_1\">Child 1</a>\n" +
+                 "<ul class=\"pages-hierarchy\">\n<li><a href=\"/projects/ecookbook/wiki/Child_1_1\">Child 1 1</a></li>\n</ul>\n</li>\n" +
                  "<li><a href=\"/projects/ecookbook/wiki/Child_2\">Child 2</a></li>\n" +
                  "</ul>\n</p>"
 
@@ -196,11 +197,12 @@ class Redmine::WikiFormatting::MacrosTest < ActionView::TestCase
     assert_equal expected, textilizable("{{child_pages(ecookbook:Another_page)}}", :object => WikiPage.find(1).content)
   end
 
-  def test_macro_child_pages_with_option
+  def test_macro_child_pages_with_parent_option
     expected =  "<p><ul class=\"pages-hierarchy\">\n" +
                  "<li><a href=\"/projects/ecookbook/wiki/Another_page\">Another page</a>\n" +
                  "<ul class=\"pages-hierarchy\">\n" +
-                 "<li><a href=\"/projects/ecookbook/wiki/Child_1\">Child 1</a></li>\n" +
+                 "<li><a href=\"/projects/ecookbook/wiki/Child_1\">Child 1</a>\n" +
+                 "<ul class=\"pages-hierarchy\">\n<li><a href=\"/projects/ecookbook/wiki/Child_1_1\">Child 1 1</a></li>\n</ul>\n</li>\n" +
                  "<li><a href=\"/projects/ecookbook/wiki/Child_2\">Child 2</a></li>\n" +
                  "</ul>\n</li>\n</ul>\n</p>"
 
@@ -214,6 +216,16 @@ class Redmine::WikiFormatting::MacrosTest < ActionView::TestCase
     assert_equal expected, textilizable("{{child_pages(ecookbook:Another_page, parent=1)}}", :object => WikiPage.find(1).content)
   end
 
+  def test_macro_child_pages_with_depth_option
+    expected =  "<p><ul class=\"pages-hierarchy\">\n" +
+                 "<li><a href=\"/projects/ecookbook/wiki/Child_1\">Child 1</a></li>\n" +
+                 "<li><a href=\"/projects/ecookbook/wiki/Child_2\">Child 2</a></li>\n" +
+                 "</ul>\n</p>"
+
+    @project = Project.find(1)
+    assert_equal expected, textilizable("{{child_pages(depth=1)}}", :object => WikiPage.find(2).content)
+  end
+
   def test_macro_child_pages_without_wiki_page_should_fail
     assert_match /can be called from wiki pages only/, textilizable("{{child_pages}}")
   end
index 11341286b57bd503819c12e7e45358c9b8acaa97..2a606a7821215dd33d5b060701273b8da122fccc 100644 (file)
@@ -131,4 +131,22 @@ class WikiPageTest < ActiveSupport::TestCase
     assert_equal Time.gm(2007, 3, 6, 23, 10, 51), page.content.updated_on
     assert_equal page.content.updated_on, page.updated_on
   end
+
+  def test_descendants
+    page = WikiPage.create!(:wiki => @wiki, :title => 'Parent')
+    child1 = WikiPage.create!(:wiki => @wiki, :title => 'Child1', :parent => page)
+    child11 = WikiPage.create!(:wiki => @wiki, :title => 'Child11', :parent => child1)
+    child111 = WikiPage.create!(:wiki => @wiki, :title => 'Child111', :parent => child11)
+    child2 = WikiPage.create!(:wiki => @wiki, :title => 'Child2', :parent => page)
+
+    assert_equal %w(Child1 Child11 Child111 Child2), page.descendants.map(&:title).sort
+    assert_equal %w(Child1 Child11 Child111 Child2), page.descendants(nil).map(&:title).sort
+    assert_equal %w(Child1 Child11 Child2), page.descendants(2).map(&:title).sort
+    assert_equal %w(Child1 Child2), page.descendants(1).map(&:title).sort
+
+    assert_equal %w(Child1 Child11 Child111 Child2 Parent), page.self_and_descendants.map(&:title).sort
+    assert_equal %w(Child1 Child11 Child111 Child2 Parent), page.self_and_descendants(nil).map(&:title).sort
+    assert_equal %w(Child1 Child11 Child2 Parent), page.self_and_descendants(2).map(&:title).sort
+    assert_equal %w(Child1 Child2 Parent), page.self_and_descendants(1).map(&:title).sort
+  end
 end