Commit a2ecebd84ea929b92b0829fb2289628131956eea
1 parent
8eba02a9
Exists in
master
and in
11 other branches
proposals_discussion: added discussion phases
Showing
14 changed files
with
259 additions
and
13 deletions
Show diff stats
| @@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
| 1 | +require_dependency 'models/vote' | ||
| 2 | + | ||
| 3 | +class Vote | ||
| 4 | + | ||
| 5 | + validate :proposals_discussion_plugin_modify_vote | ||
| 6 | + before_destroy :proposals_discussion_plugin_modify_vote | ||
| 7 | + | ||
| 8 | + def proposals_discussion_plugin_modify_vote | ||
| 9 | + if voteable.kind_of?(ProposalsDiscussionPlugin::Proposal) && !voteable.allow_vote? | ||
| 10 | + errors.add(:base, _("Can't vote in this discussion anymore.")) | ||
| 11 | + false | ||
| 12 | + end | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | +end |
lib/proposals_discussion_plugin/discussion.rb
| @@ -19,8 +19,11 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | @@ -19,8 +19,11 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | ||
| 19 | 19 | ||
| 20 | settings_items :custom_body_label, :type => :string, :default => _('Body') | 20 | settings_items :custom_body_label, :type => :string, :default => _('Body') |
| 21 | settings_items :allow_topics, :type => :boolean, :default => false | 21 | settings_items :allow_topics, :type => :boolean, :default => false |
| 22 | + settings_items :phase, :type => :string, :default => :proposals | ||
| 22 | 23 | ||
| 23 | - attr_accessible :custom_body_label, :allow_topics | 24 | + attr_accessible :custom_body_label, :allow_topics, :phase |
| 25 | + | ||
| 26 | + AVAILABLE_PHASES = {:proposals => _('Proposals'), :vote => 'Vote', :finish => 'Announcement'} | ||
| 24 | 27 | ||
| 25 | def self.short_description | 28 | def self.short_description |
| 26 | _("Discussion") | 29 | _("Discussion") |
| @@ -30,6 +33,14 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | @@ -30,6 +33,14 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | ||
| 30 | _('Container for topics.') | 33 | _('Container for topics.') |
| 31 | end | 34 | end |
| 32 | 35 | ||
| 36 | + def available_phases | ||
| 37 | + AVAILABLE_PHASES | ||
| 38 | + end | ||
| 39 | + | ||
| 40 | + def allow_new_proposals? | ||
| 41 | + phase.to_sym == :proposals | ||
| 42 | + end | ||
| 43 | + | ||
| 33 | def to_html(options = {}) | 44 | def to_html(options = {}) |
| 34 | discussion = self | 45 | discussion = self |
| 35 | proc do | 46 | proc do |
| @@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
| 1 | +module ProposalsDiscussionPlugin::DiscussionHelper | ||
| 2 | + | ||
| 3 | + def link_to_new_proposal(discussion) | ||
| 4 | + return '' unless discussion.allow_new_proposals? | ||
| 5 | + | ||
| 6 | + url = {:parent_id => discussion.id, :profile => discussion.profile.identifier} | ||
| 7 | + if discussion.allow_topics | ||
| 8 | + url.merge!(:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic') | ||
| 9 | + else | ||
| 10 | + url.merge!(:controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal") | ||
| 11 | + end | ||
| 12 | + link_to _("Send your proposal!"), url_for(url), :class => 'button with-text icon-add' | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def discussion_phases(discussion) | ||
| 16 | + discussion.available_phases.map do |phase| | ||
| 17 | + active = discussion.phase.to_sym == phase.first ? ' active' : '' | ||
| 18 | + content_tag 'span', phase.second, :class => "phase #{phase.first}#{active}" | ||
| 19 | + end.join | ||
| 20 | + end | ||
| 21 | + | ||
| 22 | +end |
lib/proposals_discussion_plugin/proposal.rb
| @@ -15,8 +15,18 @@ class ProposalsDiscussionPlugin::Proposal < TinyMceArticle | @@ -15,8 +15,18 @@ class ProposalsDiscussionPlugin::Proposal < TinyMceArticle | ||
| 15 | 15 | ||
| 16 | validates_presence_of :abstract | 16 | validates_presence_of :abstract |
| 17 | 17 | ||
| 18 | + validate :discussion_phase_proposals | ||
| 19 | + | ||
| 20 | + def discussion_phase_proposals | ||
| 21 | + errors.add(:base, _("Can't create a proposal at this phase.")) unless discussion.allow_new_proposals? | ||
| 22 | + end | ||
| 23 | + | ||
| 24 | + def allow_vote? | ||
| 25 | + discussion.phase.to_sym != :finish | ||
| 26 | + end | ||
| 27 | + | ||
| 18 | def discussion | 28 | def discussion |
| 19 | - parent.kind_of?(ProposalsDiscussionPlugin::Discussion) ? parent : parent.discussion | 29 | + @discussion ||= parent.kind_of?(ProposalsDiscussionPlugin::Discussion) ? parent : parent.discussion |
| 20 | end | 30 | end |
| 21 | 31 | ||
| 22 | def to_html(options = {}) | 32 | def to_html(options = {}) |
public/style.css
| 1 | +.article-body-proposals-discussion-plugin_discussion .phases { | ||
| 2 | + margin: 20px; | ||
| 3 | + color: white; | ||
| 4 | +} | ||
| 5 | +.article-body-proposals-discussion-plugin_discussion .phases .phase { | ||
| 6 | + padding: 8px; | ||
| 7 | + background-color: gray; | ||
| 8 | + min-width: 70px; | ||
| 9 | + display: inline-block; | ||
| 10 | + text-align: center; | ||
| 11 | + font-size: 14px; | ||
| 12 | + font-weight: bold; | ||
| 13 | + opacity: 0.3; | ||
| 14 | +} | ||
| 15 | +.article-body-proposals-discussion-plugin_discussion .phases .proposals { | ||
| 16 | + background-color: rgb(55, 186, 211); | ||
| 17 | +} | ||
| 18 | +.article-body-proposals-discussion-plugin_discussion .phases .vote { | ||
| 19 | + background-color: rgb(236, 141, 52); | ||
| 20 | +} | ||
| 21 | +.article-body-proposals-discussion-plugin_discussion .phases .finish { | ||
| 22 | + background-color: rgb(57, 175, 142); | ||
| 23 | +} | ||
| 24 | +.article-body-proposals-discussion-plugin_discussion .phases .active { | ||
| 25 | + opacity: 1; | ||
| 26 | +} | ||
| 27 | + | ||
| 1 | .proposals_list .proposal .abstract { | 28 | .proposals_list .proposal .abstract { |
| 2 | color: rgb(160, 160, 160); | 29 | color: rgb(160, 160, 160); |
| 3 | margin-bottom: 15px; | 30 | margin-bottom: 15px; |
test/functional/cms_controller_test.rb
| @@ -30,4 +30,9 @@ class CmsControllerTest < ActionController::TestCase | @@ -30,4 +30,9 @@ class CmsControllerTest < ActionController::TestCase | ||
| 30 | assert_tag :tag => 'label', :attributes => {:class => 'formlabel'}, :content => 'My Custom Label' | 30 | assert_tag :tag => 'label', :attributes => {:class => 'formlabel'}, :content => 'My Custom Label' |
| 31 | end | 31 | end |
| 32 | 32 | ||
| 33 | + should 'display available phases when edit a proposal' do | ||
| 34 | + get :edit, :id => discussion.id, :profile => profile.identifier | ||
| 35 | + assert_tag :tag => 'select', :attributes => {:id => 'article_phase'} | ||
| 36 | + end | ||
| 37 | + | ||
| 33 | end | 38 | end |
| @@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
| 1 | +require_relative '../test_helper' | ||
| 2 | + | ||
| 3 | +class DiscussionHelperTest < ActionView::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + @profile = fast_create(Community) | ||
| 7 | + @discussion = ProposalsDiscussionPlugin::Discussion.create!(:name => 'discussion', :profile => @profile, :name => 'discussion') | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + include ProposalsDiscussionPlugin::DiscussionHelper | ||
| 11 | + | ||
| 12 | + attr_reader :profile, :discussion | ||
| 13 | + | ||
| 14 | + should 'display new proposal link when discussion is in proposals phase' do | ||
| 15 | + assert !link_to_new_proposal(discussion).blank? | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + should 'not display new proposal link when discussion is in vote phase' do | ||
| 19 | + discussion.update_attribute(:phase, :vote) | ||
| 20 | + assert link_to_new_proposal(discussion).blank? | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + should 'not display new proposal link when discussion is in finish phase' do | ||
| 24 | + discussion.update_attribute(:phase, :finish) | ||
| 25 | + assert link_to_new_proposal(discussion).blank? | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | +end |
test/unit/discussion_test.rb
| @@ -34,4 +34,19 @@ class DiscussionTest < ActiveSupport::TestCase | @@ -34,4 +34,19 @@ class DiscussionTest < ActiveSupport::TestCase | ||
| 34 | assert_equal 10, discussion.max_score | 34 | assert_equal 10, discussion.max_score |
| 35 | end | 35 | end |
| 36 | 36 | ||
| 37 | + should 'allow new proposals if discussion phase is proposals' do | ||
| 38 | + discussion.phase = :proposals | ||
| 39 | + assert discussion.allow_new_proposals? | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + should 'not allow new proposals if discussion phase is vote' do | ||
| 43 | + discussion.phase = :vote | ||
| 44 | + assert !discussion.allow_new_proposals? | ||
| 45 | + end | ||
| 46 | + | ||
| 47 | + should 'not allow new proposals if discussion phase is finish' do | ||
| 48 | + discussion.phase = :finish | ||
| 49 | + assert !discussion.allow_new_proposals? | ||
| 50 | + end | ||
| 51 | + | ||
| 37 | end | 52 | end |
test/unit/proposal_test.rb
| @@ -5,11 +5,12 @@ class ProposalTest < ActiveSupport::TestCase | @@ -5,11 +5,12 @@ class ProposalTest < ActiveSupport::TestCase | ||
| 5 | def setup | 5 | def setup |
| 6 | @profile = fast_create(Community) | 6 | @profile = fast_create(Community) |
| 7 | @person = fast_create(Person) | 7 | @person = fast_create(Person) |
| 8 | - @proposal = ProposalsDiscussionPlugin::Proposal.new(:name => 'test', :profile => @profile) | 8 | + @discussion = ProposalsDiscussionPlugin::Discussion.create!(:name => 'discussion', :profile => person, :name => 'discussion') |
| 9 | + @proposal = ProposalsDiscussionPlugin::Proposal.new(:name => 'test', :abstract => 'abstract', :profile => @profile, :parent => @discussion) | ||
| 9 | @proposal.created_by = @person | 10 | @proposal.created_by = @person |
| 10 | end | 11 | end |
| 11 | 12 | ||
| 12 | - attr_reader :profile, :proposal, :person | 13 | + attr_reader :profile, :proposal, :person, :discussion |
| 13 | 14 | ||
| 14 | should 'save a proposal' do | 15 | should 'save a proposal' do |
| 15 | proposal.abstract = 'abstract' | 16 | proposal.abstract = 'abstract' |
| @@ -17,6 +18,7 @@ class ProposalTest < ActiveSupport::TestCase | @@ -17,6 +18,7 @@ class ProposalTest < ActiveSupport::TestCase | ||
| 17 | end | 18 | end |
| 18 | 19 | ||
| 19 | should 'do not save a proposal without abstract' do | 20 | should 'do not save a proposal without abstract' do |
| 21 | + proposal.abstract = nil | ||
| 20 | proposal.save | 22 | proposal.save |
| 21 | assert proposal.errors['abstract'].present? | 23 | assert proposal.errors['abstract'].present? |
| 22 | end | 24 | end |
| @@ -42,7 +44,6 @@ class ProposalTest < ActiveSupport::TestCase | @@ -42,7 +44,6 @@ class ProposalTest < ActiveSupport::TestCase | ||
| 42 | end | 44 | end |
| 43 | 45 | ||
| 44 | should 'return proposals by discussion' do | 46 | should 'return proposals by discussion' do |
| 45 | - discussion = fast_create(ProposalsDiscussionPlugin::Discussion) | ||
| 46 | topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) | 47 | topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) |
| 47 | proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | 48 | proposal1 = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) |
| 48 | proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal) | 49 | proposal2 = fast_create(ProposalsDiscussionPlugin::Proposal) |
| @@ -51,8 +52,17 @@ class ProposalTest < ActiveSupport::TestCase | @@ -51,8 +52,17 @@ class ProposalTest < ActiveSupport::TestCase | ||
| 51 | assert_equivalent [proposal1, proposal3], ProposalsDiscussionPlugin::Proposal.from_discussion(discussion) | 52 | assert_equivalent [proposal1, proposal3], ProposalsDiscussionPlugin::Proposal.from_discussion(discussion) |
| 52 | end | 53 | end |
| 53 | 54 | ||
| 55 | + should 'return discussion associated with a proposal' do | ||
| 56 | + assert_equal discussion, proposal.discussion | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + should 'return discussion associated with a proposal topic' do | ||
| 60 | + topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id) | ||
| 61 | + proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | ||
| 62 | + assert_equal discussion, proposal.discussion | ||
| 63 | + end | ||
| 64 | + | ||
| 54 | should 'return normalized score' do | 65 | should 'return normalized score' do |
| 55 | - discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => person, :name => 'discussion') | ||
| 56 | proposal1 = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') | 66 | proposal1 = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') |
| 57 | proposal2 = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal2", :abstract => 'abstract') | 67 | proposal2 = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal2", :abstract => 'abstract') |
| 58 | 10.times { Comment.create!(:source => proposal1, :body => "comment", :author => person) } | 68 | 10.times { Comment.create!(:source => proposal1, :body => "comment", :author => person) } |
| @@ -61,4 +71,50 @@ class ProposalTest < ActiveSupport::TestCase | @@ -61,4 +71,50 @@ class ProposalTest < ActiveSupport::TestCase | ||
| 61 | assert_equal 0.5, proposal2.reload.normalized_score | 71 | assert_equal 0.5, proposal2.reload.normalized_score |
| 62 | end | 72 | end |
| 63 | 73 | ||
| 74 | + should 'create a new proposal if the current phase is proposals' do | ||
| 75 | + discussion.update_attribute(:phase, :proposals) | ||
| 76 | + assert proposal.save | ||
| 77 | + end | ||
| 78 | + | ||
| 79 | + should 'do not create a new proposal if the current phase is vote' do | ||
| 80 | + discussion.update_attribute(:phase, :vote) | ||
| 81 | + assert !proposal.save | ||
| 82 | + end | ||
| 83 | + | ||
| 84 | + should 'do not create a new proposal if the current phase is finish' do | ||
| 85 | + discussion.update_attribute(:phase, :finish) | ||
| 86 | + assert !proposal.save | ||
| 87 | + end | ||
| 88 | + | ||
| 89 | + should 'do not create a new proposal if the current phase is invalid' do | ||
| 90 | + discussion.update_attribute(:phase, '') | ||
| 91 | + assert !proposal.save | ||
| 92 | + end | ||
| 93 | + | ||
| 94 | + should 'do not update a proposal if a discussion is not in proposals phase' do | ||
| 95 | + discussion.update_attribute(:phase, :vote) | ||
| 96 | + proposal.body = "changed" | ||
| 97 | + assert !proposal.save | ||
| 98 | + end | ||
| 99 | + | ||
| 100 | + should 'allow update of proposals if a discussion is in proposals phase' do | ||
| 101 | + proposal.body = "changed" | ||
| 102 | + assert proposal.save | ||
| 103 | + end | ||
| 104 | + | ||
| 105 | + should 'allow vote if discussion phase is vote' do | ||
| 106 | + discussion.update_attribute(:phase, :vote) | ||
| 107 | + assert proposal.allow_vote? | ||
| 108 | + end | ||
| 109 | + | ||
| 110 | + should 'allow vote if discussion phase is proposals' do | ||
| 111 | + discussion.update_attribute(:phase, :proposals) | ||
| 112 | + assert proposal.allow_vote? | ||
| 113 | + end | ||
| 114 | + | ||
| 115 | + should 'not allow vote if discussion phase is finish' do | ||
| 116 | + discussion.update_attribute(:phase, :finish) | ||
| 117 | + assert !proposal.allow_vote? | ||
| 118 | + end | ||
| 119 | + | ||
| 64 | end | 120 | end |
test/unit/topic_test.rb
| @@ -3,8 +3,9 @@ require File.dirname(__FILE__) + '/../test_helper' | @@ -3,8 +3,9 @@ require File.dirname(__FILE__) + '/../test_helper' | ||
| 3 | class TopicTest < ActiveSupport::TestCase | 3 | class TopicTest < ActiveSupport::TestCase |
| 4 | 4 | ||
| 5 | def setup | 5 | def setup |
| 6 | + @discussion = fast_create(ProposalsDiscussionPlugin::Discussion) | ||
| 6 | @profile = fast_create(Community) | 7 | @profile = fast_create(Community) |
| 7 | - @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile) | 8 | + @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile, :parent => @discussion) |
| 8 | end | 9 | end |
| 9 | 10 | ||
| 10 | attr_reader :profile, :topic | 11 | attr_reader :profile, :topic |
| @@ -0,0 +1,53 @@ | @@ -0,0 +1,53 @@ | ||
| 1 | +require_relative '../test_helper' | ||
| 2 | + | ||
| 3 | +class VoteTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + @person = fast_create(Person) | ||
| 7 | + @profile = fast_create(Community) | ||
| 8 | + @discussion = ProposalsDiscussionPlugin::Discussion.create!(:name => 'discussion', :profile => @person, :name => 'discussion') | ||
| 9 | + @proposal = ProposalsDiscussionPlugin::Proposal.create!(:name => 'test', :abstract => 'abstract', :profile => @profile, :parent => @discussion) | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + attr_reader :profile, :proposal, :person, :discussion | ||
| 13 | + | ||
| 14 | + should 'vote for articles that are not proposals' do | ||
| 15 | + article = fast_create(Article) | ||
| 16 | + vote = Vote.new(:voteable => article, :voter => person, :vote => 1) | ||
| 17 | + assert vote.save | ||
| 18 | + end | ||
| 19 | + | ||
| 20 | + should 'vote for a proposal of a discussion in proposals phase' do | ||
| 21 | + proposal.discussion.phase = :proposals | ||
| 22 | + vote = Vote.new(:voteable => proposal, :voter => person, :vote => 1) | ||
| 23 | + assert vote.save | ||
| 24 | + end | ||
| 25 | + | ||
| 26 | + should 'vote for a proposal of a discussion in vote phase' do | ||
| 27 | + proposal.discussion.phase = :vote | ||
| 28 | + vote = Vote.new(:voteable => proposal, :voter => person, :vote => 1) | ||
| 29 | + assert vote.save | ||
| 30 | + end | ||
| 31 | + | ||
| 32 | + should 'not vote for a proposal of a finished discussion' do | ||
| 33 | + proposal.discussion.phase = :finish | ||
| 34 | + vote = Vote.new(:voteable => proposal, :voter => person, :vote => 1) | ||
| 35 | + assert !vote.save | ||
| 36 | + end | ||
| 37 | + | ||
| 38 | + should 'not destroy a proposal vote of a finished discussion' do | ||
| 39 | + proposal.discussion.phase = :vote | ||
| 40 | + vote = Vote.new(:voteable => proposal, :voter => person, :vote => 1) | ||
| 41 | + assert vote.save | ||
| 42 | + proposal.discussion.phase = :finish | ||
| 43 | + assert !vote.destroy | ||
| 44 | + end | ||
| 45 | + | ||
| 46 | + should 'destroy a proposal vote of a discussion in vote phase' do | ||
| 47 | + proposal.discussion.phase = :vote | ||
| 48 | + vote = Vote.new(:voteable => proposal, :voter => person, :vote => 1) | ||
| 49 | + assert vote.save | ||
| 50 | + assert vote.destroy | ||
| 51 | + end | ||
| 52 | + | ||
| 53 | +end |
views/cms/proposals_discussion_plugin/_discussion.html.erb
| @@ -6,4 +6,5 @@ | @@ -6,4 +6,5 @@ | ||
| 6 | <%= labelled_form_field(_('Description:'), text_area(:article, :body, :rows => 3, :cols => 64)) %> | 6 | <%= labelled_form_field(_('Description:'), text_area(:article, :body, :rows => 3, :cols => 64)) %> |
| 7 | 7 | ||
| 8 | <%= f.text_field(:custom_body_label) %> | 8 | <%= f.text_field(:custom_body_label) %> |
| 9 | +<%= labelled_form_field _('Current Phase'), f.select(:phase, ProposalsDiscussionPlugin::Discussion::AVAILABLE_PHASES.map{|k,v| [v,k]} ) %> | ||
| 9 | <%= labelled_form_field check_box(:article, :allow_topics) + _('Allow topics'), '' %> | 10 | <%= labelled_form_field check_box(:article, :allow_topics) + _('Allow topics'), '' %> |
views/content_viewer/discussion.html.erb
| 1 | +<% extend ProposalsDiscussionPlugin::DiscussionHelper %> | ||
| 1 | <%= javascript_include_tag 'plugins/proposals_discussion/proposals_list.js' %> | 2 | <%= javascript_include_tag 'plugins/proposals_discussion/proposals_list.js' %> |
| 2 | 3 | ||
| 3 | <%= add_rss_feed_to_head(discussion.name, discussion.feed.url) if discussion.feed %> | 4 | <%= add_rss_feed_to_head(discussion.name, discussion.feed.url) if discussion.feed %> |
| @@ -6,6 +7,10 @@ | @@ -6,6 +7,10 @@ | ||
| 6 | <%= discussion.body %> | 7 | <%= discussion.body %> |
| 7 | </div> | 8 | </div> |
| 8 | 9 | ||
| 10 | +<div class="phases"> | ||
| 11 | + <%= discussion_phases(discussion) %> | ||
| 12 | +</div> | ||
| 13 | + | ||
| 9 | <% if discussion.allow_create?(user) %> | 14 | <% if discussion.allow_create?(user) %> |
| 10 | <div class="actions"> | 15 | <div class="actions"> |
| 11 | <%= link_to({:controller => :proposals_discussion_plugin_profile, :action => :export, :format => :csv, :article_id => discussion.id}, :class => 'button with-text icon-spread') do %> | 16 | <%= link_to({:controller => :proposals_discussion_plugin_profile, :action => :export, :format => :csv, :article_id => discussion.id}, :class => 'button with-text icon-spread') do %> |
| @@ -21,9 +26,7 @@ | @@ -21,9 +26,7 @@ | ||
| 21 | </div> | 26 | </div> |
| 22 | 27 | ||
| 23 | <div class="new-proposal"> | 28 | <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 %> | 29 | + <%= link_to_new_proposal(discussion) %> |
| 27 | </div> | 30 | </div> |
| 28 | 31 | ||
| 29 | <%= render :partial => 'content_viewer/proposals_list', :locals => {:holder => discussion} %> | 32 | <%= render :partial => 'content_viewer/proposals_list', :locals => {:holder => discussion} %> |
views/content_viewer/discussion_topics.html.erb
| 1 | +<% extend ProposalsDiscussionPlugin::DiscussionHelper %> | ||
| 1 | <%= javascript_include_tag 'plugins/proposals_discussion/proposals_list.js' %> | 2 | <%= javascript_include_tag 'plugins/proposals_discussion/proposals_list.js' %> |
| 2 | 3 | ||
| 3 | <%= add_rss_feed_to_head(discussion.name, discussion.feed.url) if discussion.feed %> | 4 | <%= add_rss_feed_to_head(discussion.name, discussion.feed.url) if discussion.feed %> |
| @@ -20,9 +21,7 @@ | @@ -20,9 +21,7 @@ | ||
| 20 | <div class="topics js-masonry" data-masonry-options='{ "itemSelector": ".topic-item", "columnWidth": 200 }'> | 21 | <div class="topics js-masonry" data-masonry-options='{ "itemSelector": ".topic-item", "columnWidth": 200 }'> |
| 21 | <div class="actions topic-item"> | 22 | <div class="actions topic-item"> |
| 22 | <div class="topic-color"></div> | 23 | <div class="topic-color"></div> |
| 23 | - <%= link_to url_for({:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic', :parent_id => discussion.id}), :class => 'button with-text icon-add' do %> | ||
| 24 | - <strong><%= _("Send your proposal!") %></strong> | ||
| 25 | - <% end %> | 24 | + <%= link_to_new_proposal(discussion) %> |
| 26 | </div> | 25 | </div> |
| 27 | <% discussion.topics.includes(:profile).each do |topic| %> | 26 | <% discussion.topics.includes(:profile).each do |topic| %> |
| 28 | <div class="topic-item" id="topic-<%= topic.id %>"> | 27 | <div class="topic-item" id="topic-<%= topic.id %>"> |