Commit 2920c5c036db7fdea76b13c800a6e2ab6e0caf43

Authored by Victor Costa
1 parent 657be12f

Change display content to dinamically show parent content

plugins/display_content/lib/display_content_block.rb
1 class DisplayContentBlock < Block 1 class DisplayContentBlock < Block
2 2
3 settings_items :nodes, :type => Array, :default => [] 3 settings_items :nodes, :type => Array, :default => []
4 - settings_items :parent_nodes, :type => Array, :default => []  
5 settings_items :chosen_attributes, :type => Array, :default => ['title'] 4 settings_items :chosen_attributes, :type => Array, :default => ['title']
  5 + settings_items :display_folder_children, :type => :boolean, :default => true
6 6
7 def self.description 7 def self.description
8 _('Display your contents') 8 _('Display your contents')
@@ -13,20 +13,28 @@ class DisplayContentBlock &lt; Block @@ -13,20 +13,28 @@ class DisplayContentBlock &lt; Block
13 end 13 end
14 14
15 def checked_nodes= params 15 def checked_nodes= params
  16 + self.nodes = params.keys
  17 + end
  18 +
  19 + before_save :expand_nodes
  20 +
  21 + def expand_nodes
16 return self.nodes if self.holder.nil? 22 return self.nodes if self.holder.nil?
17 - articles = []  
18 - parent_articles = []  
19 - self.holder.articles.find(params.keys).map do |article|  
20 - if article.folder?  
21 - articles = articles + article.children  
22 - parent_articles << article.id  
23 - else  
24 - articles<< article  
25 - end  
26 - parent_articles = parent_articles + get_parent(article) unless parent_articles.include?(article.parent_id) 23 +
  24 + articles = self.holder.articles.find(nodes)
  25 + children = articles.map { |article| article.children }.compact.flatten
  26 +
  27 + if display_folder_children
  28 + articles = articles - children
  29 + else
  30 + articles = (articles + children).uniq
27 end 31 end
28 - self.parent_nodes = parent_articles  
29 - self.nodes = articles.map{|a| a.id if a.is_a?(TextArticle) }.compact 32 +
  33 + self.nodes = articles.map(&:id)
  34 + end
  35 +
  36 + def parent_nodes
  37 + @parent_nodes ||= self.holder.articles.find(nodes).map { |article| get_parent(article) }.compact.flatten
30 end 38 end
31 39
32 VALID_CONTENT = ['RawHTMLArticle', 'TextArticle', 'TextileArticle', 'TinyMceArticle', 'Folder', 'Blog', 'Forum'] 40 VALID_CONTENT = ['RawHTMLArticle', 'TextArticle', 'TextileArticle', 'TinyMceArticle', 'Folder', 'Blog', 'Forum']
@@ -38,14 +46,18 @@ class DisplayContentBlock &lt; Block @@ -38,14 +46,18 @@ class DisplayContentBlock &lt; Block
38 46
39 include ActionController::UrlWriter 47 include ActionController::UrlWriter
40 def content(args={}) 48 def content(args={})
41 - docs = owner.articles.find(:all, :conditions => {:id => self.nodes}) 49 + extra_condition = display_folder_children ? 'OR articles.parent_id IN(:nodes)':''
  50 + 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}])
  51 +
42 block_title(title) + 52 block_title(title) +
43 - content_tag('ul', docs.map {|item|  
44 - content_tag('li',  
45 - (display_attribute?('title') ? content_tag('div', link_to(h(item.title), item.url), :class => 'title') : '') +  
46 - (display_attribute?('abstract') ? content_tag('div', item.abstract ,:class => 'lead') : '') +  
47 - (display_attribute?('body') ? content_tag('div', item.body ,:class => 'body') : '')  
48 - ) 53 + content_tag('ul', docs.map {|item|
  54 + if !item.folder?
  55 + content_tag('li',
  56 + (display_attribute?('title') ? content_tag('div', link_to(h(item.title), item.url), :class => 'title') : '') +
  57 + (display_attribute?('abstract') ? content_tag('div', item.abstract ,:class => 'lead') : '') +
  58 + (display_attribute?('body') ? content_tag('div', item.body ,:class => 'body') : '')
  59 + )
  60 + end
49 }.join("\n")) 61 }.join("\n"))
50 62
51 end 63 end
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
@@ -672,4 +469,37 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase @@ -672,4 +469,37 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
672 assert block.display_attribute?('body') 469 assert block.display_attribute?('body')
673 end 470 end
674 471
  472 + should 'do not save children if a folder is checked' do
  473 + profile = create_user('testuser').person
  474 + Article.delete_all
  475 + f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  476 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)
  477 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f1.id)
  478 + a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)
  479 +
  480 + checked_articles= {f1.id => true, a1.id => true, a2.id => true, a3.id => false}
  481 + block = DisplayContentBlock.new
  482 + block.stubs(:holder).returns(profile)
  483 + block.checked_nodes= checked_articles
  484 + block.save!
  485 + assert_equivalent [f1.id], block.nodes
  486 + end
  487 +
  488 + should 'save folder and children if display_folder_children is false' do
  489 + profile = create_user('testuser').person
  490 + Article.delete_all
  491 + f1 = fast_create(Folder, :name => 'test folder 1', :profile_id => profile.id)
  492 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :parent_id => f1.id)
  493 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id, :parent_id => f1.id)
  494 + a3 = fast_create(TextileArticle, :name => 'test article 3', :profile_id => profile.id, :parent_id => f1.id)
  495 +
  496 + checked_articles= {f1.id => true, a1.id => true, a2.id => true, a3.id => false}
  497 + block = DisplayContentBlock.new
  498 + block.display_folder_children = false
  499 + block.stubs(:holder).returns(profile)
  500 + block.checked_nodes= checked_articles
  501 + block.save!
  502 + assert_equivalent [f1.id, a1.id, a2.id, a3.id], block.nodes
  503 + end
  504 +
675 end 505 end
plugins/display_content/views/box_organizer/_display_content_block.rhtml
@@ -11,6 +11,10 @@ @@ -11,6 +11,10 @@
11 <div id="display_content"> 11 <div id="display_content">
12 </div> 12 </div>
13 13
  14 +<div class="display_folder_children">
  15 + <%= labelled_form_field check_box(:block, :display_folder_children) + _('Dinamically load children of selected folders'), '' %>
  16 +</div>
  17 +
14 <script type="text/javascript" > 18 <script type="text/javascript" >
15 19
16 jQuery_1_8_3("#display_content").jstree({ 20 jQuery_1_8_3("#display_content").jstree({