Commit c4c81bc9f4653b4ea5595d611a5b223e3e881e9d
1 parent
02eedc73
Exists in
master
and in
29 other branches
Better support for blogs on ArticleBlocks
This commit has the participation of Lucas Prado Melo It includes: * Make blog pagination link to absolute path * Configure blog display on block view * List blogs on article block selection * Auto select the first text article (if there is one) * Testing!
Showing
5 changed files
with
76 additions
and
12 deletions
Show diff stats
app/helpers/blog_helper.rb
| ... | ... | @@ -18,7 +18,8 @@ module BlogHelper |
| 18 | 18 | pagination = will_paginate(articles, { |
| 19 | 19 | :param_name => 'npage', |
| 20 | 20 | :previous_label => _('« Newer posts'), |
| 21 | - :next_label => _('Older posts »') | |
| 21 | + :next_label => _('Older posts »'), | |
| 22 | + :params => {:action=>"view_page", :page=>articles.first.parent.path.split('/'), :controller=>"content_viewer"} | |
| 22 | 23 | }) |
| 23 | 24 | content = [] |
| 24 | 25 | artic_len = articles.length | ... | ... |
app/models/article_block.rb
| ... | ... | @@ -49,4 +49,14 @@ class ArticleBlock < Block |
| 49 | 49 | self.box.owner.kind_of?(Environment) ? self.box.owner.portal_community.articles : self.box.owner.articles |
| 50 | 50 | end |
| 51 | 51 | |
| 52 | + def posts_per_page | |
| 53 | + self.settings[:posts_per_page] or 1 | |
| 54 | + end | |
| 55 | + | |
| 56 | + def posts_per_page= value | |
| 57 | + value = value.to_i | |
| 58 | + self.settings[:posts_per_page] = value if value > 0 | |
| 59 | + end | |
| 60 | + | |
| 61 | + settings_items :visualization_format, :type => :string, :default => 'short' | |
| 52 | 62 | end | ... | ... |
app/views/box_organizer/_article_block.rhtml
| 1 | -<div class='article-block-edition'> | |
| 1 | +<div class="article-block-edition"> | |
| 2 | 2 | <% if @block.box.owner.kind_of?(Environment) and @block.box.owner.portal_community.nil? %> |
| 3 | - <p id='no_portal_community'> | |
| 3 | + <p id="no_portal_community"> | |
| 4 | 4 | <%= _("You don't have an community defined as the portal community. Define it before use this block properly.") %> |
| 5 | 5 | </p> |
| 6 | 6 | <% else %> |
| 7 | - <% articles = @block.available_articles.select {|article| !article.folder? } %> | |
| 8 | - <%= select_tag('block[article_id]', options_for_select_with_title(articles.map {|item| [item.path, item.id]}, @block.article ? @block.article.id : nil)) %> | |
| 7 | + <% | |
| 8 | + articles = @block.available_articles.select {|a| !a.folder? || a.blog? } | |
| 9 | + firstText = articles[articles.find_index{|a| a.kind_of?TextArticle}||-1] | |
| 10 | + selected = @block.article || firstText | |
| 11 | + %> | |
| 12 | + <%= select_tag('block[article_id]', options_for_select_with_title(articles.map {|item| [item.path, item.id]}, selected.id), :onchange => 'jQuery("#block_blog_options").toggle(this.blogs.indexOf(this.value) != -1)') %> | |
| 13 | + <div id="block_blog_options"> | |
| 14 | + <%= labelled_form_field( _('Number of posts:'), text_field_tag('block[posts_per_page]', @block.posts_per_page) ) %> | |
| 15 | + <%= labelled_form_field( _('How to display posts:'), select_tag('block[visualization_format]', options_for_select([[_('First paragraph'), 'short'], [_('Full post'), 'full']], @block.visualization_format))) %> | |
| 16 | + </div> | |
| 17 | + <% blogs = @block.available_articles.select{|a|a.blog?} %> | |
| 18 | + <script> | |
| 19 | + jQuery("#block_article_id")[0].blogs = <%= blogs.map{|b| b.id.to_s }.to_json %>; | |
| 20 | + jQuery("#block_blog_options").toggle(<%= blogs.include?(selected) %>); | |
| 21 | + </script> | |
| 9 | 22 | <% end %> |
| 10 | 23 | </div> | ... | ... |
app/views/content_viewer/blog_page.rhtml
| ... | ... | @@ -11,9 +11,11 @@ |
| 11 | 11 | <div class="blog-posts"> |
| 12 | 12 | <%= |
| 13 | 13 | posts = @posts |
| 14 | + format = blog.visualization_format | |
| 14 | 15 | if inside_block |
| 15 | - posts = blog.posts.paginate(:page=>1, :per_page=>1) | |
| 16 | + posts = blog.posts.paginate(:page=>1, :per_page=>inside_block.posts_per_page) | |
| 17 | + format = inside_block.visualization_format | |
| 16 | 18 | end |
| 17 | - (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, blog.visualization_format)) | |
| 19 | + (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, format)) | |
| 18 | 20 | %> |
| 19 | 21 | </div> | ... | ... |
test/integration/blocks_integration_test.rb
| 1 | 1 | require "#{File.dirname(__FILE__)}/../test_helper" |
| 2 | 2 | |
| 3 | 3 | class BlocksIntegrationTest < ActionController::IntegrationTest |
| 4 | - | |
| 5 | - should "allow blog as block content" do | |
| 4 | + def blog_on_article_block_bootstrap | |
| 6 | 5 | profile = fast_create(Profile) |
| 7 | 6 | blog = fast_create(Blog, :name => 'Blog', :profile_id => profile.id) |
| 8 | - post = fast_create(TinyMceArticle, :name => "A Post", :profile_id => profile.id, :parent_id => blog.id, :body => 'Lorem ipsum dolor sit amet') | |
| 7 | + fast_create(TinyMceArticle, :name => "First Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p> Wasserstoffbombe </p>') | |
| 8 | + fast_create(TinyMceArticle, :name => "A Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p>Lorem ipsum dolor sit amet</p> <p>Second paragraph</p>') | |
| 9 | 9 | block = ArticleBlock.new |
| 10 | 10 | block.article = blog |
| 11 | 11 | profile.boxes << Box.new |
| 12 | 12 | profile.boxes.first.blocks << block |
| 13 | - | |
| 14 | - get "/profile/#{profile.identifier}" | |
| 13 | + return block | |
| 14 | + end | |
| 15 | + | |
| 16 | + should 'allow blog as article block content' do | |
| 17 | + block = blog_on_article_block_bootstrap | |
| 18 | + get "/profile/#{block.owner.identifier}" | |
| 19 | + assert_match(/Lorem ipsum dolor sit amet/, @response.body) | |
| 20 | + end | |
| 21 | + | |
| 22 | + should 'display short version for block posts on article block' do | |
| 23 | + block = blog_on_article_block_bootstrap | |
| 24 | + get "/profile/#{block.owner.identifier}" | |
| 25 | + assert_no_match(/Second paragraph/, @response.body) | |
| 26 | + end | |
| 27 | + | |
| 28 | + should 'display full version for block posts on article block' do | |
| 29 | + block = blog_on_article_block_bootstrap | |
| 30 | + block.visualization_format = 'full' | |
| 31 | + block.save! | |
| 32 | + get "/profile/#{block.owner.identifier}" | |
| 33 | + assert_match(/Second paragraph/, @response.body) | |
| 34 | + end | |
| 35 | + | |
| 36 | + should 'display configured number of blog posts on article block' do | |
| 37 | + block = blog_on_article_block_bootstrap | |
| 38 | + block.posts_per_page = 2 | |
| 39 | + block.save! | |
| 40 | + get "/profile/#{block.owner.identifier}" | |
| 15 | 41 | assert_match(/Lorem ipsum dolor sit amet/, @response.body) |
| 42 | + assert_match(/Wasserstoffbombe/, @response.body) | |
| 43 | + end | |
| 44 | + | |
| 45 | + should 'link correctly in pagination' do | |
| 46 | + block = blog_on_article_block_bootstrap | |
| 47 | + p = block.owner | |
| 48 | + b = block.article | |
| 49 | + f = fast_create(Folder, :name => 'Folder1', :profile_id => p.id) | |
| 50 | + b.parent = f | |
| 51 | + b.save! | |
| 52 | + get "/profile/#{block.owner.identifier}" | |
| 53 | + assert_tag :tag => 'a', :attributes => { :href => "/#{p.identifier}/#{f.slug}/#{b.slug}?npage=2" } | |
| 16 | 54 | end |
| 17 | 55 | |
| 18 | 56 | end | ... | ... |