Commit 2323e52278b2b9fbd4f3fc40a1b6add65e3e8d08
1 parent
8ee471cc
Exists in
master
and in
28 other branches
[macro-support-review] Renaming CommentGroup plugin
Showing
28 changed files
with
390 additions
and
390 deletions
Show diff stats
plugins/comment_group/controllers/profile/comment_group_plugin_profile_controller.rb
0 → 100644
... | ... | @@ -0,0 +1,16 @@ |
1 | +class CommentGroupPluginProfileController < ProfileController | |
2 | + append_view_path File.join(File.dirname(__FILE__) + '/../views') | |
3 | + | |
4 | + def view_comments | |
5 | + article_id = params[:article_id] | |
6 | + group_id = params[:group_id] | |
7 | + | |
8 | + article = profile.articles.find(article_id) | |
9 | + comments = article.group_comments.without_spam.in_group(group_id) | |
10 | + render :update do |page| | |
11 | + page.replace_html "comments_list_group_#{group_id}", :partial => 'comment/comment.rhtml', :collection => comments.as_thread | |
12 | + page.replace_html "comment-count-#{group_id}", comments.count | |
13 | + end | |
14 | + end | |
15 | + | |
16 | +end | ... | ... |
plugins/comment_group/controllers/public/comment_group_plugin_public_controller.rb
0 → 100644
plugins/comment_group/db/migrate/20121220201629_add_group_id_to_comment.rb
0 → 100644
... | ... | @@ -0,0 +1,50 @@ |
1 | +require_dependency 'comment_group_plugin/ext/article' | |
2 | +require_dependency 'comment_group_plugin/ext/comment' | |
3 | + | |
4 | +#FIXME See a better way to generalize this parameter. | |
5 | +ActionView::Base.sanitized_allowed_attributes += ['data-macro', 'data-macro-group_id'] | |
6 | + | |
7 | +class CommentGroupPlugin < Noosfero::Plugin | |
8 | + | |
9 | + def self.plugin_name | |
10 | + "Comment Group" | |
11 | + end | |
12 | + | |
13 | + def self.plugin_description | |
14 | + _("A plugin that display comment groups.") | |
15 | + end | |
16 | + | |
17 | + def load_comments(article) | |
18 | + article.comments.without_spam.without_group.as_thread | |
19 | + end | |
20 | + | |
21 | + #FIXME make this test | |
22 | + def macro_display_comments(params, inner_html, source) | |
23 | + group_id = params[:group_id].to_i | |
24 | + article = source | |
25 | + count = article.group_comments.without_spam.in_group(group_id).count | |
26 | + | |
27 | + lambda {render :partial => 'plugins/comment_group_macro/views/comment_group.rhtml', :locals => {:group_id => group_id, :article_id => article.id, :inner_html => inner_html, :count => count, :profile_identifier => article.profile.identifier }} | |
28 | + end | |
29 | + | |
30 | + def macro_methods | |
31 | + 'macro_display_comments' | |
32 | + end | |
33 | + | |
34 | + def config_macro_display_comments | |
35 | + { :params => [], :skip_dialog => true, :generator => 'makeCommentable();', :js_files => 'comment_group.js', :icon_path => '/designs/icons/tango/Tango/16x16/emblems/emblem-system.png', :css_files => 'comment_group.css' } | |
36 | + end | |
37 | + | |
38 | + def comment_form_extra_contents(args) | |
39 | + comment = args[:comment] | |
40 | + group_id = comment.group_id || args[:group_id] | |
41 | + lambda { | |
42 | + hidden_field_tag('comment[group_id]', group_id) if group_id | |
43 | + } | |
44 | + end | |
45 | + | |
46 | + def js_files | |
47 | + 'comment_group_macro.js' | |
48 | + end | |
49 | + | |
50 | +end | ... | ... |
plugins/comment_group/lib/comment_group_plugin/ext/article.rb
0 → 100644
... | ... | @@ -0,0 +1,21 @@ |
1 | +require_dependency 'article' | |
2 | + | |
3 | +class Article | |
4 | + | |
5 | + #FIXME make this test | |
6 | + has_many :group_comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc', :conditions => [ 'group_id IS NOT NULL'] | |
7 | + | |
8 | + #FIXME make this test | |
9 | + validate :not_empty_group_comments_removed | |
10 | + | |
11 | + #FIXME make this test | |
12 | + def not_empty_group_comments_removed | |
13 | + if body | |
14 | + groups_with_comments = group_comments.collect {|comment| comment.group_id}.uniq | |
15 | + groups = Hpricot(body.to_s).search('.macro').collect{|element| element['data-macro-group_id'].to_i} | |
16 | + errors.add_to_base(N_('Not empty group comment cannot be removed')) unless (groups_with_comments-groups).empty? | |
17 | + end | |
18 | + end | |
19 | + | |
20 | +end | |
21 | + | ... | ... |
plugins/comment_group/lib/comment_group_plugin/ext/comment.rb
0 → 100644
... | ... | @@ -0,0 +1,47 @@ |
1 | +function getNextGroupId() { | |
2 | + max = -1; | |
3 | + groups = jQuery('#article_body_ifr').contents().find('.article_comments'); | |
4 | + groups.each(function(key, value) { | |
5 | + value = jQuery(value).attr('data-macro-group_id'); | |
6 | + if(value>max) max = parseInt(value); | |
7 | + }); | |
8 | + return max+1; | |
9 | +} | |
10 | + | |
11 | +function makeCommentable() { | |
12 | + tinyMCE.activeEditor.focus(); | |
13 | + start = jQuery(tinyMCE.activeEditor.selection.getStart()).closest('p'); | |
14 | + end = jQuery(tinyMCE.activeEditor.selection.getEnd()).closest('p'); | |
15 | + | |
16 | + //text = start.parent().children(); | |
17 | + text = jQuery('#article_body_ifr').contents().find('*'); | |
18 | + selection = text.slice(text.index(start), text.index(end)+1); | |
19 | + | |
20 | + hasTag = false; | |
21 | + selection.each(function(key, value) { | |
22 | + commentTag = jQuery(value).closest('.article_comments'); | |
23 | + if(commentTag.length) { | |
24 | + commentTag.children().unwrap('<div class=\"article_comments\"/>'); | |
25 | + hasTag = true; | |
26 | + } | |
27 | + }); | |
28 | + | |
29 | + if(!hasTag) { | |
30 | + tags = start.siblings().add(start); | |
31 | + tags = tags.slice(tags.index(start), tags.index(end)>=0?tags.index(end)+1:tags.index(start)+1); | |
32 | + tags.wrapAll('<div class=\"macro article_comments\" data-macro=\"display_comments\" data-macro-group_id=\"'+getNextGroupId()+'\"/>'); | |
33 | + | |
34 | + contents = jQuery('#article_body_ifr').contents(); | |
35 | + lastP = contents.find('p.article_comments_last_paragraph'); | |
36 | + if(lastP.text().trim().length > 0) { | |
37 | + lastP.removeClass('article_comments_last_paragraph'); | |
38 | + } else { | |
39 | + lastP.remove(); | |
40 | + } | |
41 | + lastDiv = contents.find('div.article_comments').last(); | |
42 | + if(lastDiv.next().length==0) { | |
43 | + lastDiv.after("<p class='article_comments_last_paragraph'> </p>"); | |
44 | + } | |
45 | + } | |
46 | +} | |
47 | + | ... | ... |
... | ... | @@ -0,0 +1,39 @@ |
1 | +var comment_group_anchor; | |
2 | +jQuery(document).ready(function($) { | |
3 | + var anchor = window.location.hash; | |
4 | + if(anchor.length==0) return; | |
5 | + | |
6 | + var val = anchor.split('-'); //anchor format = #comment-\d+ | |
7 | + if(val.length!=2 || val[0]!='#comment') return; | |
8 | + if($('div[data-macro=display_comments]').length==0) return; //display_comments div must exists | |
9 | + var comment_id = val[1]; | |
10 | + if(!/^\d+$/.test(comment_id)) return; //test for integer | |
11 | + | |
12 | + comment_group_anchor = anchor; | |
13 | + var url = '/plugin/comment_group_macro/public/comment_group/'+comment_id; | |
14 | + $.getJSON(url, function(data) { | |
15 | + if(data.group_id!=null) { | |
16 | + var button = $('div.comment_group_'+ data.group_id + ' a'); | |
17 | + button.click(); | |
18 | + $.scrollTo(button); | |
19 | + } | |
20 | + }); | |
21 | +}); | |
22 | + | |
23 | +function toggleGroup(group) { | |
24 | + var div = jQuery('div.comments_list_toggle_group_'+group); | |
25 | + var visible = div.is(':visible'); | |
26 | + if(!visible) | |
27 | + jQuery('div.comment-group-loading-'+group).addClass('comment-button-loading'); | |
28 | + | |
29 | + div.toggle('fast'); | |
30 | + return visible; | |
31 | +} | |
32 | + | |
33 | +function loadCompleted(group) { | |
34 | + jQuery('div.comment-group-loading-'+group).removeClass('comment-button-loading') | |
35 | + if(comment_group_anchor) { | |
36 | + jQuery.scrollTo(jQuery(comment_group_anchor)); | |
37 | + comment_group_anchor = null; | |
38 | + } | |
39 | +} | ... | ... |
1.66 KB
plugins/comment_group/test/functional/comment_group_plugin_profile_controller_test.rb
0 → 100644
... | ... | @@ -0,0 +1,38 @@ |
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | +require File.dirname(__FILE__) + '/../../controllers/profile/comment_group_plugin_profile_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class CommentGroupPluginProfileController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class CommentGroupPluginProfileControllerTest < ActionController::TestCase | |
8 | + | |
9 | + def setup | |
10 | + @controller = CommentGroupPluginProfileController.new | |
11 | + @request = ActionController::TestRequest.new | |
12 | + @response = ActionController::TestResponse.new | |
13 | + | |
14 | + @profile = create_user('testuser').person | |
15 | + @article = profile.articles.build(:name => 'test') | |
16 | + @article.save! | |
17 | + end | |
18 | + attr_reader :article | |
19 | + attr_reader :profile | |
20 | + | |
21 | + should 'be able to show group comments' do | |
22 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
23 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | |
24 | + assert_template 'comment/_comment.rhtml' | |
25 | + assert_match /comments_list_group_0/, @response.body | |
26 | + assert_match /\"comment-count-0\", \"1\"/, @response.body | |
27 | + end | |
28 | + | |
29 | + should 'do not show global comments' do | |
30 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'global comment', :body => 'global', :group_id => nil) | |
31 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
32 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | |
33 | + assert_template 'comment/_comment.rhtml' | |
34 | + assert_match /comments_list_group_0/, @response.body | |
35 | + assert_match /\"comment-count-0\", \"1\"/, @response.body | |
36 | + end | |
37 | + | |
38 | +end | ... | ... |
plugins/comment_group/test/functional/comment_group_plugin_public_controller_test.rb
0 → 100644
... | ... | @@ -0,0 +1,33 @@ |
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | +require File.dirname(__FILE__) + '/../../controllers/public/comment_group_plugin_public_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class CommentGroupPluginPublicController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class CommentGroupPluginPublicControllerTest < ActionController::TestCase | |
8 | + | |
9 | + def setup | |
10 | + @controller = CommentGroupPluginPublicController.new | |
11 | + @request = ActionController::TestRequest.new | |
12 | + @response = ActionController::TestResponse.new | |
13 | + | |
14 | + @profile = create_user('testuser').person | |
15 | + @article = profile.articles.build(:name => 'test') | |
16 | + @article.save! | |
17 | + end | |
18 | + attr_reader :article | |
19 | + attr_reader :profile | |
20 | + | |
21 | + should 'be able to return group_id for a comment' do | |
22 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
23 | + xhr :get, :comment_group, :id => comment.id | |
24 | + assert_match /\{\"group_id\":0\}/, @response.body | |
25 | + end | |
26 | + | |
27 | + should 'return group_id=null for a global comment' do | |
28 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala' ) | |
29 | + xhr :get, :comment_group, :id => comment.id | |
30 | + assert_match /\{\"group_id\":null\}/, @response.body | |
31 | + end | |
32 | + | |
33 | +end | ... | ... |
plugins/comment_group/test/unit/comment_group_plugin_test.rb
0 → 100644
... | ... | @@ -0,0 +1,81 @@ |
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | + | |
3 | +class CommentGroupPluginTest < ActiveSupport::TestCase | |
4 | + | |
5 | + include Noosfero::Plugin::HotSpot | |
6 | + | |
7 | + def setup | |
8 | + @environment = Environment.default | |
9 | + end | |
10 | + | |
11 | + attr_reader :environment | |
12 | + | |
13 | + should 'register comment_group_macro in environment' do | |
14 | + Environment.macros = {} | |
15 | + Environment.macros[environment.id] = {} | |
16 | + macros = Environment.macros[environment.id] | |
17 | + context = mock() | |
18 | + context.stubs(:environment).returns(environment) | |
19 | + plugin = CommentGroupPlugin.new(context) | |
20 | + assert_equal ['macro_display_comments'], macros.keys | |
21 | + end | |
22 | + | |
23 | + should 'load_comments returns all the comments wihout group of an article passed as parameter' do | |
24 | + article = fast_create(Article) | |
25 | + c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
26 | + c2 = fast_create(Comment, :source_id => article.id) | |
27 | + c3 = fast_create(Comment, :source_id => article.id) | |
28 | + | |
29 | + plugin = CommentGroupPlugin.new | |
30 | + assert_equal [], [c2, c3] - plugin.load_comments(article) | |
31 | + assert_equal [], plugin.load_comments(article) - [c2, c3] | |
32 | + end | |
33 | + | |
34 | + should 'load_comments not returns spam comments' do | |
35 | + article = fast_create(Article) | |
36 | + c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
37 | + c2 = fast_create(Comment, :source_id => article.id) | |
38 | + c3 = fast_create(Comment, :source_id => article.id, :spam => true) | |
39 | + | |
40 | + plugin = CommentGroupPlugin.new | |
41 | + assert_equal [], [c2] - plugin.load_comments(article) | |
42 | + assert_equal [], plugin.load_comments(article) - [c2] | |
43 | + end | |
44 | + | |
45 | + should 'load_comments returns only root comments of article' do | |
46 | + article = fast_create(Article) | |
47 | + c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
48 | + c2 = fast_create(Comment, :source_id => article.id) | |
49 | + c3 = fast_create(Comment, :source_id => article.id, :reply_of_id => c2.id) | |
50 | + | |
51 | + plugin = CommentGroupPlugin.new | |
52 | + assert_equal [], [c2] - plugin.load_comments(article) | |
53 | + assert_equal [], plugin.load_comments(article) - [c2] | |
54 | + end | |
55 | + | |
56 | + should 'params of macro display comments configuration be an empty array' do | |
57 | + plugin = CommentGroupPlugin.new | |
58 | + assert_equal [], plugin.config_macro_display_comments[:params] | |
59 | + end | |
60 | + | |
61 | + should 'skip_dialog of macro display comments configuration be true' do | |
62 | + plugin = CommentGroupPlugin.new | |
63 | + assert plugin.config_macro_display_comments[:skip_dialog] | |
64 | + end | |
65 | + | |
66 | + should 'generator of macro display comments configuration be the makeCommentable function' do | |
67 | + plugin = CommentGroupPlugin.new | |
68 | + assert_equal 'makeCommentable();', plugin.config_macro_display_comments[:generator] | |
69 | + end | |
70 | + | |
71 | + should 'js_files of macro display comments configuration return comment_group.js' do | |
72 | + plugin = CommentGroupPlugin.new | |
73 | + assert_equal 'comment_group.js', plugin.config_macro_display_comments[:js_files] | |
74 | + end | |
75 | + | |
76 | + should 'css_files of macro display comments configuration return comment_group.css' do | |
77 | + plugin = CommentGroupPlugin.new | |
78 | + assert_equal 'comment_group.css', plugin.config_macro_display_comments[:css_files] | |
79 | + end | |
80 | + | |
81 | +end | ... | ... |
... | ... | @@ -0,0 +1,30 @@ |
1 | +<div class="comments"> | |
2 | + <div class="comment_group_<%= group_id %>" style="float: left"> | |
3 | + <div style="float: left"> | |
4 | + <%= link_to_remote(image_tag("/plugins/comment_group_macro/images/comments.gif"), | |
5 | + :url => { :profile => profile_identifier, :controller => 'comment_group_plugin_profile', :action => 'view_comments', :group_id => group_id, :article_id => article_id}, | |
6 | + :loaded => visual_effect(:highlight, "comments_list_group_#{group_id}"), | |
7 | + :method => :post, | |
8 | + :condition => "!toggleGroup(#{group_id})", | |
9 | + :complete => "loadCompleted(#{group_id})")%> | |
10 | + </div> | |
11 | + <!-- FIXME: css file --> | |
12 | + <div id="comments_group_count_<%= group_id %>" style="float: right; vertical-align: middle; padding-left: 3px; padding-right: 5px; color: #5AC1FC"><span id="comment-count-<%= group_id %>" class='comment-count'><%= count %></span></div> | |
13 | + | |
14 | + </div> | |
15 | + | |
16 | + <div> | |
17 | + <%= inner_html %> | |
18 | + </div> | |
19 | + | |
20 | + <div class="comment-group-loading-<%= group_id %>"/> | |
21 | + | |
22 | + <div class="comments_list_toggle_group_<%= group_id %>" style="display:none"> | |
23 | + <div class="article-comments-list"> | |
24 | + <div id="comments_list_group_<%= group_id %>"></div> | |
25 | + </div> | |
26 | + | |
27 | + <div id="page-comment-form-<%= group_id %>" class='post_comment_box closed'><%= render :partial => 'comment/comment_form', :locals => {:comment => Comment.new, :display_link => true, :cancel_triggers_hide => true, :group_id => group_id}%></div> | |
28 | + | |
29 | + </div> | |
30 | +</div> | ... | ... |
plugins/comment_group_macro/controllers/profile/comment_group_macro_plugin_profile_controller.rb
... | ... | @@ -1,16 +0,0 @@ |
1 | -class CommentGroupMacroPluginProfileController < ProfileController | |
2 | - append_view_path File.join(File.dirname(__FILE__) + '/../views') | |
3 | - | |
4 | - def view_comments | |
5 | - article_id = params[:article_id] | |
6 | - group_id = params[:group_id] | |
7 | - | |
8 | - article = profile.articles.find(article_id) | |
9 | - comments = article.group_comments.without_spam.in_group(group_id) | |
10 | - render :update do |page| | |
11 | - page.replace_html "comments_list_group_#{group_id}", :partial => 'comment/comment.rhtml', :collection => comments.as_thread | |
12 | - page.replace_html "comment-count-#{group_id}", comments.count | |
13 | - end | |
14 | - end | |
15 | - | |
16 | -end |
plugins/comment_group_macro/controllers/public/comment_group_macro_plugin_public_controller.rb
plugins/comment_group_macro/db/migrate/20121220201629_add_group_id_to_comment.rb
plugins/comment_group_macro/lib/comment_group_macro_plugin.rb
... | ... | @@ -1,50 +0,0 @@ |
1 | -require_dependency 'comment_group_macro_plugin/ext/article' | |
2 | -require_dependency 'comment_group_macro_plugin/ext/comment' | |
3 | - | |
4 | -#FIXME See a better way to generalize this parameter. | |
5 | -ActionView::Base.sanitized_allowed_attributes += ['data-macro', 'data-macro-group_id'] | |
6 | - | |
7 | -class CommentGroupMacroPlugin < Noosfero::Plugin | |
8 | - | |
9 | - def self.plugin_name | |
10 | - "Comment Group" | |
11 | - end | |
12 | - | |
13 | - def self.plugin_description | |
14 | - _("A plugin that display comment groups.") | |
15 | - end | |
16 | - | |
17 | - def load_comments(article) | |
18 | - article.comments.without_spam.without_group.as_thread | |
19 | - end | |
20 | - | |
21 | - #FIXME make this test | |
22 | - def macro_display_comments(params, inner_html, source) | |
23 | - group_id = params[:group_id].to_i | |
24 | - article = source | |
25 | - count = article.group_comments.without_spam.in_group(group_id).count | |
26 | - | |
27 | - lambda {render :partial => 'plugins/comment_group_macro/views/comment_group.rhtml', :locals => {:group_id => group_id, :article_id => article.id, :inner_html => inner_html, :count => count, :profile_identifier => article.profile.identifier }} | |
28 | - end | |
29 | - | |
30 | - def macro_methods | |
31 | - 'macro_display_comments' | |
32 | - end | |
33 | - | |
34 | - def config_macro_display_comments | |
35 | - { :params => [], :skip_dialog => true, :generator => 'makeCommentable();', :js_files => 'comment_group.js', :icon_path => '/designs/icons/tango/Tango/16x16/emblems/emblem-system.png', :css_files => 'comment_group.css' } | |
36 | - end | |
37 | - | |
38 | - def comment_form_extra_contents(args) | |
39 | - comment = args[:comment] | |
40 | - group_id = comment.group_id || args[:group_id] | |
41 | - lambda { | |
42 | - hidden_field_tag('comment[group_id]', group_id) if group_id | |
43 | - } | |
44 | - end | |
45 | - | |
46 | - def js_files | |
47 | - 'comment_group_macro.js' | |
48 | - end | |
49 | - | |
50 | -end |
plugins/comment_group_macro/lib/comment_group_macro_plugin/ext/article.rb
... | ... | @@ -1,21 +0,0 @@ |
1 | -require_dependency 'article' | |
2 | - | |
3 | -class Article | |
4 | - | |
5 | - #FIXME make this test | |
6 | - has_many :group_comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc', :conditions => [ 'group_id IS NOT NULL'] | |
7 | - | |
8 | - #FIXME make this test | |
9 | - validate :not_empty_group_comments_removed | |
10 | - | |
11 | - #FIXME make this test | |
12 | - def not_empty_group_comments_removed | |
13 | - if body | |
14 | - groups_with_comments = group_comments.collect {|comment| comment.group_id}.uniq | |
15 | - groups = Hpricot(body.to_s).search('.macro').collect{|element| element['data-macro-group_id'].to_i} | |
16 | - errors.add_to_base(N_('Not empty group comment cannot be removed')) unless (groups_with_comments-groups).empty? | |
17 | - end | |
18 | - end | |
19 | - | |
20 | -end | |
21 | - |
plugins/comment_group_macro/lib/comment_group_macro_plugin/ext/comment.rb
plugins/comment_group_macro/public/comment_group.css
plugins/comment_group_macro/public/comment_group.js
... | ... | @@ -1,47 +0,0 @@ |
1 | -function getNextGroupId() { | |
2 | - max = -1; | |
3 | - groups = jQuery('#article_body_ifr').contents().find('.article_comments'); | |
4 | - groups.each(function(key, value) { | |
5 | - value = jQuery(value).attr('data-macro-group_id'); | |
6 | - if(value>max) max = parseInt(value); | |
7 | - }); | |
8 | - return max+1; | |
9 | -} | |
10 | - | |
11 | -function makeCommentable() { | |
12 | - tinyMCE.activeEditor.focus(); | |
13 | - start = jQuery(tinyMCE.activeEditor.selection.getStart()).closest('p'); | |
14 | - end = jQuery(tinyMCE.activeEditor.selection.getEnd()).closest('p'); | |
15 | - | |
16 | - //text = start.parent().children(); | |
17 | - text = jQuery('#article_body_ifr').contents().find('*'); | |
18 | - selection = text.slice(text.index(start), text.index(end)+1); | |
19 | - | |
20 | - hasTag = false; | |
21 | - selection.each(function(key, value) { | |
22 | - commentTag = jQuery(value).closest('.article_comments'); | |
23 | - if(commentTag.length) { | |
24 | - commentTag.children().unwrap('<div class=\"article_comments\"/>'); | |
25 | - hasTag = true; | |
26 | - } | |
27 | - }); | |
28 | - | |
29 | - if(!hasTag) { | |
30 | - tags = start.siblings().add(start); | |
31 | - tags = tags.slice(tags.index(start), tags.index(end)>=0?tags.index(end)+1:tags.index(start)+1); | |
32 | - tags.wrapAll('<div class=\"macro article_comments\" data-macro=\"display_comments\" data-macro-group_id=\"'+getNextGroupId()+'\"/>'); | |
33 | - | |
34 | - contents = jQuery('#article_body_ifr').contents(); | |
35 | - lastP = contents.find('p.article_comments_last_paragraph'); | |
36 | - if(lastP.text().trim().length > 0) { | |
37 | - lastP.removeClass('article_comments_last_paragraph'); | |
38 | - } else { | |
39 | - lastP.remove(); | |
40 | - } | |
41 | - lastDiv = contents.find('div.article_comments').last(); | |
42 | - if(lastDiv.next().length==0) { | |
43 | - lastDiv.after("<p class='article_comments_last_paragraph'> </p>"); | |
44 | - } | |
45 | - } | |
46 | -} | |
47 | - |
plugins/comment_group_macro/public/comment_group_macro.js
... | ... | @@ -1,39 +0,0 @@ |
1 | -var comment_group_anchor; | |
2 | -jQuery(document).ready(function($) { | |
3 | - var anchor = window.location.hash; | |
4 | - if(anchor.length==0) return; | |
5 | - | |
6 | - var val = anchor.split('-'); //anchor format = #comment-\d+ | |
7 | - if(val.length!=2 || val[0]!='#comment') return; | |
8 | - if($('div[data-macro=display_comments]').length==0) return; //display_comments div must exists | |
9 | - var comment_id = val[1]; | |
10 | - if(!/^\d+$/.test(comment_id)) return; //test for integer | |
11 | - | |
12 | - comment_group_anchor = anchor; | |
13 | - var url = '/plugin/comment_group_macro/public/comment_group/'+comment_id; | |
14 | - $.getJSON(url, function(data) { | |
15 | - if(data.group_id!=null) { | |
16 | - var button = $('div.comment_group_'+ data.group_id + ' a'); | |
17 | - button.click(); | |
18 | - $.scrollTo(button); | |
19 | - } | |
20 | - }); | |
21 | -}); | |
22 | - | |
23 | -function toggleGroup(group) { | |
24 | - var div = jQuery('div.comments_list_toggle_group_'+group); | |
25 | - var visible = div.is(':visible'); | |
26 | - if(!visible) | |
27 | - jQuery('div.comment-group-loading-'+group).addClass('comment-button-loading'); | |
28 | - | |
29 | - div.toggle('fast'); | |
30 | - return visible; | |
31 | -} | |
32 | - | |
33 | -function loadCompleted(group) { | |
34 | - jQuery('div.comment-group-loading-'+group).removeClass('comment-button-loading') | |
35 | - if(comment_group_anchor) { | |
36 | - jQuery.scrollTo(jQuery(comment_group_anchor)); | |
37 | - comment_group_anchor = null; | |
38 | - } | |
39 | -} |
plugins/comment_group_macro/public/images/comments.gif
1.66 KB
plugins/comment_group_macro/test/functional/comment_group_macro_plugin_profile_controller_test.rb
... | ... | @@ -1,38 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | -require File.dirname(__FILE__) + '/../../controllers/profile/comment_group_macro_plugin_profile_controller' | |
3 | - | |
4 | -# Re-raise errors caught by the controller. | |
5 | -class CommentGroupMacroPluginProfileController; def rescue_action(e) raise e end; end | |
6 | - | |
7 | -class CommentGroupMacroPluginProfileControllerTest < ActionController::TestCase | |
8 | - | |
9 | - def setup | |
10 | - @controller = CommentGroupMacroPluginProfileController.new | |
11 | - @request = ActionController::TestRequest.new | |
12 | - @response = ActionController::TestResponse.new | |
13 | - | |
14 | - @profile = create_user('testuser').person | |
15 | - @article = profile.articles.build(:name => 'test') | |
16 | - @article.save! | |
17 | - end | |
18 | - attr_reader :article | |
19 | - attr_reader :profile | |
20 | - | |
21 | - should 'be able to show group comments' do | |
22 | - comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
23 | - xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | |
24 | - assert_template 'comment/_comment.rhtml' | |
25 | - assert_match /comments_list_group_0/, @response.body | |
26 | - assert_match /\"comment-count-0\", \"1\"/, @response.body | |
27 | - end | |
28 | - | |
29 | - should 'do not show global comments' do | |
30 | - comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'global comment', :body => 'global', :group_id => nil) | |
31 | - comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
32 | - xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | |
33 | - assert_template 'comment/_comment.rhtml' | |
34 | - assert_match /comments_list_group_0/, @response.body | |
35 | - assert_match /\"comment-count-0\", \"1\"/, @response.body | |
36 | - end | |
37 | - | |
38 | -end |
plugins/comment_group_macro/test/functional/comment_group_macro_plugin_public_controller_test.rb
... | ... | @@ -1,33 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | -require File.dirname(__FILE__) + '/../../controllers/public/comment_group_macro_plugin_public_controller' | |
3 | - | |
4 | -# Re-raise errors caught by the controller. | |
5 | -class CommentGroupMacroPluginPublicController; def rescue_action(e) raise e end; end | |
6 | - | |
7 | -class CommentGroupMacroPluginPublicControllerTest < ActionController::TestCase | |
8 | - | |
9 | - def setup | |
10 | - @controller = CommentGroupMacroPluginPublicController.new | |
11 | - @request = ActionController::TestRequest.new | |
12 | - @response = ActionController::TestResponse.new | |
13 | - | |
14 | - @profile = create_user('testuser').person | |
15 | - @article = profile.articles.build(:name => 'test') | |
16 | - @article.save! | |
17 | - end | |
18 | - attr_reader :article | |
19 | - attr_reader :profile | |
20 | - | |
21 | - should 'be able to return group_id for a comment' do | |
22 | - comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | |
23 | - xhr :get, :comment_group, :id => comment.id | |
24 | - assert_match /\{\"group_id\":0\}/, @response.body | |
25 | - end | |
26 | - | |
27 | - should 'return group_id=null for a global comment' do | |
28 | - comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala' ) | |
29 | - xhr :get, :comment_group, :id => comment.id | |
30 | - assert_match /\{\"group_id\":null\}/, @response.body | |
31 | - end | |
32 | - | |
33 | -end |
plugins/comment_group_macro/test/unit/comment_group_macro_plugin_test.rb
... | ... | @@ -1,81 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
2 | - | |
3 | -class CommentGroupMacroPluginTest < ActiveSupport::TestCase | |
4 | - | |
5 | - include Noosfero::Plugin::HotSpot | |
6 | - | |
7 | - def setup | |
8 | - @environment = Environment.default | |
9 | - end | |
10 | - | |
11 | - attr_reader :environment | |
12 | - | |
13 | - should 'register comment_group_macro in environment' do | |
14 | - Environment.macros = {} | |
15 | - Environment.macros[environment.id] = {} | |
16 | - macros = Environment.macros[environment.id] | |
17 | - context = mock() | |
18 | - context.stubs(:environment).returns(environment) | |
19 | - plugin = CommentGroupMacroPlugin.new(context) | |
20 | - assert_equal ['macro_display_comments'], macros.keys | |
21 | - end | |
22 | - | |
23 | - should 'load_comments returns all the comments wihout group of an article passed as parameter' do | |
24 | - article = fast_create(Article) | |
25 | - c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
26 | - c2 = fast_create(Comment, :source_id => article.id) | |
27 | - c3 = fast_create(Comment, :source_id => article.id) | |
28 | - | |
29 | - plugin = CommentGroupMacroPlugin.new | |
30 | - assert_equal [], [c2, c3] - plugin.load_comments(article) | |
31 | - assert_equal [], plugin.load_comments(article) - [c2, c3] | |
32 | - end | |
33 | - | |
34 | - should 'load_comments not returns spam comments' do | |
35 | - article = fast_create(Article) | |
36 | - c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
37 | - c2 = fast_create(Comment, :source_id => article.id) | |
38 | - c3 = fast_create(Comment, :source_id => article.id, :spam => true) | |
39 | - | |
40 | - plugin = CommentGroupMacroPlugin.new | |
41 | - assert_equal [], [c2] - plugin.load_comments(article) | |
42 | - assert_equal [], plugin.load_comments(article) - [c2] | |
43 | - end | |
44 | - | |
45 | - should 'load_comments returns only root comments of article' do | |
46 | - article = fast_create(Article) | |
47 | - c1 = fast_create(Comment, :source_id => article.id, :group_id => 1) | |
48 | - c2 = fast_create(Comment, :source_id => article.id) | |
49 | - c3 = fast_create(Comment, :source_id => article.id, :reply_of_id => c2.id) | |
50 | - | |
51 | - plugin = CommentGroupMacroPlugin.new | |
52 | - assert_equal [], [c2] - plugin.load_comments(article) | |
53 | - assert_equal [], plugin.load_comments(article) - [c2] | |
54 | - end | |
55 | - | |
56 | - should 'params of macro display comments configuration be an empty array' do | |
57 | - plugin = CommentGroupMacroPlugin.new | |
58 | - assert_equal [], plugin.config_macro_display_comments[:params] | |
59 | - end | |
60 | - | |
61 | - should 'skip_dialog of macro display comments configuration be true' do | |
62 | - plugin = CommentGroupMacroPlugin.new | |
63 | - assert plugin.config_macro_display_comments[:skip_dialog] | |
64 | - end | |
65 | - | |
66 | - should 'generator of macro display comments configuration be the makeCommentable function' do | |
67 | - plugin = CommentGroupMacroPlugin.new | |
68 | - assert_equal 'makeCommentable();', plugin.config_macro_display_comments[:generator] | |
69 | - end | |
70 | - | |
71 | - should 'js_files of macro display comments configuration return comment_group.js' do | |
72 | - plugin = CommentGroupMacroPlugin.new | |
73 | - assert_equal 'comment_group.js', plugin.config_macro_display_comments[:js_files] | |
74 | - end | |
75 | - | |
76 | - should 'css_files of macro display comments configuration return comment_group.css' do | |
77 | - plugin = CommentGroupMacroPlugin.new | |
78 | - assert_equal 'comment_group.css', plugin.config_macro_display_comments[:css_files] | |
79 | - end | |
80 | - | |
81 | -end |
plugins/comment_group_macro/views/_comment_group.rhtml
... | ... | @@ -1,30 +0,0 @@ |
1 | -<div class="comments"> | |
2 | - <div class="comment_group_<%= group_id %>" style="float: left"> | |
3 | - <div style="float: left"> | |
4 | - <%= link_to_remote(image_tag("/plugins/comment_group_macro/images/comments.gif"), | |
5 | - :url => { :profile => profile_identifier, :controller => 'comment_group_macro_plugin_profile', :action => 'view_comments', :group_id => group_id, :article_id => article_id}, | |
6 | - :loaded => visual_effect(:highlight, "comments_list_group_#{group_id}"), | |
7 | - :method => :post, | |
8 | - :condition => "!toggleGroup(#{group_id})", | |
9 | - :complete => "loadCompleted(#{group_id})")%> | |
10 | - </div> | |
11 | - <!-- FIXME: css file --> | |
12 | - <div id="comments_group_count_<%= group_id %>" style="float: right; vertical-align: middle; padding-left: 3px; padding-right: 5px; color: #5AC1FC"><span id="comment-count-<%= group_id %>" class='comment-count'><%= count %></span></div> | |
13 | - | |
14 | - </div> | |
15 | - | |
16 | - <div> | |
17 | - <%= inner_html %> | |
18 | - </div> | |
19 | - | |
20 | - <div class="comment-group-loading-<%= group_id %>"/> | |
21 | - | |
22 | - <div class="comments_list_toggle_group_<%= group_id %>" style="display:none"> | |
23 | - <div class="article-comments-list"> | |
24 | - <div id="comments_list_group_<%= group_id %>"></div> | |
25 | - </div> | |
26 | - | |
27 | - <div id="page-comment-form-<%= group_id %>" class='post_comment_box closed'><%= render :partial => 'comment/comment_form', :locals => {:comment => Comment.new, :display_link => true, :cancel_triggers_hide => true, :group_id => group_id}%></div> | |
28 | - | |
29 | - </div> | |
30 | -</div> |