Commit b46d3e4aa20b2c633c2c5d36d88ee4936aa7e87c
1 parent
b6e26e93
Exists in
master
and in
4 other branches
Added link to show reponses of proposals in content manager
Showing
8 changed files
with
84 additions
and
8 deletions
Show diff stats
lib/cms_helper.rb
... | ... | @@ -10,7 +10,11 @@ module CmsHelper |
10 | 10 | image_tag(icon_for_article(article)) + link_to(article_name, article.url) |
11 | 11 | else |
12 | 12 | if "ProposalsDiscussionPlugin::Proposal".eql? article.type |
13 | - link_to article.abstract, article.url, :class => icon_for_article(article) | |
13 | + if article.children_count > 0 | |
14 | + link_to article.abstract, {:action => 'view', :id => article.id}, :class => 'icon icon-replyied-article' | |
15 | + else | |
16 | + link_to article.abstract, article.url, :class => icon_for_article(article) | |
17 | + end | |
14 | 18 | else |
15 | 19 | link_to article_name, article.url, :class => icon_for_article(article) |
16 | 20 | end | ... | ... |
lib/proposals_discussion_plugin/api_new_relic_instrumenter.rb
0 → 100644
... | ... | @@ -0,0 +1,46 @@ |
1 | +class ProposalsDiscussionPlugin::ApiNewRelicInstrumenter < Grape::Middleware::Base | |
2 | + include NewRelic::Agent::Instrumentation::ControllerInstrumentation | |
3 | + | |
4 | + def call_with_newrelic(&block) | |
5 | + trace_options = { | |
6 | + :category => :rack, | |
7 | + :path => "#{route_path}\##{route_method}", | |
8 | + :request => Grape::Request.new(@env) | |
9 | + } | |
10 | + | |
11 | + perform_action_with_newrelic_trace(trace_options) do | |
12 | + result = yield | |
13 | + MetricFrame.abort_transaction! if result.first == 404 # ignore cascaded calls | |
14 | + result | |
15 | + end | |
16 | + end | |
17 | + | |
18 | + def call(env) | |
19 | + @env = env | |
20 | + if ENV['NEW_RELIC_ID'] | |
21 | + call_with_newrelic do | |
22 | + super | |
23 | + end | |
24 | + else | |
25 | + super | |
26 | + end | |
27 | + end | |
28 | + | |
29 | + def env | |
30 | + @env | |
31 | + end | |
32 | + | |
33 | + def route | |
34 | + env['api.endpoint'].routes.first | |
35 | + end | |
36 | + | |
37 | + def route_method | |
38 | + route.route_method.downcase | |
39 | + end | |
40 | + | |
41 | + def route_path | |
42 | + path = route.route_path.gsub(/^.+:version\/|^\/|:|\(.+\)/, '').tr('/', '-') | |
43 | + "api.#{route.route_version}.#{path}" | |
44 | + end | |
45 | + | |
46 | +end | ... | ... |
lib/proposals_discussion_plugin/response.rb
... | ... | @@ -12,16 +12,16 @@ class ProposalsDiscussionPlugin::Response < TinyMceArticle |
12 | 12 | _("The response of a Proposal") |
13 | 13 | end |
14 | 14 | |
15 | + def icon_name | |
16 | + 'response' | |
17 | + end | |
18 | + | |
15 | 19 | protected |
16 | 20 | |
17 | 21 | def check_parent_type |
18 | 22 | unless parent.is_a? ProposalsDiscussionPlugin::Proposal |
19 | 23 | errors.add(:parent, N_('of Response needs be a Proposal')) |
20 | 24 | end |
21 | - | |
22 | - # if self.body_changed? && (self.changed & attrs_validators).any? | |
23 | - # errors.add(:response, N_('only have "body" field')) | |
24 | - # end | |
25 | 25 | end |
26 | 26 | |
27 | 27 | end | ... | ... |
743 Bytes
291 Bytes
public/style.css
... | ... | @@ -406,3 +406,11 @@ div.confirm_evaluation_button a.disabled { |
406 | 406 | .icon-child-article { |
407 | 407 | background-image: url('/plugins/proposals_discussion/images/reply.png'); |
408 | 408 | } |
409 | + | |
410 | +.icon-response { | |
411 | + background: url('/plugins/proposals_discussion/images/response-article.png') no-repeat; | |
412 | +} | |
413 | + | |
414 | +.icon-replyied-article { | |
415 | + background: url('/plugins/proposals_discussion/images/replyied-article.png') no-repeat; | |
416 | +} | ... | ... |
test/unit/proposal_test.rb
... | ... | @@ -156,4 +156,20 @@ class ProposalTest < ActiveSupport::TestCase |
156 | 156 | assert_match "Body can't be blank", err.message |
157 | 157 | end |
158 | 158 | |
159 | + should 'not add a response to a article that isnt a proposal' do | |
160 | + article = create(Article, :name => 'test article', :profile => @profile) | |
161 | + data = { | |
162 | + :name => 'Response', | |
163 | + :abstract => 'Test', | |
164 | + :parent => article, | |
165 | + :profile => profile | |
166 | + } | |
167 | + | |
168 | + err = assert_raises ActiveRecord::RecordInvalid do | |
169 | + response = create(ProposalsDiscussionPlugin::Response, data) | |
170 | + end | |
171 | + | |
172 | + assert_match "Parent of Response needs be a Proposal", err.message | |
173 | + end | |
174 | + | |
159 | 175 | end | ... | ... |
views/cms/proposals_discussion_plugin/_response.html.erb
... | ... | @@ -10,14 +10,16 @@ |
10 | 10 | <div class="title"> |
11 | 11 | <%= required labelled_form_field _('Title'), limited_text_area(:article, :name, title_limit, 'title_textarea', :rows => 1) %> |
12 | 12 | </div> |
13 | - | |
14 | - <%= select_profile_folder(_('Parent folder:'), 'article[parent_id]', profile, @article.parent_id, {},{},{},:include_articles => true) %> | |
13 | + <% if @article.parent_id.nil? %> | |
14 | + <%= select_profile_folder(_('Parent folder:'), 'article[parent_id]', profile, @article.parent_id, {},{},{},:include_articles => true) %> | |
15 | + <% else %> | |
16 | + <%= hidden_field(:article, :parent_id) %> | |
17 | + <% end %> | |
15 | 18 | |
16 | 19 | <div class="body"> |
17 | 20 | <%= labelled_form_field(_('Response'), text_area(:article, :body, :class => 'mceEditor')) %> |
18 | 21 | </div> |
19 | 22 | |
20 | - <%= hidden_field(:article, :parent_id) %> | |
21 | 23 | </div> |
22 | 24 | |
23 | 25 | <script> | ... | ... |