Commit 084b93c03109b872336bb4476d1a18051b7bee15
Exists in
master
and in
28 other branches
Merge branch 'next_colivre' into ActionItem2892
Showing
41 changed files
with
1657 additions
and
113 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
| @@ -144,10 +144,15 @@ class CmsController < MyProfileController | @@ -144,10 +144,15 @@ class CmsController < MyProfileController | ||
| 144 | 144 | ||
| 145 | post_only :set_home_page | 145 | post_only :set_home_page |
| 146 | def set_home_page | 146 | def set_home_page |
| 147 | - @article = profile.articles.find(params[:id]) | ||
| 148 | - profile.home_page = @article | ||
| 149 | - profile.save(false) | ||
| 150 | - session[:notice] = _('"%s" configured as home page.') % @article.name | 147 | + article = params[:id].nil? ? nil : profile.articles.find(params[:id]) |
| 148 | + profile.update_attribute(:home_page, article) | ||
| 149 | + | ||
| 150 | + if article.nil? | ||
| 151 | + session[:notice] = _('Homepage reseted.') | ||
| 152 | + else | ||
| 153 | + session[:notice] = _('"%s" configured as homepage.') % article.name | ||
| 154 | + end | ||
| 155 | + | ||
| 151 | redirect_to (request.referer || profile.url) | 156 | redirect_to (request.referer || profile.url) |
| 152 | end | 157 | end |
| 153 | 158 |
app/controllers/public/profile_controller.rb
| @@ -206,10 +206,50 @@ class ProfileController < PublicController | @@ -206,10 +206,50 @@ class ProfileController < PublicController | ||
| 206 | end | 206 | end |
| 207 | 207 | ||
| 208 | def view_more_network_activities | 208 | def view_more_network_activities |
| 209 | - @activities = @profile.tracked_notifications.paginate(:per_page => 10, :page => params[:page]) | 209 | + @activities = @profile.tracked_notifications.paginate(:per_page => 10, :page => params[:page]) |
| 210 | render :partial => 'profile_network_activities', :locals => {:network_activities => @activities} | 210 | render :partial => 'profile_network_activities', :locals => {:network_activities => @activities} |
| 211 | end | 211 | end |
| 212 | 212 | ||
| 213 | + def more_comments | ||
| 214 | + activity = ActionTracker::Record.find(:first, :conditions => {:id => params[:activity], :user_id => @profile}) | ||
| 215 | + comments_count = activity.comments.count | ||
| 216 | + comment_page = (params[:comment_page] || 1).to_i | ||
| 217 | + comments_per_page = 5 | ||
| 218 | + no_more_pages = comments_count <= comment_page * comments_per_page | ||
| 219 | + | ||
| 220 | + render :update do |page| | ||
| 221 | + page.insert_html :bottom, 'profile-wall-activities-comments-'+params[:activity], | ||
| 222 | + :partial => 'comment', :collection => activity.comments.paginate(:per_page => comments_per_page, :page => comment_page) | ||
| 223 | + | ||
| 224 | + if no_more_pages | ||
| 225 | + page.remove 'profile-wall-activities-comments-more-'+params[:activity] | ||
| 226 | + else | ||
| 227 | + page.replace_html 'profile-wall-activities-comments-more-'+params[:activity], | ||
| 228 | + :partial => 'more_comments', :locals => {:activity => activity, :comment_page => comment_page} | ||
| 229 | + end | ||
| 230 | + end | ||
| 231 | + end | ||
| 232 | + | ||
| 233 | + def more_replies | ||
| 234 | + activity = Scrap.find(:first, :conditions => {:id => params[:activity], :receiver_id => @profile, :scrap_id => nil}) | ||
| 235 | + comments_count = activity.replies.count | ||
| 236 | + comment_page = (params[:comment_page] || 1).to_i | ||
| 237 | + comments_per_page = 5 | ||
| 238 | + no_more_pages = comments_count <= comment_page * comments_per_page | ||
| 239 | + | ||
| 240 | + render :update do |page| | ||
| 241 | + page.insert_html :bottom, 'profile-wall-activities-comments-'+params[:activity], | ||
| 242 | + :partial => 'profile_scrap', :collection => activity.replies.paginate(:per_page => comments_per_page, :page => comment_page), :as => :scrap | ||
| 243 | + | ||
| 244 | + if no_more_pages | ||
| 245 | + page.remove 'profile-wall-activities-comments-more-'+params[:activity] | ||
| 246 | + else | ||
| 247 | + page.replace_html 'profile-wall-activities-comments-more-'+params[:activity], | ||
| 248 | + :partial => 'more_replies', :locals => {:activity => activity, :comment_page => comment_page} | ||
| 249 | + end | ||
| 250 | + end | ||
| 251 | + end | ||
| 252 | + | ||
| 213 | def remove_scrap | 253 | def remove_scrap |
| 214 | begin | 254 | begin |
| 215 | scrap = current_user.person.scraps(params[:scrap_id]) | 255 | scrap = current_user.person.scraps(params[:scrap_id]) |
| @@ -343,6 +383,7 @@ class ProfileController < PublicController | @@ -343,6 +383,7 @@ class ProfileController < PublicController | ||
| 343 | end | 383 | end |
| 344 | end | 384 | end |
| 345 | 385 | ||
| 386 | + | ||
| 346 | protected | 387 | protected |
| 347 | 388 | ||
| 348 | def check_access_to_profile | 389 | def check_access_to_profile |
| @@ -393,4 +434,5 @@ class ProfileController < PublicController | @@ -393,4 +434,5 @@ class ProfileController < PublicController | ||
| 393 | def relations_to_include | 434 | def relations_to_include |
| 394 | [:image, :domains, :preferred_domain, :environment] | 435 | [:image, :domains, :preferred_domain, :environment] |
| 395 | end | 436 | end |
| 437 | + | ||
| 396 | end | 438 | end |
app/helpers/application_helper.rb
| @@ -1424,8 +1424,8 @@ module ApplicationHelper | @@ -1424,8 +1424,8 @@ module ApplicationHelper | ||
| 1424 | end | 1424 | end |
| 1425 | 1425 | ||
| 1426 | def filter_html(html, source) | 1426 | def filter_html(html, source) |
| 1427 | - if @plugins && source.has_macro? | ||
| 1428 | - html = convert_macro(html, source) | 1427 | + if @plugins && source && source.has_macro? |
| 1428 | + html = convert_macro(html, source) unless @plugins.enabled_macros.blank? | ||
| 1429 | #TODO This parse should be done through the macro infra, but since there | 1429 | #TODO This parse should be done through the macro infra, but since there |
| 1430 | # are old things that do not support it we are keeping this hot spot. | 1430 | # are old things that do not support it we are keeping this hot spot. |
| 1431 | html = @plugins.pipeline(:parse_content, html, source).first | 1431 | html = @plugins.pipeline(:parse_content, html, source).first |
app/views/cms/view.rhtml
| @@ -2,6 +2,18 @@ | @@ -2,6 +2,18 @@ | ||
| 2 | <%= _('Content management') %> | 2 | <%= _('Content management') %> |
| 3 | </h1> | 3 | </h1> |
| 4 | 4 | ||
| 5 | +<% if !environment.enabled?('cant_change_homepage') && !remove_content_button(:home) %> | ||
| 6 | + <div class="cms-homepage"> | ||
| 7 | + <%= _('Profile homepage:') %> | ||
| 8 | + <% if profile.home_page %> | ||
| 9 | + <%= link_to_article(profile.home_page) %> | ||
| 10 | + <%= button_without_text(:'home-not', _('Reset homepage'), { :action => 'set_home_page', :id => nil }, :method => :post) %> | ||
| 11 | + <% else %> | ||
| 12 | + <span class="cms-homepage-default"><%= _('Profile Information') %></span> | ||
| 13 | + <% end %> | ||
| 14 | + </div> | ||
| 15 | +<% end %> | ||
| 16 | + | ||
| 5 | <% button_bar(:style => 'margin-bottom: 1em;') do %> | 17 | <% button_bar(:style => 'margin-bottom: 1em;') do %> |
| 6 | <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %> | 18 | <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %> |
| 7 | 19 | ||
| @@ -56,7 +68,11 @@ | @@ -56,7 +68,11 @@ | ||
| 56 | <%= button_without_text :eyes, _('Public view'), article.view_url %> | 68 | <%= button_without_text :eyes, _('Public view'), article.view_url %> |
| 57 | <%= display_spread_button(profile, article) unless article.folder? || remove_content_button(:spread)%> | 69 | <%= display_spread_button(profile, article) unless article.folder? || remove_content_button(:spread)%> |
| 58 | <% if !environment.enabled?('cant_change_homepage') && !remove_content_button(:home) %> | 70 | <% if !environment.enabled?('cant_change_homepage') && !remove_content_button(:home) %> |
| 59 | - <%= expirable_button article, :home, _('Use as homepage'), { :action => 'set_home_page', :id => article.id }, :method => :post %> | 71 | + <% if profile.home_page != article %> |
| 72 | + <%= expirable_button article, :home, _('Use as homepage'), { :action => 'set_home_page', :id => article.id }, :method => :post %> | ||
| 73 | + <% else %> | ||
| 74 | + <%= button_without_text(:'home-not', _('Reset homepage'), { :action => 'set_home_page', :id => nil }, :method => :post) %> | ||
| 75 | + <% end %> | ||
| 60 | <% end %> | 76 | <% end %> |
| 61 | <%= display_delete_button(article) if !remove_content_button(:delete) %> | 77 | <%= display_delete_button(article) if !remove_content_button(:delete) %> |
| 62 | </td> | 78 | </td> |
app/views/profile/_profile_activities_list.rhtml
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | <% if activity.kind_of?(ActionTracker::Record) %> | 4 | <% if activity.kind_of?(ActionTracker::Record) %> |
| 5 | <%= render :partial => 'profile_activity', :locals => { :activity => activity, :tab_action => 'wall' } if activity.visible? %> | 5 | <%= render :partial => 'profile_activity', :locals => { :activity => activity, :tab_action => 'wall' } if activity.visible? %> |
| 6 | <% else %> | 6 | <% else %> |
| 7 | - <%= render :partial => 'profile_scrap', :locals => {:scrap => activity } %> | 7 | + <%= render :partial => 'profile_scraps', :locals => { :activity => activity, :scrap => activity } %> |
| 8 | <% end %> | 8 | <% end %> |
| 9 | <% end %> | 9 | <% end %> |
| 10 | <% end %> | 10 | <% end %> |
app/views/profile/_profile_comments.rhtml
| 1 | <hr /> | 1 | <hr /> |
| 2 | 2 | ||
| 3 | -<% if activity.comments_count > 2 %> | 3 | +<ul id="profile-wall-activities-comments-<%= activity.id %>" class="profile-wall-activities-comments" > |
| 4 | +</ul> | ||
| 5 | +<% if activity.comments_count > 0 %> | ||
| 6 | +<div id="profile-wall-activities-comments-more-<%= activity.id %>" class="profile-wall-activities-comments" > | ||
| 4 | <div class='view-all-comments icon-chat'> | 7 | <div class='view-all-comments icon-chat'> |
| 5 | - <%= link_to(_("View all %s comments") % activity.comments_count, '#') %> | 8 | + <%= link_to(n_('View comment', "View all %s comments", activity.comments_count) % activity.comments_count, :profile => profile.identifier, :controller => 'profile', :action => 'more_comments', :activity => activity, :comment_page => (1)) %> |
| 6 | </div> | 9 | </div> |
| 10 | +</div> | ||
| 7 | <% end %> | 11 | <% end %> |
| 8 | - | ||
| 9 | -<ul class="profile-wall-activities-comments" style="<%= 'display:none;' if (activity.comments_count > 2) %>" > | ||
| 10 | - <%= render :partial => 'comment', :collection => activity.comments_as_thread %> | ||
| 11 | -</ul> | ||
| 12 | - | ||
| 13 | <%= render :partial => 'profile_comment_form', :locals => { :activity => activity, :tab_action => tab_action } %> | 12 | <%= render :partial => 'profile_comment_form', :locals => { :activity => activity, :tab_action => tab_action } %> |
app/views/profile/_profile_scrap.rhtml
| @@ -16,13 +16,7 @@ | @@ -16,13 +16,7 @@ | ||
| 16 | </div> | 16 | </div> |
| 17 | </div> | 17 | </div> |
| 18 | 18 | ||
| 19 | - <% if scrap.replies.count > 2 %> | ||
| 20 | - <div class='view-all-comments icon-chat'> | ||
| 21 | - <%= link_to(_("View all %s comments") % scrap.replies.count, '#') %> | ||
| 22 | - </div> | ||
| 23 | - <% end %> | ||
| 24 | - | ||
| 25 | - <ul class="profile-wall-activities-comments scrap-replies" style="width: auto; <%= 'display:none;' if (scrap.replies.count > 2) %>" > | 19 | + <ul class="profile-wall-activities-comments scrap-replies" style="width: auto;" > |
| 26 | <% scrap.replies.map do |reply| %> | 20 | <% scrap.replies.map do |reply| %> |
| 27 | <%= render :partial => 'profile_scrap', :locals => {:scrap => reply} %> | 21 | <%= render :partial => 'profile_scrap', :locals => {:scrap => reply} %> |
| 28 | <% end %> | 22 | <% end %> |
app/views/profile/_profile_scraps.rhtml
| 1 | -NÃO DEVE APARECER | 1 | +<li class='profile-activity-item' id='profile-activity-item-<%= scrap.id %>'> |
| 2 | + <div class='profile-activity-image'> | ||
| 3 | + <%= link_to(profile_image(scrap.sender, :minor), scrap.sender.url) %> | ||
| 4 | + </div> | ||
| 5 | + <div class='profile-activity-description'> | ||
| 6 | + <p class='profile-activity-sender'><%= link_to scrap.sender.name, scrap.sender.url %></p> | ||
| 7 | + <p class='profile-activity-text'><%= txt2html scrap.content %></p> | ||
| 8 | + <p class='profile-activity-time'><%= time_ago_as_sentence(scrap.created_at) %></p> | ||
| 9 | + <div class='profile-wall-actions'> | ||
| 10 | + <% if logged_in? && current_person.follows?(scrap.sender) %> | ||
| 11 | + <span class='profile-activity-send-reply'> | ||
| 12 | + <%= link_to_function s_('profile|Comment'), "hide_and_show(['#profile-wall-message-response-#{scrap.id}'],['#profile-wall-reply-#{scrap.id}', '#profile-wall-reply-form-#{scrap.id}']);$('reply_content_#{scrap.id}').value='';$('reply_content_#{scrap.id}').focus();return false", :class => "profile-send-reply" %> | ||
| 13 | + </span> | ||
| 14 | + <% end %> | ||
| 15 | + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_scrap, :scrap_id => scrap.id, :view => params[:view]).to_json, _('Are you sure you want to remove this scrap and all its replies?').to_json]) if logged_in? && user.can_control_scrap?(scrap) %> | ||
| 16 | + </div> | ||
| 17 | + </div> | ||
| 18 | + | ||
| 19 | + | ||
| 20 | + <ul id="profile-wall-activities-comments-<%= activity.id %>" class="profile-wall-activities-comments scrap-replies" style="width: auto;" > | ||
| 21 | + </ul> | ||
| 22 | + | ||
| 23 | + <% if scrap.replies.count > 0 %> | ||
| 24 | + <div id="profile-wall-activities-comments-more-<%= activity.id %>" class="profile-wall-activities-comments"> | ||
| 25 | + <div class='view-all-comments icon-chat'> | ||
| 26 | + <%= link_to(n_('View comment', "View all %s comments", scrap.replies.count) % scrap.replies.count, :profile => profile.identifier, :controller => 'profile', :action => 'more_replies', :activity => activity, :comment_page => (1)) %> | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + <% end %> | ||
| 30 | + <%= render :partial => 'profile_scrap_reply_form', :locals => { :scrap => scrap } %> | ||
| 31 | + <hr /> | ||
| 32 | +</li> |
plugins/comment_group/controllers/profile/comment_group_plugin_profile_controller.rb
| 1 | class CommentGroupPluginProfileController < ProfileController | 1 | class CommentGroupPluginProfileController < ProfileController |
| 2 | - append_view_path File.join(File.dirname(__FILE__) + '/../views') | 2 | + append_view_path File.join(File.dirname(__FILE__) + '/../../views') |
| 3 | 3 | ||
| 4 | def view_comments | 4 | def view_comments |
| 5 | - article_id = params[:article_id] | ||
| 6 | - group_id = params[:group_id] | 5 | + @article_id = params[:article_id] |
| 6 | + @group_id = params[:group_id] | ||
| 7 | 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 | ||
| 12 | - page.replace_html "comment-count-#{group_id}", comments.count | ||
| 13 | - end | 8 | + article = profile.articles.find(@article_id) |
| 9 | + @group_comment_page = (params[:group_comment_page] || 1).to_i | ||
| 10 | + | ||
| 11 | + @comments = article.comments.without_spam.in_group(@group_id) | ||
| 12 | + @comments_count = @comments.count | ||
| 13 | + @comments = @comments.without_reply.paginate(:per_page => per_page, :page => @group_comment_page ) | ||
| 14 | + | ||
| 15 | + @no_more_pages = @comments_count <= @group_comment_page * per_page | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + def per_page | ||
| 19 | + 3 | ||
| 14 | end | 20 | end |
| 15 | 21 | ||
| 16 | end | 22 | end |
plugins/comment_group/lib/comment_group_plugin.rb
| @@ -24,6 +24,11 @@ class CommentGroupPlugin < Noosfero::Plugin | @@ -24,6 +24,11 @@ class CommentGroupPlugin < Noosfero::Plugin | ||
| 24 | 'comment_group_macro.js' | 24 | 'comment_group_macro.js' |
| 25 | end | 25 | end |
| 26 | 26 | ||
| 27 | + def stylesheet? | ||
| 28 | + true | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + | ||
| 27 | end | 32 | end |
| 28 | 33 | ||
| 29 | require_dependency 'comment_group_plugin/macros/allow_comment' | 34 | require_dependency 'comment_group_plugin/macros/allow_comment' |
plugins/comment_group/lib/comment_group_plugin/macros/allow_comment.rb
| @@ -11,7 +11,6 @@ class CommentGroupPlugin::AllowComment < Noosfero::Plugin::Macro | @@ -11,7 +11,6 @@ class CommentGroupPlugin::AllowComment < Noosfero::Plugin::Macro | ||
| 11 | :css_files => 'comment_group.css' } | 11 | :css_files => 'comment_group.css' } |
| 12 | end | 12 | end |
| 13 | 13 | ||
| 14 | - #FIXME Make this test | ||
| 15 | def parse(params, inner_html, source) | 14 | def parse(params, inner_html, source) |
| 16 | group_id = params[:group_id].to_i | 15 | group_id = params[:group_id].to_i |
| 17 | article = source | 16 | article = source |
plugins/comment_group/lib/ext/article.rb
| @@ -2,13 +2,10 @@ require_dependency 'article' | @@ -2,13 +2,10 @@ require_dependency 'article' | ||
| 2 | 2 | ||
| 3 | class Article | 3 | class Article |
| 4 | 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'] | 5 | has_many :group_comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc', :conditions => [ 'group_id IS NOT NULL'] |
| 7 | 6 | ||
| 8 | - #FIXME make this test | ||
| 9 | validate :not_empty_group_comments_removed | 7 | validate :not_empty_group_comments_removed |
| 10 | 8 | ||
| 11 | - #FIXME make this test | ||
| 12 | def not_empty_group_comments_removed | 9 | def not_empty_group_comments_removed |
| 13 | if body | 10 | if body |
| 14 | groups_with_comments = group_comments.collect {|comment| comment.group_id}.uniq | 11 | groups_with_comments = group_comments.collect {|comment| comment.group_id}.uniq |
plugins/comment_group/test/functional/comment_group_plugin_profile_controller_test.rb
| 1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | 1 | +require File.dirname(__FILE__) + '/../test_helper' |
| 2 | require File.dirname(__FILE__) + '/../../controllers/profile/comment_group_plugin_profile_controller' | 2 | require File.dirname(__FILE__) + '/../../controllers/profile/comment_group_plugin_profile_controller' |
| 3 | 3 | ||
| 4 | # Re-raise errors caught by the controller. | 4 | # Re-raise errors caught by the controller. |
| @@ -21,18 +21,52 @@ class CommentGroupPluginProfileControllerTest < ActionController::TestCase | @@ -21,18 +21,52 @@ class CommentGroupPluginProfileControllerTest < ActionController::TestCase | ||
| 21 | should 'be able to show group comments' do | 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) | 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 | 23 | xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 |
| 24 | - assert_template 'comment/_comment.rhtml' | 24 | + assert_template 'comment_group_plugin_profile/view_comments.rjs' |
| 25 | assert_match /comments_list_group_0/, @response.body | 25 | assert_match /comments_list_group_0/, @response.body |
| 26 | assert_match /\"comment-count-0\", \"1\"/, @response.body | 26 | assert_match /\"comment-count-0\", \"1\"/, @response.body |
| 27 | end | 27 | end |
| 28 | 28 | ||
| 29 | should 'do not show global comments' do | 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) | 30 | + fast_create(Comment, :source_id => article, :author_id => profile, :title => 'global comment', :body => 'global', :group_id => nil) |
| 31 | + 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 | 32 | xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 |
| 33 | - assert_template 'comment/_comment.rhtml' | 33 | + assert_template 'comment_group_plugin_profile/view_comments.rjs' |
| 34 | assert_match /comments_list_group_0/, @response.body | 34 | assert_match /comments_list_group_0/, @response.body |
| 35 | assert_match /\"comment-count-0\", \"1\"/, @response.body | 35 | assert_match /\"comment-count-0\", \"1\"/, @response.body |
| 36 | end | 36 | end |
| 37 | 37 | ||
| 38 | + should 'show first page comments only' do | ||
| 39 | + comment1 = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'secondpage', :group_id => 0) | ||
| 40 | + comment2 = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'firstpage 1', :group_id => 0) | ||
| 41 | + comment3 = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'firstpage 2', :group_id => 0) | ||
| 42 | + comment4 = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'firstpage 3', :group_id => 0) | ||
| 43 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | ||
| 44 | + assert_match /firstpage 1/, @response.body | ||
| 45 | + assert_match /firstpage 2/, @response.body | ||
| 46 | + assert_match /firstpage 3/, @response.body | ||
| 47 | + assert_no_match /secondpage/, @response.body | ||
| 48 | + end | ||
| 49 | + | ||
| 50 | + should 'show link to display more comments' do | ||
| 51 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 52 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 53 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 54 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'secondpage', :body => 'secondpage', :group_id => 0) | ||
| 55 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | ||
| 56 | + assert_match /group_comment_page=2/, @response.body | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + should 'do not show link to display more comments if do not have more pages' do | ||
| 60 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 61 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 62 | + comment = fast_create(Comment, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'lalala', :group_id => 0) | ||
| 63 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | ||
| 64 | + assert_no_match /group_comment_page/, @response.body | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + should 'do not show link to display more comments if do not have any comments' do | ||
| 68 | + xhr :get, :view_comments, :profile => @profile.identifier, :article_id => article.id, :group_id => 0 | ||
| 69 | + assert_no_match /group_comment_page/, @response.body | ||
| 70 | + end | ||
| 71 | + | ||
| 38 | end | 72 | end |
plugins/comment_group/test/functional/comment_group_plugin_public_controller_test.rb
| 1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | 1 | +require File.dirname(__FILE__) + '/../test_helper' |
| 2 | require File.dirname(__FILE__) + '/../../controllers/public/comment_group_plugin_public_controller' | 2 | require File.dirname(__FILE__) + '/../../controllers/public/comment_group_plugin_public_controller' |
| 3 | 3 | ||
| 4 | # Re-raise errors caught by the controller. | 4 | # Re-raise errors caught by the controller. |
plugins/comment_group/test/functional/content_viewer_controller_test.rb
0 → 100644
| @@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class ContentViewerController | ||
| 4 | + append_view_path File.join(File.dirname(__FILE__) + '/../../views') | ||
| 5 | + def rescue_action(e) | ||
| 6 | + raise e | ||
| 7 | + end | ||
| 8 | +end | ||
| 9 | + | ||
| 10 | +class ContentViewerControllerTest < ActionController::TestCase | ||
| 11 | + | ||
| 12 | + def setup | ||
| 13 | + @profile = fast_create(Community) | ||
| 14 | + @page = fast_create(Article, :profile_id => @profile.id, :body => "<div class=\"macro\" data-macro-group_id=\"1\" data-macro='comment_group_plugin/allow_comment' ></div>") | ||
| 15 | + @environment = Environment.default | ||
| 16 | + @environment.enable_plugin(CommentGroupPlugin) | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + attr_reader :page | ||
| 20 | + | ||
| 21 | + should 'parse article body and render comment group view' do | ||
| 22 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => page.id) | ||
| 23 | + get :view_page, @page.url | ||
| 24 | + assert_tag 'div', :attributes => {:class => 'comment_group_1'} | ||
| 25 | + assert_tag 'div', :attributes => {:id => 'comments_group_count_1'} | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | +end |
| @@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../../../test/test_helper' |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class AllowCommentTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + @macro = CommentGroupPlugin::AllowComment.new | ||
| 7 | + end | ||
| 8 | + | ||
| 9 | + attr_reader :macro | ||
| 10 | + | ||
| 11 | + should 'have a configuration' do | ||
| 12 | + assert CommentGroupPlugin::AllowComment.configuration | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + should 'parse contents to include comment group view' do | ||
| 16 | + profile = fast_create(Community) | ||
| 17 | + article = fast_create(Article, :profile_id => profile.id) | ||
| 18 | + comment = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 19 | + inner_html = 'inner' | ||
| 20 | + content = macro.parse({:group_id => comment.group_id}, inner_html, article) | ||
| 21 | + | ||
| 22 | + expects(:render).with({:partial => 'plugins/comment_group/views/comment_group.rhtml', :locals => {:group_id => comment.group_id, :article_id => article.id, :inner_html => inner_html, :count => 1, :profile_identifier => profile.identifier} }) | ||
| 23 | + instance_eval(&content) | ||
| 24 | + end | ||
| 25 | + | ||
| 26 | +end |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class ArticleTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + profile = fast_create(Community) | ||
| 7 | + @article = fast_create(Article, :profile_id => profile.id) | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + attr_reader :article | ||
| 11 | + | ||
| 12 | + should 'return group comments from article' do | ||
| 13 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 14 | + comment2 = fast_create(Comment, :group_id => nil, :source_id => article.id) | ||
| 15 | + assert_equal [comment1], article.group_comments | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + should 'do not allow a exclusion of a group comment macro if this group has comments' do | ||
| 19 | + article.update_attribute(:body, "<div class=\"macro\" data-macro-group_id=2></div>") | ||
| 20 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 21 | + assert !article.save | ||
| 22 | + assert_equal 'Not empty group comment cannot be removed', article.errors[:base] | ||
| 23 | + end | ||
| 24 | + | ||
| 25 | + should 'allow save if comment group macro is not removed for group with comments' do | ||
| 26 | + article.update_attribute(:body, "<div class=\"macro\" data-macro-group_id=1></div>") | ||
| 27 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 28 | + assert article.save | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | +end |
plugins/comment_group/test/unit/comment_group_plugin_test.rb
| 1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | 1 | +require File.dirname(__FILE__) + '/../test_helper' |
| 2 | 2 | ||
| 3 | class CommentGroupPluginTest < ActiveSupport::TestCase | 3 | class CommentGroupPluginTest < ActiveSupport::TestCase |
| 4 | 4 | ||
| 5 | - include Noosfero::Plugin::HotSpot | ||
| 6 | - | ||
| 7 | def setup | 5 | def setup |
| 8 | @environment = Environment.default | 6 | @environment = Environment.default |
| 7 | + @plugin = CommentGroupPlugin.new | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + attr_reader :environment, :plugin | ||
| 11 | + | ||
| 12 | + should 'have a name' do | ||
| 13 | + assert_not_equal Noosfero::Plugin.plugin_name, CommentGroupPlugin::plugin_name | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + should 'describe yourself' do | ||
| 17 | + assert_not_equal Noosfero::Plugin.plugin_description, CommentGroupPlugin::plugin_description | ||
| 18 | + end | ||
| 19 | + | ||
| 20 | + should 'have a js file' do | ||
| 21 | + assert !plugin.js_files.blank? | ||
| 9 | end | 22 | end |
| 10 | 23 | ||
| 11 | - attr_reader :environment | 24 | + should 'have stylesheet' do |
| 25 | + assert plugin.stylesheet? | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + should 'have extra contents for comment form' do | ||
| 29 | + comment = fast_create(Comment, :group_id => 1) | ||
| 30 | + content = plugin.comment_form_extra_contents({:comment => comment}) | ||
| 31 | + expects(:hidden_field_tag).with('comment[group_id]', comment.group_id).once | ||
| 32 | + instance_eval(&content) | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + should 'do not have extra contents for comments without group' do | ||
| 36 | + comment = fast_create(Comment, :group_id => nil) | ||
| 37 | + content = plugin.comment_form_extra_contents({:comment => comment}) | ||
| 38 | + assert_equal nil, instance_eval(&content) | ||
| 39 | + end | ||
| 40 | + | ||
| 41 | + should 'call without_group for scope passed as parameter to unavailable_comments' do | ||
| 42 | + article = fast_create(Article) | ||
| 43 | + article.expects(:without_group).once | ||
| 44 | + plugin.unavailable_comments(article) | ||
| 45 | + end | ||
| 12 | 46 | ||
| 13 | #FIXME Obsolete test | 47 | #FIXME Obsolete test |
| 14 | # | 48 | # |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class CommentTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + profile = fast_create(Community) | ||
| 7 | + @article = fast_create(Article, :profile_id => profile.id) | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + attr_reader :article | ||
| 11 | + | ||
| 12 | + should 'return comments that belongs to a specified group' do | ||
| 13 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 14 | + comment2 = fast_create(Comment, :group_id => nil, :source_id => article.id) | ||
| 15 | + comment3 = fast_create(Comment, :group_id => 2, :source_id => article.id) | ||
| 16 | + assert_equal [comment1], article.comments.in_group(1) | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + should 'return comments that do not belongs to any group' do | ||
| 20 | + comment1 = fast_create(Comment, :group_id => 1, :source_id => article.id) | ||
| 21 | + comment2 = fast_create(Comment, :group_id => nil, :source_id => article.id) | ||
| 22 | + comment3 = fast_create(Comment, :group_id => 2, :source_id => article.id) | ||
| 23 | + assert_equal [comment2], article.comments.without_group | ||
| 24 | + end | ||
| 25 | + | ||
| 26 | +end |
plugins/comment_group/views/_comment_group.rhtml
| @@ -20,7 +20,13 @@ | @@ -20,7 +20,13 @@ | ||
| 20 | <div class="comment-group-loading-<%= group_id %>"/> | 20 | <div class="comment-group-loading-<%= group_id %>"/> |
| 21 | 21 | ||
| 22 | <div class="comments_list_toggle_group_<%= group_id %>" style="display:none"> | 22 | <div class="comments_list_toggle_group_<%= group_id %>" style="display:none"> |
| 23 | - <div class="article-comments-list" id="comments_list_group_<%= group_id %>"></div> | ||
| 24 | - <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> | 23 | + <div class="article-comments-list" id="comments_list_group_<%= group_id %>"> |
| 24 | + </div> | ||
| 25 | + <div class ="article-comments-list-more" id="comments_list_group_<%= group_id %>_more"> | ||
| 26 | + </div> | ||
| 27 | + <div id="page-comment-form-<%= group_id %>" class='post_comment_box closed'> | ||
| 28 | + <%= render :partial => 'comment/comment_form', :locals => {:comment => Comment.new, :display_link => true, :cancel_triggers_hide => true, :group_id => group_id}%> | ||
| 29 | + </div> | ||
| 30 | + | ||
| 25 | </div> | 31 | </div> |
| 26 | </div> | 32 | </div> |
plugins/comment_group/views/comment_group_plugin_profile/view_comments.rjs
0 → 100644
| @@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
| 1 | +if @group_comment_page == 1 | ||
| 2 | + page.replace_html "comments_list_group_#{@group_id}", :partial => 'comment/comment.rhtml', :collection => @comments | ||
| 3 | +else | ||
| 4 | + page.insert_html :bottom, "comments_list_group_#{@group_id}", :partial => 'comment/comment.rhtml', :collection => @comments | ||
| 5 | +end | ||
| 6 | +page.replace_html "comment-count-#{@group_id}", @comments_count | ||
| 7 | + | ||
| 8 | +if @no_more_pages | ||
| 9 | + page.replace_html "comments_list_group_#{@group_id}_more", "" | ||
| 10 | +else | ||
| 11 | + page.replace_html "comments_list_group_#{@group_id}_more", link_to_remote(_('More'), :url => { :profile => profile.identifier, :controller => 'comment_group_plugin_profile', :action => 'view_comments', :group_id => @group_id, :article_id => @article_id, :group_comment_page => @group_comment_page + 1}, :loaded => visual_effect(:highlight, "comments_list_group_#{@group_id}"), :method => :post, :complete => "loadCompleted(#{@group_id})") | ||
| 12 | +end |
plugins/community_track/lib/community_track_plugin/step.rb
| @@ -7,7 +7,7 @@ class CommunityTrackPlugin::Step < Folder | @@ -7,7 +7,7 @@ class CommunityTrackPlugin::Step < Folder | ||
| 7 | acts_as_list :scope => :parent | 7 | acts_as_list :scope => :parent |
| 8 | 8 | ||
| 9 | def belong_to_track | 9 | def belong_to_track |
| 10 | - errors.add(:parent, "Step not allowed at this parent.") if !parent.kind_of?(CommunityTrackPlugin::Track) | 10 | + errors.add(:parent, _("Step not allowed at this parent.")) unless parent.kind_of?(CommunityTrackPlugin::Track) |
| 11 | end | 11 | end |
| 12 | 12 | ||
| 13 | validate :belong_to_track | 13 | validate :belong_to_track |
plugins/community_track/lib/community_track_plugin/track.rb
| @@ -49,8 +49,8 @@ class CommunityTrackPlugin::Track < Folder | @@ -49,8 +49,8 @@ class CommunityTrackPlugin::Track < Folder | ||
| 49 | "community-track-plugin-track" | 49 | "community-track-plugin-track" |
| 50 | end | 50 | end |
| 51 | 51 | ||
| 52 | - #FIXME make this test | ||
| 53 | def first_paragraph | 52 | def first_paragraph |
| 53 | + return '' if body.blank? | ||
| 54 | paragraphs = Hpricot(body).search('p') | 54 | paragraphs = Hpricot(body).search('p') |
| 55 | paragraphs.empty? ? '' : paragraphs.first.to_html | 55 | paragraphs.empty? ? '' : paragraphs.first.to_html |
| 56 | end | 56 | end |
604 Bytes
plugins/community_track/public/style.css
| @@ -193,3 +193,9 @@ | @@ -193,3 +193,9 @@ | ||
| 193 | .community-track textarea { | 193 | .community-track textarea { |
| 194 | width: 100%; | 194 | width: 100%; |
| 195 | } | 195 | } |
| 196 | + | ||
| 197 | +.formfield input#datepicker-from-date, | ||
| 198 | +.formfield input#datepicker-to-date { | ||
| 199 | + width: 115px; | ||
| 200 | + background: url(/plugins/community_track/icons/calendar.png) right center no-repeat; | ||
| 201 | +} |
plugins/community_track/test/unit/community_track_plugin/track_test.rb
| @@ -110,4 +110,18 @@ class TrackTest < ActiveSupport::TestCase | @@ -110,4 +110,18 @@ class TrackTest < ActiveSupport::TestCase | ||
| 110 | assert_equal [hidden_step], @track.hidden_steps | 110 | assert_equal [hidden_step], @track.hidden_steps |
| 111 | end | 111 | end |
| 112 | 112 | ||
| 113 | + should 'get first paragraph' do | ||
| 114 | + @track.body = '<p>First</p><p>Second</p>' | ||
| 115 | + assert_equal '<p>First</p>', @track.first_paragraph | ||
| 116 | + end | ||
| 117 | + | ||
| 118 | + should 'provide first_paragraph even if body was not given' do | ||
| 119 | + assert_equal '', @track.first_paragraph | ||
| 120 | + end | ||
| 121 | + | ||
| 122 | + should 'provide first_paragraph even if body is nil' do | ||
| 123 | + @track.body = nil | ||
| 124 | + assert_equal '', @track.first_paragraph | ||
| 125 | + end | ||
| 126 | + | ||
| 113 | end | 127 | end |
plugins/community_track/views/cms/community_track_plugin/_step.rhtml
| @@ -4,8 +4,14 @@ | @@ -4,8 +4,14 @@ | ||
| 4 | 4 | ||
| 5 | <div> | 5 | <div> |
| 6 | <%= required f.text_field('name', :size => '64', :maxlength => 150) %> | 6 | <%= required f.text_field('name', :size => '64', :maxlength => 150) %> |
| 7 | - <%= labelled_form_field(_('Start date'), pick_date(:article, :start_date)) %> | ||
| 8 | - <%= labelled_form_field(_('End date'), pick_date(:article, :end_date)) %> | 7 | + <%= labelled_form_field(_('Period'), ( |
| 8 | + date_range_field('article[start_date]', 'article[end_date]', @article.start_date, @article.end_date, | ||
| 9 | + '%Y-%m-%d', | ||
| 10 | + { :change_month => true, :change_year => true, | ||
| 11 | + :date_format => 'yy-mm-dd' }, | ||
| 12 | + { :size => 14 }) | ||
| 13 | + )) %> | ||
| 14 | + | ||
| 9 | </div> | 15 | </div> |
| 10 | 16 | ||
| 11 | <%= labelled_form_field check_box(:article, :hidden) + _('Hidden Step'), '' %> | 17 | <%= labelled_form_field check_box(:article, :hidden) + _('Hidden Step'), '' %> |
1.02 KB
public/designs/icons/tango/mod/scalable/actions/go-home-not.svg
0 → 100644
| @@ -0,0 +1,1112 @@ | @@ -0,0 +1,1112 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<svg | ||
| 3 | + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" | ||
| 4 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
| 5 | + xmlns:cc="http://creativecommons.org/ns#" | ||
| 6 | + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
| 7 | + xmlns:svg="http://www.w3.org/2000/svg" | ||
| 8 | + xmlns="http://www.w3.org/2000/svg" | ||
| 9 | + xmlns:xlink="http://www.w3.org/1999/xlink" | ||
| 10 | + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 11 | + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 12 | + width="48" | ||
| 13 | + height="48" | ||
| 14 | + overflow="visible" | ||
| 15 | + enable-background="new 0 0 128 129.396" | ||
| 16 | + xml:space="preserve" | ||
| 17 | + id="svg2" | ||
| 18 | + sodipodi:version="0.32" | ||
| 19 | + inkscape:version="0.48.1 r9760" | ||
| 20 | + sodipodi:docname="go-home-not.svg" | ||
| 21 | + version="1.0" | ||
| 22 | + inkscape:export-filename="/home/85902810515/projetos/noosfero/public/designs/icons/tango/mod/16x16/actions/go-home-not.png" | ||
| 23 | + inkscape:export-xdpi="30.01" | ||
| 24 | + inkscape:export-ydpi="30.01" | ||
| 25 | + inkscape:output_extension="org.inkscape.output.svg.inkscape" | ||
| 26 | + style="display:inline;overflow:visible"><metadata | ||
| 27 | + id="metadata367"><rdf:RDF><cc:Work | ||
| 28 | + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||
| 29 | + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license | ||
| 30 | + rdf:resource="http://creativecommons.org/licenses/publicdomain/" /><dc:title></dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:source>http://jimmac.musichall.cz</dc:source><dc:subject><rdf:Bag><rdf:li>home</rdf:li><rdf:li>return</rdf:li><rdf:li>go</rdf:li><rdf:li>default</rdf:li><rdf:li>user</rdf:li><rdf:li>directory</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Tuomas Kuosmanen</dc:title></cc:Agent></dc:contributor></cc:Work><cc:License | ||
| 31 | + rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits | ||
| 32 | + rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits | ||
| 33 | + rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits | ||
| 34 | + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata><defs | ||
| 35 | + id="defs365"><linearGradient | ||
| 36 | + id="linearGradient4711"><stop | ||
| 37 | + style="stop-color:#f87171;stop-opacity:1;" | ||
| 38 | + offset="0" | ||
| 39 | + id="stop4713" /><stop | ||
| 40 | + style="stop-color:#fb1f22;stop-opacity:1;" | ||
| 41 | + offset="1" | ||
| 42 | + id="stop4715" /></linearGradient><linearGradient | ||
| 43 | + id="linearGradient4700"><stop | ||
| 44 | + style="stop-color:#b20000;stop-opacity:1;" | ||
| 45 | + offset="0" | ||
| 46 | + id="stop4702" /><stop | ||
| 47 | + style="stop-color:#db0000;stop-opacity:1;" | ||
| 48 | + offset="1" | ||
| 49 | + id="stop4704" /></linearGradient><linearGradient | ||
| 50 | + id="linearGradient4694" | ||
| 51 | + osb:paint="solid"><stop | ||
| 52 | + style="stop-color:#2042e2;stop-opacity:1;" | ||
| 53 | + offset="0" | ||
| 54 | + id="stop4696" /></linearGradient><inkscape:perspective | ||
| 55 | + sodipodi:type="inkscape:persp3d" | ||
| 56 | + inkscape:vp_x="0 : 24 : 1" | ||
| 57 | + inkscape:vp_y="0 : 1000 : 0" | ||
| 58 | + inkscape:vp_z="48 : 24 : 1" | ||
| 59 | + inkscape:persp3d-origin="24 : 16 : 1" | ||
| 60 | + id="perspective92" /><radialGradient | ||
| 61 | + inkscape:collect="always" | ||
| 62 | + xlink:href="#linearGradient5060" | ||
| 63 | + id="radialGradient5031" | ||
| 64 | + gradientUnits="userSpaceOnUse" | ||
| 65 | + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" | ||
| 66 | + cx="605.71429" | ||
| 67 | + cy="486.64789" | ||
| 68 | + fx="605.71429" | ||
| 69 | + fy="486.64789" | ||
| 70 | + r="117.14286" /><linearGradient | ||
| 71 | + inkscape:collect="always" | ||
| 72 | + id="linearGradient5060"><stop | ||
| 73 | + style="stop-color:black;stop-opacity:1;" | ||
| 74 | + offset="0" | ||
| 75 | + id="stop5062" /><stop | ||
| 76 | + style="stop-color:black;stop-opacity:0;" | ||
| 77 | + offset="1" | ||
| 78 | + id="stop5064" /></linearGradient><radialGradient | ||
| 79 | + inkscape:collect="always" | ||
| 80 | + xlink:href="#linearGradient5060" | ||
| 81 | + id="radialGradient5029" | ||
| 82 | + gradientUnits="userSpaceOnUse" | ||
| 83 | + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" | ||
| 84 | + cx="605.71429" | ||
| 85 | + cy="486.64789" | ||
| 86 | + fx="605.71429" | ||
| 87 | + fy="486.64789" | ||
| 88 | + r="117.14286" /><linearGradient | ||
| 89 | + id="linearGradient5048"><stop | ||
| 90 | + style="stop-color:black;stop-opacity:0;" | ||
| 91 | + offset="0" | ||
| 92 | + id="stop5050" /><stop | ||
| 93 | + id="stop5056" | ||
| 94 | + offset="0.5" | ||
| 95 | + style="stop-color:black;stop-opacity:1;" /><stop | ||
| 96 | + style="stop-color:black;stop-opacity:0;" | ||
| 97 | + offset="1" | ||
| 98 | + id="stop5052" /></linearGradient><linearGradient | ||
| 99 | + inkscape:collect="always" | ||
| 100 | + xlink:href="#linearGradient5048" | ||
| 101 | + id="linearGradient5027" | ||
| 102 | + gradientUnits="userSpaceOnUse" | ||
| 103 | + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" | ||
| 104 | + x1="302.85715" | ||
| 105 | + y1="366.64789" | ||
| 106 | + x2="302.85715" | ||
| 107 | + y2="609.50507" /><linearGradient | ||
| 108 | + id="linearGradient2406"><stop | ||
| 109 | + style="stop-color:#7c7e79;stop-opacity:1;" | ||
| 110 | + offset="0" | ||
| 111 | + id="stop2408" /><stop | ||
| 112 | + id="stop2414" | ||
| 113 | + offset="0.1724138" | ||
| 114 | + style="stop-color:#848681;stop-opacity:1;" /><stop | ||
| 115 | + style="stop-color:#898c86;stop-opacity:1;" | ||
| 116 | + offset="1" | ||
| 117 | + id="stop2410" /></linearGradient><linearGradient | ||
| 118 | + inkscape:collect="always" | ||
| 119 | + id="linearGradient2390"><stop | ||
| 120 | + style="stop-color:#919191;stop-opacity:1;" | ||
| 121 | + offset="0" | ||
| 122 | + id="stop2392" /><stop | ||
| 123 | + style="stop-color:#919191;stop-opacity:0;" | ||
| 124 | + offset="1" | ||
| 125 | + id="stop2394" /></linearGradient><linearGradient | ||
| 126 | + inkscape:collect="always" | ||
| 127 | + id="linearGradient2378"><stop | ||
| 128 | + style="stop-color:#575757;stop-opacity:1;" | ||
| 129 | + offset="0" | ||
| 130 | + id="stop2380" /><stop | ||
| 131 | + style="stop-color:#575757;stop-opacity:0;" | ||
| 132 | + offset="1" | ||
| 133 | + id="stop2382" /></linearGradient><linearGradient | ||
| 134 | + inkscape:collect="always" | ||
| 135 | + id="linearGradient2368"><stop | ||
| 136 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 137 | + offset="0" | ||
| 138 | + id="stop2370" /><stop | ||
| 139 | + style="stop-color:#ffffff;stop-opacity:0;" | ||
| 140 | + offset="1" | ||
| 141 | + id="stop2372" /></linearGradient><linearGradient | ||
| 142 | + inkscape:collect="always" | ||
| 143 | + id="linearGradient2349"><stop | ||
| 144 | + style="stop-color:#000000;stop-opacity:1;" | ||
| 145 | + offset="0" | ||
| 146 | + id="stop2351" /><stop | ||
| 147 | + style="stop-color:#000000;stop-opacity:0;" | ||
| 148 | + offset="1" | ||
| 149 | + id="stop2353" /></linearGradient><linearGradient | ||
| 150 | + id="linearGradient2341"><stop | ||
| 151 | + id="stop2343" | ||
| 152 | + offset="0" | ||
| 153 | + style="stop-color:#000000;stop-opacity:1;" /><stop | ||
| 154 | + id="stop2345" | ||
| 155 | + offset="1" | ||
| 156 | + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient | ||
| 157 | + id="linearGradient2329"><stop | ||
| 158 | + style="stop-color:#000000;stop-opacity:0.18556701;" | ||
| 159 | + offset="0" | ||
| 160 | + id="stop2331" /><stop | ||
| 161 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 162 | + offset="1" | ||
| 163 | + id="stop2333" /></linearGradient><linearGradient | ||
| 164 | + inkscape:collect="always" | ||
| 165 | + id="linearGradient2319"><stop | ||
| 166 | + style="stop-color:#000000;stop-opacity:1;" | ||
| 167 | + offset="0" | ||
| 168 | + id="stop2321" /><stop | ||
| 169 | + style="stop-color:#000000;stop-opacity:0;" | ||
| 170 | + offset="1" | ||
| 171 | + id="stop2323" /></linearGradient><linearGradient | ||
| 172 | + id="linearGradient2307"><stop | ||
| 173 | + style="stop-color:#edd400;stop-opacity:1;" | ||
| 174 | + offset="0" | ||
| 175 | + id="stop2309" /><stop | ||
| 176 | + style="stop-color:#998800;stop-opacity:1;" | ||
| 177 | + offset="1" | ||
| 178 | + id="stop2311" /></linearGradient><linearGradient | ||
| 179 | + inkscape:collect="always" | ||
| 180 | + id="linearGradient2299"><stop | ||
| 181 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 182 | + offset="0" | ||
| 183 | + id="stop2301" /><stop | ||
| 184 | + style="stop-color:#ffffff;stop-opacity:0;" | ||
| 185 | + offset="1" | ||
| 186 | + id="stop2303" /></linearGradient><linearGradient | ||
| 187 | + id="XMLID_2_" | ||
| 188 | + gradientUnits="userSpaceOnUse" | ||
| 189 | + x1="80.223602" | ||
| 190 | + y1="117.5205" | ||
| 191 | + x2="48.046001" | ||
| 192 | + y2="59.7995" | ||
| 193 | + gradientTransform="matrix(0.314683,0,0,0.314683,4.128264,3.742874)"> | ||
| 194 | + <stop | ||
| 195 | + offset="0" | ||
| 196 | + style="stop-color:#CCCCCC" | ||
| 197 | + id="stop17" /> | ||
| 198 | + <stop | ||
| 199 | + offset="0.9831" | ||
| 200 | + style="stop-color:#FFFFFF" | ||
| 201 | + id="stop19" /> | ||
| 202 | + <midPointStop | ||
| 203 | + offset="0" | ||
| 204 | + style="stop-color:#CCCCCC" | ||
| 205 | + id="midPointStop48" /> | ||
| 206 | + <midPointStop | ||
| 207 | + offset="0.5" | ||
| 208 | + style="stop-color:#CCCCCC" | ||
| 209 | + id="midPointStop50" /> | ||
| 210 | + <midPointStop | ||
| 211 | + offset="0.9831" | ||
| 212 | + style="stop-color:#FFFFFF" | ||
| 213 | + id="midPointStop52" /> | ||
| 214 | + </linearGradient><linearGradient | ||
| 215 | + inkscape:collect="always" | ||
| 216 | + xlink:href="#XMLID_2_" | ||
| 217 | + id="linearGradient1514" | ||
| 218 | + gradientUnits="userSpaceOnUse" | ||
| 219 | + gradientTransform="matrix(0.336922,0,0,0.166888,17.98288,15.46151)" | ||
| 220 | + x1="52.006104" | ||
| 221 | + y1="166.1331" | ||
| 222 | + x2="14.049017" | ||
| 223 | + y2="-42.218513" /><linearGradient | ||
| 224 | + id="XMLID_39_" | ||
| 225 | + gradientUnits="userSpaceOnUse" | ||
| 226 | + x1="64.387703" | ||
| 227 | + y1="65.124001" | ||
| 228 | + x2="64.387703" | ||
| 229 | + y2="35.569" | ||
| 230 | + gradientTransform="matrix(0.354101,0,0,0.354101,1.638679,-0.08364921)"> | ||
| 231 | + <stop | ||
| 232 | + offset="0" | ||
| 233 | + style="stop-color:#FFFFFF" | ||
| 234 | + id="stop336" /> | ||
| 235 | + <stop | ||
| 236 | + offset="0.8539" | ||
| 237 | + style="stop-color:#FF6200" | ||
| 238 | + id="stop338" /> | ||
| 239 | + <stop | ||
| 240 | + offset="1" | ||
| 241 | + style="stop-color:#F25D00" | ||
| 242 | + id="stop340" /> | ||
| 243 | + <midPointStop | ||
| 244 | + offset="0" | ||
| 245 | + style="stop-color:#FFFFFF" | ||
| 246 | + id="midPointStop335" /> | ||
| 247 | + <midPointStop | ||
| 248 | + offset="0.5" | ||
| 249 | + style="stop-color:#FFFFFF" | ||
| 250 | + id="midPointStop337" /> | ||
| 251 | + <midPointStop | ||
| 252 | + offset="0.8539" | ||
| 253 | + style="stop-color:#FF6200" | ||
| 254 | + id="midPointStop339" /> | ||
| 255 | + <midPointStop | ||
| 256 | + offset="0.5" | ||
| 257 | + style="stop-color:#FF6200" | ||
| 258 | + id="midPointStop341" /> | ||
| 259 | + <midPointStop | ||
| 260 | + offset="1" | ||
| 261 | + style="stop-color:#F25D00" | ||
| 262 | + id="midPointStop343" /> | ||
| 263 | + </linearGradient><radialGradient | ||
| 264 | + inkscape:collect="always" | ||
| 265 | + xlink:href="#linearGradient2299" | ||
| 266 | + id="radialGradient2305" | ||
| 267 | + cx="7.5326638" | ||
| 268 | + cy="24.202574" | ||
| 269 | + fx="7.5326638" | ||
| 270 | + fy="24.202574" | ||
| 271 | + r="8.2452126" | ||
| 272 | + gradientTransform="matrix(4.100086,0,0,4.201322,-25.41506,-78.53967)" | ||
| 273 | + gradientUnits="userSpaceOnUse" /><radialGradient | ||
| 274 | + inkscape:collect="always" | ||
| 275 | + xlink:href="#linearGradient2307" | ||
| 276 | + id="radialGradient2313" | ||
| 277 | + cx="19.985598" | ||
| 278 | + cy="36.77816" | ||
| 279 | + fx="19.985598" | ||
| 280 | + fy="36.77816" | ||
| 281 | + r="1.0821035" | ||
| 282 | + gradientTransform="matrix(1.125263,0,0,0.982744,-3.428678,0.565787)" | ||
| 283 | + gradientUnits="userSpaceOnUse" /><radialGradient | ||
| 284 | + inkscape:collect="always" | ||
| 285 | + xlink:href="#linearGradient2319" | ||
| 286 | + id="radialGradient2325" | ||
| 287 | + cx="20.443665" | ||
| 288 | + cy="37.425831" | ||
| 289 | + fx="20.443665" | ||
| 290 | + fy="37.425831" | ||
| 291 | + r="1.0821035" | ||
| 292 | + gradientTransform="matrix(1.125263,0,0,0.982744,-3.428678,0.731106)" | ||
| 293 | + gradientUnits="userSpaceOnUse" /><linearGradient | ||
| 294 | + inkscape:collect="always" | ||
| 295 | + xlink:href="#linearGradient2329" | ||
| 296 | + id="linearGradient2335" | ||
| 297 | + x1="17.602522" | ||
| 298 | + y1="26.057423" | ||
| 299 | + x2="17.682528" | ||
| 300 | + y2="32.654099" | ||
| 301 | + gradientUnits="userSpaceOnUse" | ||
| 302 | + gradientTransform="matrix(0.898789,0,0,1.071914,0.478025,-2.080838)" /><radialGradient | ||
| 303 | + inkscape:collect="always" | ||
| 304 | + xlink:href="#linearGradient2341" | ||
| 305 | + id="radialGradient2339" | ||
| 306 | + gradientUnits="userSpaceOnUse" | ||
| 307 | + gradientTransform="matrix(4.100086,0,0,-4.201322,-5.198109,105.3535)" | ||
| 308 | + cx="11.68129" | ||
| 309 | + cy="19.554111" | ||
| 310 | + fx="11.68129" | ||
| 311 | + fy="19.554111" | ||
| 312 | + r="8.2452126" /><radialGradient | ||
| 313 | + inkscape:collect="always" | ||
| 314 | + xlink:href="#linearGradient2349" | ||
| 315 | + id="radialGradient2355" | ||
| 316 | + cx="24.023088" | ||
| 317 | + cy="40.56913" | ||
| 318 | + fx="24.023088" | ||
| 319 | + fy="40.56913" | ||
| 320 | + r="16.28684" | ||
| 321 | + gradientTransform="matrix(1,0,0,0.43125,0,23.07369)" | ||
| 322 | + gradientUnits="userSpaceOnUse" /><radialGradient | ||
| 323 | + inkscape:collect="always" | ||
| 324 | + xlink:href="#linearGradient2368" | ||
| 325 | + id="radialGradient2374" | ||
| 326 | + cx="29.913452" | ||
| 327 | + cy="30.442923" | ||
| 328 | + fx="29.913452" | ||
| 329 | + fy="30.442923" | ||
| 330 | + r="4.001883" | ||
| 331 | + gradientTransform="matrix(3.751495,0,0,3.147818,-82.00907,-65.70704)" | ||
| 332 | + gradientUnits="userSpaceOnUse" /><radialGradient | ||
| 333 | + inkscape:collect="always" | ||
| 334 | + xlink:href="#linearGradient2378" | ||
| 335 | + id="radialGradient2384" | ||
| 336 | + cx="24.195112" | ||
| 337 | + cy="10.577631" | ||
| 338 | + fx="24.195112" | ||
| 339 | + fy="10.577631" | ||
| 340 | + r="15.242914" | ||
| 341 | + gradientTransform="matrix(1.125263,-3.585417e-8,4.269819e-8,1.340059,-3.006704,1.355395)" | ||
| 342 | + gradientUnits="userSpaceOnUse" /><linearGradient | ||
| 343 | + inkscape:collect="always" | ||
| 344 | + xlink:href="#linearGradient2390" | ||
| 345 | + id="linearGradient2396" | ||
| 346 | + x1="30.603519" | ||
| 347 | + y1="37.337803" | ||
| 348 | + x2="30.603519" | ||
| 349 | + y2="36.112415" | ||
| 350 | + gradientUnits="userSpaceOnUse" | ||
| 351 | + gradientTransform="matrix(1.263867,0,0,0.859794,-6.499556,8.390924)" /><linearGradient | ||
| 352 | + inkscape:collect="always" | ||
| 353 | + xlink:href="#linearGradient2406" | ||
| 354 | + id="linearGradient2412" | ||
| 355 | + x1="17.850183" | ||
| 356 | + y1="28.939463" | ||
| 357 | + x2="19.040216" | ||
| 358 | + y2="41.03223" | ||
| 359 | + gradientUnits="userSpaceOnUse" | ||
| 360 | + gradientTransform="matrix(0.888785,0,0,1.08932,2.41099,-1.524336)" /><radialGradient | ||
| 361 | + inkscape:collect="always" | ||
| 362 | + xlink:href="#linearGradient9647" | ||
| 363 | + id="radialGradient2239" | ||
| 364 | + cx="24.30225" | ||
| 365 | + cy="33.30225" | ||
| 366 | + fx="24.30225" | ||
| 367 | + fy="33.30225" | ||
| 368 | + r="12.30225" | ||
| 369 | + gradientUnits="userSpaceOnUse" | ||
| 370 | + gradientTransform="matrix(1.693981,0,0,1.693981,-16.86529,-25.11111)" /><linearGradient | ||
| 371 | + id="linearGradient9647"><stop | ||
| 372 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 373 | + offset="0" | ||
| 374 | + id="stop9649" /><stop | ||
| 375 | + style="stop-color:#dbdbdb;stop-opacity:1;" | ||
| 376 | + offset="1" | ||
| 377 | + id="stop9651" /></linearGradient><linearGradient | ||
| 378 | + inkscape:collect="always" | ||
| 379 | + xlink:href="#linearGradient2256" | ||
| 380 | + id="linearGradient2262" | ||
| 381 | + x1="21.75" | ||
| 382 | + y1="15.80225" | ||
| 383 | + x2="24.30225" | ||
| 384 | + y2="35.05225" | ||
| 385 | + gradientUnits="userSpaceOnUse" | ||
| 386 | + gradientTransform="translate(0,-2)" /><linearGradient | ||
| 387 | + id="linearGradient2256"><stop | ||
| 388 | + style="stop-color:#ff0202;stop-opacity:1;" | ||
| 389 | + offset="0" | ||
| 390 | + id="stop2258" /><stop | ||
| 391 | + style="stop-color:#ff9b9b;stop-opacity:1;" | ||
| 392 | + offset="1" | ||
| 393 | + id="stop2260" /></linearGradient><radialGradient | ||
| 394 | + r="12.30225" | ||
| 395 | + fy="33.30225" | ||
| 396 | + fx="24.30225" | ||
| 397 | + cy="33.30225" | ||
| 398 | + cx="24.30225" | ||
| 399 | + gradientTransform="matrix(1.693981,0,0,1.693981,-5.6354248,-11.964506)" | ||
| 400 | + gradientUnits="userSpaceOnUse" | ||
| 401 | + id="radialGradient3047" | ||
| 402 | + xlink:href="#linearGradient9647" | ||
| 403 | + inkscape:collect="always" /><linearGradient | ||
| 404 | + y2="35.05225" | ||
| 405 | + x2="24.30225" | ||
| 406 | + y1="15.80225" | ||
| 407 | + x1="21.75" | ||
| 408 | + gradientTransform="translate(11.229865,11.146604)" | ||
| 409 | + gradientUnits="userSpaceOnUse" | ||
| 410 | + id="linearGradient3049" | ||
| 411 | + xlink:href="#linearGradient2256" | ||
| 412 | + inkscape:collect="always" /><radialGradient | ||
| 413 | + inkscape:collect="always" | ||
| 414 | + xlink:href="#linearGradient21644" | ||
| 415 | + id="radialGradient21650" | ||
| 416 | + cx="25.125" | ||
| 417 | + cy="36.75" | ||
| 418 | + fx="25.125" | ||
| 419 | + fy="36.75" | ||
| 420 | + r="15.75" | ||
| 421 | + gradientTransform="matrix(1,0,0,0.595238,0,14.875)" | ||
| 422 | + gradientUnits="userSpaceOnUse" /><linearGradient | ||
| 423 | + inkscape:collect="always" | ||
| 424 | + id="linearGradient21644"><stop | ||
| 425 | + style="stop-color:#000000;stop-opacity:1;" | ||
| 426 | + offset="0" | ||
| 427 | + id="stop21646" /><stop | ||
| 428 | + style="stop-color:#000000;stop-opacity:0;" | ||
| 429 | + offset="1" | ||
| 430 | + id="stop21648" /></linearGradient><linearGradient | ||
| 431 | + inkscape:collect="always" | ||
| 432 | + xlink:href="#linearGradient4981" | ||
| 433 | + id="linearGradient4987" | ||
| 434 | + x1="23.995985" | ||
| 435 | + y1="20.105337" | ||
| 436 | + x2="41.047836" | ||
| 437 | + y2="37.959785" | ||
| 438 | + gradientUnits="userSpaceOnUse" | ||
| 439 | + gradientTransform="translate(23.026616,19.550612)" /><linearGradient | ||
| 440 | + id="linearGradient4981"><stop | ||
| 441 | + style="stop-color:#cc0000;stop-opacity:1;" | ||
| 442 | + offset="0" | ||
| 443 | + id="stop4983" /><stop | ||
| 444 | + style="stop-color:#b30000;stop-opacity:1.0000000;" | ||
| 445 | + offset="1.0000000" | ||
| 446 | + id="stop4985" /></linearGradient><linearGradient | ||
| 447 | + inkscape:collect="always" | ||
| 448 | + xlink:href="#linearGradient11780" | ||
| 449 | + id="linearGradient2057" | ||
| 450 | + x1="15.737001" | ||
| 451 | + y1="12.5036" | ||
| 452 | + x2="53.570126" | ||
| 453 | + y2="47.374317" | ||
| 454 | + gradientUnits="userSpaceOnUse" | ||
| 455 | + gradientTransform="translate(23.026616,19.550612)" /><linearGradient | ||
| 456 | + id="linearGradient11780"><stop | ||
| 457 | + style="stop-color:#ff8b8b;stop-opacity:1.0000000;" | ||
| 458 | + offset="0.0000000" | ||
| 459 | + id="stop11782" /><stop | ||
| 460 | + style="stop-color:#ec1b1b;stop-opacity:1.0000000;" | ||
| 461 | + offset="1.0000000" | ||
| 462 | + id="stop11784" /></linearGradient><radialGradient | ||
| 463 | + inkscape:collect="always" | ||
| 464 | + xlink:href="#linearGradient2248" | ||
| 465 | + id="radialGradient2254" | ||
| 466 | + cx="16.75" | ||
| 467 | + cy="10.666344" | ||
| 468 | + fx="16.75" | ||
| 469 | + fy="10.666344" | ||
| 470 | + r="21.25" | ||
| 471 | + gradientTransform="matrix(4.154957,0,0,3.198723,-29.818914,-1.9585976)" | ||
| 472 | + gradientUnits="userSpaceOnUse" /><linearGradient | ||
| 473 | + inkscape:collect="always" | ||
| 474 | + id="linearGradient2248"><stop | ||
| 475 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 476 | + offset="0" | ||
| 477 | + id="stop2250" /><stop | ||
| 478 | + style="stop-color:#ffffff;stop-opacity:0;" | ||
| 479 | + offset="1" | ||
| 480 | + id="stop2252" /></linearGradient><radialGradient | ||
| 481 | + inkscape:collect="always" | ||
| 482 | + xlink:href="#linearGradient9647-3" | ||
| 483 | + id="radialGradient2239-7" | ||
| 484 | + cx="24.30225" | ||
| 485 | + cy="33.30225" | ||
| 486 | + fx="24.30225" | ||
| 487 | + fy="33.30225" | ||
| 488 | + r="12.30225" | ||
| 489 | + gradientUnits="userSpaceOnUse" | ||
| 490 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" /><linearGradient | ||
| 491 | + id="linearGradient9647-3"><stop | ||
| 492 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 493 | + offset="0" | ||
| 494 | + id="stop9649-3" /><stop | ||
| 495 | + style="stop-color:#dbdbdb;stop-opacity:1;" | ||
| 496 | + offset="1" | ||
| 497 | + id="stop9651-2" /></linearGradient><linearGradient | ||
| 498 | + inkscape:collect="always" | ||
| 499 | + xlink:href="#linearGradient2256-0" | ||
| 500 | + id="linearGradient2262-5" | ||
| 501 | + x1="21.75" | ||
| 502 | + y1="15.80225" | ||
| 503 | + x2="24.30225" | ||
| 504 | + y2="35.05225" | ||
| 505 | + gradientUnits="userSpaceOnUse" | ||
| 506 | + gradientTransform="translate(23.026616,19.550612)" /><linearGradient | ||
| 507 | + id="linearGradient2256-0"><stop | ||
| 508 | + style="stop-color:#ff0202;stop-opacity:1;" | ||
| 509 | + offset="0" | ||
| 510 | + id="stop2258-2" /><stop | ||
| 511 | + style="stop-color:#ff9b9b;stop-opacity:1;" | ||
| 512 | + offset="1" | ||
| 513 | + id="stop2260-8" /></linearGradient><radialGradient | ||
| 514 | + r="15.75" | ||
| 515 | + fy="36.75" | ||
| 516 | + fx="25.125" | ||
| 517 | + cy="36.75" | ||
| 518 | + cx="25.125" | ||
| 519 | + gradientTransform="matrix(1,0,0,0.595238,0,14.875)" | ||
| 520 | + gradientUnits="userSpaceOnUse" | ||
| 521 | + id="radialGradient3090" | ||
| 522 | + xlink:href="#linearGradient21644" | ||
| 523 | + inkscape:collect="always" /><radialGradient | ||
| 524 | + inkscape:collect="always" | ||
| 525 | + xlink:href="#linearGradient21644" | ||
| 526 | + id="radialGradient3205" | ||
| 527 | + gradientUnits="userSpaceOnUse" | ||
| 528 | + gradientTransform="matrix(1,0,0,0.595238,0,14.875)" | ||
| 529 | + cx="25.125" | ||
| 530 | + cy="36.75" | ||
| 531 | + fx="25.125" | ||
| 532 | + fy="36.75" | ||
| 533 | + r="15.75" /><linearGradient | ||
| 534 | + inkscape:collect="always" | ||
| 535 | + xlink:href="#linearGradient4981" | ||
| 536 | + id="linearGradient3207" | ||
| 537 | + gradientUnits="userSpaceOnUse" | ||
| 538 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 539 | + x1="23.995985" | ||
| 540 | + y1="20.105337" | ||
| 541 | + x2="41.047836" | ||
| 542 | + y2="37.959785" /><linearGradient | ||
| 543 | + inkscape:collect="always" | ||
| 544 | + xlink:href="#linearGradient11780" | ||
| 545 | + id="linearGradient3209" | ||
| 546 | + gradientUnits="userSpaceOnUse" | ||
| 547 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 548 | + x1="15.737001" | ||
| 549 | + y1="12.5036" | ||
| 550 | + x2="53.570126" | ||
| 551 | + y2="47.374317" /><radialGradient | ||
| 552 | + inkscape:collect="always" | ||
| 553 | + xlink:href="#linearGradient2248" | ||
| 554 | + id="radialGradient3211" | ||
| 555 | + gradientUnits="userSpaceOnUse" | ||
| 556 | + gradientTransform="matrix(4.154957,0,0,3.198723,-29.818914,-1.9585976)" | ||
| 557 | + cx="16.75" | ||
| 558 | + cy="10.666344" | ||
| 559 | + fx="16.75" | ||
| 560 | + fy="10.666344" | ||
| 561 | + r="21.25" /><radialGradient | ||
| 562 | + inkscape:collect="always" | ||
| 563 | + xlink:href="#linearGradient9647-3" | ||
| 564 | + id="radialGradient3213" | ||
| 565 | + gradientUnits="userSpaceOnUse" | ||
| 566 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 567 | + cx="24.30225" | ||
| 568 | + cy="33.30225" | ||
| 569 | + fx="24.30225" | ||
| 570 | + fy="33.30225" | ||
| 571 | + r="12.30225" /><linearGradient | ||
| 572 | + inkscape:collect="always" | ||
| 573 | + xlink:href="#linearGradient2256-0" | ||
| 574 | + id="linearGradient3215" | ||
| 575 | + gradientUnits="userSpaceOnUse" | ||
| 576 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 577 | + x1="21.75" | ||
| 578 | + y1="15.80225" | ||
| 579 | + x2="24.30225" | ||
| 580 | + y2="35.05225" /><radialGradient | ||
| 581 | + inkscape:collect="always" | ||
| 582 | + xlink:href="#linearGradient21644" | ||
| 583 | + id="radialGradient3218" | ||
| 584 | + gradientUnits="userSpaceOnUse" | ||
| 585 | + gradientTransform="matrix(1.173803,0,0,0.3571428,17.76075,50.050612)" | ||
| 586 | + cx="25.125" | ||
| 587 | + cy="36.75" | ||
| 588 | + fx="25.125" | ||
| 589 | + fy="36.75" | ||
| 590 | + r="15.75" /><linearGradient | ||
| 591 | + inkscape:collect="always" | ||
| 592 | + xlink:href="#linearGradient4981" | ||
| 593 | + id="linearGradient3221" | ||
| 594 | + gradientUnits="userSpaceOnUse" | ||
| 595 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 596 | + x1="23.995985" | ||
| 597 | + y1="20.105337" | ||
| 598 | + x2="41.047836" | ||
| 599 | + y2="37.959785" /><linearGradient | ||
| 600 | + inkscape:collect="always" | ||
| 601 | + xlink:href="#linearGradient11780" | ||
| 602 | + id="linearGradient3224" | ||
| 603 | + gradientUnits="userSpaceOnUse" | ||
| 604 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 605 | + x1="15.737001" | ||
| 606 | + y1="12.5036" | ||
| 607 | + x2="53.570126" | ||
| 608 | + y2="47.374317" /><radialGradient | ||
| 609 | + inkscape:collect="always" | ||
| 610 | + xlink:href="#linearGradient2248" | ||
| 611 | + id="radialGradient3227" | ||
| 612 | + gradientUnits="userSpaceOnUse" | ||
| 613 | + gradientTransform="matrix(4.154957,0,0,3.198723,-29.818914,-1.9585976)" | ||
| 614 | + cx="16.75" | ||
| 615 | + cy="10.666344" | ||
| 616 | + fx="16.75" | ||
| 617 | + fy="10.666344" | ||
| 618 | + r="21.25" /><radialGradient | ||
| 619 | + inkscape:collect="always" | ||
| 620 | + xlink:href="#linearGradient9647-3" | ||
| 621 | + id="radialGradient3230" | ||
| 622 | + gradientUnits="userSpaceOnUse" | ||
| 623 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 624 | + cx="24.30225" | ||
| 625 | + cy="33.30225" | ||
| 626 | + fx="24.30225" | ||
| 627 | + fy="33.30225" | ||
| 628 | + r="12.30225" /><linearGradient | ||
| 629 | + inkscape:collect="always" | ||
| 630 | + xlink:href="#linearGradient2256-0" | ||
| 631 | + id="linearGradient3232" | ||
| 632 | + gradientUnits="userSpaceOnUse" | ||
| 633 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 634 | + x1="21.75" | ||
| 635 | + y1="15.80225" | ||
| 636 | + x2="24.30225" | ||
| 637 | + y2="35.05225" /><radialGradient | ||
| 638 | + inkscape:collect="always" | ||
| 639 | + xlink:href="#linearGradient21644-3" | ||
| 640 | + id="radialGradient3218-2" | ||
| 641 | + gradientUnits="userSpaceOnUse" | ||
| 642 | + gradientTransform="matrix(1.173803,0,0,0.3571428,17.76075,50.050612)" | ||
| 643 | + cx="25.125" | ||
| 644 | + cy="36.75" | ||
| 645 | + fx="25.125" | ||
| 646 | + fy="36.75" | ||
| 647 | + r="15.75" /><linearGradient | ||
| 648 | + inkscape:collect="always" | ||
| 649 | + id="linearGradient21644-3"><stop | ||
| 650 | + style="stop-color:#000000;stop-opacity:1;" | ||
| 651 | + offset="0" | ||
| 652 | + id="stop21646-9" /><stop | ||
| 653 | + style="stop-color:#000000;stop-opacity:0;" | ||
| 654 | + offset="1" | ||
| 655 | + id="stop21648-9" /></linearGradient><linearGradient | ||
| 656 | + inkscape:collect="always" | ||
| 657 | + xlink:href="#linearGradient4981-1" | ||
| 658 | + id="linearGradient3221-9" | ||
| 659 | + gradientUnits="userSpaceOnUse" | ||
| 660 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 661 | + x1="23.995985" | ||
| 662 | + y1="20.105337" | ||
| 663 | + x2="41.047836" | ||
| 664 | + y2="37.959785" /><linearGradient | ||
| 665 | + id="linearGradient4981-1"><stop | ||
| 666 | + style="stop-color:#cc0000;stop-opacity:1;" | ||
| 667 | + offset="0" | ||
| 668 | + id="stop4983-4" /><stop | ||
| 669 | + style="stop-color:#b30000;stop-opacity:1.0000000;" | ||
| 670 | + offset="1.0000000" | ||
| 671 | + id="stop4985-7" /></linearGradient><linearGradient | ||
| 672 | + inkscape:collect="always" | ||
| 673 | + xlink:href="#linearGradient11780-3" | ||
| 674 | + id="linearGradient3224-7" | ||
| 675 | + gradientUnits="userSpaceOnUse" | ||
| 676 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 677 | + x1="15.737001" | ||
| 678 | + y1="12.5036" | ||
| 679 | + x2="53.570126" | ||
| 680 | + y2="47.374317" /><linearGradient | ||
| 681 | + id="linearGradient11780-3"><stop | ||
| 682 | + style="stop-color:#ff8b8b;stop-opacity:1.0000000;" | ||
| 683 | + offset="0.0000000" | ||
| 684 | + id="stop11782-9" /><stop | ||
| 685 | + style="stop-color:#ec1b1b;stop-opacity:1.0000000;" | ||
| 686 | + offset="1.0000000" | ||
| 687 | + id="stop11784-6" /></linearGradient><radialGradient | ||
| 688 | + inkscape:collect="always" | ||
| 689 | + xlink:href="#linearGradient2248-9" | ||
| 690 | + id="radialGradient3227-6" | ||
| 691 | + gradientUnits="userSpaceOnUse" | ||
| 692 | + gradientTransform="matrix(4.154957,0,0,3.198723,-29.818914,-1.9585976)" | ||
| 693 | + cx="16.75" | ||
| 694 | + cy="10.666344" | ||
| 695 | + fx="16.75" | ||
| 696 | + fy="10.666344" | ||
| 697 | + r="21.25" /><linearGradient | ||
| 698 | + inkscape:collect="always" | ||
| 699 | + id="linearGradient2248-9"><stop | ||
| 700 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 701 | + offset="0" | ||
| 702 | + id="stop2250-3" /><stop | ||
| 703 | + style="stop-color:#ffffff;stop-opacity:0;" | ||
| 704 | + offset="1" | ||
| 705 | + id="stop2252-5" /></linearGradient><radialGradient | ||
| 706 | + inkscape:collect="always" | ||
| 707 | + xlink:href="#linearGradient9647-3-4" | ||
| 708 | + id="radialGradient3230-9" | ||
| 709 | + gradientUnits="userSpaceOnUse" | ||
| 710 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 711 | + cx="24.30225" | ||
| 712 | + cy="33.30225" | ||
| 713 | + fx="24.30225" | ||
| 714 | + fy="33.30225" | ||
| 715 | + r="12.30225" /><linearGradient | ||
| 716 | + id="linearGradient9647-3-4"><stop | ||
| 717 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 718 | + offset="0" | ||
| 719 | + id="stop9649-3-2" /><stop | ||
| 720 | + style="stop-color:#dbdbdb;stop-opacity:1;" | ||
| 721 | + offset="1" | ||
| 722 | + id="stop9651-2-0" /></linearGradient><linearGradient | ||
| 723 | + inkscape:collect="always" | ||
| 724 | + xlink:href="#linearGradient2256-0-0" | ||
| 725 | + id="linearGradient3232-1" | ||
| 726 | + gradientUnits="userSpaceOnUse" | ||
| 727 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 728 | + x1="21.75" | ||
| 729 | + y1="15.80225" | ||
| 730 | + x2="24.30225" | ||
| 731 | + y2="35.05225" /><linearGradient | ||
| 732 | + id="linearGradient2256-0-0"><stop | ||
| 733 | + style="stop-color:#ff0202;stop-opacity:1;" | ||
| 734 | + offset="0" | ||
| 735 | + id="stop2258-2-7" /><stop | ||
| 736 | + style="stop-color:#ff9b9b;stop-opacity:1;" | ||
| 737 | + offset="1" | ||
| 738 | + id="stop2260-8-0" /></linearGradient><radialGradient | ||
| 739 | + r="12.30225" | ||
| 740 | + fy="33.30225" | ||
| 741 | + fx="24.30225" | ||
| 742 | + cy="33.30225" | ||
| 743 | + cx="24.30225" | ||
| 744 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 745 | + gradientUnits="userSpaceOnUse" | ||
| 746 | + id="radialGradient3276" | ||
| 747 | + xlink:href="#linearGradient9647-3-4" | ||
| 748 | + inkscape:collect="always" /><linearGradient | ||
| 749 | + y2="35.05225" | ||
| 750 | + x2="24.30225" | ||
| 751 | + y1="15.80225" | ||
| 752 | + x1="21.75" | ||
| 753 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 754 | + gradientUnits="userSpaceOnUse" | ||
| 755 | + id="linearGradient3278" | ||
| 756 | + xlink:href="#linearGradient2256-0-0" | ||
| 757 | + inkscape:collect="always" /><radialGradient | ||
| 758 | + inkscape:collect="always" | ||
| 759 | + xlink:href="#linearGradient21644-3-0" | ||
| 760 | + id="radialGradient3218-2-4" | ||
| 761 | + gradientUnits="userSpaceOnUse" | ||
| 762 | + gradientTransform="matrix(1.173803,0,0,0.3571428,17.76075,50.050612)" | ||
| 763 | + cx="25.125" | ||
| 764 | + cy="36.75" | ||
| 765 | + fx="25.125" | ||
| 766 | + fy="36.75" | ||
| 767 | + r="15.75" /><linearGradient | ||
| 768 | + id="linearGradient21644-3-0"><stop | ||
| 769 | + style="stop-color:#000000;stop-opacity:1;" | ||
| 770 | + offset="0" | ||
| 771 | + id="stop21646-9-1" /><stop | ||
| 772 | + style="stop-color:#000000;stop-opacity:0;" | ||
| 773 | + offset="1" | ||
| 774 | + id="stop21648-9-8" /></linearGradient><linearGradient | ||
| 775 | + inkscape:collect="always" | ||
| 776 | + xlink:href="#linearGradient4981-1-6" | ||
| 777 | + id="linearGradient3221-9-6" | ||
| 778 | + gradientUnits="userSpaceOnUse" | ||
| 779 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 780 | + x1="23.995985" | ||
| 781 | + y1="20.105337" | ||
| 782 | + x2="41.047836" | ||
| 783 | + y2="37.959785" /><linearGradient | ||
| 784 | + id="linearGradient4981-1-6"><stop | ||
| 785 | + style="stop-color:#cc0000;stop-opacity:1;" | ||
| 786 | + offset="0" | ||
| 787 | + id="stop4983-4-0" /><stop | ||
| 788 | + style="stop-color:#b30000;stop-opacity:1.0000000;" | ||
| 789 | + offset="1.0000000" | ||
| 790 | + id="stop4985-7-7" /></linearGradient><linearGradient | ||
| 791 | + inkscape:collect="always" | ||
| 792 | + xlink:href="#linearGradient11780-3-5" | ||
| 793 | + id="linearGradient3224-7-4" | ||
| 794 | + gradientUnits="userSpaceOnUse" | ||
| 795 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 796 | + x1="15.737001" | ||
| 797 | + y1="12.5036" | ||
| 798 | + x2="53.570126" | ||
| 799 | + y2="47.374317" /><linearGradient | ||
| 800 | + id="linearGradient11780-3-5"><stop | ||
| 801 | + style="stop-color:#ff8b8b;stop-opacity:1.0000000;" | ||
| 802 | + offset="0.0000000" | ||
| 803 | + id="stop11782-9-4" /><stop | ||
| 804 | + style="stop-color:#ec1b1b;stop-opacity:1.0000000;" | ||
| 805 | + offset="1.0000000" | ||
| 806 | + id="stop11784-6-8" /></linearGradient><radialGradient | ||
| 807 | + inkscape:collect="always" | ||
| 808 | + xlink:href="#linearGradient2248-9-9" | ||
| 809 | + id="radialGradient3227-6-4" | ||
| 810 | + gradientUnits="userSpaceOnUse" | ||
| 811 | + gradientTransform="matrix(4.154957,0,0,3.198723,-29.818914,-1.9585976)" | ||
| 812 | + cx="16.75" | ||
| 813 | + cy="10.666344" | ||
| 814 | + fx="16.75" | ||
| 815 | + fy="10.666344" | ||
| 816 | + r="21.25" /><linearGradient | ||
| 817 | + inkscape:collect="always" | ||
| 818 | + id="linearGradient2248-9-9"><stop | ||
| 819 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 820 | + offset="0" | ||
| 821 | + id="stop2250-3-5" /><stop | ||
| 822 | + style="stop-color:#ffffff;stop-opacity:0;" | ||
| 823 | + offset="1" | ||
| 824 | + id="stop2252-5-3" /></linearGradient><radialGradient | ||
| 825 | + r="12.30225" | ||
| 826 | + fy="33.30225" | ||
| 827 | + fx="24.30225" | ||
| 828 | + cy="33.30225" | ||
| 829 | + cx="24.30225" | ||
| 830 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 831 | + gradientUnits="userSpaceOnUse" | ||
| 832 | + id="radialGradient3276-7" | ||
| 833 | + xlink:href="#linearGradient9647-3-4-6" | ||
| 834 | + inkscape:collect="always" /><linearGradient | ||
| 835 | + id="linearGradient9647-3-4-6"><stop | ||
| 836 | + style="stop-color:#ffffff;stop-opacity:1;" | ||
| 837 | + offset="0" | ||
| 838 | + id="stop9649-3-2-7" /><stop | ||
| 839 | + style="stop-color:#dbdbdb;stop-opacity:1;" | ||
| 840 | + offset="1" | ||
| 841 | + id="stop9651-2-0-1" /></linearGradient><linearGradient | ||
| 842 | + y2="35.05225" | ||
| 843 | + x2="24.30225" | ||
| 844 | + y1="15.80225" | ||
| 845 | + x1="21.75" | ||
| 846 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 847 | + gradientUnits="userSpaceOnUse" | ||
| 848 | + id="linearGradient3278-2" | ||
| 849 | + xlink:href="#linearGradient2256-0-0-1" | ||
| 850 | + inkscape:collect="always" /><linearGradient | ||
| 851 | + id="linearGradient2256-0-0-1"><stop | ||
| 852 | + style="stop-color:#ff0202;stop-opacity:1;" | ||
| 853 | + offset="0" | ||
| 854 | + id="stop2258-2-7-8" /><stop | ||
| 855 | + style="stop-color:#ff9b9b;stop-opacity:1;" | ||
| 856 | + offset="1" | ||
| 857 | + id="stop2260-8-0-4" /></linearGradient><radialGradient | ||
| 858 | + r="12.30225" | ||
| 859 | + fy="33.30225" | ||
| 860 | + fx="24.30225" | ||
| 861 | + cy="33.30225" | ||
| 862 | + cx="24.30225" | ||
| 863 | + gradientTransform="matrix(1.693981,0,0,1.693981,6.1613255,-3.5604976)" | ||
| 864 | + gradientUnits="userSpaceOnUse" | ||
| 865 | + id="radialGradient3812" | ||
| 866 | + xlink:href="#linearGradient9647-3-4-6" | ||
| 867 | + inkscape:collect="always" /><linearGradient | ||
| 868 | + y2="35.05225" | ||
| 869 | + x2="24.30225" | ||
| 870 | + y1="15.80225" | ||
| 871 | + x1="21.75" | ||
| 872 | + gradientTransform="translate(23.026616,19.550612)" | ||
| 873 | + gradientUnits="userSpaceOnUse" | ||
| 874 | + id="linearGradient3814" | ||
| 875 | + xlink:href="#linearGradient2256-0-0-1" | ||
| 876 | + inkscape:collect="always" /><radialGradient | ||
| 877 | + inkscape:collect="always" | ||
| 878 | + xlink:href="#linearGradient9647-3-4-6" | ||
| 879 | + id="radialGradient3886" | ||
| 880 | + gradientUnits="userSpaceOnUse" | ||
| 881 | + gradientTransform="matrix(0.85754753,0,0,0.85754753,16.064712,11.20392)" | ||
| 882 | + cx="24.30225" | ||
| 883 | + cy="33.30225" | ||
| 884 | + fx="24.30225" | ||
| 885 | + fy="33.30225" | ||
| 886 | + r="12.30225" /><linearGradient | ||
| 887 | + inkscape:collect="always" | ||
| 888 | + xlink:href="#linearGradient2256-0-0-1" | ||
| 889 | + id="linearGradient3888" | ||
| 890 | + gradientUnits="userSpaceOnUse" | ||
| 891 | + gradientTransform="matrix(0.50623208,0,0,0.50623208,24.602463,22.903505)" | ||
| 892 | + x1="21.75" | ||
| 893 | + y1="15.80225" | ||
| 894 | + x2="24.30225" | ||
| 895 | + y2="35.05225" /><radialGradient | ||
| 896 | + inkscape:collect="always" | ||
| 897 | + xlink:href="#linearGradient2248-9-9" | ||
| 898 | + id="radialGradient3891" | ||
| 899 | + gradientUnits="userSpaceOnUse" | ||
| 900 | + gradientTransform="matrix(2.1094827,0,0,1.5765366,-2.293898,12.776643)" | ||
| 901 | + cx="16.75" | ||
| 902 | + cy="10.666344" | ||
| 903 | + fx="16.75" | ||
| 904 | + fy="10.666344" | ||
| 905 | + r="21.25" /><linearGradient | ||
| 906 | + inkscape:collect="always" | ||
| 907 | + xlink:href="#linearGradient11780-3-5" | ||
| 908 | + id="linearGradient3894" | ||
| 909 | + gradientUnits="userSpaceOnUse" | ||
| 910 | + gradientTransform="matrix(0.50623208,0,0,0.50623208,24.602463,22.903505)" | ||
| 911 | + x1="15.737001" | ||
| 912 | + y1="12.5036" | ||
| 913 | + x2="53.570126" | ||
| 914 | + y2="47.374317" /><linearGradient | ||
| 915 | + inkscape:collect="always" | ||
| 916 | + xlink:href="#linearGradient4981-1-6" | ||
| 917 | + id="linearGradient3897" | ||
| 918 | + gradientUnits="userSpaceOnUse" | ||
| 919 | + gradientTransform="matrix(0.50623208,0,0,0.50623208,24.602463,22.903505)" | ||
| 920 | + x1="23.995985" | ||
| 921 | + y1="20.105337" | ||
| 922 | + x2="41.047836" | ||
| 923 | + y2="37.959785" /><radialGradient | ||
| 924 | + inkscape:collect="always" | ||
| 925 | + xlink:href="#linearGradient21644-3-0" | ||
| 926 | + id="radialGradient3900" | ||
| 927 | + gradientUnits="userSpaceOnUse" | ||
| 928 | + gradientTransform="matrix(0.75877044,0,0,0.21650012,17.801926,37.031146)" | ||
| 929 | + cx="25.125" | ||
| 930 | + cy="36.75" | ||
| 931 | + fx="25.125" | ||
| 932 | + fy="36.75" | ||
| 933 | + r="15.75" /><linearGradient | ||
| 934 | + inkscape:collect="always" | ||
| 935 | + xlink:href="#linearGradient4700" | ||
| 936 | + id="linearGradient4706" | ||
| 937 | + x1="42" | ||
| 938 | + y1="40.46875" | ||
| 939 | + x2="30.3125" | ||
| 940 | + y2="29.09375" | ||
| 941 | + gradientUnits="userSpaceOnUse" /><linearGradient | ||
| 942 | + inkscape:collect="always" | ||
| 943 | + xlink:href="#linearGradient4711" | ||
| 944 | + id="linearGradient4717" | ||
| 945 | + x1="29.3125" | ||
| 946 | + y1="28.25" | ||
| 947 | + x2="44.125" | ||
| 948 | + y2="42.5625" | ||
| 949 | + gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview | ||
| 950 | + inkscape:cy="18.229536" | ||
| 951 | + inkscape:cx="35.718843" | ||
| 952 | + inkscape:zoom="8" | ||
| 953 | + inkscape:window-height="827" | ||
| 954 | + inkscape:window-width="1440" | ||
| 955 | + inkscape:pageshadow="2" | ||
| 956 | + inkscape:pageopacity="0.0" | ||
| 957 | + borderopacity="0.21568627" | ||
| 958 | + bordercolor="#666666" | ||
| 959 | + pagecolor="#ffffff" | ||
| 960 | + id="base" | ||
| 961 | + inkscape:showpageshadow="false" | ||
| 962 | + inkscape:window-x="0" | ||
| 963 | + inkscape:window-y="0" | ||
| 964 | + inkscape:current-layer="layer3" | ||
| 965 | + fill="#555753" | ||
| 966 | + showgrid="false" | ||
| 967 | + stroke="#a40000" | ||
| 968 | + showguides="true" | ||
| 969 | + inkscape:guide-bbox="true" | ||
| 970 | + inkscape:window-maximized="1" /> | ||
| 971 | + | ||
| 972 | +<g | ||
| 973 | + inkscape:groupmode="layer" | ||
| 974 | + id="layer1" | ||
| 975 | + inkscape:label="Home" | ||
| 976 | + style="display:inline" | ||
| 977 | + sodipodi:insensitive="true"><g | ||
| 978 | + style="display:inline;overflow:visible" | ||
| 979 | + id="g3710"><g | ||
| 980 | + transform="matrix(0.02158196,0,0,0.01859457,43.12251,41.63767)" | ||
| 981 | + id="g5022" | ||
| 982 | + style="display:inline"><rect | ||
| 983 | + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | ||
| 984 | + id="rect4173" | ||
| 985 | + width="1339.6335" | ||
| 986 | + height="478.35718" | ||
| 987 | + x="-1559.2523" | ||
| 988 | + y="-150.69685" /><path | ||
| 989 | + inkscape:connector-curvature="0" | ||
| 990 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | ||
| 991 | + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" | ||
| 992 | + id="path5058" | ||
| 993 | + sodipodi:nodetypes="cccc" /><path | ||
| 994 | + inkscape:connector-curvature="0" | ||
| 995 | + sodipodi:nodetypes="cccc" | ||
| 996 | + id="path5018" | ||
| 997 | + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" | ||
| 998 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><path | ||
| 999 | + inkscape:connector-curvature="0" | ||
| 1000 | + sodipodi:nodetypes="ccccccccc" | ||
| 1001 | + id="rect1512" | ||
| 1002 | + d="m 21.619576,8.1833733 5.957459,0 c 0.839732,0 13.886475,15.4353277 13.886475,16.3406587 l -0.443521,18.496745 c 0,0.905333 -0.67603,1.634177 -1.515762,1.634177 l -31.4572774,0 c -0.8397329,0 -1.5157625,-0.728844 -1.5157625,-1.634177 l 0.056478,-18.496745 c 0,-0.905331 14.1921789,-16.3406587 15.0319109,-16.3406587 z" | ||
| 1003 | + style="color:#000000;fill:url(#linearGradient1514);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.0000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><path | ||
| 1004 | + inkscape:connector-curvature="0" | ||
| 1005 | + d="m 46.963575,45.735573 -45.3248988,0 0,-45.32489746 45.3248988,0 0,45.32489746 z" | ||
| 1006 | + id="path5" | ||
| 1007 | + style="fill:none" /><path | ||
| 1008 | + inkscape:connector-curvature="0" | ||
| 1009 | + sodipodi:nodetypes="ccccc" | ||
| 1010 | + clip-rule="evenodd" | ||
| 1011 | + d="m 23,29 -0.04574,15.090942 -11.842791,0 L 11,29 23,29 z" | ||
| 1012 | + id="path2327" | ||
| 1013 | + style="fill:url(#linearGradient2335);fill-opacity:1;fill-rule:evenodd" /><path | ||
| 1014 | + inkscape:connector-curvature="0" | ||
| 1015 | + style="opacity:0.3125;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | ||
| 1016 | + d="m 21.780459,9.405584 5.559097,0 c 0.783582,0 13.000869,14.399588 13.000869,15.244172 l -0.347158,18.212311 c 0,0.459259 -0.143737,0.653465 -0.512375,0.653465 l -31.3872026,0.01428 c -0.3686377,0 -0.5839636,-0.07992 -0.5839636,-0.45355 L 7.7250676,24.649756 c 0,-0.844584 13.2718124,-15.244172 14.0553914,-15.244172 z" | ||
| 1017 | + id="path2357" | ||
| 1018 | + sodipodi:nodetypes="ccccccccc" /><path | ||
| 1019 | + inkscape:connector-curvature="0" | ||
| 1020 | + sodipodi:nodetypes="ccccccc" | ||
| 1021 | + style="opacity:0.2;fill:url(#radialGradient2384);fill-opacity:1;fill-rule:evenodd" | ||
| 1022 | + id="path23" | ||
| 1023 | + d="M 7.2075295,27.943053 7.1532728,30.538247 25.521437,17.358993 40.807832,28.513421 40.879142,28.201707 24.508686,12.297576 7.2075295,27.943053 z" | ||
| 1024 | + clip-rule="evenodd" /><path | ||
| 1025 | + inkscape:connector-curvature="0" | ||
| 1026 | + sodipodi:nodetypes="ccccc" | ||
| 1027 | + style="fill:url(#linearGradient2412);fill-opacity:1;fill-rule:evenodd" | ||
| 1028 | + id="path188" | ||
| 1029 | + d="m 22,30 0,14.090942 -9.811029,0 L 12,30 22,30 z" | ||
| 1030 | + clip-rule="evenodd" /><path | ||
| 1031 | + inkscape:connector-curvature="0" | ||
| 1032 | + clip-rule="evenodd" | ||
| 1033 | + d="m 19.576856,36.44767 c 0.67279,0 1.216616,0.474605 1.216616,1.058507 0,0.589811 -0.543826,1.068355 -1.216616,1.068355 -0.672272,0 -1.218686,-0.478544 -1.218686,-1.068355 5.15e-4,-0.583902 0.546414,-1.058507 1.218686,-1.058507 z" | ||
| 1034 | + id="path2315" | ||
| 1035 | + style="opacity:0.40909089;fill:url(#radialGradient2325);fill-opacity:1;fill-rule:evenodd" /><path | ||
| 1036 | + inkscape:connector-curvature="0" | ||
| 1037 | + style="fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd" | ||
| 1038 | + id="path217" | ||
| 1039 | + d="m 19.462314,35.932229 c 0.672789,0 1.216615,0.474605 1.216615,1.058507 0,0.589809 -0.543826,1.068353 -1.216615,1.068353 -0.672273,0 -1.218687,-0.478544 -1.218687,-1.068353 5.15e-4,-0.583902 0.546414,-1.058507 1.218687,-1.058507 z" | ||
| 1040 | + clip-rule="evenodd" /><path | ||
| 1041 | + inkscape:connector-curvature="0" | ||
| 1042 | + sodipodi:nodetypes="ccccccccccccc" | ||
| 1043 | + style="fill:url(#XMLID_39_)" | ||
| 1044 | + id="path342" | ||
| 1045 | + d="m 24.447748,11.559337 18.92706,17.169868 0.494679,0.391991 0.403676,-0.171385 -0.37287,-0.761673 L 43.622679,27.964702 24.447748,12.392396 5.0582327,28.135731 4.8206309,28.279851 4.603921,28.986637 5.0373408,29.115885 5.4218948,28.807462 24.447748,11.559337 z" /><path | ||
| 1046 | + inkscape:connector-curvature="0" | ||
| 1047 | + sodipodi:nodetypes="cccccccccc" | ||
| 1048 | + d="M 24.330168,2.2713382 2.4484294,20.372675 1.8237005,27.538603 3.8236367,29.602926 c 0,0 20.4073813,-17.157285 20.6240933,-17.327963 L 44.08027,29.818223 45.978694,27.494226 44.362903,20.382852 24.44773,2.1668788 24.330168,2.2713382 z" | ||
| 1049 | + id="path362" | ||
| 1050 | + style="fill:#ef2929;stroke:#a40000" /><path | ||
| 1051 | + inkscape:connector-curvature="0" | ||
| 1052 | + sodipodi:nodetypes="ccccc" | ||
| 1053 | + id="path1536" | ||
| 1054 | + d="M 2.8413446,20.613129 2.5497894,27.236494 24.369219,8.980075 24.298891,3.0867443 2.8413446,20.613129 z" | ||
| 1055 | + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient2305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path | ||
| 1056 | + inkscape:connector-curvature="0" | ||
| 1057 | + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient2339);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | ||
| 1058 | + d="M 24.483763,8.7509884 24.583223,2.9098867 43.912186,20.56184 45.403998,27.062652 24.483763,8.7509884 z" | ||
| 1059 | + id="path2337" | ||
| 1060 | + sodipodi:nodetypes="ccccc" /><path | ||
| 1061 | + inkscape:connector-curvature="0" | ||
| 1062 | + sodipodi:nodetypes="ccccccccc" | ||
| 1063 | + id="rect2361" | ||
| 1064 | + d="m 27.102228,27.719824 9.039995,0 c 0.770595,0 1.390967,0.62037 1.390967,1.390967 l -0.008,9.079221 c 0,0.770596 -0.596322,1.265969 -1.366918,1.265969 l -9.056083,0 c -0.770597,0 -1.390967,-0.620373 -1.390967,-1.390969 l 0,-8.954221 c 0,-0.770597 0.62037,-1.390967 1.390967,-1.390967 z" | ||
| 1065 | + style="opacity:0.31818183;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><rect | ||
| 1066 | + ry="0.38128215" | ||
| 1067 | + rx="0.38128215" | ||
| 1068 | + y="28.514256" | ||
| 1069 | + x="26.507767" | ||
| 1070 | + height="9.9624557" | ||
| 1071 | + width="10.001333" | ||
| 1072 | + id="rect3263" | ||
| 1073 | + style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><path | ||
| 1074 | + inkscape:connector-curvature="0" | ||
| 1075 | + sodipodi:nodetypes="ccccc" | ||
| 1076 | + id="rect2363" | ||
| 1077 | + d="m 27.107118,34.408261 c 3.617983,0.331177 5.527724,-1.445704 8.868152,-1.55274 L 36,29.00603 27.088388,29 l 0.01873,5.408261 z" | ||
| 1078 | + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient2374);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible" /></g></g><g | ||
| 1079 | + inkscape:groupmode="layer" | ||
| 1080 | + id="layer3" | ||
| 1081 | + inkscape:label="Cancel" | ||
| 1082 | + style="display:inline" | ||
| 1083 | + sodipodi:insensitive="true"><path | ||
| 1084 | + inkscape:connector-curvature="0" | ||
| 1085 | + id="path21642-1" | ||
| 1086 | + d="m 47.662816,44.987526 c -0.120652,1.646851 -3.213412,2.606775 -5.88153,3.03684 -4.362088,0.658404 -9.413,0.503003 -13.246573,-0.867841 -2.049624,-0.673315 -3.29125,-2.200566 -1.810314,-3.341428 2.178762,-1.659613 6.251742,-2.183438 9.862965,-2.236334 3.69133,-0.006 7.82464,0.471868 10.226986,2.081485 0.520681,0.38489 0.853108,0.849828 0.848466,1.327278 z" | ||
| 1087 | + style="opacity:0.63068183;color:#000000;fill:url(#radialGradient3900);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><rect | ||
| 1088 | + style="fill:url(#linearGradient4706);fill-opacity:1;fill-rule:nonzero;stroke:#850000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" | ||
| 1089 | + id="rect4692" | ||
| 1090 | + width="21.625" | ||
| 1091 | + height="21.9375" | ||
| 1092 | + x="25.9375" | ||
| 1093 | + y="24.0625" | ||
| 1094 | + rx="0.38128215" | ||
| 1095 | + ry="0.38128215" /><rect | ||
| 1096 | + style="fill:none;stroke:url(#linearGradient4717);stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline;overflow:visible" | ||
| 1097 | + id="rect4709" | ||
| 1098 | + width="20.875" | ||
| 1099 | + height="21" | ||
| 1100 | + x="26.3125" | ||
| 1101 | + y="24.5625" | ||
| 1102 | + rx="0.38128215" | ||
| 1103 | + ry="0.38128215" /><path | ||
| 1104 | + style="fill:#cc2e2e;fill-opacity:0.89138579;stroke:none;display:inline;overflow:visible" | ||
| 1105 | + d="m 26.4375,24.8125 20.625,0.125 L 47,39.4375 C 41.4375,36.625 39.859375,37.3125 37.195313,37.765625 35.025662,38.134656 32.65625,40.125 26.5,39.625 z" | ||
| 1106 | + id="rect4720" | ||
| 1107 | + inkscape:connector-curvature="0" | ||
| 1108 | + sodipodi:nodetypes="cccscc" /><path | ||
| 1109 | + inkscape:connector-curvature="0" | ||
| 1110 | + id="path2787-5" | ||
| 1111 | + d="m 33.090545,29.231406 c -0.720061,0.72006 -1.440121,1.44012 -2.160181,2.160181 1.271499,1.271499 2.542997,2.542997 3.814496,3.814497 -1.271499,1.271499 -2.542997,2.542997 -3.814496,3.814496 0.72006,0.720061 1.44012,1.440121 2.160181,2.160182 1.271499,-1.271499 2.542997,-2.542999 3.814496,-3.814498 1.271499,1.271499 2.542998,2.542999 3.814497,3.814498 0.72006,-0.720061 1.440121,-1.440121 2.160181,-2.160182 -1.271499,-1.271499 -2.542998,-2.542997 -3.814497,-3.814496 1.271499,-1.2715 2.542998,-2.542998 3.814497,-3.814497 -0.72006,-0.720061 -1.440121,-1.440121 -2.160181,-2.160181 -1.271499,1.271499 -2.542998,2.542998 -3.814497,3.814497 -1.271499,-1.271499 -2.542997,-2.542998 -3.814496,-3.814497 z" | ||
| 1112 | + style="fill:url(#radialGradient3886);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3888);stroke-width:0.50623184;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;overflow:visible" /></g></svg> | ||
| 0 | \ No newline at end of file | 1113 | \ No newline at end of file |
public/designs/icons/tango/style.css
| 1 | /******************SMALL ICONS********************/ | 1 | /******************SMALL ICONS********************/ |
| 2 | .icon-edit { background-image: url(Tango/16x16/apps/text-editor.png) } | 2 | .icon-edit { background-image: url(Tango/16x16/apps/text-editor.png) } |
| 3 | -.icon-home { background-image: url(Tango/16x16/actions/go-home.png) } | 3 | +.icon-home { background-image: url(Tango/16x16/actions/go-home.png) } |
| 4 | +.icon-home-not { background-image: url(mod/16x16/actions/go-home-not.png) } | ||
| 4 | .icon-new, | 5 | .icon-new, |
| 5 | .icon-suggest { background-image: url(Tango/16x16/actions/filenew.png) } | 6 | .icon-suggest { background-image: url(Tango/16x16/actions/filenew.png) } |
| 6 | .icon-close { background-image: url(Tango/16x16/actions/gtk-cancel.png) } | 7 | .icon-close { background-image: url(Tango/16x16/actions/gtk-cancel.png) } |
public/javascripts/application.js
| @@ -853,6 +853,12 @@ Array.min = function(array) { | @@ -853,6 +853,12 @@ Array.min = function(array) { | ||
| 853 | return Math.min.apply(Math, array); | 853 | return Math.min.apply(Math, array); |
| 854 | }; | 854 | }; |
| 855 | 855 | ||
| 856 | +function hideAndGetUrl(link) { | ||
| 857 | + link.hide(); | ||
| 858 | + url = jQuery(link).attr('href'); | ||
| 859 | + jQuery.get(url); | ||
| 860 | +} | ||
| 861 | + | ||
| 856 | jQuery(function($){ | 862 | jQuery(function($){ |
| 857 | $('.submit-with-keypress').live('keydown', function(e) { | 863 | $('.submit-with-keypress').live('keydown', function(e) { |
| 858 | field = this; | 864 | field = this; |
| @@ -875,12 +881,21 @@ jQuery(function($){ | @@ -875,12 +881,21 @@ jQuery(function($){ | ||
| 875 | } | 881 | } |
| 876 | }); | 882 | }); |
| 877 | 883 | ||
| 878 | - $('.view-all-comments').live('click', function(e) { | ||
| 879 | - var link = this; | ||
| 880 | - $(link).parent().find('.profile-wall-activities-comments').show(); | ||
| 881 | - $(link).hide(); | 884 | + $('#content').delegate( '.view-all-comments a', 'click', function(e) { |
| 885 | + hideAndGetUrl(this); | ||
| 882 | return false; | 886 | return false; |
| 887 | + }); | ||
| 888 | + | ||
| 889 | + $('#content').delegate('.view-more-replies a', 'click', function(e) { | ||
| 890 | + hideAndGetUrl(this); | ||
| 891 | + return false; | ||
| 883 | }); | 892 | }); |
| 893 | + | ||
| 894 | + $('#content').delegate('.view-more-comments a', 'click', function(e) { | ||
| 895 | + hideAndGetUrl(this); | ||
| 896 | + return false; | ||
| 897 | + }); | ||
| 898 | + | ||
| 884 | $('.focus-on-comment').live('click', function(e) { | 899 | $('.focus-on-comment').live('click', function(e) { |
| 885 | var link = this; | 900 | var link = this; |
| 886 | $(link).parents('.profile-activity-item').find('textarea').focus(); | 901 | $(link).parents('.profile-activity-item').find('textarea').focus(); |
public/stylesheets/application.css
| @@ -3137,7 +3137,7 @@ table.cms-articles a.icon { | @@ -3137,7 +3137,7 @@ table.cms-articles a.icon { | ||
| 3137 | text-overflow: ellipsis; | 3137 | text-overflow: ellipsis; |
| 3138 | } | 3138 | } |
| 3139 | 3139 | ||
| 3140 | -table.cms-articles a.icon, table.cms-articles a.icon-parent-folder { | 3140 | +table.cms-articles a.icon, table.cms-articles a.icon-parent-folder, .cms-homepage a.icon { |
| 3141 | padding: 0px 0px 3px 20px; | 3141 | padding: 0px 0px 3px 20px; |
| 3142 | background-repeat: no-repeat; | 3142 | background-repeat: no-repeat; |
| 3143 | } | 3143 | } |
| @@ -3156,6 +3156,14 @@ table.cms-articles .icon:hover { | @@ -3156,6 +3156,14 @@ table.cms-articles .icon:hover { | ||
| 3156 | border-right: 1px solid #ccc; | 3156 | border-right: 1px solid #ccc; |
| 3157 | } | 3157 | } |
| 3158 | 3158 | ||
| 3159 | +.cms-homepage a.icon { | ||
| 3160 | + border: none; | ||
| 3161 | +} | ||
| 3162 | + | ||
| 3163 | +.cms-homepage a:hover { | ||
| 3164 | + background-color: transparent; | ||
| 3165 | +} | ||
| 3166 | + | ||
| 3159 | .select-article-type { | 3167 | .select-article-type { |
| 3160 | padding: 5px 20px; | 3168 | padding: 5px 20px; |
| 3161 | width: 455px; | 3169 | width: 455px; |
| @@ -5705,6 +5713,10 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { | @@ -5705,6 +5713,10 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { | ||
| 5705 | padding-left: 20px; | 5713 | padding-left: 20px; |
| 5706 | } | 5714 | } |
| 5707 | 5715 | ||
| 5716 | +.view-more-comments, .view-more-replies { | ||
| 5717 | + text-align: center; | ||
| 5718 | +} | ||
| 5719 | + | ||
| 5708 | /* Profile activity relative dimensions */ | 5720 | /* Profile activity relative dimensions */ |
| 5709 | 5721 | ||
| 5710 | #leave_scrap { | 5722 | #leave_scrap { |
test/functional/cms_controller_test.rb
| @@ -109,6 +109,18 @@ class CmsControllerTest < ActionController::TestCase | @@ -109,6 +109,18 @@ class CmsControllerTest < ActionController::TestCase | ||
| 109 | assert_no_tag :tag => 'a', :content => 'Use as homepage', :attributes => { :href => "/myprofile/#{profile.identifier}/cms/set_home_page/#{folder.id}" } | 109 | assert_no_tag :tag => 'a', :content => 'Use as homepage', :attributes => { :href => "/myprofile/#{profile.identifier}/cms/set_home_page/#{folder.id}" } |
| 110 | end | 110 | end |
| 111 | 111 | ||
| 112 | + should 'display the profile homepage if can change homepage' do | ||
| 113 | + env = Environment.default; env.disable('cant_change_homepage') | ||
| 114 | + get :index, :profile => profile.identifier | ||
| 115 | + assert_tag :tag => 'div', :content => /Profile homepage/, :attributes => { :class => "cms-homepage"} | ||
| 116 | + end | ||
| 117 | + | ||
| 118 | + should 'not display the profile homepage if cannot change homepage' do | ||
| 119 | + env = Environment.default; env.enable('cant_change_homepage') | ||
| 120 | + get :index, :profile => profile.identifier | ||
| 121 | + assert_no_tag :tag => 'div', :content => /Profile homepage/, :attributes => { :class => "cms-homepage"} | ||
| 122 | + end | ||
| 123 | + | ||
| 112 | should 'be able to set home page' do | 124 | should 'be able to set home page' do |
| 113 | a = profile.articles.build(:name => 'my new home page') | 125 | a = profile.articles.build(:name => 'my new home page') |
| 114 | a.save! | 126 | a.save! |
| @@ -119,6 +131,7 @@ class CmsControllerTest < ActionController::TestCase | @@ -119,6 +131,7 @@ class CmsControllerTest < ActionController::TestCase | ||
| 119 | 131 | ||
| 120 | profile.reload | 132 | profile.reload |
| 121 | assert_equal a, profile.home_page | 133 | assert_equal a, profile.home_page |
| 134 | + assert_match /configured/, session[:notice] | ||
| 122 | end | 135 | end |
| 123 | 136 | ||
| 124 | should 'be able to set home page even when profile description is invalid' do | 137 | should 'be able to set home page even when profile description is invalid' do |
| @@ -154,6 +167,37 @@ class CmsControllerTest < ActionController::TestCase | @@ -154,6 +167,37 @@ class CmsControllerTest < ActionController::TestCase | ||
| 154 | assert_redirected_to profile.url | 167 | assert_redirected_to profile.url |
| 155 | end | 168 | end |
| 156 | 169 | ||
| 170 | + should 'be able to reset home page' do | ||
| 171 | + a = profile.articles.build(:name => 'my new home page') | ||
| 172 | + a.save! | ||
| 173 | + | ||
| 174 | + profile.home_page = a | ||
| 175 | + profile.save! | ||
| 176 | + | ||
| 177 | + post :set_home_page, :profile => profile.identifier, :id => nil | ||
| 178 | + | ||
| 179 | + profile.reload | ||
| 180 | + assert_equal nil, profile.home_page | ||
| 181 | + assert_match /reseted/, session[:notice] | ||
| 182 | + end | ||
| 183 | + | ||
| 184 | + should 'display default home page' do | ||
| 185 | + profile.home_page = nil | ||
| 186 | + profile.save! | ||
| 187 | + get :index, :profile => profile.identifier | ||
| 188 | + assert_tag :tag => 'div', :attributes => { :class => "cms-homepage" }, :descendant => { :tag => "span", :content => /Profile Information/ } | ||
| 189 | + end | ||
| 190 | + | ||
| 191 | + should 'display article as home page' do | ||
| 192 | + a = profile.articles.build(:name => 'my new home page') | ||
| 193 | + a.save! | ||
| 194 | + profile.home_page = a | ||
| 195 | + profile.save! | ||
| 196 | + Article.stubs(:short_description).returns('short description') | ||
| 197 | + get :index, :profile => profile.identifier | ||
| 198 | + assert_tag :tag => 'div', :attributes => { :class => "cms-homepage" }, :descendant => { :tag => "a", :content => /my new home page/ } | ||
| 199 | + end | ||
| 200 | + | ||
| 157 | should 'set last_changed_by when creating article' do | 201 | should 'set last_changed_by when creating article' do |
| 158 | login_as(profile.identifier) | 202 | login_as(profile.identifier) |
| 159 | 203 |
test/functional/profile_controller_test.rb
| @@ -734,7 +734,7 @@ class ProfileControllerTest < ActionController::TestCase | @@ -734,7 +734,7 @@ class ProfileControllerTest < ActionController::TestCase | ||
| 734 | end | 734 | end |
| 735 | 735 | ||
| 736 | should 'see the activities_items paginated' do | 736 | should 'see the activities_items paginated' do |
| 737 | - p1= Person.first | 737 | + p1 = create_user('some').person |
| 738 | ActionTracker::Record.destroy_all | 738 | ActionTracker::Record.destroy_all |
| 739 | 40.times{Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1))} | 739 | 40.times{Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1))} |
| 740 | login_as(p1.identifier) | 740 | login_as(p1.identifier) |
| @@ -1170,6 +1170,58 @@ class ProfileControllerTest < ActionController::TestCase | @@ -1170,6 +1170,58 @@ class ProfileControllerTest < ActionController::TestCase | ||
| 1170 | assert_redirected_to :controller => 'account', :action => 'login' | 1170 | assert_redirected_to :controller => 'account', :action => 'login' |
| 1171 | end | 1171 | end |
| 1172 | 1172 | ||
| 1173 | + should "not index display activities comments" do | ||
| 1174 | + login_as(profile.identifier) | ||
| 1175 | + article = TinyMceArticle.create!(:profile => profile, :name => 'An Article about Free Software') | ||
| 1176 | + ActionTracker::Record.destroy_all | ||
| 1177 | + activity = ActionTracker::Record.create!(:user_id => profile.id, :user_type => 'Profile', :verb => 'create_article', :target_id => article.id, :target_type => 'Article', :params => {'name' => article.name, 'url' => article.url, 'lead' => article.lead, 'first_image' => article.first_image}) | ||
| 1178 | + 20.times {comment = fast_create(Comment, :source_id => article, :title => 'a comment', :body => 'lalala', :created_at => Time.now)} | ||
| 1179 | + article.reload | ||
| 1180 | + get :index, :profile => profile.identifier | ||
| 1181 | + assert_tag 'ul', :attributes => {:class => 'profile-wall-activities-comments'}, :children => {:count => 0 } | ||
| 1182 | + end | ||
| 1183 | + | ||
| 1184 | + should "view more comments paginated" do | ||
| 1185 | + login_as(profile.identifier) | ||
| 1186 | + article = TinyMceArticle.create!(:profile => profile, :name => 'An Article about Free Software') | ||
| 1187 | + ActionTracker::Record.destroy_all | ||
| 1188 | + activity = ActionTracker::Record.create!(:user_id => profile.id, :user_type => 'Profile', :verb => 'create_article', :target_id => article.id, :target_type => 'Article', :params => {'name' => article.name, 'url' => article.url, 'lead' => article.lead, 'first_image' => article.first_image}) | ||
| 1189 | + 20.times {comment = fast_create(Comment, :source_id => article, :title => 'a comment', :body => 'lalala', :created_at => Time.now)} | ||
| 1190 | + article.reload | ||
| 1191 | + assert_equal 20, article.comments.count | ||
| 1192 | + get :more_comments, :activity => activity.id, :comment_page => 2 | ||
| 1193 | + assert_response :success | ||
| 1194 | + assert_template '_comment' | ||
| 1195 | + assert_select_rjs :insert_html do | ||
| 1196 | + assert_select 'li', 5 # 5 comments per page | ||
| 1197 | + end | ||
| 1198 | + end | ||
| 1199 | + | ||
| 1200 | + should "not index display scraps replies" do | ||
| 1201 | + login_as(profile.identifier) | ||
| 1202 | + Scrap.destroy_all | ||
| 1203 | + scrap = fast_create(Scrap, :sender_id => profile.id, :receiver_id => profile.id) | ||
| 1204 | + 20.times {fast_create(Scrap, :sender_id => profile.id, :receiver_id => profile.id, :scrap_id => scrap.id)} | ||
| 1205 | + profile.reload | ||
| 1206 | + get :index, :profile => profile.identifier | ||
| 1207 | + assert_tag 'ul', :attributes => {:class => 'profile-wall-activities-comments scrap-replies'}, :children => {:count => 0 } | ||
| 1208 | + end | ||
| 1209 | + | ||
| 1210 | + should "view more replies paginated" do | ||
| 1211 | + login_as(profile.identifier) | ||
| 1212 | + Scrap.destroy_all | ||
| 1213 | + scrap = fast_create(Scrap, :sender_id => profile.id, :receiver_id => profile.id) | ||
| 1214 | + 20.times {fast_create(Scrap, :sender_id => profile.id, :receiver_id => profile.id, :scrap_id => scrap.id)} | ||
| 1215 | + profile.reload | ||
| 1216 | + assert_equal 20, scrap.replies.count | ||
| 1217 | + get :more_replies, :activity => scrap.id, :comment_page => 2 | ||
| 1218 | + assert_response :success | ||
| 1219 | + assert_template '_profile_scrap' | ||
| 1220 | + assert_select_rjs :insert_html do | ||
| 1221 | + assert_select 'li', 5 # 5 replies per page | ||
| 1222 | + end | ||
| 1223 | + end | ||
| 1224 | + | ||
| 1173 | should 'render empty response for not logged in users in check_membership' do | 1225 | should 'render empty response for not logged in users in check_membership' do |
| 1174 | get :check_membership | 1226 | get :check_membership |
| 1175 | assert_equal '', @response.body | 1227 | assert_equal '', @response.body |
| @@ -1331,30 +1383,6 @@ class ProfileControllerTest < ActionController::TestCase | @@ -1331,30 +1383,6 @@ class ProfileControllerTest < ActionController::TestCase | ||
| 1331 | assert_equal "Comment successfully added.", assigns(:message) | 1383 | assert_equal "Comment successfully added.", assigns(:message) |
| 1332 | end | 1384 | end |
| 1333 | 1385 | ||
| 1334 | - should 'display comment in wall if user was removed' do | ||
| 1335 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | ||
| 1336 | - article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | ||
| 1337 | - to_be_removed = create_user('removed_user').person | ||
| 1338 | - comment = Comment.create!(:author => to_be_removed, :title => 'Test Comment', :body => 'My author does not exist =(', :source_id => article.id, :source_type => 'Article') | ||
| 1339 | - to_be_removed.destroy | ||
| 1340 | - | ||
| 1341 | - login_as(profile.identifier) | ||
| 1342 | - get :index, :profile => profile.identifier | ||
| 1343 | - | ||
| 1344 | - assert_tag :tag => 'span', :content => '(removed user)', :attributes => {:class => 'comment-user-status comment-user-status-wall icon-user-removed'} | ||
| 1345 | - end | ||
| 1346 | - | ||
| 1347 | - should 'display comment in wall from non logged users' do | ||
| 1348 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | ||
| 1349 | - article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | ||
| 1350 | - comment = Comment.create!(:name => 'outside user', :email => 'outside@localhost.localdomain', :title => 'Test Comment', :body => 'My author does not exist =(', :source_id => article.id, :source_type => 'Article') | ||
| 1351 | - | ||
| 1352 | - login_as(profile.identifier) | ||
| 1353 | - get :index, :profile => profile.identifier | ||
| 1354 | - | ||
| 1355 | - assert_tag :tag => 'span', :content => '(unauthenticated user)', :attributes => {:class => 'comment-user-status comment-user-status-wall icon-user-unknown'} | ||
| 1356 | - end | ||
| 1357 | - | ||
| 1358 | should 'add locale on mailing' do | 1386 | should 'add locale on mailing' do |
| 1359 | community = fast_create(Community) | 1387 | community = fast_create(Community) |
| 1360 | create_user_with_permission('profile_moderator_user', 'send_mail_to_members', community) | 1388 | create_user_with_permission('profile_moderator_user', 'send_mail_to_members', community) |
test/unit/application_helper_test.rb
| @@ -814,6 +814,32 @@ class ApplicationHelperTest < ActiveSupport::TestCase | @@ -814,6 +814,32 @@ class ApplicationHelperTest < ActiveSupport::TestCase | ||
| 814 | assert_no_match /Test1/, parsed_html | 814 | assert_no_match /Test1/, parsed_html |
| 815 | end | 815 | end |
| 816 | 816 | ||
| 817 | + should 'not convert macro if source is nil' do | ||
| 818 | + profile = create_user('testuser').person | ||
| 819 | + article = fast_create(Article, :profile_id => profile.id) | ||
| 820 | + class Plugin1 < Noosfero::Plugin; end | ||
| 821 | + | ||
| 822 | + environment = Environment.default | ||
| 823 | + environment.enable_plugin(Plugin1) | ||
| 824 | + @plugins = Noosfero::Plugin::Manager.new(environment, self) | ||
| 825 | + | ||
| 826 | + expects(:convert_macro).never | ||
| 827 | + filter_html(article.body, nil) | ||
| 828 | + end | ||
| 829 | + | ||
| 830 | + should 'not convert macro if there is no macro plugin active' do | ||
| 831 | + profile = create_user('testuser').person | ||
| 832 | + article = fast_create(Article, :profile_id => profile.id) | ||
| 833 | + class Plugin1 < Noosfero::Plugin; end | ||
| 834 | + | ||
| 835 | + environment = Environment.default | ||
| 836 | + environment.enable_plugin(Plugin1) | ||
| 837 | + @plugins = Noosfero::Plugin::Manager.new(environment, self) | ||
| 838 | + | ||
| 839 | + expects(:convert_macro).never | ||
| 840 | + filter_html(article.body, article) | ||
| 841 | + end | ||
| 842 | + | ||
| 817 | protected | 843 | protected |
| 818 | include NoosferoTestHelper | 844 | include NoosferoTestHelper |
| 819 | 845 |
test/unit/comment_test.rb
| @@ -285,22 +285,6 @@ class CommentTest < ActiveSupport::TestCase | @@ -285,22 +285,6 @@ class CommentTest < ActiveSupport::TestCase | ||
| 285 | assert_equal [c1,c3], c.reload.children | 285 | assert_equal [c1,c3], c.reload.children |
| 286 | end | 286 | end |
| 287 | 287 | ||
| 288 | - should "return activities comments as a thread" do | ||
| 289 | - person = fast_create(Person) | ||
| 290 | - a = TextileArticle.create!(:profile => person, :name => 'My article', :body => 'Article body') | ||
| 291 | - c0 = Comment.create!(:source => a, :body => 'My comment', :author => person) | ||
| 292 | - c1 = Comment.create!(:reply_of_id => c0.id, :source => a, :body => 'bla', :author => person) | ||
| 293 | - c2 = Comment.create!(:reply_of_id => c1.id, :source => a, :body => 'bla', :author => person) | ||
| 294 | - c3 = Comment.create!(:reply_of_id => c0.id, :source => a, :body => 'bla', :author => person) | ||
| 295 | - c4 = Comment.create!(:source => a, :body => 'My comment', :author => person) | ||
| 296 | - result = a.activity.comments_as_thread | ||
| 297 | - assert_equal c0, result[0] | ||
| 298 | - assert_equal [c1, c3], result[0].replies | ||
| 299 | - assert_equal [c2], result[0].replies[0].replies | ||
| 300 | - assert_equal c4, result[1] | ||
| 301 | - assert result[1].replies.empty? | ||
| 302 | - end | ||
| 303 | - | ||
| 304 | should 'provide author url for authenticated user' do | 288 | should 'provide author url for authenticated user' do |
| 305 | author = Person.new | 289 | author = Person.new |
| 306 | author.expects(:url).returns('http://blabla.net/author') | 290 | author.expects(:url).returns('http://blabla.net/author') |
vendor/plugins/action_tracker_has_comments/init.rb
| @@ -3,22 +3,13 @@ | @@ -3,22 +3,13 @@ | ||
| 3 | Rails.configuration.to_prepare do | 3 | Rails.configuration.to_prepare do |
| 4 | ActionTracker::Record.module_eval do | 4 | ActionTracker::Record.module_eval do |
| 5 | 5 | ||
| 6 | - has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :finder_sql => 'SELECT * FROM comments WHERE #{conditions_for_comments} ORDER BY created_at ASC', :counter_sql => 'SELECT * FROM comments WHERE #{conditions_for_comments}' | 6 | + has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, |
| 7 | + :finder_sql => 'SELECT * FROM comments WHERE #{conditions_for_comments} ORDER BY created_at ASC', | ||
| 8 | + :counter_sql => 'SELECT COUNT(*) FROM comments WHERE #{conditions_for_comments}' | ||
| 7 | 9 | ||
| 8 | def conditions_for_comments | 10 | def conditions_for_comments |
| 9 | type, id = (self.target_type == 'Article' ? ['Article', self.target_id] : [self.class.to_s, self.id]) | 11 | type, id = (self.target_type == 'Article' ? ['Article', self.target_id] : [self.class.to_s, self.id]) |
| 10 | - "source_type = '#{type}' AND source_id = '#{id}'" | ||
| 11 | - end | ||
| 12 | - | ||
| 13 | - def comments_as_thread | ||
| 14 | - result = {} | ||
| 15 | - root = [] | ||
| 16 | - self.comments.each do |c| | ||
| 17 | - c.replies = [] | ||
| 18 | - result[c.id] ||= c | ||
| 19 | - c.reply_of_id.nil? ? root << c : result[c.reply_of_id].replies << c | ||
| 20 | - end | ||
| 21 | - root | 12 | + "source_type = '#{type}' AND source_id = '#{id}' AND reply_of_id IS NULL" |
| 22 | end | 13 | end |
| 23 | 14 | ||
| 24 | end | 15 | end |