Commit abdeef43007690c8c81f81cc57d55382574ebb99

Authored by Rodrigo Souto
2 parents 91db1c99 a375bb4c

Merge remote-tracking branch 'participa/AI2937-folder_display_content' into folder-display-content

Conflicts:
	plugins/display_content/lib/display_content_block.rb
	plugins/display_content/test/unit/display_content_block_test.rb
plugins/display_content/lib/display_content_block.rb
@@ -16,7 +16,6 @@ class DisplayContentBlock < Block @@ -16,7 +16,6 @@ class DisplayContentBlock < Block
16 ] 16 ]
17 17
18 settings_items :nodes, :type => Array, :default => [] 18 settings_items :nodes, :type => Array, :default => []
19 - settings_items :parent_nodes, :type => Array, :default => []  
20 settings_items :sections, 19 settings_items :sections,
21 :type => Array, 20 :type => Array,
22 :default => [{:name => _('Publish date'), :checked => true}, 21 :default => [{:name => _('Publish date'), :checked => true},
@@ -25,6 +24,7 @@ class DisplayContentBlock < Block @@ -25,6 +24,7 @@ class DisplayContentBlock < Block
25 {:name => _('Body'), :checked => false}, 24 {:name => _('Body'), :checked => false},
26 {:name => _('Image'), :checked => false}, 25 {:name => _('Image'), :checked => false},
27 {:name => _('Tags'), :checked => false}] 26 {:name => _('Tags'), :checked => false}]
  27 + settings_items :display_folder_children, :type => :boolean, :default => true
28 28
29 def self.description 29 def self.description
30 _('Display your contents') 30 _('Display your contents')
@@ -35,20 +35,28 @@ class DisplayContentBlock < Block @@ -35,20 +35,28 @@ class DisplayContentBlock < Block
35 end 35 end
36 36
37 def checked_nodes= params 37 def checked_nodes= params
  38 + self.nodes = params.keys
  39 + end
  40 +
  41 + before_save :expand_nodes
  42 +
  43 + def expand_nodes
38 return self.nodes if self.holder.nil? 44 return self.nodes if self.holder.nil?
39 - articles = []  
40 - parent_articles = []  
41 - self.holder.articles.find(params.keys).map do |article|  
42 - if article.folder?  
43 - articles = articles + article.children  
44 - parent_articles << article.id  
45 - else  
46 - articles<< article  
47 - end  
48 - parent_articles = parent_articles + get_parent(article) unless parent_articles.include?(article.parent_id) 45 +
  46 + articles = self.holder.articles.find(nodes)
  47 + children = articles.map { |article| article.children }.compact.flatten
  48 +
  49 + if display_folder_children
  50 + articles = articles - children
  51 + else
  52 + articles = (articles + children).uniq
49 end 53 end
50 - self.parent_nodes = parent_articles  
51 - self.nodes = articles.map{|a| a.id if a.is_a?(TextArticle) }.compact 54 +
  55 + self.nodes = articles.map(&:id)
  56 + end
  57 +
  58 + def parent_nodes
  59 + @parent_nodes ||= self.holder.articles.find(nodes).map { |article| get_parent(article) }.compact.flatten
52 end 60 end
53 61
54 VALID_CONTENT = ['RawHTMLArticle', 'TextArticle', 'TextileArticle', 'TinyMceArticle', 'Folder', 'Blog', 'Forum'] 62 VALID_CONTENT = ['RawHTMLArticle', 'TextArticle', 'TextileArticle', 'TinyMceArticle', 'Folder', 'Blog', 'Forum']
@@ -60,17 +68,18 @@ class DisplayContentBlock &lt; Block @@ -60,17 +68,18 @@ class DisplayContentBlock &lt; Block
60 68
61 include ActionController::UrlWriter 69 include ActionController::UrlWriter
62 def content(args={}) 70 def content(args={})
63 - docs = owner.articles.find(:all, :conditions => {:id => self.nodes}) 71 + extra_condition = display_folder_children ? 'OR articles.parent_id IN(:nodes)':''
  72 + docs = nodes.blank? ? [] : owner.articles.find(:all, :conditions => ["(articles.id IN(:nodes) #{extra_condition}) AND articles.type IN(:types)", {:nodes => self.nodes, :types => VALID_CONTENT}])
64 73
65 block_title(title) + 74 block_title(title) +
66 - content_tag('ul', docs.map {|item|  
67 -  
68 - content_sections = ''  
69 - read_more_section = ''  
70 - tags_section = ''  
71 -  
72 - sections.select { |section|  
73 - case section[:name] 75 + content_tag('ul', docs.map {|item|
  76 + if !item.folder?
  77 + content_sections = ''
  78 + read_more_section = ''
  79 + tags_section = ''
  80 +
  81 + sections.select { |section|
  82 + case section[:name]
74 when 'Publish date' 83 when 'Publish date'
75 content_sections += (display_section?(section) ? (content_tag('div', show_date(item.published_at, false), :class => 'published-at') ) : '') 84 content_sections += (display_section?(section) ? (content_tag('div', show_date(item.published_at, false), :class => 'published-at') ) : '')
76 when 'Title' 85 when 'Title'
@@ -92,14 +101,14 @@ class DisplayContentBlock &lt; Block @@ -92,14 +101,14 @@ class DisplayContentBlock &lt; Block
92 tags_section = item.tags.map { |t| content_tag('span', t.name) }.join("") 101 tags_section = item.tags.map { |t| content_tag('span', t.name) }.join("")
93 content_sections += (display_section?(section) ? (content_tag('div', tags_section, :class => 'tags')) : '') 102 content_sections += (display_section?(section) ? (content_tag('div', tags_section, :class => 'tags')) : '')
94 end 103 end
95 - end  
96 - } 104 + end
  105 + }
97 106
98 - content_sections += read_more_section if !read_more_section.blank? 107 + content_sections += read_more_section if !read_more_section.blank?
99 108
100 - content_tag('li', content_sections) 109 + content_tag('li', content_sections)
  110 + end
101 }.join(" ")) 111 }.join(" "))
102 -  
103 end 112 end
104 113
105 def url_params 114 def url_params
@@ -121,7 +130,7 @@ class DisplayContentBlock &lt; Block @@ -121,7 +130,7 @@ class DisplayContentBlock &lt; Block
121 130
122 def holder 131 def holder
123 return nil if self.box.nil? || self.owner.nil? 132 return nil if self.box.nil? || self.owner.nil?
124 - if self.owner.kind_of?(Environment) 133 + if self.owner.kind_of?(Environment)
125 return nil if self.owner.portal_community.nil? 134 return nil if self.owner.portal_community.nil?
126 self.owner.portal_community 135 self.owner.portal_community
127 else 136 else
plugins/display_content/test/functional/display_content_plugin_admin_controller_test.rb
@@ -73,18 +73,16 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -73,18 +73,16 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
73 73
74 should 'index action returns an json with node undetermined if the node is in the parent nodes list' do 74 should 'index action returns an json with node undetermined if the node is in the parent nodes list' do
75 Article.delete_all 75 Article.delete_all
76 - article = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id)  
77 - block.parent_nodes= [article.id] 76 + f = fast_create(Folder, :name => 'test folder 1', :profile_id => environment.portal_community.id)
  77 + article = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id, :parent_id => f.id)
  78 + article2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => environment.portal_community.id, :parent_id => f.id)
  79 + block.nodes = [article.id]
78 block.save! 80 block.save!
79 81
80 get :index, :block_id => block.id 82 get :index, :block_id => block.id
81 json_response = ActiveSupport::JSON.decode(@response.body) 83 json_response = ActiveSupport::JSON.decode(@response.body)
82 - expected_json = {'data' => article.title}  
83 - expected_json['attr'] = { 'node_id' => article.id, 'parent_id' => article.parent_id}  
84 - expected_json['attr'].merge!({'class' => 'jstree-undetermined'})  
85 - expected_json['children'] = []  
86 -  
87 - assert_equivalent [expected_json], json_response 84 + expected_json = { 'node_id' => f.id, 'class' => 'jstree-undetermined', 'parent_id' => f.parent_id}
  85 + assert_equal expected_json, json_response.first['attr']
88 end 86 end
89 87
90 should 'index action returns an json with node closed if the node has article with children' do 88 should 'index action returns an json with node closed if the node has article with children' do
@@ -106,7 +104,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -106,7 +104,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
106 f = fast_create(Folder, :name => 'test folder 1', :profile_id => environment.portal_community.id) 104 f = fast_create(Folder, :name => 'test folder 1', :profile_id => environment.portal_community.id)
107 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id, :parent_id => f.id) 105 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id, :parent_id => f.id)
108 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => environment.portal_community.id, :parent_id => f.id) 106 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => environment.portal_community.id, :parent_id => f.id)
109 - block.parent_nodes = [f.id] 107 + block.checked_nodes= {a1.id => true}
110 block.save! 108 block.save!
111 109
112 get :index, :block_id => block.id 110 get :index, :block_id => block.id
@@ -114,7 +112,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -114,7 +112,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
114 expected_json = {'data' => f.title} 112 expected_json = {'data' => f.title}
115 expected_json['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id} 113 expected_json['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id}
116 children = [ 114 children = [
117 - {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id}}, 115 + {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id, "class" => "jstree-checked"}},
118 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}} 116 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}}
119 ] 117 ]
120 expected_json['attr'].merge!({'class' => 'jstree-undetermined'}) 118 expected_json['attr'].merge!({'class' => 'jstree-undetermined'})
@@ -130,7 +128,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -130,7 +128,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
130 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id, :parent_id => f.id) 128 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => environment.portal_community.id, :parent_id => f.id)
131 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => environment.portal_community.id, :parent_id => f.id) 129 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => environment.portal_community.id, :parent_id => f.id)
132 a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => environment.portal_community.id) 130 a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => environment.portal_community.id)
133 - block.parent_nodes = [f.id] 131 + block.checked_nodes= {a2.id => true, a3.id => true}
134 block.save! 132 block.save!
135 133
136 get :index, :block_id => block.id 134 get :index, :block_id => block.id
@@ -140,7 +138,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -140,7 +138,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
140 value['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id} 138 value['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id}
141 children = [ 139 children = [
142 {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id}}, 140 {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id}},
143 - {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}} 141 + {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id, "class" => "jstree-checked"}}
144 ] 142 ]
145 value['attr'].merge!({'class' => 'jstree-undetermined'}) 143 value['attr'].merge!({'class' => 'jstree-undetermined'})
146 value['children'] = children 144 value['children'] = children
@@ -148,7 +146,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase @@ -148,7 +146,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
148 expected_json.push(value) 146 expected_json.push(value)
149 147
150 value = {'data' => a3.title} 148 value = {'data' => a3.title}
151 - value['attr'] = { 'node_id' => a3.id, 'parent_id' => a3.parent_id} 149 + value['attr'] = { 'node_id' => a3.id, 'parent_id' => a3.parent_id, "class" => "jstree-checked"}
152 expected_json.push(value) 150 expected_json.push(value)
153 151
154 assert_equivalent expected_json, json_response 152 assert_equivalent expected_json, json_response
plugins/display_content/test/functional/display_content_plugin_myprofile_controller_test.rb
@@ -73,18 +73,16 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase @@ -73,18 +73,16 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase
73 73
74 should 'index action returns an json with node undetermined if the node is in the parent nodes list' do 74 should 'index action returns an json with node undetermined if the node is in the parent nodes list' do
75 Article.delete_all 75 Article.delete_all
76 - article = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
77 - block.parent_nodes= [article.id] 76 + f = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  77 + article = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f.id)
  78 + article2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f.id)
  79 + block.nodes = [article.id]
78 block.save! 80 block.save!
79 81
80 get :index, :block_id => block.id, :profile => profile.identifier 82 get :index, :block_id => block.id, :profile => profile.identifier
81 json_response = ActiveSupport::JSON.decode(@response.body) 83 json_response = ActiveSupport::JSON.decode(@response.body)
82 - expected_json = {'data' => article.title}  
83 - expected_json['attr'] = { 'node_id' => article.id, 'parent_id' => article.parent_id}  
84 - expected_json['attr'].merge!({'class' => 'jstree-undetermined'})  
85 - expected_json['children'] = []  
86 -  
87 - assert_equivalent [expected_json], json_response 84 + expected_json = { 'node_id' => f.id, 'class' => 'jstree-undetermined', 'parent_id' => f.parent_id}
  85 + assert_equal expected_json, json_response.first['attr']
88 end 86 end
89 87
90 should 'index action returns an json with node closed if the node has article with children' do 88 should 'index action returns an json with node closed if the node has article with children' do
@@ -107,7 +105,7 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase @@ -107,7 +105,7 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase
107 f = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id) 105 f = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
108 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f.id) 106 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f.id)
109 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f.id) 107 a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f.id)
110 - block.parent_nodes = [f.id] 108 + block.checked_nodes = {a1.id => true}
111 block.save! 109 block.save!
112 110
113 get :index, :block_id => block.id, :profile => profile.identifier 111 get :index, :block_id => block.id, :profile => profile.identifier
@@ -115,32 +113,32 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase @@ -115,32 +113,32 @@ class DisplayContentPluginMyprofileControllerTest &lt; ActionController::TestCase
115 expected_json = {'data' => f.title} 113 expected_json = {'data' => f.title}
116 expected_json['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id} 114 expected_json['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id}
117 children = [ 115 children = [
118 - {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id}}, 116 + {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id, "class" => "jstree-checked"}},
119 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}} 117 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}}
120 ] 118 ]
121 expected_json['attr'].merge!({'class' => 'jstree-undetermined'}) 119 expected_json['attr'].merge!({'class' => 'jstree-undetermined'})
122 expected_json['children'] = children 120 expected_json['children'] = children
123 expected_json['state'] = 'closed' 121 expected_json['state'] = 'closed'
124 122
125 - assert_equivalent [expected_json], json_response  
126 - end  
127 -  
128 - should 'index action returns an json with all the children nodes and root nodes if some parent is in the parents list and there is others root articles' do  
129 - Article.delete_all  
130 - f = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
131 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f.id)  
132 - a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f.id)  
133 - a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id)  
134 - block.parent_nodes = [f.id]  
135 - block.save!  
136 -  
137 - get :index, :block_id => block.id, :profile => profile.identifier  
138 - json_response = ActiveSupport::JSON.decode(@response.body)  
139 - expected_json = []  
140 - value = {'data' => f.title}  
141 - value['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id}  
142 - children = [  
143 - {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id}}, 123 + assert_equivalent [expected_json], json_response
  124 + end
  125 +
  126 + should 'index action returns an json with all the children nodes and root nodes if some parent is in the parents list and there is others root articles' do
  127 + Article.delete_all
  128 + f = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  129 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f.id)
  130 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f.id)
  131 + a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id)
  132 + block.checked_nodes = {a1.id => true}
  133 + block.save!
  134 +
  135 + get :index, :block_id => block.id, :profile => profile.identifier
  136 + json_response = ActiveSupport::JSON.decode(@response.body)
  137 + expected_json = []
  138 + value = {'data' => f.title}
  139 + value['attr'] = { 'node_id' => f.id, 'parent_id' => f.parent_id}
  140 + children = [
  141 + {'data' => a1.title, 'attr' => {'node_id' => a1.id, 'parent_id' => a1.parent_id, "class" => "jstree-checked"}},
144 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}} 142 {'data' => a2.title, 'attr' => {'node_id' => a2.id, 'parent_id'=> a2.parent_id}}
145 ] 143 ]
146 value['attr'].merge!({'class' => 'jstree-undetermined'}) 144 value['attr'].merge!({'class' => 'jstree-undetermined'})
plugins/display_content/test/unit/display_content_block_test.rb
@@ -23,7 +23,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -23,7 +23,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
23 assert_equal [], block.nodes 23 assert_equal [], block.nodes
24 end 24 end
25 25
26 - should 'not set nodes if there is no holder' do 26 + should 'not expand nodes if there is no holder' do
27 Article.delete_all 27 Article.delete_all
28 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => 1) 28 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => 1)
29 29
@@ -31,7 +31,9 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -31,7 +31,9 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
31 block = DisplayContentBlock.new 31 block = DisplayContentBlock.new
32 block.stubs(:holder).returns(nil) 32 block.stubs(:holder).returns(nil)
33 block.checked_nodes= checked_articles 33 block.checked_nodes= checked_articles
34 - assert_equal [], block.nodes 34 + a1.delete
  35 + block.save!
  36 + assert_equal [a1.id], block.nodes
35 end 37 end
36 38
37 should 'nodes be the article ids in hash of checked nodes' do 39 should 'nodes be the article ids in hash of checked nodes' do
@@ -90,28 +92,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -90,28 +92,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
90 assert_equal [], block.nodes - [a1.id, a4.id] 92 assert_equal [], block.nodes - [a1.id, a4.id]
91 end 93 end
92 94
93 - should "save the first children level of folders" do  
94 - profile = create_user('testuser').person  
95 - Article.delete_all  
96 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
97 - a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id)  
98 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
99 - a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)  
100 - f2 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
101 - a4 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f2.id)  
102 - a5 = fast_create(TextileArticle, :name => 'test article 5', :profile_id => profile.id, :parent_id => f2.id)  
103 -  
104 - checked_articles= {a1.id => true, a2.id => true, f1.id => false, f2.id => true}  
105 -  
106 - block = DisplayContentBlock.new  
107 - block.stubs(:holder).returns(profile)  
108 - block.checked_nodes= checked_articles  
109 -  
110 - assert_equal [], [a1.id, a2.id, a3.id, a4.id, a5.id] - block.nodes  
111 - assert_equal [], block.nodes - [a1.id, a2.id, a3.id, a4.id, a5.id]  
112 - end  
113 -  
114 - should "not save deeper level of folder's children" do 95 + should "save selected folders and articles" do
115 profile = create_user('testuser').person 96 profile = create_user('testuser').person
116 Article.delete_all 97 Article.delete_all
117 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id) 98 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -128,11 +109,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -128,11 +109,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
128 block.stubs(:holder).returns(profile) 109 block.stubs(:holder).returns(profile)
129 block.checked_nodes= checked_articles 110 block.checked_nodes= checked_articles
130 111
131 - assert_equal [], [a1.id, a2.id, a3.id] - block.nodes  
132 - assert_equal [], block.nodes - [a1.id, a2.id, a3.id] 112 + assert_equivalent [a1.id, a2.id, f1.id], block.nodes
133 end 113 end
134 114
135 - should "save the first children level of blogs" do 115 + should "save selected articles and blogs" do
136 profile = create_user('testuser').person 116 profile = create_user('testuser').person
137 Article.delete_all 117 Article.delete_all
138 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id) 118 a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -149,8 +129,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -149,8 +129,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
149 block.stubs(:holder).returns(profile) 129 block.stubs(:holder).returns(profile)
150 block.checked_nodes= checked_articles 130 block.checked_nodes= checked_articles
151 131
152 - assert_equal [], [a1.id, a2.id, a3.id, a4.id, a5.id] - block.nodes  
153 - assert_equal [], block.nodes - [a1.id, a2.id, a3.id, a4.id, a5.id] 132 + assert_equivalent [a1.id, a2.id, b1.id, b2.id], block.nodes
154 end 133 end
155 134
156 should 'TextileArticle be saved as node' do 135 should 'TextileArticle be saved as node' do
@@ -192,7 +171,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -192,7 +171,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
192 assert_equal [], block.nodes - [a1.id] 171 assert_equal [], block.nodes - [a1.id]
193 end 172 end
194 173
195 - should 'Event not be saved as node' do 174 + should 'Event be saved as node' do
196 profile = create_user('testuser').person 175 profile = create_user('testuser').person
197 Article.delete_all 176 Article.delete_all
198 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id) 177 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -203,41 +182,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -203,41 +182,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
203 block = DisplayContentBlock.new 182 block = DisplayContentBlock.new
204 block.stubs(:holder).returns(profile) 183 block.stubs(:holder).returns(profile)
205 block.checked_nodes= checked_articles 184 block.checked_nodes= checked_articles
206 - assert_equal [], [a1.id, a2.id] - block.nodes  
207 - assert_equal [], block.nodes - [a1.id, a2.id] 185 + assert_equivalent [a1.id, a2.id, a3.id], block.nodes
208 end 186 end
209 187
210 - should 'RSS not be saved as node' do  
211 - profile = create_user('testuser').person  
212 - Article.delete_all  
213 - a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)  
214 - a2 = fast_create(TextArticle, :name => 'test article 2', :profile_id => profile.id)  
215 - a3 = fast_create(RssFeed, :name => 'test article 3', :profile_id => profile.id)  
216 -  
217 - checked_articles= {a1.id => true, a2.id => true, a3.id => false}  
218 - block = DisplayContentBlock.new  
219 - block.stubs(:holder).returns(profile)  
220 - block.checked_nodes= checked_articles  
221 - assert_equal [], [a1.id, a2.id] - block.nodes  
222 - assert_equal [], block.nodes - [a1.id, a2.id]  
223 - end  
224 -  
225 - should 'UploadedFile not be saved as node' do  
226 - profile = create_user('testuser').person  
227 - Article.delete_all  
228 - a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)  
229 - a2 = fast_create(TextArticle, :name => 'test article 2', :profile_id => profile.id)  
230 - a3 = fast_create(UploadedFile, :name => 'test article 3', :profile_id => profile.id)  
231 -  
232 - checked_articles= {a1.id => true, a2.id => true, a3.id => false}  
233 - block = DisplayContentBlock.new  
234 - block.stubs(:holder).returns(profile)  
235 - block.checked_nodes= checked_articles  
236 - assert_equal [], [a1.id, a2.id] - block.nodes  
237 - assert_equal [], block.nodes - [a1.id, a2.id]  
238 - end  
239 -  
240 - should 'Folder not be saved as node' do 188 + should 'Folder be saved as node' do
241 profile = create_user('testuser').person 189 profile = create_user('testuser').person
242 Article.delete_all 190 Article.delete_all
243 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id) 191 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -248,11 +196,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -248,11 +196,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
248 block = DisplayContentBlock.new 196 block = DisplayContentBlock.new
249 block.stubs(:holder).returns(profile) 197 block.stubs(:holder).returns(profile)
250 block.checked_nodes= checked_articles 198 block.checked_nodes= checked_articles
251 - assert_equal [], [a1.id, a2.id] - block.nodes  
252 - assert_equal [], block.nodes - [a1.id, a2.id] 199 + assert_equivalent [a1.id, a2.id, a3.id], block.nodes
253 end 200 end
254 201
255 - should 'Forum not be saved as node' do 202 + should 'Forum be saved as node' do
256 profile = create_user('testuser').person 203 profile = create_user('testuser').person
257 Article.delete_all 204 Article.delete_all
258 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id) 205 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -263,26 +210,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -263,26 +210,10 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
263 block = DisplayContentBlock.new 210 block = DisplayContentBlock.new
264 block.stubs(:holder).returns(profile) 211 block.stubs(:holder).returns(profile)
265 block.checked_nodes= checked_articles 212 block.checked_nodes= checked_articles
266 - assert_equal [], [a1.id, a2.id] - block.nodes  
267 - assert_equal [], block.nodes - [a1.id, a2.id]  
268 - end  
269 -  
270 - should 'Gallery not be saved as node' do  
271 - profile = create_user('testuser').person  
272 - Article.delete_all  
273 - a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)  
274 - a2 = fast_create(TextArticle, :name => 'test article 2', :profile_id => profile.id)  
275 - a3 = fast_create(Gallery, :name => 'test article 3', :profile_id => profile.id)  
276 -  
277 - checked_articles= {a1.id => true, a2.id => true, a3.id => false}  
278 - block = DisplayContentBlock.new  
279 - block.stubs(:holder).returns(profile)  
280 - block.checked_nodes= checked_articles  
281 - assert_equal [], [a1.id, a2.id] - block.nodes  
282 - assert_equal [], block.nodes - [a1.id, a2.id] 213 + assert_equivalent [a1.id, a2.id, a3.id], block.nodes
283 end 214 end
284 215
285 - should 'Blog not be saved as node' do 216 + should 'Blog be saved as node' do
286 profile = create_user('testuser').person 217 profile = create_user('testuser').person
287 Article.delete_all 218 Article.delete_all
288 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id) 219 a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
@@ -293,141 +224,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -293,141 +224,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
293 block = DisplayContentBlock.new 224 block = DisplayContentBlock.new
294 block.stubs(:holder).returns(profile) 225 block.stubs(:holder).returns(profile)
295 block.checked_nodes= checked_articles 226 block.checked_nodes= checked_articles
296 - assert_equal [], [a1.id, a2.id] - block.nodes  
297 - assert_equal [], block.nodes - [a1.id, a2.id]  
298 - end  
299 -  
300 - should "save the article parents in parent_nodes variable" do  
301 - profile = create_user('testuser').person  
302 - Article.delete_all  
303 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
304 - a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id)  
305 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
306 - a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)  
307 - f2 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
308 - a4 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f2.id)  
309 -  
310 - checked_articles= {a1.id => 1, a3.id => 1, a4.id => 1, f2.id => true}  
311 -  
312 - block = DisplayContentBlock.new  
313 - block.stubs(:holder).returns(profile)  
314 - block.checked_nodes= checked_articles  
315 -  
316 - assert_equal [], [f1.id, f2.id] - block.parent_nodes  
317 - assert_equal [], block.parent_nodes - [f1.id, f2.id]  
318 - end  
319 -  
320 - should "save deeper level of article parents in parent_nodes variable" do  
321 - profile = create_user('testuser').person  
322 - Article.delete_all  
323 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
324 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
325 - f2 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id, :parent_id => f1.id)  
326 - f3 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id, :parent_id => f2.id)  
327 - a2 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f3.id)  
328 -  
329 - checked_articles= {a2.id => 1}  
330 -  
331 - block = DisplayContentBlock.new  
332 - block.stubs(:holder).returns(profile)  
333 - block.checked_nodes= checked_articles  
334 -  
335 - assert_equal [], [f1.id, f2.id, f3.id] - block.parent_nodes  
336 - assert_equal [], block.parent_nodes - [f1.id, f2.id, f3.id]  
337 - end  
338 -  
339 - should "save only once time of parents if more than one children article is checked" do  
340 - profile = create_user('testuser').person  
341 - Article.delete_all  
342 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
343 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
344 - a2 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)  
345 - f2 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
346 - a3 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f2.id)  
347 - a4 = fast_create(TextileArticle, :name => 'test article 5', :profile_id => profile.id, :parent_id => f2.id)  
348 - a5 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f2.id)  
349 -  
350 - checked_articles= {a1.id => 1, a2.id => 1, a3.id => 1, a4.id => 1, a5.id => 1}  
351 -  
352 - block = DisplayContentBlock.new  
353 - block.stubs(:holder).returns(profile)  
354 - block.checked_nodes= checked_articles  
355 -  
356 - assert_equal [], [f1.id, f2.id] - block.parent_nodes  
357 - assert_equal [], block.parent_nodes - [f1.id, f2.id]  
358 - end  
359 -  
360 - should "save only once time of parents if a deeper level of children is checked" do  
361 - profile = create_user('testuser').person  
362 - Article.delete_all  
363 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)  
364 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
365 - f2 = fast_create(Folder, :name => 'test folder 2', :profile_id => profile.id, :parent_id => f1.id)  
366 - f3 = fast_create(Folder, :name => 'test folder 2', :profile_id => profile.id, :parent_id => f2.id)  
367 - f4 = fast_create(Folder, :name => 'test folder 2', :profile_id => profile.id, :parent_id => f3.id)  
368 - f5 = fast_create(Folder, :name => 'test folder 2', :profile_id => profile.id, :parent_id => f2.id)  
369 - a2 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f4.id)  
370 - a3 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f5.id)  
371 -  
372 - checked_articles= {a2.id => 1, a3.id => 1}  
373 -  
374 - block = DisplayContentBlock.new  
375 - block.stubs(:holder).returns(profile)  
376 - block.checked_nodes= checked_articles  
377 -  
378 - assert_equal [], [f1.id, f2.id, f3.id, f4.id, f5.id] - block.parent_nodes  
379 - assert_equal [], block.parent_nodes - [f1.id, f2.id, f3.id, f4.id, f5.id]  
380 - end  
381 -  
382 - should "save the folder in parent_nodes variable if it was checked" do  
383 - profile = create_user('testuser').person  
384 - Article.delete_all  
385 - f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)  
386 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)  
387 - a2 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f1.id)  
388 -  
389 - checked_articles= {f1.id => 1}  
390 -  
391 - block = DisplayContentBlock.new  
392 - block.stubs(:holder).returns(profile)  
393 - block.checked_nodes= checked_articles  
394 -  
395 - assert_equal [], [f1.id] - block.parent_nodes  
396 - assert_equal [], block.parent_nodes - [f1.id]  
397 - end  
398 -  
399 - should "save the blog in parent_nodes variable if it was checked" do  
400 - profile = create_user('testuser').person  
401 - Article.delete_all  
402 - b1 = fast_create(Blog, :name => 'test folder 1', :profile_id => profile.id)  
403 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => b1.id)  
404 - a2 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => b1.id)  
405 -  
406 - checked_articles= {b1.id => 1}  
407 -  
408 - block = DisplayContentBlock.new  
409 - block.stubs(:holder).returns(profile)  
410 - block.checked_nodes= checked_articles  
411 -  
412 - assert_equal [], [b1.id] - block.parent_nodes  
413 - assert_equal [], block.parent_nodes - [b1.id]  
414 - end  
415 -  
416 - should "save the forum in parent_nodes variable if it was checked" do  
417 - profile = create_user('testuser').person  
418 - Article.delete_all  
419 - f1 = fast_create(Forum, :name => 'test folder 1', :profile_id => profile.id)  
420 - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)  
421 - a2 = fast_create(TextileArticle, :name => 'test article 4', :profile_id => profile.id, :parent_id => f1.id)  
422 -  
423 - checked_articles= {f1.id => 1}  
424 -  
425 - block = DisplayContentBlock.new  
426 - block.stubs(:holder).returns(profile)  
427 - block.checked_nodes= checked_articles  
428 -  
429 - assert_equal [], [f1.id] - block.parent_nodes  
430 - assert_equal [], block.parent_nodes - [f1.id] 227 + assert_equivalent [a1.id, a2.id, a3.id], block.nodes
431 end 228 end
432 229
433 should "return all root articles from profile" do 230 should "return all root articles from profile" do
@@ -696,4 +493,37 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -696,4 +493,37 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
696 assert_match /#{a.published_at}/, block.content 493 assert_match /#{a.published_at}/, block.content
697 end 494 end
698 495
  496 + should 'do not save children if a folder is checked' do
  497 + profile = create_user('testuser').person
  498 + Article.delete_all
  499 + f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  500 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)
  501 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f1.id)
  502 + a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)
  503 +
  504 + checked_articles= {f1.id => true, a1.id => true, a2.id => true, a3.id => false}
  505 + block = DisplayContentBlock.new
  506 + block.stubs(:holder).returns(profile)
  507 + block.checked_nodes= checked_articles
  508 + block.save!
  509 + assert_equivalent [f1.id], block.nodes
  510 + end
  511 +
  512 + should 'save folder and children if display_folder_children is false' do
  513 + profile = create_user('testuser').person
  514 + Article.delete_all
  515 + f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  516 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)
  517 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f1.id)
  518 + a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)
  519 +
  520 + checked_articles= {f1.id => true, a1.id => true, a2.id => true, a3.id => false}
  521 + block = DisplayContentBlock.new
  522 + block.display_folder_children = false
  523 + block.stubs(:holder).returns(profile)
  524 + block.checked_nodes= checked_articles
  525 + block.save!
  526 + assert_equivalent [f1.id, a1.id, a2.id, a3.id], block.nodes
  527 + end
  528 +
699 end 529 end
plugins/display_content/views/box_organizer/_display_content_block.rhtml
@@ -17,6 +17,10 @@ @@ -17,6 +17,10 @@
17 <div id="display_content"> 17 <div id="display_content">
18 </div> 18 </div>
19 19
  20 +<div class="display_folder_children">
  21 + <%= labelled_form_field check_box(:block, :display_folder_children) + _('Dinamically load children of selected folders'), '' %>
  22 +</div>
  23 +
20 <script type="text/javascript" > 24 <script type="text/javascript" >
21 25
22 jQuery_1_8_3("#display_content").jstree({ 26 jQuery_1_8_3("#display_content").jstree({