Commit 974f333d0fc73c9f9d002d3e711cb93b239138ba

Authored by Joenio Costa
Committed by Antonio Terceiro
1 parent 4b393886

ActionItem806: some enhancements in blog

  - display comment form opened
  - links to subscribe rss feed
  - show 'Edit blog' on view blog
  - display button to remove article when view
  - use select box instead of text fields to blog configuration
  - decreasing size of the field description
  - use 'New post' instead of 'New article'
app/controllers/my_profile/cms_controller.rb
... ... @@ -129,11 +129,12 @@ class CmsController < MyProfileController
129 129 redirect_to :action => 'view', :id => @article.id
130 130 end
131 131  
132   - post_only :destroy
133 132 def destroy
134 133 @article = profile.articles.find(params[:id])
135   - @article.destroy
136   - redirect_to :action => (@article.parent ? 'view' : 'index'), :id => @article.parent
  134 + if request.post?
  135 + @article.destroy
  136 + redirect_to :action => (@article.parent ? 'view' : 'index'), :id => @article.parent
  137 + end
137 138 end
138 139  
139 140 def why_categorize
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -62,6 +62,8 @@ class ContentViewerController < ApplicationController
62 62 return
63 63 end
64 64  
  65 + @form_div = params[:form]
  66 +
65 67 if request.post? && params[:comment] && params[self.icaptcha_field].blank? && @page.accept_comments?
66 68 add_comment
67 69 end
... ...
app/helpers/application_helper.rb
... ... @@ -719,4 +719,33 @@ module ApplicationHelper
719 719 environment.top_url(request.ssl?)
720 720 end
721 721  
  722 + def helper_for_article(article)
  723 + article_helper = ActionView::Base.new
  724 + article_helper.extend ArticleHelper
  725 + begin
  726 + class_name = article.class.name + 'Helper'
  727 + klass = class_name.constantize
  728 + article_helper.extend klass
  729 + rescue
  730 + end
  731 + article_helper
  732 + end
  733 +
  734 + def label_for_new_article(article)
  735 + article_helper = helper_for_article(!article.nil? && !article.parent.nil? ? article.parent : article)
  736 + article_helper.cms_label_for_new_children
  737 + end
  738 +
  739 + def label_for_edit_article(article)
  740 + article_helper = helper_for_article(article)
  741 + article_helper.cms_label_for_edit
  742 + end
  743 +
  744 + def meta_tags_for_article(article)
  745 + if article and (article.blog? or (article.parent and article.parent.blog?))
  746 + blog = article.blog? ? article : article.parent
  747 + "<link rel='alternate' type='application/rss+xml' title='#{blog.feed.title}' href='#{url_for blog.feed.url}' />"
  748 + end
  749 + end
  750 +
722 751 end
... ...
app/helpers/article_helper.rb
... ... @@ -11,4 +11,12 @@ module ArticleHelper
11 11 )
12 12 end
13 13  
  14 + def cms_label_for_new_children
  15 + _('New article')
  16 + end
  17 +
  18 + def cms_label_for_edit
  19 + _('Edit')
  20 + end
  21 +
14 22 end
... ...
app/helpers/blog_helper.rb
... ... @@ -6,4 +6,12 @@ module BlogHelper
6 6 hidden_field_tag('article[accept_comments]', 0)
7 7 end
8 8  
  9 + def cms_label_for_new_children
  10 + _('New post')
  11 + end
  12 +
  13 + def cms_label_for_edit
  14 + _('Edit blog')
  15 + end
  16 +
9 17 end
... ...
app/helpers/cms_helper.rb
... ... @@ -12,14 +12,7 @@ module CmsHelper
12 12 attr_reader :environment
13 13  
14 14 def options_for_article(article)
15   - article_helper = ActionView::Base.new
16   - article_helper.extend ArticleHelper
17   - begin
18   - class_name = article.class.name + 'Helper'
19   - klass = class_name.constantize
20   - article_helper.extend klass
21   - rescue
22   - end
  15 + article_helper = helper_for_article(article)
23 16 article_helper.custom_options_for_article(article)
24 17 end
25 18  
... ...
app/helpers/content_viewer_helper.rb
... ... @@ -35,7 +35,7 @@ module ContentViewerHelper
35 35  
36 36 def display_post(article)
37 37 article_title(article) + content_tag('p', article.to_html) +
38   - content_tag('p', link_to( number_of_comments(article), article.url ), :class => 'metadata')
  38 + content_tag('p', link_to( number_of_comments(article), article.url.merge(:form => 'opened', :anchor => 'comment_form') ), :class => 'metadata')
39 39 end
40 40  
41 41 def article_to_html(article)
... ...
app/models/blog_archives_block.rb
... ... @@ -3,6 +3,7 @@ class BlogArchivesBlock &lt; Block
3 3 include ActionView::Helpers::TagHelper
4 4 include ActionView::Helpers::UrlHelper
5 5 include ActionController::UrlWriter
  6 + include ActionView::Helpers::AssetTagHelper
6 7  
7 8 def self.description
8 9 _('List posts of your blog')
... ... @@ -25,7 +26,8 @@ class BlogArchivesBlock &lt; Block
25 26 results << "</ul>"
26 27 end
27 28 block_title(title) +
28   - content_tag('ul', results, :class => 'blog-archives')
  29 + content_tag('ul', results, :class => 'blog-archives') +
  30 + content_tag('div', link_to(_('Subscribe RSS Feed'), owner.blog.feed.url), :class => 'subscribe-feed')
29 31 end
30 32  
31 33 end
... ...
app/views/cms/_blog.rhtml
... ... @@ -4,18 +4,14 @@
4 4  
5 5 <%= f.text_field('title', :size => '64') %>
6 6  
7   -<%= labelled_form_field(_('Description:'), text_area(:article, :body, :cols => 64)) %>
  7 +<%= labelled_form_field(_('Description:'), text_area(:article, :body, :cols => 64, :rows => 10)) %>
8 8  
9   -<h4><%= _('Settings') %></h4>
10   -
11   -<%= f.text_field('posts_per_page') %>
12   -
13   -<h5><%= _('Feed options') %></h5>
  9 +<%= labelled_form_field(_('Posts per page:'), f.select(:posts_per_page, [5, 10, 20, 50, 100])) %>
14 10  
15 11 <% fields_for 'article[feed]', @article.feed do |feed| %>
16 12  
17   -<%= labelled_form_field(_('Limit of articles'), feed.text_field(:limit)) %>
  13 +<%= labelled_form_field(_('Limit of posts in RSS Feed'), feed.select(:limit, ['5', '10', '20', '50'])) %>
18 14  
19   -<%= labelled_form_field(_('Use as item description:'), feed.select(:feed_item_description, [ [ _('Article abstract'), 'abstract'], [ _('Article body'), 'body']])) %>
  15 +<%= labelled_form_field(_('Use as description in RSS Feed:'), feed.select(:feed_item_description, [ [ _('Article abstract'), 'abstract'], [ _('Article body'), 'body']])) %>
20 16  
21 17 <% end %>
... ...
app/views/cms/view.rhtml
... ... @@ -22,7 +22,7 @@
22 22 <% if !@article or !@article.blog? %>
23 23 <%= button :add, _('New folder'), :action => 'new', :type => 'Folder', :parent_id => parent_id %>
24 24 <% end %>
25   - <%= lightbox_button('new', _('New article'), :action => 'new', :parent_id => parent_id) %>
  25 + <%= lightbox_button('new', label_for_new_article(@article), :action => 'new', :parent_id => parent_id) %>
26 26 <% end %>
27 27  
28 28 <table class='cms-articles'>
... ...
app/views/content_viewer/_comment_form.rhtml
... ... @@ -15,7 +15,7 @@
15 15 f.commit.focus(); f['comment[<%= focus_on %>]'].focus();
16 16 this.onclick=null">
17 17  
18   -<h4><%= _('Post a comment') %></h4>
  18 +<h4><%= content_tag('a', '', :name => 'comment_form') + _('Post a comment') %></h4>
19 19  
20 20 <% form_tag( @page.url, { :id => comment_form_id } ) do %>
21 21  
... ...
app/views/content_viewer/view_page.rhtml
... ... @@ -32,15 +32,18 @@
32 32 </script>
33 33 <% if logged_in? && current_user.person.has_permission?('post_content', profile) %>
34 34 <div id="article-actions" class="hidden">
35   - <%= link_to content_tag( 'span', _('Edit') ),
  35 + <%= link_to content_tag( 'span', label_for_edit_article(@page) ),
36 36 { :controller => 'cms', :action => 'edit', :id => @page },
37 37 :class => 'button with-text icon-edit' %>
  38 + <%= link_to content_tag( 'span', _('Delete') ),
  39 + { :controller => 'cms', :action => 'destroy', :id => @page },
  40 + :class => 'button with-text icon-delete' %>
38 41 <% if profile.kind_of?(Person) %>
39 42 <%= link_to content_tag( 'span', _('Spread this') ),
40 43 { :controller => 'cms', :action => 'publish', :id => @page },
41 44 :class => 'button with-text icon-spread' %>
42 45 <% end %>
43   - <%= lightbox_button(:new, _('New publication'), :controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent))) %>
  46 + <%= lightbox_button(:new, label_for_new_article(@page), :controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent))) %>
44 47 </div>
45 48 <% end %>
46 49 </div>
... ...
app/views/layouts/application.rhtml
... ... @@ -11,7 +11,7 @@
11 11 <meta name="description" content="FIXME: Descriptions of Noosfero" />
12 12 <meta name="keywords" content="Noosfero, Community, Open Source" />
13 13 <link rel="shortcut icon" href="<%= '/designs/themes/' + current_theme + '/images/favicon.ico' %>" type="image/x-icon" />
14   -
  14 + <%= meta_tags_for_article(@page) if @controller.controller_name == 'content_viewer' %>
15 15 <%= javascript_include_tag 'default-config' %>
16 16 <%= javascript_include_tag :defaults %>
17 17 <%# javascript_include_tag 'animator' %>
... ...
public/stylesheets/blocks/blog-archives-block.css
... ... @@ -15,3 +15,8 @@
15 15 .blog-archives-block a {
16 16 text-decoration: none;
17 17 }
  18 +
  19 +.blog-archives-block .subscribe-feed {
  20 + padding: 5px 0px 10px 10px;
  21 + font-size: small;
  22 +}
... ...
test/functional/cms_controller_test.rb
... ... @@ -642,7 +642,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
642 642  
643 643 should 'display posts per page input with default value on edit blog' do
644 644 get :new, :profile => profile.identifier, :type => 'Blog'
645   - assert_tag :tag => 'input', :attributes => { :name => 'article[posts_per_page]', :type => 'text', :value => '20' }
  645 + assert_tag :tag => 'select', :attributes => { :name => 'article[posts_per_page]' }, :child => { :tag => 'option', :attributes => {:value => '20', :selected => 'selected'} }
646 646 end
647 647  
648 648 should 'not offer to create special article types' do
... ... @@ -725,4 +725,25 @@ class CmsControllerTest &lt; Test::Unit::TestCase
725 725 assert_tag :tag => 'input', :attributes => { :name => 'article[title]', :type => 'text' }
726 726 end
727 727  
  728 + should "display 'New article' when create children of folder" do
  729 + a = Folder.new(:name => 'article folder'); profile.articles << a; a.save!
  730 + Article.stubs(:short_description).returns('bli')
  731 + get :view, :profile => profile.identifier, :id => a
  732 + assert_tag :tag => 'a', :content => 'New article'
  733 + end
  734 +
  735 + should "display 'New post' when create children of blog" do
  736 + a = Blog.create!(:name => 'blog_for_test', :profile => profile)
  737 + Article.stubs(:short_description).returns('bli')
  738 + get :view, :profile => profile.identifier, :id => a
  739 + assert_tag :tag => 'a', :content => 'New post'
  740 + end
  741 +
  742 + should 'offer confirmation to remove article' do
  743 + a = profile.articles.create!(:name => 'my-article')
  744 + get :destroy, :profile => profile.identifier, :id => a.id
  745 + assert_response :success
  746 + assert_tag :tag => 'input', :attributes => {:type => 'submit', :value => 'Yes, I want.' }
  747 + end
  748 +
728 749 end
... ...
test/functional/content_viewer_controller_test.rb
... ... @@ -564,4 +564,59 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
564 564 assert_tag :tag => 'div', :attributes => { :class => /main-block/ }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new?parent_id=#{folder.id}" } }
565 565 end
566 566  
  567 + should "display 'New article' when create children of folder" do
  568 + login_as(profile.identifier)
  569 + a = Folder.new(:name => 'article folder'); profile.articles << a; a.save!
  570 + Article.stubs(:short_description).returns('bli')
  571 + get :view_page, :profile => profile.identifier, :page => [a.path]
  572 + assert_tag :tag => 'a', :content => 'New article'
  573 + end
  574 +
  575 + should "display 'New post' when create children of blog" do
  576 + login_as(profile.identifier)
  577 + a = Blog.create!(:name => 'article folder', :profile => profile)
  578 + Article.stubs(:short_description).returns('bli')
  579 + get :view_page, :profile => profile.identifier, :page => [a.path]
  580 + assert_tag :tag => 'a', :content => 'New post'
  581 + end
  582 +
  583 + should "display same label for new article button of parent" do
  584 + login_as(profile.identifier)
  585 + a = Blog.create!(:name => 'article folder', :profile => profile)
  586 + Article.stubs(:short_description).returns('bli')
  587 + t = TextileArticle.create!(:name => 'first post', :parent => a, :profile => profile)
  588 + get :view_page, :profile => profile.identifier, :page => [t.path]
  589 + assert_tag :tag => 'a', :content => 'New post'
  590 + end
  591 +
  592 + should 'display button to remove article' do
  593 + login_as(profile.identifier)
  594 + t = TextileArticle.create!(:name => 'article to destroy', :profile => profile)
  595 + get :view_page, :profile => profile.identifier, :page => [t.path]
  596 + assert_tag :tag => 'a', :content => 'Delete', :attributes => {:href => "/myprofile/#{profile.identifier}/cms/destroy/#{t.id}"}
  597 + end
  598 +
  599 + should 'add meta tag to rss feed on view blog' do
  600 + login_as(profile.identifier)
  601 + a = Blog.create!(:name => 'article folder', :profile => profile)
  602 + get :view_page, :profile => profile.identifier, :page => [a.path]
  603 + assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => /\/#{profile.identifier}\/blog\/feed/}
  604 + end
  605 +
  606 + should 'add meta tag to rss feed on view post blog' do
  607 + login_as(profile.identifier)
  608 + a = Blog.create!(:name => 'article folder', :profile => profile)
  609 + t = TextileArticle.create!(:name => 'first post', :parent => a, :profile => profile)
  610 + get :view_page, :profile => profile.identifier, :page => [t.path]
  611 + assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => /\/#{profile.identifier}\/blog\/feed/}
  612 + end
  613 +
  614 + should 'link to post with comment form opened' do
  615 + login_as(profile.identifier)
  616 + a = Blog.create!(:name => 'article folder', :profile => profile)
  617 + t = TextileArticle.create!(:name => 'first post', :parent => a, :profile => profile)
  618 + get :view_page, :profile => profile.identifier, :page => [a.path]
  619 + assert_tag :tag => 'div', :attributes => { :id => "post-#{t.id}" }, :descendant => { :tag => 'a', :content => 'No comments yet', :attributes => { :href => /#{profile.identifier}\/blog\/first-post\?form=opened#comment_form/ } }
  620 + end
  621 +
567 622 end
... ...
test/unit/application_helper_test.rb
... ... @@ -225,8 +225,17 @@ class ApplicationHelperTest &lt; Test::Unit::TestCase
225 225 assert_nil select_categories(mock)
226 226 end
227 227  
  228 + should 'create rss feed link to blog' do
  229 + p = create_user('testuser').person
  230 + b = Blog.create!(:profile => p, :name => 'blog_feed_test')
  231 + assert_tag_in_string meta_tags_for_article(b), :tag => 'link', :attributes => {:type => 'application/rss+xml', :title => 'feed'}
  232 + end
  233 +
228 234 protected
229 235  
  236 + def url_for(args = {})
  237 + args
  238 + end
230 239 def content_tag(tag, content, options = {})
231 240 content.strip
232 241 end
... ...
test/unit/cms_helper_test.rb
... ... @@ -4,6 +4,7 @@ class CmsHelperTest &lt; Test::Unit::TestCase
4 4  
5 5 include CmsHelper
6 6 include BlogHelper
  7 + include ApplicationHelper
7 8  
8 9 should 'show default options for article' do
9 10 result = options_for_article(RssFeed.new)
... ...
test/unit/content_viewer_helper_test.rb
... ... @@ -46,7 +46,7 @@ class ContentViewerHelperTest &lt; Test::Unit::TestCase
46 46  
47 47 should 'count total of comments from post' do
48 48 article = TextileArticle.new(:name => 'first post for test', :body => 'first post for test', :profile => profile)
49   - article.stubs(:url).returns('')
  49 + article.stubs(:url).returns({})
50 50 article.stubs(:comments).returns([Comment.new(:author => profile, :title => 'test', :body => 'test')])
51 51 result = display_post(article)
52 52 assert_match /One comment/, result
... ...