diff --git a/app/helpers/folder_helper.rb b/app/helpers/folder_helper.rb
index 288d1cb..429f71c 100644
--- a/app/helpers/folder_helper.rb
+++ b/app/helpers/folder_helper.rb
@@ -1,11 +1,19 @@
module FolderHelper
def list_articles(articles, recursive = false)
- content_tag(
- 'table',
- content_tag('tr', content_tag('th', _('Title')) + content_tag('th', _('Last update'))) +
- articles.select { |item| item.public? }.map {|item| display_article_in_listing(item, recursive, 0)}.join('')
- )
+ if !articles.blank?
+ content_tag(
+ 'table',
+ content_tag('tr', content_tag('th', _('Title')) + content_tag('th', _('Last update'))) +
+ articles.map {|item| display_article_in_listing(item, recursive, 0)}.join('')
+ )
+ else
+ content_tag('em', _('(empty folder)'))
+ end
+ end
+
+ def available_articles(articles, user)
+ articles.select {|article| article.display_to?(user)}
end
def display_article_in_listing(article, recursive = false, level = 0)
diff --git a/app/models/folder.rb b/app/models/folder.rb
index 9b6252f..f455a6a 100644
--- a/app/models/folder.rb
+++ b/app/models/folder.rb
@@ -41,7 +41,10 @@ class Folder < Article
end
def folder
- content_tag('div', body) + tag('hr') + (children.empty? ? content_tag('em', _('(empty folder)')) : list_articles(children))
+ folder = self
+ lambda do
+ render :file => 'content_viewer/folder', :locals => { :folder => folder }
+ end
end
def image_gallery
diff --git a/app/views/content_viewer/folder.rhtml b/app/views/content_viewer/folder.rhtml
new file mode 100644
index 0000000..0f821f4
--- /dev/null
+++ b/app/views/content_viewer/folder.rhtml
@@ -0,0 +1,10 @@
+
+ <%= folder.body %>
+
+
+
+<% if folder.children.empty? %>
+ <%= _('(empty folder)') %>
+<% else %>
+ <%= list_articles(available_articles(folder.children, user)) %>
+<% end %>
diff --git a/app/views/profile/sitemap.rhtml b/app/views/profile/sitemap.rhtml
index fd74211..0fcf974 100644
--- a/app/views/profile/sitemap.rhtml
+++ b/app/views/profile/sitemap.rhtml
@@ -1,3 +1,3 @@
<%= _("%s: site map") % profile.name %>
-<%= list_articles(@articles, false) %>
+<%= list_articles(available_articles(@articles, user), false) %>
diff --git a/test/unit/folder_helper_test.rb b/test/unit/folder_helper_test.rb
index c0cb378..493157b 100644
--- a/test/unit/folder_helper_test.rb
+++ b/test/unit/folder_helper_test.rb
@@ -15,4 +15,77 @@ class FolderHelperTest < Test::Unit::TestCase
assert_equal 'icons-mime/unknown.png', icon_for_article(art2)
end
+ should 'list all the folder\'s children to the owner' do
+ profile = create_user('Folder Owner').person
+ folder = fast_create(Folder, :profile_id => profile.id)
+ sub_folder = fast_create(Folder, {:parent_id => folder.id, :profile_id => profile.id})
+ sub_blog = fast_create(Blog, {:parent_id => folder.id, :profile_id => profile.id})
+ sub_article = fast_create(Article, {:parent_id => folder.id, :profile_id => profile.id, :published => false})
+
+ result = available_articles(folder.children, profile)
+
+ assert_includes result, sub_folder
+ assert_includes result, sub_article
+ assert_includes result, sub_blog
+ end
+
+ should 'list the folder\'s children that are public to the user' do
+ profile = create_user('Folder Owner').person
+ profile2 = create_user('Folder Viwer').person
+ folder = fast_create(Folder, :profile_id => profile.id)
+ public_article = fast_create(Article, {:parent_id => folder.id, :profile_id => profile.id, :published => true})
+ not_public_article = fast_create(Article, {:parent_id => folder.id, :profile_id => profile.id, :published => false})
+
+ result = available_articles(folder.children, profile2)
+
+ assert_includes result, public_article
+ assert_not_includes result, not_public_article
+ end
+
+ should ' not list the folder\'s children to the user because the owner\'s profile is not public' do
+ profile = create_user('folder-owner').person
+ profile.public_profile = false
+ profile.save!
+ profile2 = create_user('Folder Viwer').person
+ folder = fast_create(Folder, :profile_id => profile.id)
+ article = fast_create(Article, {:parent_id => folder.id, :profile_id => profile.id})
+
+ result = available_articles(folder.children, profile2)
+
+ assert_not_includes result, article
+ end
+
+ should ' not list the folder\'s children to the user because the owner\'s profile is not visible' do
+ profile = create_user('folder-owner').person
+ profile.visible = false
+ profile.save!
+ profile2 = create_user('Folder Viwer').person
+ folder = fast_create(Folder, :profile_id => profile.id)
+ article = fast_create(Article, {:parent_id => folder.id, :profile_id => profile.id})
+
+ result = available_articles(folder.children, profile2)
+
+ assert_not_includes result, article
+ end
+
+ should 'list subitems as HTML content' do
+ profile = create_user('folder-owner').person
+ folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
+ article = fast_create(Article, {:name => 'Article1', :parent_id => folder.id, :profile_id => profile.id})
+ article = fast_create(Article, {:name => 'Article2', :parent_id => folder.id, :profile_id => profile.id})
+
+ result = folder.list_articles(folder.children)
+
+ assert_tag_in_string result, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/folder-owner\/my-article-[0-9]*(\?|$)/ } }, :content => /Article1/
+ assert_tag_in_string result, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/folder-owner\/my-article-[0-9]*(\?|$)/ } }, :content => /Article2/
+ end
+
+ should 'explictly advise if empty' do
+ profile = create_user('folder-owner').person
+ folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
+ result = folder.list_articles(folder.children)
+
+ assert_match '(empty folder)', result
+ end
+
end
--
libgit2 0.21.2