Commit c4c81bc9f4653b4ea5595d611a5b223e3e881e9d
1 parent
02eedc73
Exists in
master
and in
28 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 | ... | ... |