Commit 8eba02a990c0ea29e9bc8b86aec54c0a0cee83d8

Authored by Victor Costa
1 parent e8d4ea47

proposals_discussion: improve proposals list

public/images/score.png

1.61 KB | W: | H:

1.65 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
public/style.css
  1 +.proposals_list .proposal .abstract {
  2 + color: rgb(160, 160, 160);
  3 + margin-bottom: 15px;
  4 + float: left;
  5 +}
  6 +.proposals_list .proposal .comments-count {
  7 + clear: both;
  8 + float: right;
  9 + color: rgb(162, 162, 162);
  10 + font-size: 10px;
  11 +}
  12 +.proposals_list .proposal .tags {
  13 + float: left;
  14 + clear: both;
  15 +}
  16 +.proposal .author {
  17 + display: table-cell;
  18 + font-size: 10px;
  19 + margin-right: 10px;
  20 +}
  21 +#content #article .proposal .author .profile-link img {
  22 + max-width: 70%;
  23 +}
  24 +
1 .private-proposals .proposal { 25 .private-proposals .proposal {
2 background: url(/images/hachure.png); 26 background: url(/images/hachure.png);
3 opacity: 0.5; 27 opacity: 0.5;
@@ -6,18 +30,23 @@ @@ -6,18 +30,23 @@
6 } 30 }
7 31
8 .proposal { 32 .proposal {
9 - width: 100%;  
10 - min-width: 272px;  
11 vertical-align: top; 33 vertical-align: top;
12 - margin: 12px 13px 12px 0; 34 + margin: 15px 0;
  35 + background-color: rgb(236, 236, 236);
  36 + border-radius: 5px;
  37 + padding: 10px;
13 } 38 }
14 39
  40 +.article-body-proposals-discussion-plugin_discussion .new-proposal {
  41 + clear: both;
  42 + margin: 20px 0;
  43 +}
15 .article-body-proposals-discussion-plugin_discussion .actions, 44 .article-body-proposals-discussion-plugin_discussion .actions,
16 .article-body-proposals-discussion-plugin_topic .actions { 45 .article-body-proposals-discussion-plugin_topic .actions {
17 margin: 10px 0 25px 0; 46 margin: 10px 0 25px 0;
18 } 47 }
19 48
20 -.proposal .content, .proposal .score, .proposal .topic { 49 +.proposal .content, .proposal .topic {
21 display: inline-block; 50 display: inline-block;
22 border-color: rgb(201, 201, 201); 51 border-color: rgb(201, 201, 201);
23 padding: 5px; 52 padding: 5px;
@@ -32,6 +61,7 @@ @@ -32,6 +61,7 @@
32 .proposal .score { 61 .proposal .score {
33 width: 5%; 62 width: 5%;
34 text-align: center; 63 text-align: center;
  64 + float: right;
35 } 65 }
36 .proposal .score span { 66 .proposal .score span {
37 background: url(/plugins/proposals_discussion/images/score.png) no-repeat; 67 background: url(/plugins/proposals_discussion/images/score.png) no-repeat;
@@ -41,19 +71,20 @@ @@ -41,19 +71,20 @@
41 position: relative; 71 position: relative;
42 } 72 }
43 73
44 -.proposal .content:hover, .proposal .topic:hover {  
45 - background: rgb(230, 230, 230);  
46 -}  
47 -  
48 .proposal .title { 74 .proposal .title {
49 font-weight: bold; 75 font-weight: bold;
50 - font-size: 12px; 76 + font-size: 14px;
  77 + background-color: rgb(136, 136, 136);
  78 + padding: 9px;
  79 + border-radius: 5px;
51 } 80 }
52 81
53 #article .proposal a:visited, #article .proposal a { 82 #article .proposal a:visited, #article .proposal a {
54 - color: rgb(70, 70, 70);  
55 text-decoration: none; 83 text-decoration: none;
  84 +}
  85 +#article .proposal .title a:visited, #article .proposal .title a {
56 width: 100%; 86 width: 100%;
  87 + color: rgb(240, 240, 240);
57 display: inline-block; 88 display: inline-block;
58 } 89 }
59 #article .proposal .private.actions a:visited, #article .proposal .private.actions a { 90 #article .proposal .private.actions a:visited, #article .proposal .private.actions a {
@@ -61,7 +92,8 @@ @@ -61,7 +92,8 @@
61 } 92 }
62 93
63 .proposal .content { 94 .proposal .content {
64 - width: 84%; 95 + width: 100%;
  96 + display: table-cell;
65 color: rgb(83, 83, 83); 97 color: rgb(83, 83, 83);
66 vertical-align: top; 98 vertical-align: top;
67 position: relative; 99 position: relative;
@@ -98,6 +130,7 @@ form .proposals-discussion-plugin .body textarea { @@ -98,6 +130,7 @@ form .proposals-discussion-plugin .body textarea {
98 } 130 }
99 131
100 .proposals_list .filters { 132 .proposals_list .filters {
  133 + clear: both;
101 float: right; 134 float: right;
102 margin-top: 4px; 135 margin-top: 4px;
103 } 136 }
@@ -210,7 +243,8 @@ form .proposals-discussion-plugin .body textarea { @@ -210,7 +243,8 @@ form .proposals-discussion-plugin .body textarea {
210 min-height: 50px; 243 min-height: 50px;
211 } 244 }
212 245
213 -.article-body-proposals-discussion-plugin_topic .graph { 246 +.article-body-proposals-discussion-plugin_topic .statistics .graph,
  247 +.article-body-proposals-discussion-plugin_discussion .statistics .graph {
214 float: left; 248 float: left;
215 } 249 }
216 .article-body-proposals-discussion-plugin_topic .graph #proposals-time, 250 .article-body-proposals-discussion-plugin_topic .graph #proposals-time,
test/functional/proposals_discussion_plugin_public_controller_test.rb
@@ -3,21 +3,22 @@ require File.dirname(__FILE__) + '/../test_helper' @@ -3,21 +3,22 @@ require File.dirname(__FILE__) + '/../test_helper'
3 class ProposalsDiscussionPluginPublicControllerTest < ActionController::TestCase 3 class ProposalsDiscussionPluginPublicControllerTest < ActionController::TestCase
4 4
5 def setup 5 def setup
  6 + @person = fast_create(Person)
6 @profile = fast_create(Community) 7 @profile = fast_create(Community)
7 @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :allow_topics => true, :name => 'discussion') 8 @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :allow_topics => true, :name => 'discussion')
8 @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) 9 @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id)
9 end 10 end
10 11
11 - attr_reader :profile, :discussion, :topic 12 + attr_reader :profile, :discussion, :topic, :person
12 13
13 should 'load proposals' do 14 should 'load proposals' do
14 - proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)} 15 + proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)}
15 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id 16 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id
16 assert_equivalent proposals, assigns(:proposals) 17 assert_equivalent proposals, assigns(:proposals)
17 end 18 end
18 19
19 should 'add link to next page' do 20 should 'add link to next page' do
20 - proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id) 21 + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
21 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id 22 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id
22 assert_match /href=.*page=2/, response.body 23 assert_match /href=.*page=2/, response.body
23 end 24 end
@@ -28,17 +29,17 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase @@ -28,17 +29,17 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase
28 end 29 end
29 30
30 should 'load proposals with alphabetical order' do 31 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) 32 + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'z proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  33 + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'abc proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  34 + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'abd proposal', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
34 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id, :order => 'alphabetical' 35 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id, :order => 'alphabetical'
35 assert_equal [proposal2, proposal3, proposal1], assigns(:proposals) 36 assert_equal [proposal2, proposal3, proposal1], assigns(:proposals)
36 end 37 end
37 38
38 should 'load proposals with most commented order' do 39 should 'load proposals with most commented order' do
39 - proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal1', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)  
40 - proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal2', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)  
41 - proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal3', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id) 40 + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal1', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  41 + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal2', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  42 + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal3', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
42 43
43 author = fast_create(Person) 44 author = fast_create(Person)
44 Comment.create!(:source => proposal2, :body => 'text', :author => author) 45 Comment.create!(:source => proposal2, :body => 'text', :author => author)
@@ -50,9 +51,9 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase @@ -50,9 +51,9 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase
50 end 51 end
51 52
52 should 'load proposals with most recent order' do 53 should 'load proposals with most recent order' do
53 - proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'z', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today - 2.day)  
54 - proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'b', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today - 1.day)  
55 - proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'k', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today) 54 + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'z', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today - 2.day, :author_id => person.id)
  55 + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'b', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today - 1.day, :author_id => person.id)
  56 + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'k', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :created_at => Date.today, :author_id => person.id)
56 57
57 author = fast_create(Person) 58 author = fast_create(Person)
58 59
@@ -61,9 +62,9 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase @@ -61,9 +62,9 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase
61 end 62 end
62 63
63 should 'load proposals with most recently commented order' do 64 should 'load proposals with most recently commented order' do
64 - proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal1', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)  
65 - proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal2', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)  
66 - proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal3', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id) 65 + proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal1', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  66 + proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal2', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
  67 + proposal3 = fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal3', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)
67 68
68 author = fast_create(Person) 69 author = fast_create(Person)
69 Comment.create!({:source => proposal2, :body => 'text', :author => author, :created_at => 10.days.ago}, :without_protection => true) 70 Comment.create!({:source => proposal2, :body => 'text', :author => author, :created_at => 10.days.ago}, :without_protection => true)
@@ -82,7 +83,7 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase @@ -82,7 +83,7 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase
82 profile.add_member(person) 83 profile.add_member(person)
83 profile.update_attribute(:public_profile, false) 84 profile.update_attribute(:public_profile, false)
84 85
85 - proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)} 86 + proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)}
86 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id 87 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id
87 assert_equivalent proposals, assigns(:proposals) 88 assert_equivalent proposals, assigns(:proposals)
88 end 89 end
@@ -90,7 +91,7 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase @@ -90,7 +91,7 @@ class ProposalsDiscussionPluginPublicControllerTest &lt; ActionController::TestCase
90 should 'not load proposals when profile is private and user is not logged' do 91 should 'not load proposals when profile is private and user is not logged' do
91 logout 92 logout
92 profile.update_attribute(:public_profile, false) 93 profile.update_attribute(:public_profile, false)
93 - proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id)} 94 + proposals = 3.times.map { fast_create(ProposalsDiscussionPlugin::Proposal, :name => 'proposal title', :abstract => 'proposal abstract', :profile_id => profile.id, :parent_id => topic.id, :author_id => person.id)}
94 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id 95 get :load_proposals, :profile => profile.identifier, :holder_id => topic.id
95 assert_equal nil, assigns(:proposals) 96 assert_equal nil, assigns(:proposals)
96 end 97 end
views/content_viewer/_proposal_card.html.erb
1 <div class="proposal"> 1 <div class="proposal">
2 - <div class="score">  
3 - <% if proposal_card.published? %>  
4 - <% normalized_score = proposal_card.normalized_score %>  
5 - <% pos = 26 * (normalized_score*4 - 1).round %>  
6 - <span title="<%= normalized_score %>" style="background-position-y: -<%= pos %>px">&nbsp;</span>  
7 - <% end %> 2 + <div class="author">
  3 + <%= link_to_profile profile_image(proposal_card.author, :minor, :class => 'disable-zoom') + '<br/>' + proposal_card.author.short_name, proposal_card.author.identifier, :class => 'profile-link' %>
8 </div> 4 </div>
9 <div class="content"> 5 <div class="content">
10 <div class="title"> 6 <div class="title">
@@ -22,7 +18,22 @@ @@ -22,7 +18,22 @@
22 </div> 18 </div>
23 <% end %> 19 <% end %>
24 <div class="abstract"> 20 <div class="abstract">
25 - <%= link_to strip_tags(proposal_card.abstract), proposal_card.view_url %> 21 + <%= proposal_card.abstract %>
  22 + </div>
  23 + <div class="score">
  24 + <% if proposal_card.published? %>
  25 + <% normalized_score = proposal_card.normalized_score %>
  26 + <% pos = 26 * (normalized_score*4 - 1).round %>
  27 + <span title="<%= normalized_score %>" style="background-position-y: -<%= pos %>px">&nbsp;</span>
  28 + <% end %>
  29 + </div>
  30 + <% if !proposal_card.tags.empty? %>
  31 + <div class="tags" id="article-tags">
  32 + <%= proposal_card.tags.map { |t| link_to(t, :controller => 'profile', :profile => @profile.identifier, :action => 'tags', :id => t.name ) }.join("\n") %>
  33 + </div>
  34 + <% end %>
  35 + <div class="comments-count">
  36 + <%= n_("%s comment", "%s comments", proposal_card.comments_count) % proposal_card.comments_count %>
26 </div> 37 </div>
27 </div> 38 </div>
28 </div> 39 </div>
views/content_viewer/_statistics.html.erb
1 -<div class="statistics"> 1 +<div class="statistics clearfix">
2 <h5><%= _('Statistics') %></h5> 2 <h5><%= _('Statistics') %></h5>
3 3
4 <div class="graph"> 4 <div class="graph">
views/content_viewer/discussion.html.erb
@@ -14,14 +14,16 @@ @@ -14,14 +14,16 @@
14 </div> 14 </div>
15 <% end %> 15 <% end %>
16 16
17 -<%= link_to url_for({:controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => discussion.id}), :class => 'button with-text icon-add' do %>  
18 - <strong><%= _("Send your proposal!") %></strong>  
19 -<% end %>  
20 -  
21 <%= render :partial => 'content_viewer/statistics', :locals => {:holder => discussion} %> 17 <%= render :partial => 'content_viewer/statistics', :locals => {:holder => discussion} %>
22 18
23 -<div class="tag_cloud"> 19 +<div id="article-tags" class="tag_cloud">
24 <%= tag_cloud(discussion.proposal_tags, :tag, {:action => :tag, :controller => 'search'}, :max_size => 18, :min_size => 10) %> 20 <%= tag_cloud(discussion.proposal_tags, :tag, {:action => :tag, :controller => 'search'}, :max_size => 18, :min_size => 10) %>
25 </div> 21 </div>
26 22
  23 +<div class="new-proposal">
  24 + <%= link_to url_for({:controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => discussion.id}), :class => 'button with-text icon-add' do %>
  25 + <strong><%= _("Send your proposal!") %></strong>
  26 + <% end %>
  27 +</div>
  28 +
27 <%= render :partial => 'content_viewer/proposals_list', :locals => {:holder => discussion} %> 29 <%= render :partial => 'content_viewer/proposals_list', :locals => {:holder => discussion} %>