Commit 0b8db772dc24fa6e039018cd9f467dc94beed49c

Authored by Rodrigo Souto
2 parents 657be12f 3583e31a

Merge branch 'AI2892-display_content_order_attributes' of /mnt/ebs/repositories/…

…participa/noosfero into next
app/views/shared/_lead_and_body.rhtml
... ... @@ -7,11 +7,18 @@
7 7 <% lead_id ||= 0%>
8 8 <% f ||= false%>
9 9  
  10 +<% if @article %>
  11 + <% fields_for 'article[image_builder]', @article.image do |i| %>
  12 + <%= file_field_or_thumbnail(_('Image:'), @article.image, i) %>
  13 + <% end %>
  14 +<% end %>
  15 +
10 16 <br style="clear: both;"/>
11 17 <%= button :add, _("Lead"), '#', :class => "lead-button", :article_id => "#article-lead-"+lead_id.to_s, :style => "margin-left: 0px;" %>
12 18 <em><%= _('Used when a short version of your text is needed.') %></em>
13 19  
14 20 <div class='article-lead' id="article-lead-<%=lead_id.to_s%>">
  21 +
15 22 <% if f %>
16 23 <%= labelled_form_field(_(abstract_label), f.text_area(abstract_method, :style => 'width: 98%; height: 200px;', :class => editor_type)) %>
17 24 <% else %>
... ...
plugins/display_content/README
... ... @@ -33,7 +33,7 @@ As a Noosfero administrator user, go to administrator panel:
33 33 DEVELOPMENT
34 34 ===========
35 35  
36   -Noosfero uses jQuery 1.5.1 and the jsTree doesn't works fine with this jQuery version.
  36 +Noosfero uses jQuery 1.5.1 and the jsTree doesn't works fine with this jQuery version.
37 37 Until Noosfero upgrade its JQuery version to a newer one is necessary to load jQuery 1.8.3 inside plugin and apply some changes in jsTree to avoid jQuery conflit.
38 38  
39 39 Get the Display Content (Noosfero with Display Content Plugin) development repository:
... ...
plugins/display_content/controllers/display_content_plugin_admin_controller.rb
... ... @@ -4,6 +4,6 @@ class DisplayContentPluginAdminController &lt; AdminController
4 4  
5 5 append_view_path File.join(File.dirname(__FILE__) + '/../views')
6 6  
7   - include DisplayContentPluginController
  7 + include DisplayContentPluginController
8 8  
9 9 end
... ...
plugins/display_content/controllers/display_content_plugin_module.rb
... ... @@ -18,10 +18,10 @@ module DisplayContentPluginController
18 18 node[:data] = article.title
19 19 node[:attr] = { 'node_id' => article.id, 'parent_id' => article.parent_id}
20 20 if block.nodes.include?(article.id)
21   - node[:attr].merge!('class' => 'jstree-checked')
  21 + node[:attr].merge!('class' => 'jstree-checked')
22 22 elsif block.parent_nodes.include?(article.id)
23 23 node[:children] = get_node(block, article.children)
24   - node[:attr].merge!('class' => 'jstree-undetermined')
  24 + node[:attr].merge!('class' => 'jstree-undetermined')
25 25 end
26 26 node[:state] = 'closed' if Article.exists?(:parent_id => article.id)
27 27 nodes.push(node)
... ...
plugins/display_content/controllers/display_content_plugin_myprofile_controller.rb
... ... @@ -4,6 +4,6 @@ class DisplayContentPluginMyprofileController &lt; MyProfileController
4 4  
5 5 append_view_path File.join(File.dirname(__FILE__) + '/../views')
6 6  
7   - include DisplayContentPluginController
  7 + include DisplayContentPluginController
8 8  
9 9 end
... ...
plugins/display_content/lib/display_content_block.rb
1 1 class DisplayContentBlock < Block
2 2  
  3 + MONTHS = [
  4 + N_('January'),
  5 + N_('February'),
  6 + N_('March'),
  7 + N_('April'),
  8 + N_('May'),
  9 + N_('June'),
  10 + N_('July'),
  11 + N_('August'),
  12 + N_('September'),
  13 + N_('October'),
  14 + N_('November'),
  15 + N_('December')
  16 + ]
  17 +
3 18 settings_items :nodes, :type => Array, :default => []
4 19 settings_items :parent_nodes, :type => Array, :default => []
5   - settings_items :chosen_attributes, :type => Array, :default => ['title']
  20 + settings_items :sections,
  21 + :type => Array,
  22 + :default => [{:name => _('Publish date'), :checked => true},
  23 + {:name => _('Title'), :checked => true},
  24 + {:name => _('Abstract'), :checked => true},
  25 + {:name => _('Body'), :checked => false},
  26 + {:name => _('Image'), :checked => false},
  27 + {:name => _('Tags'), :checked => false}]
6 28  
7 29 def self.description
8 30 _('Display your contents')
... ... @@ -33,20 +55,50 @@ class DisplayContentBlock &lt; Block
33 55  
34 56 def articles_of_parent(parent = nil)
35 57 return [] if self.holder.nil?
36   - holder.articles.find(:all, :conditions => {:type => VALID_CONTENT, :parent_id => (parent.nil? ? nil : parent)})
  58 + holder.articles.find(:all, :conditions => {:type => VALID_CONTENT, :parent_id => (parent.nil? ? nil : parent)})
37 59 end
38 60  
39 61 include ActionController::UrlWriter
40 62 def content(args={})
41 63 docs = owner.articles.find(:all, :conditions => {:id => self.nodes})
  64 +
42 65 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   - )
49   - }.join("\n"))
  66 + content_tag('ul', docs.map {|item|
  67 +
  68 + content_sections = ''
  69 + read_more_section = ''
  70 + tags_section = ''
  71 +
  72 + sections.select { |section|
  73 + case section[:name]
  74 + when 'Publish date'
  75 + content_sections += (display_section?(section) ? (content_tag('div', show_date(item.published_at, false), :class => 'published-at') ) : '')
  76 + when 'Title'
  77 + content_sections += (display_section?(section) ? (content_tag('div', link_to(h(item.title), item.url), :class => 'title') ) : '')
  78 + when 'Abstract'
  79 + content_sections += (display_section?(section) ? (content_tag('div', item.abstract , :class => 'lead')) : '' )
  80 + if display_section?(section)
  81 + read_more_section = content_tag('div', link_to(_('Read more'), item.url), :class => 'read_more')
  82 + end
  83 + when 'Body'
  84 + content_sections += (display_section?(section) ? (content_tag('div', item.body ,:class => 'body')) : '' )
  85 + when 'Image'
  86 + image_section = image_tag item.image.public_filename if item.image
  87 + if !image_section.blank?
  88 + content_sections += (display_section?(section) ? (content_tag('div', link_to( image_section, item.url ) ,:class => 'image')) : '' )
  89 + end
  90 + when 'Tags'
  91 + if !item.tags.empty?
  92 + tags_section = item.tags.map { |t| content_tag('span', t.name) }.join("")
  93 + content_sections += (display_section?(section) ? (content_tag('div', tags_section, :class => 'tags')) : '')
  94 + end
  95 + end
  96 + }
  97 +
  98 + content_sections += read_more_section if !read_more_section.blank?
  99 +
  100 + content_tag('li', content_sections)
  101 + }.join(" "))
50 102  
51 103 end
52 104  
... ... @@ -61,15 +113,15 @@ class DisplayContentBlock &lt; Block
61 113 params
62 114 end
63 115  
64   - def display_attribute?(attr)
65   - chosen_attributes.include?(attr)
  116 + def display_section?(section)
  117 + section[:checked]
66 118 end
67 119  
68 120 protected
69 121  
70 122 def holder
71 123 return nil if self.box.nil? || self.box.owner.nil?
72   - if self.box.owner.kind_of?(Environment)
  124 + if self.box.owner.kind_of?(Environment)
73 125 return nil if self.box.owner.portal_community.nil?
74 126 self.box.owner.portal_community
75 127 else
... ... @@ -87,4 +139,20 @@ class DisplayContentBlock &lt; Block
87 139 { :profile => [:article], :environment => [:article] }
88 140 end
89 141  
  142 + def show_date(date, use_numbers = false, year=true)
  143 + if date && use_numbers
  144 + date_format = year ? _('%{month}/%{day}/%{year}') : _('%{month}/%{day}')
  145 + date_format % { :day => date.day, :month => date.month, :year => date.year }
  146 + elsif date
  147 + date_format = year ? _('%{month_name} %{day}, %{year}') : _('%{month_name} %{day}')
  148 + date_format % { :day => date.day, :month_name => month_name(date.month), :year => date.year }
  149 + else
  150 + ''
  151 + end
  152 + end
  153 +
  154 + def month_name(n)
  155 + _(MONTHS[n-1])
  156 + end
  157 +
90 158 end
... ...
plugins/display_content/lib/display_content_plugin.rb
... ... @@ -20,7 +20,6 @@ class DisplayContentPlugin &lt; Noosfero::Plugin
20 20 false
21 21 end
22 22  
23   - #FIXME make this test
24 23 def stylesheet?
25 24 true
26 25 end
... ...
plugins/display_content/public/style.css
1   -#display_content_plugin ul {
  1 +#display_content_plugin .sections {
  2 + width: auto;
  3 +}
  4 +
  5 +#display_content_plugin .sections td {
  6 + padding: 2px;
  7 +}
  8 +
  9 +.block.display-content-block ul {
2 10 list-style: none;
  11 + padding: 0px;
  12 +}
  13 +
  14 +.block.display-content-block li {
  15 + margin: 5px;
  16 +}
  17 +
  18 +.block.display-content-block .published-at,
  19 +.block.display-content-block .title,
  20 +.block.display-content-block .lead,
  21 +.block.display-content-block .body,
  22 +.block.display-content-block .image,
  23 +.block.display-content-block .read_more,
  24 +.block.display-content-block .tags {
  25 + margin: 2px 0px 2px 0px;
  26 +}
  27 +
  28 +.block.display-content-block .tags span {
  29 + margin-right: 3px;
3 30 }
4 31  
5   -#display_content_plugin .display_attributes li{
6   - display: inline;
  32 +.block.display-content-block .tags a {
  33 + text-decoration: none;
  34 + -webkit-border-radius: 3px;
  35 + background-color: #BBB;
  36 + color: #FFF;
  37 + padding: 2px;
7 38 }
... ...
plugins/display_content/test/functional/display_content_plugin_admin_controller_test.rb
... ... @@ -19,7 +19,7 @@ class DisplayContentPluginAdminControllerTest &lt; ActionController::TestCase
19 19 @environment.enabled_plugins = ['DisplayContentPlugin']
20 20 @environment.portal_community = fast_create(Community, :name => 'my test profile', :identifier => 'mytestcommunity')
21 21 @environment.save!
22   -
  22 +
23 23 box = Box.new(:owner => @environment, :position => 1)
24 24 box.save
25 25  
... ...
plugins/display_content/test/unit/display_content_block_test.rb
... ... @@ -515,7 +515,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
515 515 Article.delete_all
516 516 a1 = fast_create(invalid_article, :name => 'test article 1', :profile_id => profile.id)
517 517 a2 = fast_create(VALID_KIND_OF_ARTICLE.first, :name => 'test article 2', :profile_id => profile.id)
518   -
  518 +
519 519 block = DisplayContentBlock.new
520 520 box = mock()
521 521 box.stubs(:owner).returns(profile)
... ... @@ -523,7 +523,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
523 523 assert_equal [], [a2] - block.articles_of_parent
524 524 assert_equal [], block.articles_of_parent - [a2]
525 525 end
526   -
  526 +
527 527 end
528 528  
529 529 VALID_KIND_OF_ARTICLE.map do |valid_article|
... ... @@ -533,14 +533,14 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
533 533 Article.delete_all
534 534 a1 = fast_create(valid_article, :name => 'test article 1', :profile_id => profile.id)
535 535 a2 = fast_create(INVALID_KIND_OF_ARTICLE.first, :name => 'test article 2', :profile_id => profile.id)
536   -
  536 +
537 537 block = DisplayContentBlock.new
538 538 box = mock()
539 539 box.stubs(:owner).returns(profile)
540 540 block.stubs(:box).returns(box)
541 541 assert_equal [a1], block.articles_of_parent
542 542 end
543   -
  543 +
544 544 end
545 545  
546 546 should 'list links for all articles title defined in nodes' do
... ... @@ -554,7 +554,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
554 554 box = mock()
555 555 block.stubs(:box).returns(box)
556 556 box.stubs(:owner).returns(profile)
557   -
  557 +
558 558 assert_match /.*<a.*>#{a1.title}<\/a>/, block.content
559 559 assert_match /.*<a.*>#{a2.title}<\/a>/, block.content
560 560 end
... ... @@ -566,12 +566,12 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
566 566 a2 = fast_create(TextArticle, :name => 'test article 2', :profile_id => profile.id, :abstract => 'abstract article 2')
567 567  
568 568 block = DisplayContentBlock.new
569   - block.chosen_attributes = ['abstract']
  569 + block.sections = [{:name => 'Abstract', :checked => true}]
570 570 block.nodes = [a1.id, a2.id]
571 571 box = mock()
572 572 block.stubs(:box).returns(box)
573 573 box.stubs(:owner).returns(profile)
574   -
  574 +
575 575 assert_match /<div class="lead">#{a1.lead}<\/div>/, block.content
576 576 assert_match /<div class="lead">#{a2.lead}<\/div>/, block.content
577 577 end
... ... @@ -585,7 +585,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
585 585 box = mock()
586 586 block.stubs(:box).returns(box)
587 587 box.stubs(:owner).returns(profile)
588   -
  588 +
589 589 Article.delete_all
590 590 assert_match /<ul><\/ul>/, block.content
591 591 end
... ... @@ -595,7 +595,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
595 595 block = DisplayContentBlock.new
596 596 block.box = profile.boxes.first
597 597 block.save!
598   -
  598 +
599 599 params = {:block_id => block.id}
600 600 params[:controller] = "display_content_plugin_myprofile"
601 601 params[:profile] = profile.identifier
... ... @@ -607,7 +607,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
607 607 block = DisplayContentBlock.new
608 608 block.box = environment.boxes.first
609 609 block.save!
610   -
  610 +
611 611 params = {:block_id => block.id}
612 612 params[:controller] = "display_content_plugin_admin"
613 613 assert_equal params, block.url_params
... ... @@ -619,11 +619,11 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
619 619  
620 620 block = DisplayContentBlock.new
621 621 block.nodes = [a.id]
622   - block.chosen_attributes = ['title']
  622 + block.sections = [{:name => 'Title', :checked => true}]
623 623 box = mock()
624 624 block.stubs(:box).returns(box)
625 625 box.stubs(:owner).returns(profile)
626   -
  626 +
627 627 assert_match /.*<a.*>#{a.title}<\/a>/, block.content
628 628 end
629 629  
... ... @@ -633,11 +633,11 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
633 633  
634 634 block = DisplayContentBlock.new
635 635 block.nodes = [a.id]
636   - block.chosen_attributes = ['abstract']
  636 + block.sections = [{:name => 'Abstract', :checked => true}]
637 637 box = mock()
638 638 block.stubs(:box).returns(box)
639 639 box.stubs(:owner).returns(profile)
640   -
  640 +
641 641 assert_match /#{a.abstract}/, block.content
642 642 end
643 643  
... ... @@ -647,11 +647,11 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
647 647  
648 648 block = DisplayContentBlock.new
649 649 block.nodes = [a.id]
650   - block.chosen_attributes = ['body']
  650 + block.sections = [{:name => 'Body', :checked => true}]
651 651 box = mock()
652 652 block.stubs(:box).returns(box)
653 653 box.stubs(:owner).returns(profile)
654   -
  654 +
655 655 assert_match /#{a.body}/, block.content
656 656 end
657 657  
... ... @@ -659,17 +659,41 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
659 659 profile = create_user('testuser').person
660 660  
661 661 block = DisplayContentBlock.new
662   -
663   - assert block.display_attribute?('title')
  662 +
  663 + assert block.display_section?({:name => 'Title', :checked => true})
664 664 end
665 665  
666 666 should 'display_attribute be true if the attribute was chosen' do
667 667 profile = create_user('testuser').person
668 668  
669 669 block = DisplayContentBlock.new
670   - block.chosen_attributes = ['body']
671   -
672   - assert block.display_attribute?('body')
  670 +
  671 + block.sections = [{:name => 'Body', :checked => true}]
  672 + section = block.sections.first
  673 +
  674 + assert block.display_section?(section)
  675 + end
  676 +
  677 + should 'display_attribute be true for publish date by default' do
  678 + profile = create_user('testuser').person
  679 +
  680 + block = DisplayContentBlock.new
  681 +
  682 + assert block.display_section?({:name => 'Publish date', :checked => true})
  683 + end
  684 +
  685 + should 'show publishd date if defined by user' do
  686 + profile = create_user('testuser').person
  687 + a = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id, :body => 'some body')
  688 +
  689 + block = DisplayContentBlock.new
  690 + block.nodes = [a.id]
  691 + block.sections = [{:name => 'Publish date', :checked => true}]
  692 + box = mock()
  693 + block.stubs(:box).returns(box)
  694 + box.stubs(:owner).returns(profile)
  695 +
  696 + assert_match /#{a.published_at}/, block.content
673 697 end
674 698  
675 699 end
... ...
plugins/display_content/views/box_organizer/_display_content_block.rhtml
1 1 <div id="display_content_plugin">
2 2  
3   -<h3> <%= _('Choose which attributes should be displayed:') %> </h3>
4   -<ul class='display_attributes'>
5   - <li> <%= _('Title: ')%> <%= check_box_tag "block[chosen_attributes][]", 'title', @block.display_attribute?('title') %> </li>
6   - <li> <%= _('Abstract: ')%> <%= check_box_tag "block[chosen_attributes][]", 'abstract', @block.display_attribute?('abstract') %> </li>
7   - <li> <%= _('Body: ')%> <%= check_box_tag "block[chosen_attributes][]", 'body', @block.display_attribute?('body') %> </li>
8   -</ul>
  3 +<h3> <%= _('Choose which attributes should be displayed and drag to reorder them:') %> </h3>
  4 +
  5 +<table class="sections">
  6 + <tbody id="sortable">
  7 + <% for section in @block.sections do %>
  8 + <tr>
  9 + <td><%= hidden_field_tag 'block[sections][][name]', section[:name] %> <%= check_box_tag 'block[sections][][checked]', section[:name], section[:checked] %></td>
  10 + <td><%= section[:name]%></td>
  11 + </tr>
  12 + <% end %>
  13 + </tbody>
  14 +</table>
9 15  
10 16 <h3> <%= _('Choose which content should be displayed:') %> </h3>
11 17 <div id="display_content">
... ... @@ -16,20 +22,22 @@
16 22 jQuery_1_8_3("#display_content").jstree({
17 23 plugins : ["themes","json_data", "checkbox"],
18 24 checkbox : {
19   - real_checkboxes : true,
20   - real_checkboxes_names : function (n) { return [("block[checked_nodes[" + n.attr('node_id') + "]]"), 1]; }
  25 + real_checkboxes : true,
  26 + real_checkboxes_names : function (n) { return [("block[checked_nodes[" + n.attr('node_id') + "]]"), 1]; }
21 27 },
22 28 themes : {"theme" : "classic", "icons" : true, "url": "/plugins/display_content/javascripts/jstree/themes/classic/style.css"},
23 29 json_data : {
24   - ajax : {
25   - url : '<%= url_for @block.url_params %>',
  30 + ajax : {
  31 + url : '<%= url_for @block.url_params %>',
26 32 async: true,
27   - data : function (m) {
  33 + data : function (m) {
28 34 return m.attr ? {"id" : m.attr("node_id")} : {};
29 35 }
30 36 }
31 37 }
32 38 });
33 39  
  40 +jQuery( "#sortable" ).sortable();
  41 +
34 42 </script>
35 43 </div>
... ...