Commit 713bf1e3fe7bf7ce214d608dba3fa88326f43126

Authored by Victor Costa
1 parent 54c6e8ec

proposals_discussion: added a order option

controllers/public/proposals_discussion_plugin_public_controller.rb
... ... @@ -6,13 +6,13 @@ class ProposalsDiscussionPluginPublicController < ApplicationController
6 6 holder = profile.articles.find(params[:holder_id])
7 7 page = (params[:page] || 1).to_i
8 8 set_rand_cookie if page == 1
  9 + order = params[:order]
9 10  
10   - set_seed
11   - @proposals = holder.proposals.public.reorder('random()')
  11 + @proposals = order_proposals(holder.proposals.public, order)
12 12 @proposals = @proposals.page(page).per_page(5)
13 13  
14 14 unless @proposals.empty?
15   - render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => @proposals, :holder => holder, :page => page+1}
  15 + render :partial => 'content_viewer/proposals_list_content', :locals => {:proposals => @proposals, :holder => holder, :page => page+1, :order => order}
16 16 else
17 17 render :text => ''
18 18 end
... ... @@ -20,6 +20,16 @@ class ProposalsDiscussionPluginPublicController < ApplicationController
20 20  
21 21 private
22 22  
  23 + def order_proposals(proposals, order)
  24 + case order
  25 + when 'alphabetical'
  26 + proposals.reorder('name')
  27 + else
  28 + set_seed
  29 + proposals.reorder('random()')
  30 + end
  31 + end
  32 +
23 33 def set_seed
24 34 #XXX postgresql specific
25 35 seed_val = profile.connection.quote(cookies[:_noosfero_proposals_discussion_rand_seed])
... ...
public/style.css
... ... @@ -109,3 +109,15 @@ form .proposals-discussion-plugin .body textarea {
109 109 font-weight: bold;
110 110 font-size: 14px;
111 111 }
  112 +
  113 +.proposals_list .filters {
  114 + float: right;
  115 +}
  116 +#article .proposals_list .filters a {
  117 + text-decoration: none;
  118 + border-left: 1px solid rgb(185, 185, 185);
  119 + padding: 0 5px;
  120 +}
  121 +.proposals_list .filters a.selected {
  122 + font-weight: bold;
  123 +}
... ...
test/functional/proposals_discussion_plugin_public_controller_test.rb
... ... @@ -27,4 +27,12 @@ class ProposalsDiscussionPluginPublicControllerTest < ActionController::TestCase
27 27 assert_equal '', response.body
28 28 end
29 29  
  30 + should 'load proposals with alphabetical order' do
  31 + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'z proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)
  32 + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'abc proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)
  33 + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'abd proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)
  34 + get :load_proposals, :profile => profile.identifier, :holder_id => discussion.id, :order => 'alphabetical'
  35 + assert_equal [proposal2, proposal3, proposal1], assigns(:proposals)
  36 + end
  37 +
30 38 end
... ...
views/content_viewer/_proposals_list.html.erb
1 1 <script src="/javascripts/plugins/proposals_discussion/jquery.jscroll.min.js" type="text/javascript"></script>
2 2 <script>
3 3 jQuery(document).ready(function($) {
4   - $('.proposals').jscroll({
5   - loadingHtml: '<img src="/images/loading.gif" alt="Loading" /> <%= _("Loading...") %>',
6   - nextSelector: 'div.more a'
  4 + function proposalsScroll() {
  5 + $('.proposals').data('jscroll', null);
  6 + $('.proposals').jscroll({
  7 + loadingHtml: '<img src="/images/loading.gif" alt="Loading" /> <%= _("Loading...") %>',
  8 + nextSelector: 'div.more a'
  9 + });
  10 + $('.proposals').trigger('scroll.jscroll');
  11 + }
  12 + proposalsScroll();
  13 +
  14 + $('.proposals_list .filters a.order').on('ajax:success', function(event, data, status, xhr) {
  15 + $('.proposals_list .filters a.order').removeClass('selected');
  16 + $(this).addClass('selected');
  17 + $(this).parents('div.proposals_list').find('.proposals').html(data);
  18 + proposalsScroll();
7 19 });
8   - $('.proposals').trigger('scroll.jscroll');
9 20 });
  21 +
10 22 </script>
11 23  
12 24 <% private_proposals = user ? @page.proposals.private(user) : [] %>
... ... @@ -17,10 +29,20 @@
17 29 </div>
18 30 <% end %>
19 31  
20   -<h5><%= _('Proposals') %></h5>
21   -<div class="proposals">
22   - <div class="more">
23   - <img src="/images/loading.gif" alt="Loading" /><%= _("Loading...") %>
24   - <%= link_to '', url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier }) %>
  32 +<% order ||= 'random' %>
  33 +<div class="proposals_list">
  34 + <h5><%= _('Proposals') %></h5>
  35 + <div class="filters">
  36 + <% [[_('Random'), :random], [_('Aplhabetical'), :alphabetical]].each do |order| %>
  37 + <%= link_to order.first, url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :order => order.second}), :remote => true, :class => 'order' %>
  38 + <% end %>
  39 + </div>
  40 + <div class="clear"></div>
  41 +
  42 + <div class="proposals">
  43 + <div class="more">
  44 + <img src="/images/loading.gif" alt="Loading" /><%= _("Loading...") %>
  45 + <%= link_to '', url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :order => order }) %>
  46 + </div>
25 47 </div>
26 48 </div>
... ...
views/content_viewer/_proposals_list_content.html.erb
1 1 <%= render :partial => 'content_viewer/proposal_card', :collection => proposals %>
2 2  
3 3 <div class="more">
4   - <%= link_to _('More'), url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :page => page }) %>
  4 + <%= link_to _('More'), url_for({:controller => 'proposals_discussion_plugin_public', :action => 'load_proposals', :holder_id => holder.id, :profile => profile.identifier, :page => page, :order => order }) %>
5 5 </div>
... ...