Commit 619223c680bd8fcedc16ed16ceb432223922df94
Committed by
Joenio Costa
1 parent
4fe87ea2
Exists in
master
and in
22 other branches
Bsc Plugin
* Refactoring profile management to use tokeninput * Also, adding support of tokeninput to the core * Adding attributes validated and cnpj to enterprise * Environment option to define enterprise as validated by defaul * Making profile namedscopes consider subclasses too * Adapting enterprise icon and identification to meet Bsc expectations * Adapting profile info actions to meet Bsc expectations * Adapting control panel buttons to meet Bsc expectations * Adapting core product to meed Bsc expectations * Adding and fixing plugin hotspots (ActionItem2085, ActionItem2087, ActionItem2086, ActionItem2088)
Showing
104 changed files
with
6763 additions
and
434 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 104 files displayed.
app/controllers/application.rb
| ... | ... | @@ -128,6 +128,21 @@ class ApplicationController < ActionController::Base |
| 128 | 128 | |
| 129 | 129 | def init_noosfero_plugins |
| 130 | 130 | @plugins = Noosfero::Plugin::Manager.new(self) |
| 131 | + @plugins.enabled_plugins.map(&:class).each do |plugin| | |
| 132 | + prepend_view_path(plugin.view_path) | |
| 133 | + end | |
| 134 | + init_noosfero_plugins_controller_filters | |
| 135 | + end | |
| 136 | + | |
| 137 | + # This is a generic method that initialize any possible filter defined by a | |
| 138 | + # plugin to the current controller being initialized. | |
| 139 | + def init_noosfero_plugins_controller_filters | |
| 140 | + @plugins.enabled_plugins.each do |plugin| | |
| 141 | + plugin.send(self.class.name.underscore + '_filters').each do |plugin_filter| | |
| 142 | + self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {})) | |
| 143 | + self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block]) | |
| 144 | + end | |
| 145 | + end | |
| 131 | 146 | end |
| 132 | 147 | |
| 133 | 148 | def load_terminology | ... | ... |
app/controllers/my_profile/manage_products_controller.rb
| ... | ... | @@ -4,6 +4,7 @@ class ManageProductsController < ApplicationController |
| 4 | 4 | protect 'manage_products', :profile, :except => [:show] |
| 5 | 5 | before_filter :check_environment_feature |
| 6 | 6 | before_filter :login_required, :except => [:show] |
| 7 | + before_filter :create_product?, :only => [:new] | |
| 7 | 8 | |
| 8 | 9 | protected |
| 9 | 10 | |
| ... | ... | @@ -14,6 +15,13 @@ class ManageProductsController < ApplicationController |
| 14 | 15 | end |
| 15 | 16 | end |
| 16 | 17 | |
| 18 | + def create_product? | |
| 19 | + if !profile.create_product? | |
| 20 | + render_access_denied | |
| 21 | + return | |
| 22 | + end | |
| 23 | + end | |
| 24 | + | |
| 17 | 25 | public |
| 18 | 26 | |
| 19 | 27 | def index | ... | ... |
app/controllers/my_profile/profile_members_controller.rb
| 1 | 1 | class ProfileMembersController < MyProfileController |
| 2 | 2 | protect 'manage_memberships', :profile |
| 3 | - no_design_blocks | |
| 4 | 3 | |
| 5 | 4 | def index |
| 6 | 5 | @members = profile.members |
| ... | ... | @@ -15,29 +14,23 @@ class ProfileMembersController < MyProfileController |
| 15 | 14 | rescue ActiveRecord::RecordNotFound |
| 16 | 15 | @person = nil |
| 17 | 16 | end |
| 18 | - if !params[:confirmation] && @person && @person.is_last_admin_leaving?(profile, @roles) | |
| 19 | - redirect_to :action => :last_admin, :roles => params[:roles], :person => @person | |
| 20 | - else | |
| 21 | - if @person && @person.define_roles(@roles, profile) | |
| 17 | + | |
| 18 | + if @person | |
| 19 | + if@person.is_last_admin_leaving?(profile, @roles) | |
| 20 | + redirect_to :action => :last_admin | |
| 21 | + elsif @person.define_roles(@roles, profile) | |
| 22 | 22 | session[:notice] = _('Roles successfuly updated') |
| 23 | + redirect_to :controller => 'profile_editor' | |
| 23 | 24 | else |
| 24 | 25 | session[:notice] = _('Couldn\'t change the roles') |
| 25 | - end | |
| 26 | - if params[:confirmation] | |
| 27 | - redirect_to profile.url | |
| 28 | - else | |
| 29 | - redirect_to :action => :index | |
| 26 | + redirect_to :action => 'index' | |
| 30 | 27 | end |
| 31 | 28 | end |
| 32 | 29 | end |
| 33 | 30 | |
| 34 | 31 | def last_admin |
| 35 | - @person = params[:person] | |
| 36 | - @roles = params[:roles] || [] | |
| 37 | - @members = profile.members.select {|member| !profile.admins.include?(member)} | |
| 38 | - @title = _('Current admins') | |
| 39 | - @collection = :profile_admins | |
| 40 | - @remove_action = {:action => 'remove_admin'} | |
| 32 | + @roles = [Profile::Roles.admin(environment.id)] | |
| 33 | + @pre_population = [].to_json | |
| 41 | 34 | end |
| 42 | 35 | |
| 43 | 36 | def add_role |
| ... | ... | @@ -90,6 +83,7 @@ class ProfileMembersController < MyProfileController |
| 90 | 83 | end |
| 91 | 84 | |
| 92 | 85 | def add_members |
| 86 | + @roles = Profile::Roles.organization_member_roles(environment.id) | |
| 93 | 87 | end |
| 94 | 88 | |
| 95 | 89 | def add_member |
| ... | ... | @@ -122,19 +116,42 @@ class ProfileMembersController < MyProfileController |
| 122 | 116 | render :layout => false |
| 123 | 117 | end |
| 124 | 118 | |
| 125 | - def find_users | |
| 126 | - if !params[:query] || params[:query].length <= 2 | |
| 127 | - @users_found = [] | |
| 128 | - elsif params[:scope] == 'all_users' | |
| 129 | - @users_found = Person.find_by_contents(params[:query] + '*').select {|user| !profile.members.include?(user)} | |
| 130 | - @button_alt = _('Add member') | |
| 131 | - @add_action = {:action => 'add_member'} | |
| 132 | - elsif params[:scope] == 'new_admins' | |
| 133 | - @users_found = Person.find_by_contents(params[:query] + '*').select {|user| profile.members.include?(user) && !profile.admins.include?(user)} | |
| 134 | - @button_alt = _('Add member') | |
| 135 | - @add_action = {:action => 'add_admin'} | |
| 119 | + def search_user | |
| 120 | + role = Role.find(params[:role]) | |
| 121 | + render :text => environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?', "%#{params['q_'+role.key]}%", "%#{params['q_'+role.key]}%"]). | |
| 122 | + select { |person| !profile.members_by_role(role).include?(person) }. | |
| 123 | + map {|person| {:id => person.id, :name => person.name} }. | |
| 124 | + to_json | |
| 125 | + end | |
| 126 | + | |
| 127 | + def save_associations | |
| 128 | + error = false | |
| 129 | + roles = Profile::Roles.organization_member_roles(environment.id) | |
| 130 | + roles.select { |role| params['q_'+role.key] }.each do |role| | |
| 131 | + people = [Person.find(params['q_'+role.key].split(','))].flatten | |
| 132 | + to_remove = profile.members_by_role(role) - people | |
| 133 | + to_add = people - profile.members_by_role(role) | |
| 134 | + | |
| 135 | + begin | |
| 136 | + to_remove.each { |person| profile.disaffiliate(person, role) } | |
| 137 | + to_add.each { |person| profile.affiliate(person, role) } | |
| 138 | + rescue Exception => ex | |
| 139 | + logger.info ex | |
| 140 | + error = true | |
| 141 | + end | |
| 142 | + end | |
| 143 | + | |
| 144 | + if error | |
| 145 | + session[:notice] = _('The members list couldn\'t be updated. Please contact the administrator.') | |
| 146 | + redirect_to :action => 'add_members' | |
| 147 | + else | |
| 148 | + if profile.admins.blank? && !params[:last_admin] | |
| 149 | + redirect_to :action => 'last_admin' | |
| 150 | + else | |
| 151 | + session[:notice] = _('The members list was updated.') | |
| 152 | + redirect_to :controller => 'profile_editor' | |
| 153 | + end | |
| 136 | 154 | end |
| 137 | - render :layout => false | |
| 138 | 155 | end |
| 139 | 156 | |
| 140 | 157 | def send_mail | ... | ... |
app/helpers/application_helper.rb
| ... | ... | @@ -298,6 +298,17 @@ module ApplicationHelper |
| 298 | 298 | partial_for_task_class(klass.superclass, action) |
| 299 | 299 | end |
| 300 | 300 | |
| 301 | + def view_for_profile_actions(klass) | |
| 302 | + raise ArgumentError, 'No profile actions view for this class.' if klass.nil? | |
| 303 | + | |
| 304 | + name = klass.name.underscore | |
| 305 | + VIEW_EXTENSIONS.each do |ext| | |
| 306 | + return "blocks/profile_info_actions/"+name+ext if File.exists?(File.join(RAILS_ROOT, 'app', 'views', 'blocks', 'profile_info_actions', name+ext)) | |
| 307 | + end | |
| 308 | + | |
| 309 | + view_for_profile_actions(klass.superclass) | |
| 310 | + end | |
| 311 | + | |
| 301 | 312 | def user |
| 302 | 313 | @controller.send(:user) |
| 303 | 314 | end |
| ... | ... | @@ -970,7 +981,8 @@ module ApplicationHelper |
| 970 | 981 | 'lightbox', |
| 971 | 982 | 'colorpicker', |
| 972 | 983 | pngfix_stylesheet_path, |
| 973 | - ] | |
| 984 | + ] + | |
| 985 | + tokeninput_stylesheets | |
| 974 | 986 | end |
| 975 | 987 | |
| 976 | 988 | # DEPRECATED. Do not use this· |
| ... | ... | @@ -982,6 +994,10 @@ module ApplicationHelper |
| 982 | 994 | 'iepngfix/iepngfix.css' |
| 983 | 995 | end |
| 984 | 996 | |
| 997 | + def tokeninput_stylesheets | |
| 998 | + ['token-input', 'token-input-facebook', 'token-input-mac'] | |
| 999 | + end | |
| 1000 | + | |
| 985 | 1001 | def noosfero_layout_features |
| 986 | 1002 | render :file => 'shared/noosfero_layout_features' |
| 987 | 1003 | end |
| ... | ... | @@ -1127,7 +1143,7 @@ module ApplicationHelper |
| 1127 | 1143 | def manage_enterprises |
| 1128 | 1144 | if user && !user.enterprises.empty? |
| 1129 | 1145 | enterprises_link = user.enterprises.map do |enterprise| |
| 1130 | - link_to(content_tag('strong', [_('<span>Manage</span> %s') % enterprise.short_name(25)]), @environment.top_url + "/myprofile/#{enterprise.identifier}", :class => "icon-menu-enterprise", :title => [_('Manage %s') % enterprise.short_name]) | |
| 1146 | + link_to(content_tag('strong', [_('<span>Manage</span> %s') % enterprise.short_name(25)]), @environment.top_url + "/myprofile/#{enterprise.identifier}", :class => "icon-menu-"+enterprise.class.identification.underscore, :title => [_('Manage %s') % enterprise.short_name]) | |
| 1131 | 1147 | end |
| 1132 | 1148 | render :partial => 'shared/manage_enterprises', :locals => {:enterprises_link => enterprises_link} |
| 1133 | 1149 | end | ... | ... |
app/helpers/catalog_helper.rb
| ... | ... | @@ -6,14 +6,17 @@ include ManageProductsHelper |
| 6 | 6 | def display_products_list(profile, products) |
| 7 | 7 | data = '' |
| 8 | 8 | extra_content = [] |
| 9 | + extra_content_list = [] | |
| 9 | 10 | products.each { |product| |
| 10 | 11 | extra_content = @plugins.map(:catalog_item_extras, product).collect { |content| instance_eval(&content) } if @plugins |
| 12 | + extra_content_list = @plugins.map(:catalog_list_item_extras, product).collect { |content| instance_eval(&content) } if @plugins | |
| 11 | 13 | data << content_tag('li', |
| 12 | 14 | link_to_product(product, :class => 'product-pic', :style => 'background-image:url(%s)' % product.default_image(:portrait) ) + |
| 13 | 15 | content_tag('h3', link_to_product(product)) + |
| 14 | 16 | content_tag('ul', |
| 15 | 17 | (product.price ? content_tag('li', _('Price: %s') % ( "%.2f" % product.price), :class => 'product_price') : '') + |
| 16 | - content_tag('li', product_category_name(profile, product.product_category), :class => 'product_category') | |
| 18 | + content_tag('li', product_category_name(profile, product.product_category), :class => 'product_category') + | |
| 19 | + extra_content_list.map { |content| content_tag('li', content)}.join("\n") | |
| 17 | 20 | ) + |
| 18 | 21 | (product.description ? content_tag('div', |
| 19 | 22 | txt2html(product.description), | ... | ... |
app/models/community.rb
app/models/enterprise.rb
| ... | ... | @@ -147,6 +147,7 @@ class Enterprise < Organization |
| 147 | 147 | end |
| 148 | 148 | |
| 149 | 149 | before_create do |enterprise| |
| 150 | + enterprise.validated = enterprise.environment.enabled?('enterprises_are_validated_when_created') | |
| 150 | 151 | if enterprise.environment.enabled?('enterprises_are_disabled_when_created') |
| 151 | 152 | enterprise.enabled = false |
| 152 | 153 | end |
| ... | ... | @@ -167,4 +168,12 @@ class Enterprise < Organization |
| 167 | 168 | enable_contact_us |
| 168 | 169 | end |
| 169 | 170 | |
| 171 | + def control_panel_settings_button | |
| 172 | + {:title => __('Enterprise Info and settings'), :icon => 'edit-profile-enterprise'} | |
| 173 | + end | |
| 174 | + | |
| 175 | + def create_product? | |
| 176 | + true | |
| 177 | + end | |
| 178 | + | |
| 170 | 179 | end | ... | ... |
app/models/environment.rb
| ... | ... | @@ -117,6 +117,7 @@ class Environment < ActiveRecord::Base |
| 117 | 117 | 'enable_organization_url_change' => _("Allow organizations to change their URL"), |
| 118 | 118 | 'admin_must_approve_new_communities' => _("Admin must approve creation of communities"), |
| 119 | 119 | 'enterprises_are_disabled_when_created' => __('Enterprises are disabled when created'), |
| 120 | + 'enterprises_are_validated_when_created' => __('Enterprises are validated when created'), | |
| 120 | 121 | 'show_balloon_with_profile_links_when_clicked' => _('Show a balloon with profile links when a profile image is clicked'), |
| 121 | 122 | 'xmpp_chat' => _('XMPP/Jabber based chat'), |
| 122 | 123 | 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images') |
| ... | ... | @@ -255,11 +256,22 @@ class Environment < ActiveRecord::Base |
| 255 | 256 | self.settings["#{feature}_enabled".to_sym] = true |
| 256 | 257 | end |
| 257 | 258 | |
| 259 | + def enable_plugin(plugin) | |
| 260 | + self.enabled_plugins += [plugin] | |
| 261 | + self.enabled_plugins.uniq! | |
| 262 | + self.save! | |
| 263 | + end | |
| 264 | + | |
| 258 | 265 | # Disables a feature identified by its name |
| 259 | 266 | def disable(feature) |
| 260 | 267 | self.settings["#{feature}_enabled".to_sym] = false |
| 261 | 268 | end |
| 262 | 269 | |
| 270 | + def disable_plugin(plugin) | |
| 271 | + self.enabled_plugins.delete(plugin) | |
| 272 | + self.save! | |
| 273 | + end | |
| 274 | + | |
| 263 | 275 | # Tells if a feature, identified by its name, is enabled |
| 264 | 276 | def enabled?(feature) |
| 265 | 277 | self.settings["#{feature}_enabled".to_sym] == true | ... | ... |
app/models/organization.rb
| ... | ... | @@ -95,12 +95,12 @@ class Organization < Profile |
| 95 | 95 | [] |
| 96 | 96 | end |
| 97 | 97 | |
| 98 | - N_('Display name'); N_('Description'); N_('Contact person'); N_('Contact email'); N_('Acronym'); N_('Foundation year'); N_('Legal form'); N_('Economic activity'); N_('Management information'); N_('Validated'); N_('Tag list') | |
| 99 | - settings_items :display_name, :description, :contact_person, :contact_email, :acronym, :foundation_year, :legal_form, :economic_activity, :management_information, :validated, :cnpj | |
| 98 | + N_('Display name'); N_('Description'); N_('Contact person'); N_('Contact email'); N_('Acronym'); N_('Foundation year'); N_('Legal form'); N_('Economic activity'); N_('Management information'); N_('Tag list') | |
| 99 | + settings_items :display_name, :description, :contact_person, :contact_email, :acronym, :foundation_year, :legal_form, :economic_activity, :management_information | |
| 100 | 100 | |
| 101 | 101 | validates_format_of :foundation_year, :with => Noosfero::Constants::INTEGER_FORMAT |
| 102 | - | |
| 103 | 102 | validates_format_of :contact_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |org| !org.contact_email.blank? }) |
| 103 | + validates_as_cnpj :cnpj | |
| 104 | 104 | |
| 105 | 105 | xss_terminate :only => [ :acronym, :contact_person, :contact_email, :legal_form, :economic_activity, :management_information ], :on => 'validation' |
| 106 | 106 | |
| ... | ... | @@ -149,4 +149,12 @@ class Organization < Profile |
| 149 | 149 | false |
| 150 | 150 | end |
| 151 | 151 | |
| 152 | + def members_to_json | |
| 153 | + members.map { |member| {:id => member.id, :name => member.name} }.to_json | |
| 154 | + end | |
| 155 | + | |
| 156 | + def members_by_role_to_json(role) | |
| 157 | + members_by_role(role).map { |member| {:id => member.id, :name => member.name} }.to_json | |
| 158 | + end | |
| 159 | + | |
| 152 | 160 | end | ... | ... |
app/models/person.rb
app/models/product.rb
app/models/profile.rb
| ... | ... | @@ -52,8 +52,9 @@ class Profile < ActiveRecord::Base |
| 52 | 52 | acts_as_accessible |
| 53 | 53 | |
| 54 | 54 | named_scope :memberships_of, lambda { |person| { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ['role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id ] } } |
| 55 | - named_scope :enterprises, :conditions => "profiles.type = 'Enterprise'" | |
| 56 | - named_scope :communities, :conditions => "profiles.type = 'Community'" | |
| 55 | + #FIXME: these will work only if the subclass is already loaded | |
| 56 | + named_scope :enterprises, lambda { {:conditions => (Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } | |
| 57 | + named_scope :communities, lambda { {:conditions => (Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} } | |
| 57 | 58 | |
| 58 | 59 | def members |
| 59 | 60 | Person.members_of(self) |
| ... | ... | @@ -564,9 +565,7 @@ private :generate_url, :url_options |
| 564 | 565 | if self.closed? && members_count > 0 |
| 565 | 566 | AddMember.create!(:person => person, :organization => self) unless self.already_request_membership?(person) |
| 566 | 567 | else |
| 567 | - if members_count == 0 | |
| 568 | - self.affiliate(person, Profile::Roles.admin(environment.id)) | |
| 569 | - end | |
| 568 | + self.affiliate(person, Profile::Roles.admin(environment.id)) if members_count == 0 | |
| 570 | 569 | self.affiliate(person, Profile::Roles.member(environment.id)) |
| 571 | 570 | end |
| 572 | 571 | else |
| ... | ... | @@ -817,6 +816,14 @@ private :generate_url, :url_options |
| 817 | 816 | end |
| 818 | 817 | end |
| 819 | 818 | |
| 819 | + def control_panel_settings_button | |
| 820 | + {:title => _('Profile Info and settings'), :icon => 'edit-profile'} | |
| 821 | + end | |
| 822 | + | |
| 823 | + def self.identification | |
| 824 | + name | |
| 825 | + end | |
| 826 | + | |
| 820 | 827 | protected |
| 821 | 828 | |
| 822 | 829 | def followed_by?(person) | ... | ... |
app/views/admin_panel/index.rhtml
| ... | ... | @@ -16,4 +16,7 @@ |
| 16 | 16 | <tr><td><%= link_to _('Manage Fields'), :controller => 'features', :action => 'manage_fields' %></td></tr> |
| 17 | 17 | <tr><td><%= link_to _('Set Portal'), :action => 'set_portal_community' %></td></tr> |
| 18 | 18 | <tr><td><%= link_to _('Terms of use'), :action => 'terms_of_use' %></td></tr> |
| 19 | + <% @plugins.map(:admin_panel_links).each do |link| %> | |
| 20 | + <tr><td><%= link_to link[:title], link[:url] %></td></tr> | |
| 21 | + <% end %> | |
| 19 | 22 | </table> | ... | ... |
app/views/layouts/_javascript.rhtml
| 1 | -<%= javascript_include_tag :defaults, 'jquery-latest.js', 'jquery.noconflict.js', 'jquery.cycle.all.min.js', 'thickbox.js', 'lightbox', 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery.cookie', 'reflection', 'add-and-join', :cache => 'cache-general' %> | |
| 1 | +<%= javascript_include_tag :defaults, 'jquery-latest.js', 'jquery.noconflict.js', 'jquery.cycle.all.min.js', 'thickbox.js', 'lightbox', 'jquery-ui-1.8.2.custom.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery.cookie', 'reflection', 'add-and-join', 'jquery.tokeninput', :cache => 'cache-general' %> | ... | ... |
app/views/manage_products/index.rhtml
| ... | ... | @@ -25,6 +25,6 @@ |
| 25 | 25 | <%= pagination_links @products %> |
| 26 | 26 | |
| 27 | 27 | <% button_bar do %> |
| 28 | - <%= button :add, _('New product or service'), :action => 'new' %> | |
| 28 | + <%= button :add, _('New product or service'), :action => 'new' if @profile.create_product? %> | |
| 29 | 29 | <%= button :back, _('Back'), { :controller => 'profile_editor', :profile => @profile.identifier, :action => 'index' } %> |
| 30 | 30 | <% end %> | ... | ... |
app/views/memberships/index.rhtml
| ... | ... | @@ -17,7 +17,7 @@ |
| 17 | 17 | <span class='profile-details'> |
| 18 | 18 | <strong><%= membership.name %></strong><br/> |
| 19 | 19 | <%= _('Role: %s') % rolename_for(profile, membership) %> <br/> |
| 20 | - <%= _('Type: %s') % getterm(membership.class.name) %> <br/> | |
| 20 | + <%= _('Type: %s') % getterm(membership.class.identification) %> <br/> | |
| 21 | 21 | <%= _('Description: %s') % membership.description + '<br/>' if membership.community? %> |
| 22 | 22 | <%= _('Members: %s') % membership.members.size.to_s %> <br/> |
| 23 | 23 | <%= _('Created at: %s') % show_date(membership.created_at) unless membership.enterprise? %> <br/> | ... | ... |
app/views/profile/_profile.rhtml
| 1 | 1 | <tr> |
| 2 | 2 | <td colspan='2'> |
| 3 | 3 | |
| 4 | - <% plugins_tabs = @plugins.map(:profile_tabs) %> | |
| 4 | + <% plugins_tabs = @plugins.map(:profile_tabs). | |
| 5 | + map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%> | |
| 5 | 6 | |
| 6 | 7 | <% tabs = plugins_tabs.select { |tab| tab[:start] } %> |
| 7 | 8 | ... | ... |
app/views/profile/profile_info.rjs
| ... | ... | @@ -3,4 +3,4 @@ if !user.nil? and user.has_permission?('edit_profile', profile) |
| 3 | 3 | else |
| 4 | 4 | page.hide "profile-admin-url-#{@block.id}" |
| 5 | 5 | end |
| 6 | -page.replace_html "profile-info-options-#{@block.id}", :file => 'blocks/profile_info_actions/' + @block.owner.class.name.underscore | |
| 6 | +page.replace_html "profile-info-options-#{@block.id}", :file => view_for_profile_actions(@block.owner.class) | ... | ... |
| ... | ... | @@ -0,0 +1,35 @@ |
| 1 | +<h2><%= _('Moderation options') %></h2> | |
| 2 | +<% if profile.community? %> | |
| 3 | + <div style='margin-bottom: 1em'> | |
| 4 | + <%= _('New members must be approved:')%> | |
| 5 | + </div> | |
| 6 | + <div style='margin-bottom: 0.5em'> | |
| 7 | + <%= radio_button 'profile_data', 'closed', 'true', :style => 'float: left' %> | |
| 8 | + <div style='margin-left: 30px'> | |
| 9 | + <%= _('<strong>Before</strong> joining this group (a moderator has to accept the member in pending request before member can access the intranet and/or the website).') %> | |
| 10 | + </div> | |
| 11 | + </div> | |
| 12 | + <div> | |
| 13 | + <%= radio_button 'profile_data', 'closed', 'false', :style => 'float: left' %> | |
| 14 | + <div style='margin-left: 30px'> | |
| 15 | + <%= _('<strong>After</strong> joining this group (a moderator can always desactivate access for users later).') %> | |
| 16 | + </div> | |
| 17 | + </div> | |
| 18 | + <br> | |
| 19 | +<% end %> | |
| 20 | +<div style='margin-bottom: 1em'> | |
| 21 | + <%= _('New articles posted by members of this group must be approved:')%> | |
| 22 | + | |
| 23 | +</div> | |
| 24 | +<div style='margin-bottom: 0.5em'> | |
| 25 | + <%= radio_button 'profile_data', 'moderated_articles', 'true', :style => 'float: left' %> | |
| 26 | + <div style='margin-left: 30px'> | |
| 27 | + <%= _('<strong>Before</strong> being published in this group (a moderator has to accept the article in pending request before the article be listed as a article of this group).') %> | |
| 28 | + </div> | |
| 29 | +</div> | |
| 30 | +<div> | |
| 31 | + <%= radio_button 'profile_data', 'moderated_articles', 'false', :style => 'float: left' %> | |
| 32 | + <div style='margin-left: 30px'> | |
| 33 | + <%= _('<strong>After</strong> being published in this group (a moderator can always remove publicated articles later).') %> | |
| 34 | + </div> | |
| 35 | +</div> | ... | ... |
app/views/profile_editor/_organization.rhtml
| ... | ... | @@ -58,42 +58,8 @@ |
| 58 | 58 | </div> |
| 59 | 59 | <% end %> |
| 60 | 60 | |
| 61 | - <%= render :partial => 'shared/organization_custom_fields', :locals => { :f => f, :object_name => 'profile_data', :profile => @profile } %> | |
| 61 | +<%= render :partial => 'shared/organization_custom_fields', :locals => { :f => f, :object_name => 'profile_data', :profile => @profile } %> | |
| 62 | 62 | |
| 63 | - <%= labelled_check_box(_('Enable "contact us"'), 'profile_data[enable_contact_us]', "1", @profile.enable_contact_us) if @profile.enterprise? %> | |
| 63 | +<%= labelled_check_box(_('Enable "contact us"'), 'profile_data[enable_contact_us]', "1", @profile.enable_contact_us) if @profile.enterprise? %> | |
| 64 | 64 | |
| 65 | - <h1><%= _('Moderation options') %></h1> | |
| 66 | - <% if profile.community? %> | |
| 67 | - <div style='margin-bottom: 1em'> | |
| 68 | - <%= _('New members must be approved:')%> | |
| 69 | - </div> | |
| 70 | - <div style='margin-bottom: 0.5em'> | |
| 71 | - <%= radio_button 'profile_data', 'closed', 'true', :style => 'float: left' %> | |
| 72 | - <div style='margin-left: 30px'> | |
| 73 | - <%= _('<strong>Before</strong> joining this group (a moderator has to accept the member in pending request before member can access the intranet and/or the website).') %> | |
| 74 | - </div> | |
| 75 | - </div> | |
| 76 | - <div> | |
| 77 | - <%= radio_button 'profile_data', 'closed', 'false', :style => 'float: left' %> | |
| 78 | - <div style='margin-left: 30px'> | |
| 79 | - <%= _('<strong>After</strong> joining this group (a moderator can always desactivate access for users later).') %> | |
| 80 | - </div> | |
| 81 | - </div> | |
| 82 | - <br> | |
| 83 | - <% end %> | |
| 84 | - <div style='margin-bottom: 1em'> | |
| 85 | - <%= _('New articles posted by members of this group must be approved:')%> | |
| 86 | - | |
| 87 | - </div> | |
| 88 | - <div style='margin-bottom: 0.5em'> | |
| 89 | - <%= radio_button 'profile_data', 'moderated_articles', 'true', :style => 'float: left' %> | |
| 90 | - <div style='margin-left: 30px'> | |
| 91 | - <%= _('<strong>Before</strong> being published in this group (a moderator has to accept the article in pending request before the article be listed as a article of this group).') %> | |
| 92 | - </div> | |
| 93 | - </div> | |
| 94 | - <div> | |
| 95 | - <%= radio_button 'profile_data', 'moderated_articles', 'false', :style => 'float: left' %> | |
| 96 | - <div style='margin-left: 30px'> | |
| 97 | - <%= _('<strong>After</strong> being published in this group (a moderator can always remove publicated articles later).') %> | |
| 98 | - </div> | |
| 99 | - </div> | |
| 65 | +<%= render :partial => 'moderation', :locals => { :profile => @profile } %> | ... | ... |
app/views/profile_editor/index.rhtml
| ... | ... | @@ -10,9 +10,9 @@ |
| 10 | 10 | |
| 11 | 11 | <% control_panel do %> |
| 12 | 12 | |
| 13 | - <%= control_panel_button(_('Profile Info and settings'), 'edit-profile', :controller => 'profile_editor', :action => 'edit') if profile.person? %> | |
| 14 | - <%= control_panel_button(__('Community Info and settings'), 'edit-profile-group', :controller => 'profile_editor', :action => 'edit') if profile.community? %> | |
| 15 | - <%= control_panel_button(__('Enterprise Info and settings'), 'edit-profile-enterprise', :controller => 'profile_editor', :action => 'edit') if profile.enterprise? %> | |
| 13 | + <%= control_panel_button(profile.control_panel_settings_button[:title], | |
| 14 | + profile.control_panel_settings_button[:icon], | |
| 15 | + :controller => 'profile_editor', :action => 'edit') %> | |
| 16 | 16 | |
| 17 | 17 | <%= control_panel_button(_('Location'), 'edit-location', :controller => 'maps', :action => 'edit_location') %> |
| 18 | 18 | |
| ... | ... | @@ -58,9 +58,9 @@ |
| 58 | 58 | |
| 59 | 59 | <% if profile.enterprise? %> |
| 60 | 60 | <% if profile.enabled? %> |
| 61 | - <%= control_panel_button(__('Disable Enterprise'), 'disable', :action => 'disable') %> | |
| 61 | + <%= control_panel_button(__('Disable'), 'disable', :action => 'disable') %> | |
| 62 | 62 | <% else %> |
| 63 | - <%= control_panel_button(__('Enable Enterprise'), 'enable', :action => 'enable') %> | |
| 63 | + <%= control_panel_button(__('Enable'), 'enable', :action => 'enable') %> | |
| 64 | 64 | <% end %> |
| 65 | 65 | <% end %> |
| 66 | 66 | ... | ... |
app/views/profile_members/_find_users.rhtml
app/views/profile_members/_index_buttons.rhtml
| ... | ... | @@ -5,4 +5,7 @@ |
| 5 | 5 | <%= button :search, _('Invite your friends to join %s') % profile.short_name, :controller => 'invite', :action => 'select_address_book' %> |
| 6 | 6 | <% end %> |
| 7 | 7 | <%= button :send, _('Send e-mail to members'), :action => 'send_mail' %> |
| 8 | + <% @plugins.map(:manage_members_extra_buttons).each do |plugin_button| %> | |
| 9 | + <%= button plugin_button[:icon], plugin_button[:title], plugin_button[:url] %> | |
| 10 | + <% end %> | |
| 8 | 11 | <% end %> | ... | ... |
| ... | ... | @@ -0,0 +1,42 @@ |
| 1 | +<% form_tag :action => 'save_associations' do %> | |
| 2 | + <% @roles.each do |role|%> | |
| 3 | + <%= content_tag('p', content_tag('b', role.name.pluralize+':'), :style => 'margin-top: 30px; margin-bottom: 0px;') %> | |
| 4 | + <%= text_field_tag('q_'+role.key, nil, :id => 'search_'+role.key) %> | |
| 5 | + <%= hidden_field_tag(:last_admin, true) if from == 'last_admin'%> | |
| 6 | + <% end %> | |
| 7 | + | |
| 8 | + <% button_bar(:style => 'margin-top: 30px;') do %> | |
| 9 | + <%= submit_button('save', _('Save'))%> | |
| 10 | + <%= button('cancel', _('Cancel'), {:controller => 'profile_editor'})%> | |
| 11 | + <% end %> | |
| 12 | +<% end %> | |
| 13 | + | |
| 14 | +<% @roles.each do |role| %> | |
| 15 | + <% search_url = url_for(:action => 'search_user', :profile => profile.identifier, :role => role.id) %> | |
| 16 | + <% @pre_population ||= profile.members_by_role_to_json(role) %> | |
| 17 | + <script type="text/javascript"> | |
| 18 | + jQuery(<%= ('#search_' + role.key).to_json %>) | |
| 19 | + .tokenInput("<%= search_url %>", { | |
| 20 | + prePopulate: <%= @pre_population %>, | |
| 21 | + hintText: <%= _('Type in a search term for users').to_json %>, | |
| 22 | + noResultsText: <%= _('No results').to_json %>, | |
| 23 | + searchingText: <%= _('Searching...').to_json %>, | |
| 24 | + searchDelay: 500, | |
| 25 | + backspaceDeleteItem: false, | |
| 26 | + preventDuplicates: true, | |
| 27 | + queryParam: <%= ('q_'+role.key).to_json %> | |
| 28 | + }); | |
| 29 | + | |
| 30 | + jQuery("#token-input-search-enterprises") | |
| 31 | + .live("keydown", function(event){ | |
| 32 | + if(event.keyCode == "13") return false; | |
| 33 | + }); | |
| 34 | + </script> | |
| 35 | +<% end %> | |
| 36 | + | |
| 37 | +<script> | |
| 38 | + jQuery(function(){ | |
| 39 | + jQuery('.token-input-input-token input').blur(); | |
| 40 | + jQuery('.token-input-input-token input')[0].focus(); | |
| 41 | + }); | |
| 42 | +</script> | ... | ... |
app/views/profile_members/add_members.rhtml
| 1 | -<h2><%= _('Add members to %s') % profile.name %></h2> | |
| 1 | +<h1><%= _('Add members to %s') % profile.name %></h1> | |
| 2 | 2 | |
| 3 | -<% form_remote_tag :url => {:action => 'find_users', :profile => profile.identifier, :scope => 'all_users'}, :update => 'users-list', :loading => '$("users-list").addClassName("loading")', :complete => '$("users-list").removeClassName("loading")' do %> | |
| 4 | - <%= text_field_tag('query', '', :autocomplete => 'off') %> | |
| 5 | - <%= submit_tag(_('Search')) %> | |
| 6 | -<% end %> | |
| 7 | - | |
| 8 | -<%= observe_field('query', :url => {:action => 'find_users', :profile => profile.identifier, :scope => 'all_users'}, :update => 'users-list', :frequency => 1, :with => 'query', :condition => '$("query").value.length > 2', :loading => '$("users-list").addClassName("loading")', :complete => '$("users-list").removeClassName("loading")') %> | |
| 9 | -<%= observe_field('query', :frequency => 1, :condition => '$("query").value.length <= 2', :function => '$("users-list").update($("empty-query").innerHTML)') %> | |
| 10 | - | |
| 11 | -<div id="users-list"> | |
| 12 | - <%= render :partial => 'find_users' %> | |
| 13 | -</div> | |
| 14 | - | |
| 15 | -<div id='empty-query' style='display: none'> | |
| 16 | - <%= render :partial => 'find_users' %> | |
| 17 | -</div> | |
| 18 | - | |
| 19 | -<div id="members-list" class="add-members"> | |
| 20 | - <%= render :partial => 'members_list' %> | |
| 21 | -</div> | |
| 22 | -<%= drop_receiving_element('members-list', | |
| 23 | - :url => {:action => 'add_member', :profile => profile.identifier}, | |
| 24 | - :before => '$("tr-" + element.id).hide()', | |
| 25 | - :loading => '$("members-list").addClassName("loading")', | |
| 26 | - :update => 'members-list', | |
| 27 | - :success => '$("tr-" + element.id).hide(); $(element.id).show();', | |
| 28 | - :complete => '$("members-list").removeClassName("loading")') %> | |
| 29 | - | |
| 30 | -<br style="clear:both" /> | |
| 3 | +<%= render :partial => 'manage_roles', :locals => {:from => 'add_members'} %> | ... | ... |
app/views/profile_members/find_users.rhtml
| ... | ... | @@ -1,35 +0,0 @@ |
| 1 | -<h3> <%= _('Users') %> </h3> | |
| 2 | -<table> | |
| 3 | - <tr><th><%= _('Name') %></th><th></th></tr> | |
| 4 | - <% @users_found.each do |user| %> | |
| 5 | - <tr id="tr-<%= user.identifier %>"> | |
| 6 | - <td> | |
| 7 | - <div id="<%= user.identifier %>" class="draggable-user"> | |
| 8 | - <%= image_tag('/images/grip-clue.png') %> | |
| 9 | - <%= profile_image(user, :icon) %> | |
| 10 | - <%= [link_to_profile(user.short_name + " (#{user.identifier})", user.identifier, :title => user.name), | |
| 11 | - (user.sex ? gettext(user.sex.capitalize) : _('Sex not informed')), | |
| 12 | - user.location.empty? ? nil : user.location ].compact.join(' — ') %> | |
| 13 | - </div> | |
| 14 | - <%= draggable_element(user.identifier, :revert => true) %> | |
| 15 | - </td> | |
| 16 | - <td> | |
| 17 | - <%= button_to_remote_without_text(:add, @button_alt, | |
| 18 | - { :loading => '$("members-list").addClassName("loading")', | |
| 19 | - :update => 'members-list', | |
| 20 | - :url => {:id => user.id, :profile => profile.identifier}.merge(@add_action), | |
| 21 | - :success => "$('tr-#{user.identifier}').hide()", | |
| 22 | - :complete => '$("members-list").removeClassName("loading")'}) %> | |
| 23 | - | |
| 24 | - | |
| 25 | - </td> | |
| 26 | - </tr> | |
| 27 | - <% end if @users_found %> | |
| 28 | - <% if !params[:query] || params[:query].length <= 2 %> | |
| 29 | - <tr> | |
| 30 | - <td style='text-align: center'> | |
| 31 | - <em><%= _('You must type at least 3 characters') %></em> | |
| 32 | - </td> | |
| 33 | - </tr> | |
| 34 | - <% end %> | |
| 35 | -</table> |
app/views/profile_members/last_admin.rhtml
| 1 | 1 | <h1><%= _('Last administrator leaving %s') % profile.name %></h1> |
| 2 | 2 | |
| 3 | -<% if profile.members_count > 1 %> | |
| 4 | - <div id='last-admin-message'> | |
| 5 | - <%= _('Since you are the last administrator, you must choose at least one member to administer this community.') % profile.name %> | |
| 6 | - </div> | |
| 3 | +<div id='last-admin-message'> | |
| 4 | + <%= _('Since you are the last administrator, you must choose at least one member to administer this community.') % profile.name %> | |
| 5 | +</div> | |
| 7 | 6 | |
| 8 | - <%= render :partial => 'add_admins' %> | |
| 7 | +<%= render :partial => 'manage_roles', :locals => {:from => 'last_admin'} %> | |
| 9 | 8 | |
| 10 | - <% form_tag :action => 'update_roles', :roles => @roles, :person => @person, :confirmation => profile.admins.count > 1 do %> | |
| 11 | - <% button_bar do %> | |
| 12 | - <%= submit_button(:save, _("Leave administration and save"), :cancel => {:action => 'index'}) %> | |
| 13 | - <% end %> | |
| 14 | - <% end %> | |
| 15 | - | |
| 16 | -<% else %> | |
| 17 | - | |
| 18 | - <div id='last-admin-message'> | |
| 19 | - <%= _('Since you are the last administrator and there is no other member in this community, the next user to join this community will assume the administrator role.') % profile.name %> | |
| 20 | - </div> | |
| 21 | - | |
| 22 | - <% form_tag :action => 'update_roles', :roles => @roles, :person => @person, :confirmation => true do %> | |
| 23 | - <% button_bar do %> | |
| 24 | - <%= submit_button(:ok, _("Ok, I want to leave"), :cancel => {:action => 'index'}) %> | |
| 25 | - <% end %> | |
| 26 | - <% end %> | |
| 27 | -<% end %> | ... | ... |
app/views/search/_product.rhtml
| ... | ... | @@ -6,6 +6,7 @@ product_item_pos += 1 |
| 6 | 6 | %> |
| 7 | 7 | |
| 8 | 8 | <% extra_content = @plugins.map(:asset_product_extras, product, product.enterprise).collect { |content| instance_eval(&content) } %> |
| 9 | +<% extra_properties = @plugins.map(:asset_product_properties, product)%> | |
| 9 | 10 | |
| 10 | 11 | <li class="product-item <%= ( pos % 2 == 0 ) ? 'odd' : 'even' %>"> |
| 11 | 12 | <%= link_to_product product, :class => 'product-pic', :style => 'background-image:url(%s)' % product.default_image(:minor) %> |
| ... | ... | @@ -14,10 +15,15 @@ product_item_pos += 1 |
| 14 | 15 | </strong> |
| 15 | 16 | <ul> |
| 16 | 17 | <li> <%= _('Price: %s') % (product.price ? product.price : _('Not informed')) %> </li> |
| 17 | - <% if product.enterprise %> | |
| 18 | - <li> <%= _('Suplier: %s') % link_to_homepage(product.enterprise.name, product.enterprise.identifier) %> </li> | |
| 18 | + <% if product.enterprise && product.display_supplier_on_search? %> | |
| 19 | + <li> <%= _('Supplier: %s') % link_to_homepage(product.enterprise.name, product.enterprise.identifier) %> </li> | |
| 20 | + <% end %> | |
| 21 | + | |
| 22 | + <li> <%= _('Category:') + ' ' + link_to_product_category(product.product_category) %> </li> | |
| 23 | + | |
| 24 | + <% extra_properties.each do |property| %> | |
| 25 | + <li><%= property[:name] + ': ' + instance_eval(&property[:content]) %></li> | |
| 19 | 26 | <% end %> |
| 20 | - <li> <%=_('Category:') + ' ' + link_to_product_category(product.product_category) %> </li> | |
| 21 | 27 | </ul> |
| 22 | 28 | |
| 23 | 29 | <%= extra_content.join('\n') %> | ... | ... |
db/migrate/20111004184103_add_field_validated_to_enterprises.rb
0 → 100644
db/schema.rb
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | # |
| 10 | 10 | # It's strongly recommended to check this file into your version control system. |
| 11 | 11 | |
| 12 | -ActiveRecord::Schema.define(:version => 20110824192153) do | |
| 12 | +ActiveRecord::Schema.define(:version => 20111004184104) do | |
| 13 | 13 | |
| 14 | 14 | create_table "action_tracker", :force => true do |t| |
| 15 | 15 | t.integer "user_id" |
| ... | ... | @@ -378,6 +378,8 @@ ActiveRecord::Schema.define(:version => 20110824192153) do |
| 378 | 378 | t.datetime "updated_at" |
| 379 | 379 | t.boolean "visible", :default => true |
| 380 | 380 | t.integer "image_id" |
| 381 | + t.boolean "validated", :default => true | |
| 382 | + t.string "cnpj" | |
| 381 | 383 | end |
| 382 | 384 | |
| 383 | 385 | add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id" | ... | ... |
features/activate_enterprise.feature
| ... | ... | @@ -55,7 +55,7 @@ Feature: activate enterprise |
| 55 | 55 | Given feature "enterprise_activation" is enabled on environment |
| 56 | 56 | And the following enterprises |
| 57 | 57 | | identifier | name | enabled | cnpj | |
| 58 | - | services-provider | Services Provider | false | 00000000000000 | | |
| 58 | + | services-provider | Services Provider | false | 94.132.024/0001-48 | | |
| 59 | 59 | And I am on Joao Silva's control panel |
| 60 | 60 | And I fill in "Enterprise activation code" with code of "Services Provider" |
| 61 | 61 | And I press "Activate" | ... | ... |
| ... | ... | @@ -0,0 +1,164 @@ |
| 1 | +Feature: bsc | |
| 2 | + | |
| 3 | + Background: | |
| 4 | + Given "Bsc" plugin is enabled | |
| 5 | + | |
| 6 | + Scenario: display link to bsc creation on admin panel when bsc plugin active | |
| 7 | + Given I am logged in as admin | |
| 8 | + When I am on the environment control panel | |
| 9 | + Then I should see "Create Bsc" | |
| 10 | + When "Bsc" plugin is disabled | |
| 11 | + And I am on the environment control panel | |
| 12 | + Then I should not see "Create Bsc" | |
| 13 | + | |
| 14 | + Scenario: be able to create a bsc | |
| 15 | + Given I am logged in as admin | |
| 16 | + And I am on the environment control panel | |
| 17 | + And I follow "Create Bsc" | |
| 18 | + And I fill in the following: | |
| 19 | + | Business name | Sample Bsc | | |
| 20 | + | Company name | Sample Bsc | | |
| 21 | + | profile_data_identifier | sample-identifier | | |
| 22 | + | Cnpj | 07.970.746/0001-77 | | |
| 23 | + When I press "Save" | |
| 24 | + Then there should be a profile named "Sample Bsc" | |
| 25 | + | |
| 26 | + Scenario: display a button on bsc control panel to manage associated enterprises | |
| 27 | + Given the folllowing "bsc" from "bsc_plugin" | |
| 28 | + | business_name | identifier | company_name | cnpj | | |
| 29 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | | |
| 30 | + And I am logged in as admin | |
| 31 | + When I am on Bsc Test's control panel | |
| 32 | + Then I should see "Manage associated enterprises" | |
| 33 | + | |
| 34 | + Scenario: display a button on bsc control panel to transfer ownership | |
| 35 | + Given the folllowing "bsc" from "bsc_plugin" | |
| 36 | + | business_name | identifier | company_name | cnpj | | |
| 37 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | | |
| 38 | + And I am logged in as admin | |
| 39 | + When I am on Bsc Test's control panel | |
| 40 | + Then I should see "Transfer ownership" | |
| 41 | + | |
| 42 | + Scenario: create a new enterprise already associated with a bsc | |
| 43 | + Given the following user | |
| 44 | + | login | name | | |
| 45 | + | pedro-silva | Pedro Silva | | |
| 46 | + And the folllowing "bsc" from "bsc_plugin" | |
| 47 | + | business_name | identifier | company_name | cnpj | owner | | |
| 48 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | pedro-silva | | |
| 49 | + And organization_approval_method is "none" on environment | |
| 50 | + And I am logged in as "pedro-silva" | |
| 51 | + And I am on Bsc Test's control panel | |
| 52 | + And I follow "Manage associated enterprises" | |
| 53 | + And I follow "Add new enterprise" | |
| 54 | + And I fill in the following: | |
| 55 | + | Name | Associated Enterprise | | |
| 56 | + | Address | associated-enterprise | | |
| 57 | + When I press "Save" | |
| 58 | + Then "Associated Enterprise" should be associated with "Bsc Test" | |
| 59 | + | |
| 60 | + Scenario: do not display "add new product" button | |
| 61 | + Given the following user | |
| 62 | + | login | name | | |
| 63 | + | pedro-silva | Pedro Silva | | |
| 64 | + And the folllowing "bsc" from "bsc_plugin" | |
| 65 | + | business_name | identifier | company_name | cnpj | owner | | |
| 66 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | pedro-silva | | |
| 67 | + And feature "disable_products_for_enterprises" is disabled on environment | |
| 68 | + And I am logged in as "pedro-silva" | |
| 69 | + And I am on Bsc Test's control panel | |
| 70 | + When I follow "Manage Products and Services" | |
| 71 | + Then I should not see "New product or service" | |
| 72 | + | |
| 73 | + Scenario: display bsc's enterprises' products name on the bsc catalog | |
| 74 | + Given the following user | |
| 75 | + | login | name | | |
| 76 | + | pedro-silva | Pedro Silva | | |
| 77 | + And the folllowing "bsc" from "bsc_plugin" | |
| 78 | + | business_name | identifier | company_name | cnpj | owner | | |
| 79 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | pedro-silva | | |
| 80 | + And the following enterprise | |
| 81 | + | identifier | name | | |
| 82 | + | sample-enterprise | Sample Enterprise | | |
| 83 | + And the following product_category | |
| 84 | + | name | | |
| 85 | + | bike | | |
| 86 | + And the following products | |
| 87 | + | owner | category | name | | |
| 88 | + | sample-enterprise | bike | Master Bike | | |
| 89 | + And "Sample Enterprise" is associated with "Bsc Test" | |
| 90 | + And I am logged in as "pedro-silva" | |
| 91 | + When I go to Bsc Test's products page | |
| 92 | + Then I should see "Master Bike" | |
| 93 | + And I should see "Sample Enterprise" | |
| 94 | + | |
| 95 | + Scenario: display enterprise name linked only if person is member of any Bsc | |
| 96 | + Given the folllowing "bsc" from "bsc_plugin" | |
| 97 | + | business_name | identifier | company_name | cnpj | | |
| 98 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | | |
| 99 | + | Another Bsc | another-bsc | Another Bsc Test Ltda | 07.970.746/0001-77 | | |
| 100 | + And the following enterprise | |
| 101 | + | identifier | name | | |
| 102 | + | sample-enterprise | Sample Enterprise | | |
| 103 | + And the following product_category | |
| 104 | + | name | | |
| 105 | + | bike | | |
| 106 | + And the following products | |
| 107 | + | owner | category | name | | |
| 108 | + | sample-enterprise | bike | Master Bike | | |
| 109 | + And "Sample Enterprise" is associated with "Bsc Test" | |
| 110 | + And the folllowing "bsc" from "bsc_plugin" | |
| 111 | + | business_name | identifier | company_name | cnpj | | |
| 112 | + And the following user | |
| 113 | + | login | name | | |
| 114 | + | pedro | Pedro Souto | | |
| 115 | + | maria | Maria Souto | | |
| 116 | + And pedro is member of another-bsc | |
| 117 | + And I am logged in as "pedro" | |
| 118 | + When I go to Bsc Test's products page | |
| 119 | + Then I should see "Sample Enterprise" | |
| 120 | + And I should see "Sample Enterprise" within "a.bsc-catalog-enterprise-link" | |
| 121 | + But I am logged in as "maria" | |
| 122 | + When I go to Bsc Test's products page | |
| 123 | + Then I should see "Sample Enterprise" | |
| 124 | + #TODO -> test that it's not a link | |
| 125 | + | |
| 126 | + Scenario: allow only environment administrators to delete bsc profile | |
| 127 | + Given the folllowing "bsc" from "bsc_plugin" | |
| 128 | + | business_name | identifier | company_name | cnpj | | |
| 129 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | | |
| 130 | + And the following user | |
| 131 | + | login | name | | |
| 132 | + | pedro | Pedro Souto | | |
| 133 | + And "Pedro Souto" is admin of "Bsc Test" | |
| 134 | + And I am logged in as "pedro" | |
| 135 | + And I am on Bsc Test's control panel | |
| 136 | + And I follow "Bsc info and settings" | |
| 137 | + When I follow "Delete profile" | |
| 138 | + Then I should see "Access denied" | |
| 139 | + And "Bsc Test" profile should exist | |
| 140 | + But I am logged in as admin | |
| 141 | + And I am on Bsc Test's control panel | |
| 142 | + And I follow "Bsc info and settings" | |
| 143 | + When I follow "Delete profile" | |
| 144 | + Then I should see "Deleting profile Bsc Test" | |
| 145 | + And I follow "Yes, I am sure" | |
| 146 | + Then "Bsc Test" profile should not exist | |
| 147 | + | |
| 148 | + # Like we can believe that selenium is going to work... | |
| 149 | + @selenium | |
| 150 | + Scenario: list already associated enterprises on manage associated enterprises | |
| 151 | + Given the folllowing "bsc" from "bsc_plugin" | |
| 152 | + | business_name | identifier | company_name | cnpj | | |
| 153 | + | Bsc Test | bsc-test | Bsc Test Ltda | 94.132.024/0001-48 | | |
| 154 | + And the following enterprises | |
| 155 | + | identifier | name | | |
| 156 | + | enterprise-1 | Enterprise 1 | | |
| 157 | + | enterprise-2 | Enterprise 2 | | |
| 158 | + And "Enterprise 1" is associated with "Bsc Test" | |
| 159 | + And "Enterprise 2" is associated with "Bsc Test" | |
| 160 | + And I am logged in as admin | |
| 161 | + And I am on Bsc Test's control panel | |
| 162 | + When I follow "Manage associated enterprises" | |
| 163 | + Then I should see "Enterprise 1" | |
| 164 | + And I should see "Enterprise 2" | ... | ... |
features/last_administrator_leaving.feature
| ... | ... | @@ -11,7 +11,7 @@ Feature: remove administrator role |
| 11 | 11 | And the following community |
| 12 | 12 | | name | identifier | |
| 13 | 13 | | Nice people | nice-people | |
| 14 | - And "Joao Silva" is a member of "Nice people" | |
| 14 | + And "Joao Silva" is admin of "Nice people" | |
| 15 | 15 | And I am logged in as "joaosilva" |
| 16 | 16 | |
| 17 | 17 | Scenario: the last administrator removes his administrator role and must choose the new administrator |
| ... | ... | @@ -28,8 +28,8 @@ Feature: remove administrator role |
| 28 | 28 | And I uncheck "Profile Administrator" |
| 29 | 29 | And I uncheck "Profile Member" |
| 30 | 30 | When I press "Save changes" |
| 31 | - Then I should see "Since you are the last administrator and there is no other member in this community" | |
| 32 | - And I press "Ok, I want to leave" | |
| 31 | + Then I should see "Since you are the last administrator, you must choose at least one member to administer this community." | |
| 32 | + And I press "Save" | |
| 33 | 33 | And I am logged in as "mariasouza" |
| 34 | 34 | When I go to Nice people's join page |
| 35 | 35 | Then "Maria Souza" should be admin of "Nice people" |
| ... | ... | @@ -41,8 +41,8 @@ Feature: remove administrator role |
| 41 | 41 | And I uncheck "Profile Administrator" |
| 42 | 42 | And I uncheck "Profile Member" |
| 43 | 43 | When I press "Save changes" |
| 44 | - Then I should see "Since you are the last administrator and there is no other member in this community" | |
| 45 | - And I press "Ok, I want to leave" | |
| 44 | + Then I should see "Since you are the last administrator, you must choose at least one member to administer this community." | |
| 45 | + And I press "Save" | |
| 46 | 46 | And I am logged in as "mariasouza" |
| 47 | 47 | When I go to Nice people's join page |
| 48 | 48 | Then "Maria Souza" should be admin of "Nice people" | ... | ... |
features/manage_products.feature
| ... | ... | @@ -11,6 +11,12 @@ Feature: manage products |
| 11 | 11 | | redemoinho | joaosilva | Rede Moinho | true | |
| 12 | 12 | And feature "disable_products_for_enterprises" is disabled on environment |
| 13 | 13 | |
| 14 | + Scenario: display "create new product" button | |
| 15 | + Given I am logged in as "joaosilva" | |
| 16 | + And I am on Rede Moinho's control panel | |
| 17 | + When I follow "Manage Products and Services" | |
| 18 | + Then I should see "New product or service" | |
| 19 | + | |
| 14 | 20 | Scenario: paginate public listing products and services |
| 15 | 21 | Given the following product_category |
| 16 | 22 | | name | | ... | ... |
features/plugins.feature
| ... | ... | @@ -19,7 +19,7 @@ Feature: plugins |
| 19 | 19 | And the following events of TestPlugin |
| 20 | 20 | | event | body | |
| 21 | 21 | | control_panel_buttons | lambda { {:title => 'Test plugin button', :icon => '', :url => ''} } | |
| 22 | - | profile_tabs | lambda { {:title => 'Test plugin tab', :id => 'test_plugin', :content => 'Test plugin random content'} } | | |
| 22 | + | profile_tabs | lambda { {:title => 'Test plugin tab', :id => 'test_plugin', :content => lambda {'Test plugin random content'} } } | | |
| 23 | 23 | |
| 24 | 24 | Scenario: a user must see the plugin\'s button in the control panel if the plugin is enabled |
| 25 | 25 | Given plugin TestPlugin is enabled on environment | ... | ... |
features/step_definitions/noosfero_steps.rb
| ... | ... | @@ -36,6 +36,36 @@ Given /^the following (community|communities|enterprises?|organizations?)$/ do | |
| 36 | 36 | end |
| 37 | 37 | end |
| 38 | 38 | |
| 39 | +Given /^"([^\"]*)" is associated with "([^\"]*)"$/ do |enterprise, bsc| | |
| 40 | + enterprise = Enterprise.find_by_name(enterprise) || Enterprise[enterprise] | |
| 41 | + bsc = BscPlugin::Bsc.find_by_name(bsc) || BscPlugin::Bsc[bsc] | |
| 42 | + | |
| 43 | + bsc.enterprises << enterprise | |
| 44 | +end | |
| 45 | + | |
| 46 | +Then /^"([^\"]*)" should be associated with "([^\"]*)"$/ do |enterprise, bsc| | |
| 47 | + enterprise = Enterprise.find_by_name(enterprise) || Enterprise[enterprise] | |
| 48 | + bsc = BscPlugin::Bsc.find_by_name(bsc) || BscPlugin::Bsc[bsc] | |
| 49 | + | |
| 50 | + bsc.enterprises.should include(enterprise) | |
| 51 | +end | |
| 52 | + | |
| 53 | +Given /^the folllowing "([^\"]*)" from "([^\"]*)"$/ do |kind, plugin, table| | |
| 54 | + klass = (plugin.camelize+'::'+kind.singularize.camelize).constantize | |
| 55 | + table.hashes.each do |row| | |
| 56 | + owner = row.delete("owner") | |
| 57 | + domain = row.delete("domain") | |
| 58 | + organization = klass.create!(row) | |
| 59 | + if owner | |
| 60 | + organization.add_admin(Profile[owner]) | |
| 61 | + end | |
| 62 | + if domain | |
| 63 | + d = Domain.new :name => domain, :owner => organization | |
| 64 | + d.save(false) | |
| 65 | + end | |
| 66 | + end | |
| 67 | +end | |
| 68 | + | |
| 39 | 69 | Given /^the following blocks$/ do |table| |
| 40 | 70 | table.hashes.map{|item| item.dup}.each do |item| |
| 41 | 71 | klass = item.delete('type') |
| ... | ... | @@ -298,12 +328,12 @@ Given /^"(.+)" is friend of "(.+)"$/ do |person, friend| |
| 298 | 328 | Person[person].add_friend(Person[friend]) |
| 299 | 329 | end |
| 300 | 330 | |
| 301 | -Given /^(.+) is blocked$/ do |enterprise_name| | |
| 331 | +Given /^enterprise "([^\"]*)" is blocked$/ do |enterprise_name| | |
| 302 | 332 | enterprise = Enterprise.find_by_name(enterprise_name) |
| 303 | 333 | enterprise.block |
| 304 | 334 | end |
| 305 | 335 | |
| 306 | -Given /^(.+) is disabled$/ do |enterprise_name| | |
| 336 | +Given /^enterprise "([^\"]*)" is disabled$/ do |enterprise_name| | |
| 307 | 337 | enterprise = Enterprise.find_by_name(enterprise_name) |
| 308 | 338 | enterprise.enabled = false |
| 309 | 339 | enterprise.save |
| ... | ... | @@ -428,3 +458,33 @@ Then /^I should receive an e-mail on (.*)$/ do |address| |
| 428 | 458 | last_mail = ActionMailer::Base.deliveries.last |
| 429 | 459 | last_mail['to'].to_s.should == address |
| 430 | 460 | end |
| 461 | + | |
| 462 | +Given /^"([^\"]*)" plugin is (enabled|disabled)$/ do |plugin_name, status| | |
| 463 | + environment = Environment.default | |
| 464 | + environment.send(status.chop + '_plugin', plugin_name+'Plugin') | |
| 465 | +end | |
| 466 | + | |
| 467 | +Then /^there should be an? (.+) named "([^\"]*)"$/ do |klass_name, profile_name| | |
| 468 | + klass = klass_name.camelize.constantize | |
| 469 | + klass.find_by_name(profile_name).nil?.should be_false | |
| 470 | +end | |
| 471 | + | |
| 472 | +Then /^"([^\"]*)" profile should exist$/ do |profile_selector| | |
| 473 | + profile = nil | |
| 474 | + begin | |
| 475 | + profile = Profile.find_by_name(profile_selector) | |
| 476 | + profile.nil?.should be_false | |
| 477 | + rescue | |
| 478 | + profile.nil?.should be_false | |
| 479 | + end | |
| 480 | +end | |
| 481 | + | |
| 482 | +Then /^"([^\"]*)" profile should not exist$/ do |profile_selector| | |
| 483 | + profile = nil | |
| 484 | + begin | |
| 485 | + profile = Profile.find_by_name(profile_selector) | |
| 486 | + profile.nil?.should be_true | |
| 487 | + rescue | |
| 488 | + profile.nil?.should be_true | |
| 489 | + end | |
| 490 | +end | ... | ... |
features/unblock_button.feature
| ... | ... | @@ -10,11 +10,11 @@ Feature: unblock button |
| 10 | 10 | And the following blocks |
| 11 | 11 | | owner | type | |
| 12 | 12 | | sample-enterprise | DisabledEnterpriseMessageBlock | |
| 13 | - And Sample Enterprise is disabled | |
| 13 | + And enterprise "Sample Enterprise" is disabled | |
| 14 | 14 | |
| 15 | 15 | Scenario: the environment administrator unblocks a blocked enterprise |
| 16 | 16 | Given I am logged in as admin |
| 17 | - And Sample Enterprise is blocked | |
| 17 | + And enterprise "Sample Enterprise" is blocked | |
| 18 | 18 | And I am on Sample Enterprise's homepage |
| 19 | 19 | When I follow "Unblock" |
| 20 | 20 | Then I should not see "Unblock" |
| ... | ... | @@ -24,7 +24,7 @@ Feature: unblock button |
| 24 | 24 | | login | name | |
| 25 | 25 | | joaosilva | Joao Silva | |
| 26 | 26 | And I am logged in as "joaosilva" |
| 27 | - And Sample Enterprise is blocked | |
| 27 | + And enterprise "Sample Enterprise" is blocked | |
| 28 | 28 | When I am on Sample Enterprise's homepage |
| 29 | 29 | Then I should not see "Unblock" |
| 30 | 30 | ... | ... |
lib/noosfero/plugin.rb
| ... | ... | @@ -40,7 +40,11 @@ class Noosfero::Plugin |
| 40 | 40 | end |
| 41 | 41 | |
| 42 | 42 | def root_path |
| 43 | - Rails.root+'/plugins/'+public_name | |
| 43 | + File.join(RAILS_ROOT, 'plugins', public_name) | |
| 44 | + end | |
| 45 | + | |
| 46 | + def view_path | |
| 47 | + File.join(root_path,'views') | |
| 44 | 48 | end |
| 45 | 49 | |
| 46 | 50 | # Here the developer should specify the meta-informations that the plugin can |
| ... | ... | @@ -61,11 +65,6 @@ class Noosfero::Plugin |
| 61 | 65 | end |
| 62 | 66 | end |
| 63 | 67 | |
| 64 | - def expanded_template(file_path, locals = {}) | |
| 65 | - views_path = "#{RAILS_ROOT}/plugins/#{self.class.public_name}/views" | |
| 66 | - ERB.new(File.read("#{views_path}/#{file_path}")).result(binding) | |
| 67 | - end | |
| 68 | - | |
| 69 | 68 | # Here the developer may specify the events to which the plugins can |
| 70 | 69 | # register and must return true or false. The default value must be false. |
| 71 | 70 | |
| ... | ... | @@ -92,7 +91,7 @@ class Noosfero::Plugin |
| 92 | 91 | # returns = { :title => title, :id => id, :content => content, :start => start } |
| 93 | 92 | # title = name that will be displayed. |
| 94 | 93 | # id = div id. |
| 95 | - # content = content of the tab (use expanded_template method to import content from another file). | |
| 94 | + # content = lambda block that creates a html code. | |
| 96 | 95 | # start = boolean that specifies if the tab must come before noosfero tabs (optional). |
| 97 | 96 | def profile_tabs |
| 98 | 97 | nil |
| ... | ... | @@ -104,6 +103,12 @@ class Noosfero::Plugin |
| 104 | 103 | nil |
| 105 | 104 | end |
| 106 | 105 | |
| 106 | + # -> Adds content to calalog list item | |
| 107 | + # returns = lambda block that creates a html code | |
| 108 | + def catalog_list_item_extras(item) | |
| 109 | + nil | |
| 110 | + end | |
| 111 | + | |
| 107 | 112 | # -> Adds content to products info |
| 108 | 113 | # returns = lambda block that creates a html code |
| 109 | 114 | def product_info_extras(product) |
| ... | ... | @@ -116,13 +121,21 @@ class Noosfero::Plugin |
| 116 | 121 | nil |
| 117 | 122 | end |
| 118 | 123 | |
| 124 | + # -> Adds a property to the product on asset products | |
| 125 | + # returns = {:name => name, :content => content} | |
| 126 | + # name = Name of the property | |
| 127 | + # content = lambda block that creates an html | |
| 128 | + def asset_product_properties(product) | |
| 129 | + nil | |
| 130 | + end | |
| 131 | + | |
| 119 | 132 | # -> Adds content to the beginning of the page |
| 120 | 133 | # returns = lambda block that creates html code or raw rhtml/html.erb |
| 121 | 134 | def body_beginning |
| 122 | 135 | nil |
| 123 | 136 | end |
| 124 | 137 | |
| 125 | - # -> Add plugins' javascript files to application | |
| 138 | + # -> Adds plugins' javascript files to application | |
| 126 | 139 | # returns = ['example1.js', 'javascripts/example2.js', 'example3.js'] |
| 127 | 140 | def js_files |
| 128 | 141 | [] |
| ... | ... | @@ -140,4 +153,43 @@ class Noosfero::Plugin |
| 140 | 153 | raw_content |
| 141 | 154 | end |
| 142 | 155 | |
| 156 | + # -> Adds links to the admin panel | |
| 157 | + # returns = {:title => title, :url => url} | |
| 158 | + # title = name that will be displayed in the link | |
| 159 | + # url = url or route to which the link will redirect to. | |
| 160 | + def admin_panel_links | |
| 161 | + nil | |
| 162 | + end | |
| 163 | + | |
| 164 | + # -> Adds buttons to manage members page | |
| 165 | + # returns = { :title => title, :icon => icon, :url => url } | |
| 166 | + # title = name that will be displayed. | |
| 167 | + # icon = css class name (for customized icons include them in a css file). | |
| 168 | + # url = url or route to which the button will redirect. | |
| 169 | + def manage_members_extra_buttons | |
| 170 | + nil | |
| 171 | + end | |
| 172 | + | |
| 173 | + # This is a generic hotspot for all controllers on Noosfero. | |
| 174 | + # If any plugin wants to define filters to run on any controller, the name of | |
| 175 | + # the hotspot must be in the following form: <underscored_controller_name>_filters. | |
| 176 | + # Example: for ProfileController the hotspot is profile_controller_filters | |
| 177 | + # | |
| 178 | + # -> Adds a filter to a controller | |
| 179 | + # returns = { :type => type, | |
| 180 | + # :method_name => method_name, | |
| 181 | + # :options => {:opt1 => opt1, :opt2 => opt2}, | |
| 182 | + # :block => Proc or lambda block} | |
| 183 | + # type = 'before_filter' or 'after_filter' | |
| 184 | + # method_name = The name of the filter | |
| 185 | + # option = Filter options, like :only or :except | |
| 186 | + # block = Block that the filter will call | |
| 187 | + def method_missing(method, *args, &block) | |
| 188 | + if method.to_s =~ /^(.+)_controller_filters$/ | |
| 189 | + [] | |
| 190 | + else | |
| 191 | + super | |
| 192 | + end | |
| 193 | + end | |
| 194 | + | |
| 143 | 195 | end | ... | ... |
lib/noosfero/plugin/context.rb
plugins/bsc/controllers/bsc_plugin_environment_controller.rb
0 → 100644
| ... | ... | @@ -0,0 +1,35 @@ |
| 1 | +class BscPluginEnvironmentController < AdminController | |
| 2 | + | |
| 3 | + def new | |
| 4 | + @bsc = BscPlugin::Bsc.new(params[:profile_data]) | |
| 5 | + if request.post? && @bsc.valid? | |
| 6 | + @bsc.user = current_user | |
| 7 | + @bsc.save! | |
| 8 | + @bsc.add_admin(user) | |
| 9 | + session[:notice] = _('Your Bsc was created.') | |
| 10 | + redirect_to :controller => 'profile_editor', :profile => @bsc.identifier | |
| 11 | + end | |
| 12 | + end | |
| 13 | + | |
| 14 | + def save_validations | |
| 15 | + enterprises = [Enterprise.find(params[:q].split(','))].flatten | |
| 16 | + | |
| 17 | + begin | |
| 18 | + enterprises.each { |enterprise| enterprise.validated = true ; enterprise.save! } | |
| 19 | + session[:notice] = _('Enterprises validated.') | |
| 20 | + redirect_to :controller => 'admin_panel' | |
| 21 | + rescue Exception => ex | |
| 22 | + session[:notice] = _('Enterprise validations couldn\'t be saved.') | |
| 23 | + logger.info ex | |
| 24 | + redirect_to :action => 'validate_enterprises' | |
| 25 | + end | |
| 26 | + end | |
| 27 | + | |
| 28 | + def search_enterprise | |
| 29 | + render :text => Enterprise.not_validated.find(:all, :conditions => ["type <> 'BscPlugin::Bsc' AND (name LIKE ? OR identifier LIKE ?)", "%#{params[:q]}%", "%#{params[:q]}%"]). | |
| 30 | + map {|enterprise| {:id => enterprise.id, :name => enterprise.name} }. | |
| 31 | + to_json | |
| 32 | + end | |
| 33 | + | |
| 34 | +end | |
| 35 | + | ... | ... |
plugins/bsc/controllers/bsc_plugin_myprofile_controller.rb
0 → 100644
| ... | ... | @@ -0,0 +1,88 @@ |
| 1 | +class BscPluginMyprofileController < MyProfileController | |
| 2 | + | |
| 3 | + def manage_associated_enterprises | |
| 4 | + @associated_enterprises = profile.enterprises | |
| 5 | + @pending_enterprises = profile.enterprise_requests.pending.map(&:enterprise) | |
| 6 | + end | |
| 7 | + | |
| 8 | + def search_enterprise | |
| 9 | + render :text => environment.enterprises.find(:all, :conditions => ["type <> 'BscPlugin::Bsc' AND (LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?)", "%#{params[:q]}%", "%#{params[:q]}%"]). | |
| 10 | + select { |enterprise| enterprise.bsc.nil? && !profile.already_requested?(enterprise)}. | |
| 11 | + map {|enterprise| {:id => enterprise.id, :name => enterprise.name} }. | |
| 12 | + to_json | |
| 13 | + end | |
| 14 | + | |
| 15 | + def save_associations | |
| 16 | + enterprises = [Enterprise.find(params[:q].split(','))].flatten | |
| 17 | + to_remove = profile.enterprises - enterprises | |
| 18 | + to_add = enterprises - profile.enterprises | |
| 19 | + | |
| 20 | + to_remove.each do |enterprise| | |
| 21 | + enterprise.bsc = nil | |
| 22 | + enterprise.save! | |
| 23 | + profile.enterprises.delete(enterprise) | |
| 24 | + end | |
| 25 | + | |
| 26 | + to_add.each do |enterprise| | |
| 27 | + if enterprise.enabled | |
| 28 | + BscPlugin::AssociateEnterprise.create!(:requestor => user, :target => enterprise, :bsc => profile) | |
| 29 | + else | |
| 30 | + enterprise.bsc = profile | |
| 31 | + enterprise.save! | |
| 32 | + profile.enterprises << enterprise | |
| 33 | + end | |
| 34 | + end | |
| 35 | + | |
| 36 | + session[:notice] = _('This Bsc associations were saved successfully.') | |
| 37 | + begin | |
| 38 | + redirect_to :controller => 'profile_editor' | |
| 39 | + rescue Exception => ex | |
| 40 | + session[:notice] = _('This Bsc associations couldn\'t be saved.') | |
| 41 | + logger.info ex | |
| 42 | + redirect_to :action => 'manage_associated_enterprises' | |
| 43 | + end | |
| 44 | + end | |
| 45 | + | |
| 46 | + def similar_enterprises | |
| 47 | + name = params[:name] | |
| 48 | + city = params[:city] | |
| 49 | + | |
| 50 | + result = [] | |
| 51 | + if !name.blank? | |
| 52 | + enterprises = (profile.environment.enterprises - profile.enterprises).select { |enterprise| enterprise.bsc_id.nil? && enterprise.city == city && enterprise.name.downcase.include?(name.downcase)} | |
| 53 | + result = enterprises.inject(result) {|result, enterprise| result << [enterprise.id, enterprise.name]} | |
| 54 | + end | |
| 55 | + render :text => result.to_json | |
| 56 | + end | |
| 57 | + | |
| 58 | + def transfer_ownership | |
| 59 | + role = Profile::Roles.admin(profile.environment.id) | |
| 60 | + @roles = [role] | |
| 61 | + if request.post? | |
| 62 | + person = Person.find(params['q_'+role.key]) | |
| 63 | + | |
| 64 | + profile.admins.map { |admin| profile.remove_admin(admin) } | |
| 65 | + profile.add_admin(person) | |
| 66 | + | |
| 67 | + BscPlugin::Mailer.deliver_admin_notification(person, profile) | |
| 68 | + | |
| 69 | + session[:notice] = _('Enterprise ownership transferred.') | |
| 70 | + redirect_to :controller => 'profile_editor' | |
| 71 | + end | |
| 72 | + end | |
| 73 | + | |
| 74 | + def create_enterprise | |
| 75 | + @create_enterprise = CreateEnterprise.new(params[:create_enterprise]) | |
| 76 | + @create_enterprise.requestor = user | |
| 77 | + @create_enterprise.target = environment | |
| 78 | + @create_enterprise.bsc_id = profile.id | |
| 79 | + @create_enterprise.enabled = true | |
| 80 | + @create_enterprise.validated = false | |
| 81 | + if request.post? && @create_enterprise.valid? | |
| 82 | + @create_enterprise.perform | |
| 83 | + session[:notice] = _('Enterprise was created in association with %s.') % profile.name | |
| 84 | + redirect_to :controller => 'profile_editor', :profile => @create_enterprise.identifier | |
| 85 | + end | |
| 86 | + end | |
| 87 | + | |
| 88 | +end | ... | ... |
plugins/bsc/db/migrate/20110609143043_add_bsc_to_enterprise.rb
0 → 100644
plugins/bsc/db/migrate/20110614183624_add_bsc_to_tasks.rb
0 → 100644
| ... | ... | @@ -0,0 +1,121 @@ |
| 1 | +require_dependency 'ext/enterprise' | |
| 2 | +require_dependency 'ext/product' | |
| 3 | + | |
| 4 | +class BscPlugin < Noosfero::Plugin | |
| 5 | + | |
| 6 | + Bsc | |
| 7 | + | |
| 8 | + def self.plugin_name | |
| 9 | + "Bsc" | |
| 10 | + end | |
| 11 | + | |
| 12 | + def self.plugin_description | |
| 13 | + _("Adds the Bsc feature") | |
| 14 | + end | |
| 15 | + | |
| 16 | + def admin_panel_links | |
| 17 | + [{:title => _('Create Bsc'), :url => {:controller => 'bsc_plugin_environment', :action => 'new'}}, | |
| 18 | + {:title => _('Validate Enterprises'), :url => {:controller => 'bsc_plugin_environment', :action => 'validate_enterprises'}} ] | |
| 19 | + end | |
| 20 | + | |
| 21 | + def control_panel_buttons | |
| 22 | + buttons = [] | |
| 23 | + buttons << {:title => _("Manage associated enterprises"), :icon => 'bsc-enterprises', :url => {:controller => 'bsc_plugin_myprofile', :action => 'manage_associated_enterprises'}} if bsc?(context.profile) | |
| 24 | + buttons << {:title => _('Transfer ownership'), :icon => 'transfer-enterprise-ownership', :url => {:controller => 'bsc_plugin_myprofile', :action => 'transfer_ownership'}} if context.profile.enterprise? | |
| 25 | + buttons | |
| 26 | + end | |
| 27 | + | |
| 28 | + def manage_members_extra_buttons | |
| 29 | + {:title => _('Transfer ownership'), :icon => '', :url => {:controller => 'bsc_plugin_myprofile', :action => 'transfer_enterprises_management'}} if context.profile.enterprise? | |
| 30 | + end | |
| 31 | + | |
| 32 | + def stylesheet? | |
| 33 | + true | |
| 34 | + end | |
| 35 | + | |
| 36 | + def catalog_list_item_extras(product) | |
| 37 | + if bsc?(context.profile) | |
| 38 | + enterprise = product.enterprise | |
| 39 | + if is_member_of_any_bsc?(context.user) | |
| 40 | + lambda {link_to(enterprise.short_name, enterprise.url, :class => 'bsc-catalog-enterprise-link')} | |
| 41 | + else | |
| 42 | + lambda {enterprise.short_name} | |
| 43 | + end | |
| 44 | + end | |
| 45 | + end | |
| 46 | + | |
| 47 | + def profile_controller_filters | |
| 48 | + if profile | |
| 49 | + special_enterprise = profile.enterprise? && !profile.validated && profile.bsc | |
| 50 | + is_member_of_any_bsc = is_member_of_any_bsc?(context.user) | |
| 51 | + block = lambda { | |
| 52 | + render_access_denied if special_enterprise && !is_member_of_any_bsc | |
| 53 | + } | |
| 54 | + | |
| 55 | + [{ :type => 'before_filter', :method_name => 'bsc_access', :block => block }] | |
| 56 | + else | |
| 57 | + [] | |
| 58 | + end | |
| 59 | + end | |
| 60 | + | |
| 61 | + def content_viewer_controller_filters | |
| 62 | + if profile | |
| 63 | + special_enterprise = profile.enterprise? && !profile.validated && profile.bsc | |
| 64 | + is_member_of_any_bsc = is_member_of_any_bsc?(context.user) | |
| 65 | + block = lambda { | |
| 66 | + render_access_denied if special_enterprise && !is_member_of_any_bsc | |
| 67 | + } | |
| 68 | + | |
| 69 | + [{ :type => 'before_filter', :method_name => 'bsc_access', :block => block }] | |
| 70 | + else | |
| 71 | + [] | |
| 72 | + end | |
| 73 | + end | |
| 74 | + | |
| 75 | + def profile_editor_controller_filters | |
| 76 | + if context.user | |
| 77 | + is_not_admin = !context.environment.admins.include?(context.user) | |
| 78 | + [{ :type => 'before_filter', | |
| 79 | + :method_name => 'bsc_destroy_access', | |
| 80 | + :options => {:only => :destroy_profile}, | |
| 81 | + :block => lambda { render_access_denied if is_not_admin } }] | |
| 82 | + else | |
| 83 | + [] | |
| 84 | + end | |
| 85 | + end | |
| 86 | + | |
| 87 | + def asset_product_properties(product) | |
| 88 | + properties = [] | |
| 89 | + properties << { :name => _('Bsc'), :content => lambda { link_to(product.bsc.name, product.bsc.url) } } if product.bsc | |
| 90 | + if product.enterprise.validated || is_member_of_any_bsc?(context.user) | |
| 91 | + content = lambda { link_to_homepage(product.enterprise.name, product.enterprise.identifier) } | |
| 92 | + else | |
| 93 | + content = lambda { product.enterprise.name } | |
| 94 | + end | |
| 95 | + properties << { :name => _('Supplier'), :content => content } | |
| 96 | + end | |
| 97 | + | |
| 98 | + def profile_tabs | |
| 99 | + if bsc?(context.profile) | |
| 100 | + { :title => _("Contact"), | |
| 101 | + :id => 'bsc-contact', | |
| 102 | + :content => lambda { render :partial => 'profile_tab' }, | |
| 103 | + :start => true } | |
| 104 | + end | |
| 105 | + end | |
| 106 | + | |
| 107 | + private | |
| 108 | + | |
| 109 | + def bsc?(profile) | |
| 110 | + profile.kind_of?(BscPlugin::Bsc) | |
| 111 | + end | |
| 112 | + | |
| 113 | + def is_member_of_any_bsc?(user) | |
| 114 | + BscPlugin::Bsc.all.any? { |bsc| bsc.members.include?(user) } | |
| 115 | + end | |
| 116 | + | |
| 117 | + def profile | |
| 118 | + context.environment.profiles.find_by_identifier(context.params[:profile]) | |
| 119 | + end | |
| 120 | + | |
| 121 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,49 @@ |
| 1 | +class BscPlugin::AssociateEnterprise < Task | |
| 2 | + | |
| 3 | + alias :enterprise :target | |
| 4 | + | |
| 5 | + belongs_to :bsc, :class_name => 'BscPlugin::Bsc' | |
| 6 | + | |
| 7 | + validates_presence_of :bsc | |
| 8 | + | |
| 9 | + def title | |
| 10 | + _("BSC association") | |
| 11 | + end | |
| 12 | + | |
| 13 | + def linked_subject | |
| 14 | + {:text => bsc.name, :url => bsc.url} | |
| 15 | + end | |
| 16 | + | |
| 17 | + def information | |
| 18 | + {:message => _('%{requestor} wants to associate this enterprise with %{linked_subject}.')} | |
| 19 | + end | |
| 20 | + | |
| 21 | + def icon | |
| 22 | + src = bsc.image ? bsc.image.public_filename(:minor) : '/images/icons-app/enterprise-minor.png' | |
| 23 | + {:type => :defined_image, :src => src, :name => bsc.name} | |
| 24 | + end | |
| 25 | + | |
| 26 | + def reject_details | |
| 27 | + true | |
| 28 | + end | |
| 29 | + | |
| 30 | + def perform | |
| 31 | + bsc.enterprises << enterprise | |
| 32 | + end | |
| 33 | + | |
| 34 | + def task_finished_message | |
| 35 | + _('%{enterprise} accepted your request to associate it with %{bsc}.') % {:enterprise => enterprise.name, :bsc => bsc.name} | |
| 36 | + end | |
| 37 | + | |
| 38 | + def task_cancelled_message | |
| 39 | + message = _("%{enterprise} rejected your request to associate it with %{bsc}.") % {:enterprise => enterprise.name, :bsc => bsc.name} | |
| 40 | + if !reject_explanation.blank? | |
| 41 | + message += " " + _("Here is the reject explanation left by the administrator:\n\n%{reject_explanation}") % {:reject_explanation => reject_explanation} | |
| 42 | + end | |
| 43 | + end | |
| 44 | + | |
| 45 | + def target_notification_message | |
| 46 | + _('%{requestor} wants assoaciate %{bsc} as your BSC.') % {:requestor => requestor.name, :enterprise => enterprise.name, :bsc => bsc.name} | |
| 47 | + end | |
| 48 | + | |
| 49 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,42 @@ |
| 1 | +class BscPlugin::Bsc < Enterprise | |
| 2 | + | |
| 3 | + has_many :enterprises | |
| 4 | + has_many :enterprise_requests, :class_name => 'BscPlugin::AssociateEnterprise' | |
| 5 | + | |
| 6 | + validates_presence_of :nickname | |
| 7 | + validates_presence_of :company_name | |
| 8 | + validates_presence_of :cnpj | |
| 9 | + validates_uniqueness_of :nickname | |
| 10 | + validates_uniqueness_of :company_name | |
| 11 | + validates_uniqueness_of :cnpj | |
| 12 | + | |
| 13 | + before_validation do |bsc| | |
| 14 | + bsc.name = bsc.business_name || 'Sample name' | |
| 15 | + end | |
| 16 | + | |
| 17 | + def already_requested?(enterprise) | |
| 18 | + enterprise_requests.pending.map(&:enterprise).include?(enterprise) | |
| 19 | + end | |
| 20 | + | |
| 21 | + def enterprises_to_json | |
| 22 | + enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} }.to_json | |
| 23 | + end | |
| 24 | + | |
| 25 | + def control_panel_settings_button | |
| 26 | + {:title => _('Bsc info and settings'), :icon => 'edit-profile-enterprise'} | |
| 27 | + end | |
| 28 | + | |
| 29 | + def products(reload_flag=false) | |
| 30 | + reload if reload_flag | |
| 31 | + enterprises.map { |enterprise| enterprise.products }.flatten | |
| 32 | + end | |
| 33 | + | |
| 34 | + def create_product? | |
| 35 | + false | |
| 36 | + end | |
| 37 | + | |
| 38 | + def self.identification | |
| 39 | + 'Bsc' | |
| 40 | + end | |
| 41 | + | |
| 42 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,13 @@ |
| 1 | +class BscPlugin::Mailer < Noosfero::Plugin::MailerBase | |
| 2 | + | |
| 3 | + prepend_view_path(BscPlugin.root_path+'/views') | |
| 4 | + | |
| 5 | + def admin_notification(admin, bsc) | |
| 6 | + domain = bsc.hostname || bsc.environment.default_hostname | |
| 7 | + recipients admin.contact_email | |
| 8 | + from 'no-reply@' + domain | |
| 9 | + subject _("[%s] Bsc management transferred to you.") % bsc.name | |
| 10 | + content_type 'text/html' | |
| 11 | + body :bsc => bsc | |
| 12 | + end | |
| 13 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +require_dependency 'enterprise' | |
| 2 | + | |
| 3 | +class Enterprise | |
| 4 | + belongs_to :bsc, :class_name => 'BscPlugin::Bsc' | |
| 5 | + FIELDS << 'bsc_id' | |
| 6 | + FIELDS << 'enabled' | |
| 7 | + FIELDS << 'validated' | |
| 8 | + | |
| 9 | + named_scope :validated, :conditions => {:validated => true} | |
| 10 | + named_scope :not_validated, :conditions => {:validated => false} | |
| 11 | +end | ... | ... |
978 Bytes
2.05 KB
3.84 KB
| ... | ... | @@ -0,0 +1,1309 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
| 2 | +<svg | |
| 3 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | |
| 4 | + xmlns:cc="http://creativecommons.org/ns#" | |
| 5 | + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
| 6 | + xmlns:svg="http://www.w3.org/2000/svg" | |
| 7 | + xmlns="http://www.w3.org/2000/svg" | |
| 8 | + xmlns:xlink="http://www.w3.org/1999/xlink" | |
| 9 | + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |
| 10 | + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |
| 11 | + width="48" | |
| 12 | + height="48" | |
| 13 | + overflow="visible" | |
| 14 | + enable-background="new 0 0 128 129.396" | |
| 15 | + xml:space="preserve" | |
| 16 | + id="svg2" | |
| 17 | + sodipodi:version="0.32" | |
| 18 | + inkscape:version="0.47 r22583" | |
| 19 | + sodipodi:docname="BSC.svg" | |
| 20 | + version="1.0" | |
| 21 | + inkscape:export-filename="/home/tigert/My Downloads/go-home.png" | |
| 22 | + inkscape:export-xdpi="90.000000" | |
| 23 | + inkscape:export-ydpi="90.000000"><metadata | |
| 24 | + id="metadata367"><rdf:RDF><cc:Work | |
| 25 | + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |
| 26 | + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license | |
| 27 | + rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" /><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 | |
| 28 | + rdf:about="http://creativecommons.org/licenses/by-sa/2.0/"><cc:permits | |
| 29 | + rdf:resource="http://web.resource.org/cc/Reproduction" /><cc:permits | |
| 30 | + rdf:resource="http://web.resource.org/cc/Distribution" /><cc:requires | |
| 31 | + rdf:resource="http://web.resource.org/cc/Notice" /><cc:requires | |
| 32 | + rdf:resource="http://web.resource.org/cc/Attribution" /><cc:permits | |
| 33 | + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /><cc:requires | |
| 34 | + rdf:resource="http://web.resource.org/cc/ShareAlike" /></cc:License></rdf:RDF></metadata><defs | |
| 35 | + id="defs365"><linearGradient | |
| 36 | + inkscape:collect="always" | |
| 37 | + id="linearGradient3177"><stop | |
| 38 | + style="stop-color:#729fcf;stop-opacity:1" | |
| 39 | + offset="0" | |
| 40 | + id="stop3179" /><stop | |
| 41 | + style="stop-color:#204a87;stop-opacity:1" | |
| 42 | + offset="1" | |
| 43 | + id="stop3181" /></linearGradient><linearGradient | |
| 44 | + id="linearGradient3171"><stop | |
| 45 | + id="stop3173" | |
| 46 | + offset="0" | |
| 47 | + style="stop-color:#d3d7cf;stop-opacity:1" /><stop | |
| 48 | + id="stop3175" | |
| 49 | + offset="1" | |
| 50 | + style="stop-color:#888a85;stop-opacity:1" /></linearGradient><linearGradient | |
| 51 | + inkscape:collect="always" | |
| 52 | + id="linearGradient5161"><stop | |
| 53 | + style="stop-color:#c17d11;stop-opacity:1;" | |
| 54 | + offset="0" | |
| 55 | + id="stop5163" /><stop | |
| 56 | + style="stop-color:#8f5902;stop-opacity:1" | |
| 57 | + offset="1" | |
| 58 | + id="stop5165" /></linearGradient><linearGradient | |
| 59 | + inkscape:collect="always" | |
| 60 | + id="linearGradient3771"><stop | |
| 61 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 62 | + offset="0" | |
| 63 | + id="stop3773" /><stop | |
| 64 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 65 | + offset="1" | |
| 66 | + id="stop3775" /></linearGradient><linearGradient | |
| 67 | + gradientTransform="matrix(0.314683,0.000000,0.000000,0.314683,4.128264,3.742874)" | |
| 68 | + y2="59.7995" | |
| 69 | + x2="48.046001" | |
| 70 | + y1="117.5205" | |
| 71 | + x1="80.223602" | |
| 72 | + gradientUnits="userSpaceOnUse" | |
| 73 | + id="linearGradient3736"> | |
| 74 | + <stop | |
| 75 | + id="stop3738" | |
| 76 | + style="stop-color:#CCCCCC" | |
| 77 | + offset="0" /> | |
| 78 | + <stop | |
| 79 | + id="stop3740" | |
| 80 | + style="stop-color:#FFFFFF" | |
| 81 | + offset="0.81071424" /> | |
| 82 | + <midPointStop | |
| 83 | + id="midPointStop3742" | |
| 84 | + style="stop-color:#CCCCCC" | |
| 85 | + offset="0" /> | |
| 86 | + <midPointStop | |
| 87 | + id="midPointStop3744" | |
| 88 | + style="stop-color:#CCCCCC" | |
| 89 | + offset="0.5" /> | |
| 90 | + <midPointStop | |
| 91 | + id="midPointStop3746" | |
| 92 | + style="stop-color:#FFFFFF" | |
| 93 | + offset="0.9831" /> | |
| 94 | + </linearGradient><inkscape:perspective | |
| 95 | + sodipodi:type="inkscape:persp3d" | |
| 96 | + inkscape:vp_x="0 : 24 : 1" | |
| 97 | + inkscape:vp_y="0 : 1000 : 0" | |
| 98 | + inkscape:vp_z="48 : 24 : 1" | |
| 99 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 100 | + id="perspective92" /><linearGradient | |
| 101 | + inkscape:collect="always" | |
| 102 | + id="linearGradient5060"><stop | |
| 103 | + style="stop-color:black;stop-opacity:1;" | |
| 104 | + offset="0" | |
| 105 | + id="stop5062" /><stop | |
| 106 | + style="stop-color:black;stop-opacity:0;" | |
| 107 | + offset="1" | |
| 108 | + id="stop5064" /></linearGradient><linearGradient | |
| 109 | + id="linearGradient5048"><stop | |
| 110 | + style="stop-color:black;stop-opacity:0;" | |
| 111 | + offset="0" | |
| 112 | + id="stop5050" /><stop | |
| 113 | + id="stop5056" | |
| 114 | + offset="0.5" | |
| 115 | + style="stop-color:black;stop-opacity:1;" /><stop | |
| 116 | + style="stop-color:black;stop-opacity:0;" | |
| 117 | + offset="1" | |
| 118 | + id="stop5052" /></linearGradient><linearGradient | |
| 119 | + id="linearGradient2406"><stop | |
| 120 | + style="stop-color:#7c7e79;stop-opacity:1;" | |
| 121 | + offset="0" | |
| 122 | + id="stop2408" /><stop | |
| 123 | + id="stop2414" | |
| 124 | + offset="0.1724138" | |
| 125 | + style="stop-color:#848681;stop-opacity:1;" /><stop | |
| 126 | + style="stop-color:#898c86;stop-opacity:1;" | |
| 127 | + offset="1" | |
| 128 | + id="stop2410" /></linearGradient><linearGradient | |
| 129 | + inkscape:collect="always" | |
| 130 | + id="linearGradient2390"><stop | |
| 131 | + style="stop-color:#919191;stop-opacity:1;" | |
| 132 | + offset="0" | |
| 133 | + id="stop2392" /><stop | |
| 134 | + style="stop-color:#919191;stop-opacity:0;" | |
| 135 | + offset="1" | |
| 136 | + id="stop2394" /></linearGradient><linearGradient | |
| 137 | + inkscape:collect="always" | |
| 138 | + id="linearGradient2378"><stop | |
| 139 | + style="stop-color:#575757;stop-opacity:1;" | |
| 140 | + offset="0" | |
| 141 | + id="stop2380" /><stop | |
| 142 | + style="stop-color:#575757;stop-opacity:0;" | |
| 143 | + offset="1" | |
| 144 | + id="stop2382" /></linearGradient><linearGradient | |
| 145 | + inkscape:collect="always" | |
| 146 | + id="linearGradient2368"><stop | |
| 147 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 148 | + offset="0" | |
| 149 | + id="stop2370" /><stop | |
| 150 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 151 | + offset="1" | |
| 152 | + id="stop2372" /></linearGradient><linearGradient | |
| 153 | + inkscape:collect="always" | |
| 154 | + id="linearGradient2349"><stop | |
| 155 | + style="stop-color:#000000;stop-opacity:1;" | |
| 156 | + offset="0" | |
| 157 | + id="stop2351" /><stop | |
| 158 | + style="stop-color:#000000;stop-opacity:0;" | |
| 159 | + offset="1" | |
| 160 | + id="stop2353" /></linearGradient><linearGradient | |
| 161 | + id="linearGradient2341"><stop | |
| 162 | + id="stop2343" | |
| 163 | + offset="0" | |
| 164 | + style="stop-color:#000000;stop-opacity:1;" /><stop | |
| 165 | + id="stop2345" | |
| 166 | + offset="1" | |
| 167 | + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient | |
| 168 | + id="linearGradient2329"><stop | |
| 169 | + style="stop-color:#000000;stop-opacity:0.18556701;" | |
| 170 | + offset="0" | |
| 171 | + id="stop2331" /><stop | |
| 172 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 173 | + offset="1" | |
| 174 | + id="stop2333" /></linearGradient><linearGradient | |
| 175 | + inkscape:collect="always" | |
| 176 | + id="linearGradient2319"><stop | |
| 177 | + style="stop-color:#000000;stop-opacity:1;" | |
| 178 | + offset="0" | |
| 179 | + id="stop2321" /><stop | |
| 180 | + style="stop-color:#000000;stop-opacity:0;" | |
| 181 | + offset="1" | |
| 182 | + id="stop2323" /></linearGradient><linearGradient | |
| 183 | + id="linearGradient2307"><stop | |
| 184 | + style="stop-color:#edd400;stop-opacity:1;" | |
| 185 | + offset="0" | |
| 186 | + id="stop2309" /><stop | |
| 187 | + style="stop-color:#998800;stop-opacity:1;" | |
| 188 | + offset="1" | |
| 189 | + id="stop2311" /></linearGradient><linearGradient | |
| 190 | + inkscape:collect="always" | |
| 191 | + id="linearGradient2299"><stop | |
| 192 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 193 | + offset="0" | |
| 194 | + id="stop2301" /><stop | |
| 195 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 196 | + offset="1" | |
| 197 | + id="stop2303" /></linearGradient><linearGradient | |
| 198 | + id="XMLID_2_" | |
| 199 | + gradientUnits="userSpaceOnUse" | |
| 200 | + x1="80.223602" | |
| 201 | + y1="117.5205" | |
| 202 | + x2="48.046001" | |
| 203 | + y2="59.7995" | |
| 204 | + gradientTransform="matrix(0.314683,0.000000,0.000000,0.314683,4.128264,3.742874)"> | |
| 205 | + <stop | |
| 206 | + offset="0" | |
| 207 | + style="stop-color:#CCCCCC" | |
| 208 | + id="stop17" /> | |
| 209 | + <stop | |
| 210 | + offset="0.9831" | |
| 211 | + style="stop-color:#FFFFFF" | |
| 212 | + id="stop19" /> | |
| 213 | + <midPointStop | |
| 214 | + offset="0" | |
| 215 | + style="stop-color:#CCCCCC" | |
| 216 | + id="midPointStop48" /> | |
| 217 | + <midPointStop | |
| 218 | + offset="0.5" | |
| 219 | + style="stop-color:#CCCCCC" | |
| 220 | + id="midPointStop50" /> | |
| 221 | + <midPointStop | |
| 222 | + offset="0.9831" | |
| 223 | + style="stop-color:#FFFFFF" | |
| 224 | + id="midPointStop52" /> | |
| 225 | + </linearGradient><linearGradient | |
| 226 | + id="XMLID_39_" | |
| 227 | + gradientUnits="userSpaceOnUse" | |
| 228 | + x1="64.387703" | |
| 229 | + y1="65.124001" | |
| 230 | + x2="64.387703" | |
| 231 | + y2="35.569" | |
| 232 | + gradientTransform="matrix(0.354101,0.000000,0.000000,0.354101,1.638679,-8.364921e-2)"> | |
| 233 | + <stop | |
| 234 | + offset="0" | |
| 235 | + style="stop-color:#FFFFFF" | |
| 236 | + id="stop336" /> | |
| 237 | + <stop | |
| 238 | + offset="0.8539" | |
| 239 | + style="stop-color:#FF6200" | |
| 240 | + id="stop338" /> | |
| 241 | + <stop | |
| 242 | + offset="1" | |
| 243 | + style="stop-color:#F25D00" | |
| 244 | + id="stop340" /> | |
| 245 | + <midPointStop | |
| 246 | + offset="0" | |
| 247 | + style="stop-color:#FFFFFF" | |
| 248 | + id="midPointStop335" /> | |
| 249 | + <midPointStop | |
| 250 | + offset="0.5" | |
| 251 | + style="stop-color:#FFFFFF" | |
| 252 | + id="midPointStop337" /> | |
| 253 | + <midPointStop | |
| 254 | + offset="0.8539" | |
| 255 | + style="stop-color:#FF6200" | |
| 256 | + id="midPointStop339" /> | |
| 257 | + <midPointStop | |
| 258 | + offset="0.5" | |
| 259 | + style="stop-color:#FF6200" | |
| 260 | + id="midPointStop341" /> | |
| 261 | + <midPointStop | |
| 262 | + offset="1" | |
| 263 | + style="stop-color:#F25D00" | |
| 264 | + id="midPointStop343" /> | |
| 265 | + </linearGradient><radialGradient | |
| 266 | + inkscape:collect="always" | |
| 267 | + xlink:href="#linearGradient2307" | |
| 268 | + id="radialGradient2313" | |
| 269 | + cx="19.985598" | |
| 270 | + cy="36.77816" | |
| 271 | + fx="19.985598" | |
| 272 | + fy="36.77816" | |
| 273 | + r="1.0821035" | |
| 274 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.565787)" | |
| 275 | + gradientUnits="userSpaceOnUse" /><radialGradient | |
| 276 | + inkscape:collect="always" | |
| 277 | + xlink:href="#linearGradient2319" | |
| 278 | + id="radialGradient2325" | |
| 279 | + cx="20.443665" | |
| 280 | + cy="37.425829" | |
| 281 | + fx="20.443665" | |
| 282 | + fy="37.425829" | |
| 283 | + r="1.0821035" | |
| 284 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.731106)" | |
| 285 | + gradientUnits="userSpaceOnUse" /><radialGradient | |
| 286 | + inkscape:collect="always" | |
| 287 | + xlink:href="#linearGradient2349" | |
| 288 | + id="radialGradient2355" | |
| 289 | + cx="24.023088" | |
| 290 | + cy="40.56913" | |
| 291 | + fx="24.023088" | |
| 292 | + fy="40.56913" | |
| 293 | + r="16.28684" | |
| 294 | + gradientTransform="matrix(1.000000,0.000000,0.000000,0.431250,1.157278e-15,23.07369)" | |
| 295 | + gradientUnits="userSpaceOnUse" /><linearGradient | |
| 296 | + inkscape:collect="always" | |
| 297 | + xlink:href="#linearGradient2390" | |
| 298 | + id="linearGradient2396" | |
| 299 | + x1="30.603519" | |
| 300 | + y1="37.337803" | |
| 301 | + x2="30.603519" | |
| 302 | + y2="36.112415" | |
| 303 | + gradientUnits="userSpaceOnUse" | |
| 304 | + gradientTransform="matrix(1.263867,0,0,0.859794,-6.499556,8.390924)" /><linearGradient | |
| 305 | + inkscape:collect="always" | |
| 306 | + xlink:href="#linearGradient5048" | |
| 307 | + id="linearGradient3710" | |
| 308 | + gradientUnits="userSpaceOnUse" | |
| 309 | + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" | |
| 310 | + x1="302.85715" | |
| 311 | + y1="366.64789" | |
| 312 | + x2="302.85715" | |
| 313 | + y2="609.50507" /><radialGradient | |
| 314 | + inkscape:collect="always" | |
| 315 | + xlink:href="#linearGradient5060" | |
| 316 | + id="radialGradient3712" | |
| 317 | + gradientUnits="userSpaceOnUse" | |
| 318 | + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" | |
| 319 | + cx="605.71429" | |
| 320 | + cy="486.64789" | |
| 321 | + fx="605.71429" | |
| 322 | + fy="486.64789" | |
| 323 | + r="117.14286" /><radialGradient | |
| 324 | + inkscape:collect="always" | |
| 325 | + xlink:href="#linearGradient5060" | |
| 326 | + id="radialGradient3714" | |
| 327 | + gradientUnits="userSpaceOnUse" | |
| 328 | + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" | |
| 329 | + cx="605.71429" | |
| 330 | + cy="486.64789" | |
| 331 | + fx="605.71429" | |
| 332 | + fy="486.64789" | |
| 333 | + r="117.14286" /><linearGradient | |
| 334 | + inkscape:collect="always" | |
| 335 | + xlink:href="#XMLID_2_" | |
| 336 | + id="linearGradient3716" | |
| 337 | + gradientUnits="userSpaceOnUse" | |
| 338 | + gradientTransform="matrix(0.336922,0,0,0.166888,-42.01712,15.46151)" | |
| 339 | + x1="52.006104" | |
| 340 | + y1="166.1331" | |
| 341 | + x2="14.049017" | |
| 342 | + y2="-42.218513" /><linearGradient | |
| 343 | + inkscape:collect="always" | |
| 344 | + xlink:href="#linearGradient2329" | |
| 345 | + id="linearGradient3718" | |
| 346 | + gradientUnits="userSpaceOnUse" | |
| 347 | + gradientTransform="matrix(0.898789,0,0,1.071914,-59.521975,-2.080838)" | |
| 348 | + x1="17.602522" | |
| 349 | + y1="26.057423" | |
| 350 | + x2="17.682528" | |
| 351 | + y2="32.654099" /><radialGradient | |
| 352 | + inkscape:collect="always" | |
| 353 | + xlink:href="#linearGradient2378" | |
| 354 | + id="radialGradient3720" | |
| 355 | + gradientUnits="userSpaceOnUse" | |
| 356 | + gradientTransform="matrix(1.125263,-3.585417e-8,4.269819e-8,1.340059,-63.006704,1.355395)" | |
| 357 | + cx="24.195112" | |
| 358 | + cy="10.577631" | |
| 359 | + fx="24.195112" | |
| 360 | + fy="10.577631" | |
| 361 | + r="15.242914" /><linearGradient | |
| 362 | + inkscape:collect="always" | |
| 363 | + xlink:href="#linearGradient2406" | |
| 364 | + id="linearGradient3722" | |
| 365 | + gradientUnits="userSpaceOnUse" | |
| 366 | + gradientTransform="matrix(0.888785,0,0,1.08932,-57.58901,-1.524336)" | |
| 367 | + x1="17.850183" | |
| 368 | + y1="28.939463" | |
| 369 | + x2="19.040216" | |
| 370 | + y2="41.03223" /><radialGradient | |
| 371 | + inkscape:collect="always" | |
| 372 | + xlink:href="#linearGradient2319" | |
| 373 | + id="radialGradient3724" | |
| 374 | + gradientUnits="userSpaceOnUse" | |
| 375 | + gradientTransform="matrix(1.125263,0,0,0.982744,-63.428678,0.731106)" | |
| 376 | + cx="20.443665" | |
| 377 | + cy="37.425829" | |
| 378 | + fx="20.443665" | |
| 379 | + fy="37.425829" | |
| 380 | + r="1.0821035" /><radialGradient | |
| 381 | + inkscape:collect="always" | |
| 382 | + xlink:href="#linearGradient2307" | |
| 383 | + id="radialGradient3726" | |
| 384 | + gradientUnits="userSpaceOnUse" | |
| 385 | + gradientTransform="matrix(1.125263,0,0,0.982744,-63.428678,0.565787)" | |
| 386 | + cx="19.985598" | |
| 387 | + cy="36.77816" | |
| 388 | + fx="19.985598" | |
| 389 | + fy="36.77816" | |
| 390 | + r="1.0821035" /><linearGradient | |
| 391 | + inkscape:collect="always" | |
| 392 | + xlink:href="#XMLID_39_" | |
| 393 | + id="linearGradient3728" | |
| 394 | + gradientUnits="userSpaceOnUse" | |
| 395 | + gradientTransform="matrix(0.354101,0,0,0.354101,-58.361321,-0.08364921)" | |
| 396 | + x1="64.387703" | |
| 397 | + y1="65.124001" | |
| 398 | + x2="64.387703" | |
| 399 | + y2="35.569" /><radialGradient | |
| 400 | + inkscape:collect="always" | |
| 401 | + xlink:href="#linearGradient2299" | |
| 402 | + id="radialGradient3730" | |
| 403 | + gradientUnits="userSpaceOnUse" | |
| 404 | + gradientTransform="matrix(4.100086,0,0,4.201322,-85.41506,-78.53967)" | |
| 405 | + cx="7.5326638" | |
| 406 | + cy="24.202574" | |
| 407 | + fx="7.5326638" | |
| 408 | + fy="24.202574" | |
| 409 | + r="8.2452128" /><radialGradient | |
| 410 | + inkscape:collect="always" | |
| 411 | + xlink:href="#linearGradient2341" | |
| 412 | + id="radialGradient3732" | |
| 413 | + gradientUnits="userSpaceOnUse" | |
| 414 | + gradientTransform="matrix(4.100086,0,0,-4.201322,-65.198109,105.3535)" | |
| 415 | + cx="11.68129" | |
| 416 | + cy="19.554111" | |
| 417 | + fx="11.68129" | |
| 418 | + fy="19.554111" | |
| 419 | + r="8.2452126" /><radialGradient | |
| 420 | + inkscape:collect="always" | |
| 421 | + xlink:href="#linearGradient2368" | |
| 422 | + id="radialGradient3734" | |
| 423 | + gradientUnits="userSpaceOnUse" | |
| 424 | + gradientTransform="matrix(3.751495,0,0,3.147818,-142.00907,-65.70704)" | |
| 425 | + cx="29.913452" | |
| 426 | + cy="30.442923" | |
| 427 | + fx="29.913452" | |
| 428 | + fy="30.442923" | |
| 429 | + r="4.0018832" /><linearGradient | |
| 430 | + inkscape:collect="always" | |
| 431 | + xlink:href="#linearGradient3736" | |
| 432 | + id="linearGradient4355" | |
| 433 | + gradientUnits="userSpaceOnUse" | |
| 434 | + gradientTransform="matrix(0.336922,0.000000,0.000000,0.166888,17.98288,15.46151)" | |
| 435 | + x1="49.023571" | |
| 436 | + y1="173.99986" | |
| 437 | + x2="19.343113" | |
| 438 | + y2="-5.7614088" /><radialGradient | |
| 439 | + inkscape:collect="always" | |
| 440 | + xlink:href="#linearGradient2378" | |
| 441 | + id="radialGradient4379" | |
| 442 | + gradientUnits="userSpaceOnUse" | |
| 443 | + gradientTransform="matrix(-2.7847815e-8,0.91845951,-1.1152723,-3.3815205e-8,39.60096,1.4161083)" | |
| 444 | + cx="28.399611" | |
| 445 | + cy="15.333439" | |
| 446 | + fx="28.399611" | |
| 447 | + fy="15.333439" | |
| 448 | + r="15.242914" /><radialGradient | |
| 449 | + inkscape:collect="always" | |
| 450 | + xlink:href="#linearGradient2341" | |
| 451 | + id="radialGradient4473" | |
| 452 | + gradientUnits="userSpaceOnUse" | |
| 453 | + gradientTransform="matrix(-2.0618025,-2.0407128e-7,-3.2411324e-7,3.2746279,61.522713,-37.078328)" | |
| 454 | + cx="11.651313" | |
| 455 | + cy="20.026194" | |
| 456 | + fx="11.651313" | |
| 457 | + fy="20.026194" | |
| 458 | + r="8.2452126" /><radialGradient | |
| 459 | + inkscape:collect="always" | |
| 460 | + xlink:href="#linearGradient2299" | |
| 461 | + id="radialGradient4657" | |
| 462 | + gradientUnits="userSpaceOnUse" | |
| 463 | + gradientTransform="matrix(3.39591,-4.6697806e-7,4.6697814e-7,3.3959105,-19.762019,-53.978222)" | |
| 464 | + cx="8.027895" | |
| 465 | + cy="24.287516" | |
| 466 | + fx="8.027895" | |
| 467 | + fy="24.287516" | |
| 468 | + r="8.2452128" /><linearGradient | |
| 469 | + inkscape:collect="always" | |
| 470 | + xlink:href="#linearGradient2329" | |
| 471 | + id="linearGradient4661" | |
| 472 | + gradientUnits="userSpaceOnUse" | |
| 473 | + gradientTransform="matrix(0.67409175,0,0,0.92339382,5.1085187,4.2256015)" | |
| 474 | + x1="15.415529" | |
| 475 | + y1="23.833527" | |
| 476 | + x2="16.899008" | |
| 477 | + y2="33.219193" /><linearGradient | |
| 478 | + inkscape:collect="always" | |
| 479 | + xlink:href="#linearGradient3771" | |
| 480 | + id="linearGradient4665" | |
| 481 | + gradientUnits="userSpaceOnUse" | |
| 482 | + gradientTransform="translate(-1,1)" | |
| 483 | + x1="26.5" | |
| 484 | + y1="36.5" | |
| 485 | + x2="24.5" | |
| 486 | + y2="28.5" /><radialGradient | |
| 487 | + inkscape:collect="always" | |
| 488 | + xlink:href="#linearGradient2368" | |
| 489 | + id="radialGradient4669" | |
| 490 | + gradientUnits="userSpaceOnUse" | |
| 491 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460078,-26.062392)" | |
| 492 | + cx="29.913452" | |
| 493 | + cy="30.442923" | |
| 494 | + fx="29.913452" | |
| 495 | + fy="30.442923" | |
| 496 | + r="4.0018832" /><radialGradient | |
| 497 | + inkscape:collect="always" | |
| 498 | + xlink:href="#linearGradient5060" | |
| 499 | + id="radialGradient4693" | |
| 500 | + gradientUnits="userSpaceOnUse" | |
| 501 | + gradientTransform="matrix(-2.6052648,0,0,1.9930785,128.02878,-872.62632)" | |
| 502 | + cx="605.71429" | |
| 503 | + cy="486.64789" | |
| 504 | + fx="605.71429" | |
| 505 | + fy="486.64789" | |
| 506 | + r="117.14286" /><linearGradient | |
| 507 | + inkscape:collect="always" | |
| 508 | + xlink:href="#linearGradient5048" | |
| 509 | + id="linearGradient4697" | |
| 510 | + gradientUnits="userSpaceOnUse" | |
| 511 | + gradientTransform="matrix(2.3780477,0,0,1.969706,-1808.0185,-845.99583)" | |
| 512 | + x1="304.19855" | |
| 513 | + y1="357.48697" | |
| 514 | + x2="304.19855" | |
| 515 | + y2="603.21515" /><radialGradient | |
| 516 | + inkscape:collect="always" | |
| 517 | + xlink:href="#linearGradient5060" | |
| 518 | + id="radialGradient4701" | |
| 519 | + gradientUnits="userSpaceOnUse" | |
| 520 | + gradientTransform="matrix(2.6052656,0,0,1.9930785,-2039.1167,-872.62632)" | |
| 521 | + cx="605.71429" | |
| 522 | + cy="486.64789" | |
| 523 | + fx="605.71429" | |
| 524 | + fy="486.64789" | |
| 525 | + r="117.14286" /><linearGradient | |
| 526 | + inkscape:collect="always" | |
| 527 | + xlink:href="#linearGradient5048" | |
| 528 | + id="linearGradient4765" | |
| 529 | + gradientUnits="userSpaceOnUse" | |
| 530 | + gradientTransform="matrix(2.3780477,0,0,1.969706,-1808.0185,-845.99583)" | |
| 531 | + x1="304.19855" | |
| 532 | + y1="357.48697" | |
| 533 | + x2="304.19855" | |
| 534 | + y2="603.21515" /><radialGradient | |
| 535 | + inkscape:collect="always" | |
| 536 | + xlink:href="#linearGradient5060" | |
| 537 | + id="radialGradient4767" | |
| 538 | + gradientUnits="userSpaceOnUse" | |
| 539 | + gradientTransform="matrix(2.6052656,0,0,1.9930785,-2039.1167,-872.62632)" | |
| 540 | + cx="605.71429" | |
| 541 | + cy="486.64789" | |
| 542 | + fx="605.71429" | |
| 543 | + fy="486.64789" | |
| 544 | + r="117.14286" /><radialGradient | |
| 545 | + inkscape:collect="always" | |
| 546 | + xlink:href="#linearGradient5060" | |
| 547 | + id="radialGradient4769" | |
| 548 | + gradientUnits="userSpaceOnUse" | |
| 549 | + gradientTransform="matrix(-2.6052648,0,0,1.9930785,128.02878,-872.62632)" | |
| 550 | + cx="605.71429" | |
| 551 | + cy="486.64789" | |
| 552 | + fx="605.71429" | |
| 553 | + fy="486.64789" | |
| 554 | + r="117.14286" /><linearGradient | |
| 555 | + inkscape:collect="always" | |
| 556 | + xlink:href="#linearGradient3736" | |
| 557 | + id="linearGradient4771" | |
| 558 | + gradientUnits="userSpaceOnUse" | |
| 559 | + gradientTransform="matrix(0.336922,0,0,0.166888,17.98288,15.46151)" | |
| 560 | + x1="49.023571" | |
| 561 | + y1="173.99986" | |
| 562 | + x2="19.343113" | |
| 563 | + y2="-5.7614088" /><linearGradient | |
| 564 | + inkscape:collect="always" | |
| 565 | + xlink:href="#linearGradient2329" | |
| 566 | + id="linearGradient4773" | |
| 567 | + gradientUnits="userSpaceOnUse" | |
| 568 | + gradientTransform="matrix(0.67409175,0,0,0.92339382,5.1085187,4.2256015)" | |
| 569 | + x1="15.415529" | |
| 570 | + y1="23.833527" | |
| 571 | + x2="16.899008" | |
| 572 | + y2="33.219193" /><radialGradient | |
| 573 | + inkscape:collect="always" | |
| 574 | + xlink:href="#linearGradient2319" | |
| 575 | + id="radialGradient4775" | |
| 576 | + gradientUnits="userSpaceOnUse" | |
| 577 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.731106)" | |
| 578 | + cx="20.443665" | |
| 579 | + cy="37.425829" | |
| 580 | + fx="20.443665" | |
| 581 | + fy="37.425829" | |
| 582 | + r="1.0821035" /><radialGradient | |
| 583 | + inkscape:collect="always" | |
| 584 | + xlink:href="#linearGradient2307" | |
| 585 | + id="radialGradient4777" | |
| 586 | + gradientUnits="userSpaceOnUse" | |
| 587 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.565787)" | |
| 588 | + cx="19.985598" | |
| 589 | + cy="36.77816" | |
| 590 | + fx="19.985598" | |
| 591 | + fy="36.77816" | |
| 592 | + r="1.0821035" /><radialGradient | |
| 593 | + inkscape:collect="always" | |
| 594 | + xlink:href="#linearGradient2368" | |
| 595 | + id="radialGradient4779" | |
| 596 | + gradientUnits="userSpaceOnUse" | |
| 597 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460078,-26.062392)" | |
| 598 | + cx="29.913452" | |
| 599 | + cy="30.442923" | |
| 600 | + fx="29.913452" | |
| 601 | + fy="30.442923" | |
| 602 | + r="4.0018832" /><linearGradient | |
| 603 | + inkscape:collect="always" | |
| 604 | + xlink:href="#linearGradient3771" | |
| 605 | + id="linearGradient4781" | |
| 606 | + gradientUnits="userSpaceOnUse" | |
| 607 | + gradientTransform="translate(-1,1)" | |
| 608 | + x1="26.5" | |
| 609 | + y1="36.5" | |
| 610 | + x2="24.5" | |
| 611 | + y2="28.5" /><radialGradient | |
| 612 | + inkscape:collect="always" | |
| 613 | + xlink:href="#linearGradient2378" | |
| 614 | + id="radialGradient4783" | |
| 615 | + gradientUnits="userSpaceOnUse" | |
| 616 | + gradientTransform="matrix(-2.7847815e-8,0.91845951,-1.1152723,-3.3815205e-8,39.60096,1.4161083)" | |
| 617 | + cx="28.399611" | |
| 618 | + cy="15.333439" | |
| 619 | + fx="28.399611" | |
| 620 | + fy="15.333439" | |
| 621 | + r="15.242914" /><radialGradient | |
| 622 | + inkscape:collect="always" | |
| 623 | + xlink:href="#linearGradient2299" | |
| 624 | + id="radialGradient4785" | |
| 625 | + gradientUnits="userSpaceOnUse" | |
| 626 | + gradientTransform="matrix(3.39591,-4.6697806e-7,4.6697814e-7,3.3959105,-19.762019,-53.978222)" | |
| 627 | + cx="8.027895" | |
| 628 | + cy="24.287516" | |
| 629 | + fx="8.027895" | |
| 630 | + fy="24.287516" | |
| 631 | + r="8.2452128" /><radialGradient | |
| 632 | + inkscape:collect="always" | |
| 633 | + xlink:href="#linearGradient2341" | |
| 634 | + id="radialGradient4787" | |
| 635 | + gradientUnits="userSpaceOnUse" | |
| 636 | + gradientTransform="matrix(-2.0618025,-2.0407128e-7,-3.2411324e-7,3.2746279,61.522713,-37.078328)" | |
| 637 | + cx="11.651313" | |
| 638 | + cy="20.026194" | |
| 639 | + fx="11.651313" | |
| 640 | + fy="20.026194" | |
| 641 | + r="8.2452126" /><linearGradient | |
| 642 | + inkscape:collect="always" | |
| 643 | + xlink:href="#linearGradient5048" | |
| 644 | + id="linearGradient5003" | |
| 645 | + gradientUnits="userSpaceOnUse" | |
| 646 | + gradientTransform="matrix(2.3780477,0,0,1.969706,-1808.0185,-845.99583)" | |
| 647 | + x1="304.19855" | |
| 648 | + y1="357.48697" | |
| 649 | + x2="304.19855" | |
| 650 | + y2="603.21515" /><radialGradient | |
| 651 | + inkscape:collect="always" | |
| 652 | + xlink:href="#linearGradient5060" | |
| 653 | + id="radialGradient5005" | |
| 654 | + gradientUnits="userSpaceOnUse" | |
| 655 | + gradientTransform="matrix(2.6052656,0,0,1.9930785,-2039.1167,-872.62632)" | |
| 656 | + cx="605.71429" | |
| 657 | + cy="486.64789" | |
| 658 | + fx="605.71429" | |
| 659 | + fy="486.64789" | |
| 660 | + r="117.14286" /><radialGradient | |
| 661 | + inkscape:collect="always" | |
| 662 | + xlink:href="#linearGradient5060" | |
| 663 | + id="radialGradient5007" | |
| 664 | + gradientUnits="userSpaceOnUse" | |
| 665 | + gradientTransform="matrix(-2.6052648,0,0,1.9930785,128.02878,-872.62632)" | |
| 666 | + cx="605.71429" | |
| 667 | + cy="486.64789" | |
| 668 | + fx="605.71429" | |
| 669 | + fy="486.64789" | |
| 670 | + r="117.14286" /><linearGradient | |
| 671 | + inkscape:collect="always" | |
| 672 | + xlink:href="#linearGradient3736" | |
| 673 | + id="linearGradient5009" | |
| 674 | + gradientUnits="userSpaceOnUse" | |
| 675 | + gradientTransform="matrix(0.336922,0,0,0.166888,17.98288,15.46151)" | |
| 676 | + x1="49.023571" | |
| 677 | + y1="173.99986" | |
| 678 | + x2="19.343113" | |
| 679 | + y2="-5.7614088" /><linearGradient | |
| 680 | + inkscape:collect="always" | |
| 681 | + xlink:href="#linearGradient2329" | |
| 682 | + id="linearGradient5011" | |
| 683 | + gradientUnits="userSpaceOnUse" | |
| 684 | + gradientTransform="matrix(0.67409175,0,0,0.92339382,5.1085187,4.2256015)" | |
| 685 | + x1="15.415529" | |
| 686 | + y1="23.833527" | |
| 687 | + x2="16.899008" | |
| 688 | + y2="33.219193" /><radialGradient | |
| 689 | + inkscape:collect="always" | |
| 690 | + xlink:href="#linearGradient2319" | |
| 691 | + id="radialGradient5013" | |
| 692 | + gradientUnits="userSpaceOnUse" | |
| 693 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.731106)" | |
| 694 | + cx="20.443665" | |
| 695 | + cy="37.425829" | |
| 696 | + fx="20.443665" | |
| 697 | + fy="37.425829" | |
| 698 | + r="1.0821035" /><radialGradient | |
| 699 | + inkscape:collect="always" | |
| 700 | + xlink:href="#linearGradient2307" | |
| 701 | + id="radialGradient5015" | |
| 702 | + gradientUnits="userSpaceOnUse" | |
| 703 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,2.0807369)" | |
| 704 | + cx="19.985598" | |
| 705 | + cy="36.77816" | |
| 706 | + fx="19.985598" | |
| 707 | + fy="36.77816" | |
| 708 | + r="1.0821035" /><radialGradient | |
| 709 | + inkscape:collect="always" | |
| 710 | + xlink:href="#linearGradient2368" | |
| 711 | + id="radialGradient5017" | |
| 712 | + gradientUnits="userSpaceOnUse" | |
| 713 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460078,-26.062392)" | |
| 714 | + cx="29.913452" | |
| 715 | + cy="30.442923" | |
| 716 | + fx="29.913452" | |
| 717 | + fy="30.442923" | |
| 718 | + r="4.0018832" /><linearGradient | |
| 719 | + inkscape:collect="always" | |
| 720 | + xlink:href="#linearGradient3771" | |
| 721 | + id="linearGradient5019" | |
| 722 | + gradientUnits="userSpaceOnUse" | |
| 723 | + gradientTransform="translate(-1,1)" | |
| 724 | + x1="26.5" | |
| 725 | + y1="36.5" | |
| 726 | + x2="24.5" | |
| 727 | + y2="28.5" /><radialGradient | |
| 728 | + inkscape:collect="always" | |
| 729 | + xlink:href="#linearGradient2378" | |
| 730 | + id="radialGradient5021" | |
| 731 | + gradientUnits="userSpaceOnUse" | |
| 732 | + gradientTransform="matrix(-2.7847815e-8,0.91845951,-1.1152723,-3.3815205e-8,39.60096,1.4161083)" | |
| 733 | + cx="28.399611" | |
| 734 | + cy="15.333439" | |
| 735 | + fx="28.399611" | |
| 736 | + fy="15.333439" | |
| 737 | + r="15.242914" /><radialGradient | |
| 738 | + inkscape:collect="always" | |
| 739 | + xlink:href="#linearGradient2299" | |
| 740 | + id="radialGradient5023" | |
| 741 | + gradientUnits="userSpaceOnUse" | |
| 742 | + gradientTransform="matrix(3.39591,-4.6697806e-7,4.6697814e-7,3.3959105,-19.762019,-53.978222)" | |
| 743 | + cx="8.027895" | |
| 744 | + cy="24.287516" | |
| 745 | + fx="8.027895" | |
| 746 | + fy="24.287516" | |
| 747 | + r="8.2452128" /><radialGradient | |
| 748 | + inkscape:collect="always" | |
| 749 | + xlink:href="#linearGradient2341" | |
| 750 | + id="radialGradient5025" | |
| 751 | + gradientUnits="userSpaceOnUse" | |
| 752 | + gradientTransform="matrix(-2.0618025,-2.0407128e-7,-3.2411324e-7,3.2746279,61.522713,-37.078328)" | |
| 753 | + cx="11.651313" | |
| 754 | + cy="20.026194" | |
| 755 | + fx="11.651313" | |
| 756 | + fy="20.026194" | |
| 757 | + r="8.2452126" /><linearGradient | |
| 758 | + inkscape:collect="always" | |
| 759 | + xlink:href="#linearGradient5048" | |
| 760 | + id="linearGradient5077" | |
| 761 | + gradientUnits="userSpaceOnUse" | |
| 762 | + gradientTransform="matrix(2.1515669,0,0,1.969706,-1773.1654,-845.99583)" | |
| 763 | + x1="304.19855" | |
| 764 | + y1="357.48697" | |
| 765 | + x2="304.19855" | |
| 766 | + y2="603.21515" /><radialGradient | |
| 767 | + inkscape:collect="always" | |
| 768 | + xlink:href="#linearGradient5060" | |
| 769 | + id="radialGradient5079" | |
| 770 | + gradientUnits="userSpaceOnUse" | |
| 771 | + gradientTransform="matrix(2.6052656,0,0,1.9930785,-2131.7867,-872.62632)" | |
| 772 | + cx="605.71429" | |
| 773 | + cy="486.64789" | |
| 774 | + fx="605.71429" | |
| 775 | + fy="486.64789" | |
| 776 | + r="117.14286" /><radialGradient | |
| 777 | + inkscape:collect="always" | |
| 778 | + xlink:href="#linearGradient5060" | |
| 779 | + id="radialGradient5081" | |
| 780 | + gradientUnits="userSpaceOnUse" | |
| 781 | + gradientTransform="matrix(-2.6052648,0,0,1.9930785,128.02878,-872.62632)" | |
| 782 | + cx="605.71429" | |
| 783 | + cy="486.64789" | |
| 784 | + fx="605.71429" | |
| 785 | + fy="486.64789" | |
| 786 | + r="117.14286" /><linearGradient | |
| 787 | + inkscape:collect="always" | |
| 788 | + xlink:href="#linearGradient3736" | |
| 789 | + id="linearGradient5083" | |
| 790 | + gradientUnits="userSpaceOnUse" | |
| 791 | + gradientTransform="matrix(0.336922,0,0,0.166888,17.98288,15.46151)" | |
| 792 | + x1="49.023571" | |
| 793 | + y1="173.99986" | |
| 794 | + x2="19.343113" | |
| 795 | + y2="-5.7614088" /><linearGradient | |
| 796 | + inkscape:collect="always" | |
| 797 | + xlink:href="#linearGradient2329" | |
| 798 | + id="linearGradient5085" | |
| 799 | + gradientUnits="userSpaceOnUse" | |
| 800 | + gradientTransform="matrix(0.59919267,0,0,0.92339382,6.9853499,4.2256015)" | |
| 801 | + x1="15.415529" | |
| 802 | + y1="23.833527" | |
| 803 | + x2="16.899008" | |
| 804 | + y2="33.219193" /><radialGradient | |
| 805 | + inkscape:collect="always" | |
| 806 | + xlink:href="#linearGradient2319" | |
| 807 | + id="radialGradient5087" | |
| 808 | + gradientUnits="userSpaceOnUse" | |
| 809 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.731106)" | |
| 810 | + cx="20.443665" | |
| 811 | + cy="37.425829" | |
| 812 | + fx="20.443665" | |
| 813 | + fy="37.425829" | |
| 814 | + r="1.0821035" /><radialGradient | |
| 815 | + inkscape:collect="always" | |
| 816 | + xlink:href="#linearGradient2368" | |
| 817 | + id="radialGradient5091" | |
| 818 | + gradientUnits="userSpaceOnUse" | |
| 819 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460078,-26.062392)" | |
| 820 | + cx="29.913452" | |
| 821 | + cy="30.442923" | |
| 822 | + fx="29.913452" | |
| 823 | + fy="30.442923" | |
| 824 | + r="4.0018832" /><linearGradient | |
| 825 | + inkscape:collect="always" | |
| 826 | + xlink:href="#linearGradient3771" | |
| 827 | + id="linearGradient5093" | |
| 828 | + gradientUnits="userSpaceOnUse" | |
| 829 | + gradientTransform="translate(-1,1)" | |
| 830 | + x1="26.5" | |
| 831 | + y1="36.5" | |
| 832 | + x2="24.5" | |
| 833 | + y2="28.5" /><radialGradient | |
| 834 | + inkscape:collect="always" | |
| 835 | + xlink:href="#linearGradient2378" | |
| 836 | + id="radialGradient5095" | |
| 837 | + gradientUnits="userSpaceOnUse" | |
| 838 | + gradientTransform="matrix(-2.7847815e-8,0.91845951,-1.1152723,-3.3815205e-8,39.60096,1.4161083)" | |
| 839 | + cx="29.48839" | |
| 840 | + cy="15.333439" | |
| 841 | + fx="29.48839" | |
| 842 | + fy="15.333439" | |
| 843 | + r="15.242914" /><radialGradient | |
| 844 | + inkscape:collect="always" | |
| 845 | + xlink:href="#linearGradient2299" | |
| 846 | + id="radialGradient5097" | |
| 847 | + gradientUnits="userSpaceOnUse" | |
| 848 | + gradientTransform="matrix(3.39591,-4.6697806e-7,4.6697814e-7,3.3959105,-19.762019,-52.978222)" | |
| 849 | + cx="8.027895" | |
| 850 | + cy="24.287516" | |
| 851 | + fx="8.027895" | |
| 852 | + fy="24.287516" | |
| 853 | + r="8.2452128" /><radialGradient | |
| 854 | + inkscape:collect="always" | |
| 855 | + xlink:href="#linearGradient2341" | |
| 856 | + id="radialGradient5099" | |
| 857 | + gradientUnits="userSpaceOnUse" | |
| 858 | + gradientTransform="matrix(-2.0618025,-2.0407128e-7,-3.2411324e-7,3.2746279,61.522713,-36.078328)" | |
| 859 | + cx="11.651313" | |
| 860 | + cy="20.026194" | |
| 861 | + fx="11.651313" | |
| 862 | + fy="20.026194" | |
| 863 | + r="8.2452126" /><linearGradient | |
| 864 | + inkscape:collect="always" | |
| 865 | + xlink:href="#linearGradient3177" | |
| 866 | + id="linearGradient3259" | |
| 867 | + gradientUnits="userSpaceOnUse" | |
| 868 | + x1="25.621262" | |
| 869 | + y1="33.817276" | |
| 870 | + x2="28.5" | |
| 871 | + y2="36.5" /><linearGradient | |
| 872 | + inkscape:collect="always" | |
| 873 | + xlink:href="#linearGradient5048" | |
| 874 | + id="linearGradient3297" | |
| 875 | + gradientUnits="userSpaceOnUse" | |
| 876 | + gradientTransform="matrix(2.1515669,0,0,1.969706,-1773.1654,-845.99583)" | |
| 877 | + x1="304.19855" | |
| 878 | + y1="357.48697" | |
| 879 | + x2="304.19855" | |
| 880 | + y2="603.21515" /><radialGradient | |
| 881 | + inkscape:collect="always" | |
| 882 | + xlink:href="#linearGradient5060" | |
| 883 | + id="radialGradient3299" | |
| 884 | + gradientUnits="userSpaceOnUse" | |
| 885 | + gradientTransform="matrix(2.6052656,0,0,1.9930785,-2131.7867,-872.62632)" | |
| 886 | + cx="605.71429" | |
| 887 | + cy="486.64789" | |
| 888 | + fx="605.71429" | |
| 889 | + fy="486.64789" | |
| 890 | + r="117.14286" /><radialGradient | |
| 891 | + inkscape:collect="always" | |
| 892 | + xlink:href="#linearGradient5060" | |
| 893 | + id="radialGradient3301" | |
| 894 | + gradientUnits="userSpaceOnUse" | |
| 895 | + gradientTransform="matrix(-2.6052648,0,0,1.9930785,128.02878,-872.62632)" | |
| 896 | + cx="605.71429" | |
| 897 | + cy="486.64789" | |
| 898 | + fx="605.71429" | |
| 899 | + fy="486.64789" | |
| 900 | + r="117.14286" /><linearGradient | |
| 901 | + inkscape:collect="always" | |
| 902 | + xlink:href="#linearGradient3736" | |
| 903 | + id="linearGradient3303" | |
| 904 | + gradientUnits="userSpaceOnUse" | |
| 905 | + gradientTransform="matrix(0.336922,0,0,0.166888,17.98288,15.46151)" | |
| 906 | + x1="49.023571" | |
| 907 | + y1="173.99986" | |
| 908 | + x2="19.343113" | |
| 909 | + y2="-5.7614088" /><linearGradient | |
| 910 | + inkscape:collect="always" | |
| 911 | + xlink:href="#linearGradient2329" | |
| 912 | + id="linearGradient3305" | |
| 913 | + gradientUnits="userSpaceOnUse" | |
| 914 | + gradientTransform="matrix(0.59919267,0,0,0.92339382,6.9853499,4.2256015)" | |
| 915 | + x1="15.415529" | |
| 916 | + y1="23.833527" | |
| 917 | + x2="16.899008" | |
| 918 | + y2="33.219193" /><radialGradient | |
| 919 | + inkscape:collect="always" | |
| 920 | + xlink:href="#linearGradient2319" | |
| 921 | + id="radialGradient3307" | |
| 922 | + gradientUnits="userSpaceOnUse" | |
| 923 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,0.731106)" | |
| 924 | + cx="20.443665" | |
| 925 | + cy="37.425829" | |
| 926 | + fx="20.443665" | |
| 927 | + fy="37.425829" | |
| 928 | + r="1.0821035" /><linearGradient | |
| 929 | + inkscape:collect="always" | |
| 930 | + xlink:href="#linearGradient5161" | |
| 931 | + id="linearGradient3309" | |
| 932 | + gradientUnits="userSpaceOnUse" | |
| 933 | + x1="17.5" | |
| 934 | + y1="35.5" | |
| 935 | + x2="20.5" | |
| 936 | + y2="39.5" /><radialGradient | |
| 937 | + inkscape:collect="always" | |
| 938 | + xlink:href="#linearGradient3171" | |
| 939 | + id="radialGradient3311" | |
| 940 | + gradientUnits="userSpaceOnUse" | |
| 941 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.3489438,1.0441923)" | |
| 942 | + cx="19.985598" | |
| 943 | + cy="36.77816" | |
| 944 | + fx="19.985598" | |
| 945 | + fy="36.77816" | |
| 946 | + r="1.0821035" /><linearGradient | |
| 947 | + inkscape:collect="always" | |
| 948 | + xlink:href="#linearGradient3771" | |
| 949 | + id="linearGradient3315" | |
| 950 | + gradientUnits="userSpaceOnUse" | |
| 951 | + gradientTransform="translate(-1,1)" | |
| 952 | + x1="26.5" | |
| 953 | + y1="36.5" | |
| 954 | + x2="24.5" | |
| 955 | + y2="28.5" /><radialGradient | |
| 956 | + inkscape:collect="always" | |
| 957 | + xlink:href="#linearGradient2378" | |
| 958 | + id="radialGradient3317" | |
| 959 | + gradientUnits="userSpaceOnUse" | |
| 960 | + gradientTransform="matrix(-2.7847815e-8,0.91845951,-1.1152723,-3.3815205e-8,39.60096,1.4161083)" | |
| 961 | + cx="29.48839" | |
| 962 | + cy="15.333439" | |
| 963 | + fx="29.48839" | |
| 964 | + fy="15.333439" | |
| 965 | + r="15.242914" /><radialGradient | |
| 966 | + inkscape:collect="always" | |
| 967 | + xlink:href="#linearGradient2299" | |
| 968 | + id="radialGradient3319" | |
| 969 | + gradientUnits="userSpaceOnUse" | |
| 970 | + gradientTransform="matrix(3.39591,-4.6697806e-7,4.6697814e-7,3.3959105,-19.762019,-52.978222)" | |
| 971 | + cx="8.027895" | |
| 972 | + cy="24.287516" | |
| 973 | + fx="8.027895" | |
| 974 | + fy="24.287516" | |
| 975 | + r="8.2452128" /><radialGradient | |
| 976 | + inkscape:collect="always" | |
| 977 | + xlink:href="#linearGradient2341" | |
| 978 | + id="radialGradient3321" | |
| 979 | + gradientUnits="userSpaceOnUse" | |
| 980 | + gradientTransform="matrix(-2.0618025,-2.0407128e-7,-3.2411324e-7,3.2746279,61.522713,-36.078328)" | |
| 981 | + cx="11.651313" | |
| 982 | + cy="20.026194" | |
| 983 | + fx="11.651313" | |
| 984 | + fy="20.026194" | |
| 985 | + r="8.2452126" /><inkscape:perspective | |
| 986 | + id="perspective3331" | |
| 987 | + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" | |
| 988 | + inkscape:vp_z="1 : 0.5 : 1" | |
| 989 | + inkscape:vp_y="0 : 1000 : 0" | |
| 990 | + inkscape:vp_x="0 : 0.5 : 1" | |
| 991 | + sodipodi:type="inkscape:persp3d" /><radialGradient | |
| 992 | + inkscape:collect="always" | |
| 993 | + xlink:href="#linearGradient2368-5" | |
| 994 | + id="radialGradient5017-4" | |
| 995 | + gradientUnits="userSpaceOnUse" | |
| 996 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460078,-26.062392)" | |
| 997 | + cx="29.913452" | |
| 998 | + cy="30.442923" | |
| 999 | + fx="29.913452" | |
| 1000 | + fy="30.442923" | |
| 1001 | + r="4.001883" /><linearGradient | |
| 1002 | + inkscape:collect="always" | |
| 1003 | + id="linearGradient2368-5"><stop | |
| 1004 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 1005 | + offset="0" | |
| 1006 | + id="stop2370-2" /><stop | |
| 1007 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 1008 | + offset="1" | |
| 1009 | + id="stop2372-0" /></linearGradient><radialGradient | |
| 1010 | + r="4.001883" | |
| 1011 | + fy="30.442923" | |
| 1012 | + fx="29.913452" | |
| 1013 | + cy="30.442923" | |
| 1014 | + cx="29.913452" | |
| 1015 | + gradientTransform="matrix(0.11004748,1.8133708,-1.8164852,0.18222563,79.460083,-26.062392)" | |
| 1016 | + gradientUnits="userSpaceOnUse" | |
| 1017 | + id="radialGradient3340" | |
| 1018 | + xlink:href="#linearGradient2368-5" | |
| 1019 | + inkscape:collect="always" /><inkscape:perspective | |
| 1020 | + id="perspective4157" | |
| 1021 | + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" | |
| 1022 | + inkscape:vp_z="1 : 0.5 : 1" | |
| 1023 | + inkscape:vp_y="0 : 1000 : 0" | |
| 1024 | + inkscape:vp_x="0 : 0.5 : 1" | |
| 1025 | + sodipodi:type="inkscape:persp3d" /><radialGradient | |
| 1026 | + inkscape:collect="always" | |
| 1027 | + xlink:href="#linearGradient2307-6" | |
| 1028 | + id="radialGradient5015-8" | |
| 1029 | + gradientUnits="userSpaceOnUse" | |
| 1030 | + gradientTransform="matrix(1.125263,0,0,0.982744,-4.428678,2.0807369)" | |
| 1031 | + cx="20.09285" | |
| 1032 | + cy="35.716652" | |
| 1033 | + fx="20.09285" | |
| 1034 | + fy="35.716652" | |
| 1035 | + r="1.0821035" /><linearGradient | |
| 1036 | + id="linearGradient2307-6"><stop | |
| 1037 | + style="stop-color:#edd400;stop-opacity:1;" | |
| 1038 | + offset="0" | |
| 1039 | + id="stop2309-3" /><stop | |
| 1040 | + style="stop-color:#998800;stop-opacity:1;" | |
| 1041 | + offset="1" | |
| 1042 | + id="stop2311-5" /></linearGradient><radialGradient | |
| 1043 | + r="1.0821035" | |
| 1044 | + fy="36.77816" | |
| 1045 | + fx="19.985598" | |
| 1046 | + cy="36.77816" | |
| 1047 | + cx="19.985598" | |
| 1048 | + gradientTransform="matrix(1.125263,0,0,0.982744,-21.672305,-35.366438)" | |
| 1049 | + gradientUnits="userSpaceOnUse" | |
| 1050 | + id="radialGradient4166" | |
| 1051 | + xlink:href="#linearGradient2307-6" | |
| 1052 | + inkscape:collect="always" /></defs><sodipodi:namedview | |
| 1053 | + inkscape:cy="24" | |
| 1054 | + inkscape:cx="24" | |
| 1055 | + inkscape:zoom="12.541667" | |
| 1056 | + inkscape:window-height="827" | |
| 1057 | + inkscape:window-width="1440" | |
| 1058 | + inkscape:pageshadow="2" | |
| 1059 | + inkscape:pageopacity="0.0" | |
| 1060 | + borderopacity="0.21568627" | |
| 1061 | + bordercolor="#666666" | |
| 1062 | + pagecolor="#ffffff" | |
| 1063 | + id="base" | |
| 1064 | + inkscape:showpageshadow="false" | |
| 1065 | + inkscape:window-x="0" | |
| 1066 | + inkscape:window-y="25" | |
| 1067 | + inkscape:current-layer="svg2" | |
| 1068 | + fill="#555753" | |
| 1069 | + showgrid="true" | |
| 1070 | + stroke="#a40000" | |
| 1071 | + showguides="true" | |
| 1072 | + inkscape:guide-bbox="true" | |
| 1073 | + inkscape:snap-grids="true" | |
| 1074 | + inkscape:window-maximized="1"><inkscape:grid | |
| 1075 | + type="xygrid" | |
| 1076 | + id="grid3670" | |
| 1077 | + empspacing="5" | |
| 1078 | + visible="true" | |
| 1079 | + enabled="true" | |
| 1080 | + snapvisiblegridlinesonly="true" | |
| 1081 | + originx="0.5px" | |
| 1082 | + originy="0.5px" /></sodipodi:namedview> | |
| 1083 | + | |
| 1084 | +<g | |
| 1085 | + transform="translate(15,-6)" | |
| 1086 | + id="use5027"><g | |
| 1087 | + transform="matrix(0.02158196,0,0,0.01859457,39.12251,27.63767)" | |
| 1088 | + id="g3263" | |
| 1089 | + style="display:inline"><rect | |
| 1090 | + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient3297);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1091 | + id="rect3265" | |
| 1092 | + width="880.36487" | |
| 1093 | + height="484.0123" | |
| 1094 | + x="-1442.0613" | |
| 1095 | + y="-141.85165" /><path | |
| 1096 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient3299);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1097 | + d="m -561.69644,-141.85163 c 0,0 0,484.00662 0,484.00662 134.16473,0.91119 324.34504,-108.44127 324.34497,-242.03439 0,-133.593226 -149.71775,-241.97221 -324.34497,-241.97223 z" | |
| 1098 | + id="path3267" | |
| 1099 | + sodipodi:nodetypes="cccc" /><path | |
| 1100 | + sodipodi:nodetypes="cccc" | |
| 1101 | + id="path3269" | |
| 1102 | + d="m -1442.0613,-141.85163 c 0,0 0,484.00662 0,484.00662 -134.1648,0.91119 -324.345,-108.44127 -324.345,-242.03439 0,-133.593226 149.7177,-241.97221 324.345,-241.97223 z" | |
| 1103 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient3301);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><g | |
| 1104 | + id="g3271" | |
| 1105 | + transform="translate(-5.9999999,-13)"><path | |
| 1106 | + style="color:#000000;fill:url(#linearGradient3303);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1107 | + d="m 35.5,26.5 0,16 c 0,0.905333 -0.160268,1 -1,1 l -22,0 c -0.839733,0 -1,-0.09467 -1,-1 l 0,-16 24,0 z" | |
| 1108 | + id="path3273" | |
| 1109 | + sodipodi:nodetypes="ccccccc" /><path | |
| 1110 | + sodipodi:nodetypes="ccccc" | |
| 1111 | + id="path3277" | |
| 1112 | + d="m 34.5,26.5 0,16 -22,0 0,-16 22,0 z" | |
| 1113 | + style="opacity:0.35;color:#000000;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><rect | |
| 1114 | + style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1115 | + id="rect3285" | |
| 1116 | + width="7" | |
| 1117 | + height="6" | |
| 1118 | + x="24.5" | |
| 1119 | + y="32.5" /><rect | |
| 1120 | + y="31.5" | |
| 1121 | + x="23.5" | |
| 1122 | + height="8" | |
| 1123 | + width="9" | |
| 1124 | + id="rect3287" | |
| 1125 | + style="opacity:0.5;color:#000000;fill:none;stroke:url(#linearGradient3315);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1126 | + ry="1" | |
| 1127 | + rx="1" /><path | |
| 1128 | + clip-rule="evenodd" | |
| 1129 | + d="m 12.5,31.5 0,5 13,-6 9,5 0,-4 -10,-7 -12,7 z" | |
| 1130 | + id="path3289" | |
| 1131 | + style="opacity:0.20000000000000001;fill:url(#radialGradient3317);fill-opacity:1;fill-rule:evenodd" | |
| 1132 | + sodipodi:nodetypes="ccccccc" /><path | |
| 1133 | + style="fill:#ef2929;stroke:#a40000;stroke-linecap:round;stroke-linejoin:round" | |
| 1134 | + id="path3291" | |
| 1135 | + d="m 8.4999999,27.5 -1e-7,5 1.5,2 14.5000002,-7 12.5,7 1.5,-2 0,-5 -14,-8 -16.0000001,8 z" | |
| 1136 | + sodipodi:nodetypes="ccccccccc" /><path | |
| 1137 | + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient3319);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1138 | + d="m 9.0215946,27.818937 -10e-8,4 L 24.5,24.5 l 0,-4.318937 -15.4784054,7.637874 z" | |
| 1139 | + id="path3293" | |
| 1140 | + sodipodi:nodetypes="ccccc" /><path | |
| 1141 | + sodipodi:nodetypes="ccccc" | |
| 1142 | + id="path3295" | |
| 1143 | + d="m 24.5,24.5 0,-4.318937 13.478405,7.637874 0,4 L 24.5,24.5 z" | |
| 1144 | + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient3321);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1145 | + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient3340);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1146 | + d="m 25,36.954984 c 2.841896,0.362925 3.37612,-1.584298 6,-1.701594 L 31,33 l -6,0 0,3.954959 0,2.5e-5 z" | |
| 1147 | + id="rect2363-2" | |
| 1148 | + sodipodi:nodetypes="cccccc" /></g></g><g | |
| 1149 | + id="g4807" | |
| 1150 | + transform="translate(-1.9999999,-1.0000001)"><g | |
| 1151 | + style="display:inline" | |
| 1152 | + id="g4729" | |
| 1153 | + transform="matrix(0.02158196,0,0,0.01859457,39.12251,28.63767)"><rect | |
| 1154 | + y="-141.85165" | |
| 1155 | + x="-1442.0613" | |
| 1156 | + height="484.0123" | |
| 1157 | + width="880.36487" | |
| 1158 | + id="rect4731" | |
| 1159 | + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5077);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1160 | + sodipodi:nodetypes="cccc" | |
| 1161 | + id="path4733" | |
| 1162 | + d="m -561.69644,-141.85163 c 0,0 0,484.00662 0,484.00662 134.16473,0.91119 324.34504,-108.44127 324.34497,-242.03439 0,-133.593226 -149.71775,-241.97221 -324.34497,-241.97223 z" | |
| 1163 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5079);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1164 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5081);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1165 | + d="m -1442.0613,-141.85163 c 0,0 0,484.00662 0,484.00662 -134.1648,0.91119 -324.345,-108.44127 -324.345,-242.03439 0,-133.593226 149.7177,-241.97221 324.345,-241.97223 z" | |
| 1166 | + id="path4735" | |
| 1167 | + sodipodi:nodetypes="cccc" /></g><g | |
| 1168 | + transform="translate(-5.9999999,-13)" | |
| 1169 | + id="g4737"><path | |
| 1170 | + sodipodi:nodetypes="ccccccc" | |
| 1171 | + id="path4739" | |
| 1172 | + d="m 35.5,26.5 0,17 c 0,0.905333 -0.160268,1 -1,1 l -22,0 c -0.839733,0 -1,-0.09467 -1,-1 l 0,-17 24,0 z" | |
| 1173 | + style="color:#000000;fill:url(#linearGradient5083);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1174 | + sodipodi:nodetypes="ccccc" | |
| 1175 | + clip-rule="evenodd" | |
| 1176 | + d="M 22,31 21.969511,44 14.074317,44 14,31 l 8,0 z" | |
| 1177 | + id="path4741" | |
| 1178 | + style="fill:url(#linearGradient5085);fill-opacity:1;fill-rule:evenodd" /><path | |
| 1179 | + style="opacity:0.35;color:#000000;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1180 | + d="m 34.5,26.5 0,17 -22,0 0,-17 22,0 z" | |
| 1181 | + id="path4743" | |
| 1182 | + sodipodi:nodetypes="ccccc" /><path | |
| 1183 | + clip-rule="evenodd" | |
| 1184 | + d="m 18.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" | |
| 1185 | + id="path4745" | |
| 1186 | + style="opacity:0.40909089;fill:url(#radialGradient5087);fill-opacity:1;fill-rule:evenodd" /><rect | |
| 1187 | + y="32" | |
| 1188 | + x="15" | |
| 1189 | + height="12" | |
| 1190 | + width="6" | |
| 1191 | + id="rect4747" | |
| 1192 | + style="color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /><path | |
| 1193 | + style="color:#000000;fill:url(#radialGradient5015-8);fill-opacity:1;fill-rule:evenodd;stroke-width:1;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;enable-background:accumulate" | |
| 1194 | + id="path4749" | |
| 1195 | + d="m 18.542048,36.410633 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" | |
| 1196 | + clip-rule="evenodd" /><rect | |
| 1197 | + y="32.5" | |
| 1198 | + x="24.5" | |
| 1199 | + height="6.999999" | |
| 1200 | + width="8" | |
| 1201 | + id="rect4751" | |
| 1202 | + style="color:#000000;fill:url(#linearGradient3259);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><rect | |
| 1203 | + rx="1" | |
| 1204 | + ry="1" | |
| 1205 | + style="opacity:0.5;color:#000000;fill:none;stroke:url(#linearGradient5093);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1206 | + id="rect4755" | |
| 1207 | + width="10" | |
| 1208 | + height="9" | |
| 1209 | + x="23.5" | |
| 1210 | + y="31.5" /><path | |
| 1211 | + sodipodi:nodetypes="ccccccc" | |
| 1212 | + style="opacity:0.20000000000000001;fill:url(#radialGradient5095);fill-opacity:1;fill-rule:evenodd" | |
| 1213 | + id="path4757" | |
| 1214 | + d="m 12.5,31.5 0,5 13,-6 9,5 0,-5 -10,-6 -12,7 z" | |
| 1215 | + clip-rule="evenodd" /><path | |
| 1216 | + sodipodi:nodetypes="ccccccccc" | |
| 1217 | + d="m 8.4999999,27.5 -1e-7,5 1.5,2 14.5000002,-7 12.5,7 1.5,-2 0,-5 -14,-8 -16.0000001,8 z" | |
| 1218 | + id="path4759" | |
| 1219 | + style="fill:#ef2929;stroke:#a40000;stroke-linecap:round;stroke-linejoin:round" /><path | |
| 1220 | + sodipodi:nodetypes="ccccc" | |
| 1221 | + id="path4761" | |
| 1222 | + d="m 9.0215946,27.818937 -10e-8,4 L 24.5,24.5 l 0,-4.318937 -15.4784054,7.637874 z" | |
| 1223 | + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient5097);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1224 | + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient5099);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1225 | + d="m 24.5,24.5 0,-4.318937 13.478405,7.637874 0,4 L 24.5,24.5 z" | |
| 1226 | + id="path4763" | |
| 1227 | + sodipodi:nodetypes="ccccc" /></g></g><g | |
| 1228 | + id="g3829" | |
| 1229 | + transform="translate(2.0000001,0)"><g | |
| 1230 | + transform="matrix(0.02158196,0,0,0.01859457,44.12251,41.63767)" | |
| 1231 | + id="g5022" | |
| 1232 | + style="display:inline"><rect | |
| 1233 | + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5003);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1234 | + id="rect4173" | |
| 1235 | + width="973.03491" | |
| 1236 | + height="484.0123" | |
| 1237 | + x="-1442.0613" | |
| 1238 | + y="-141.85165" /><path | |
| 1239 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5005);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1240 | + d="m -469.02645,-141.85163 c 0,0 0,484.00662 0,484.00662 134.16473,0.91119 324.34504,-108.44127 324.34497,-242.03439 0,-133.593226 -149.71775,-241.97221 -324.34497,-241.97223 z" | |
| 1241 | + id="path5058" | |
| 1242 | + sodipodi:nodetypes="cccc" /><path | |
| 1243 | + sodipodi:nodetypes="cccc" | |
| 1244 | + id="path5018" | |
| 1245 | + d="m -1442.0613,-141.85163 c 0,0 0,484.00662 0,484.00662 -134.1648,0.91119 -324.345,-108.44127 -324.345,-242.03439 0,-133.593226 149.7177,-241.97221 324.345,-241.97223 z" | |
| 1246 | + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5007);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><g | |
| 1247 | + id="g3812"><path | |
| 1248 | + style="color:#000000;fill:url(#linearGradient5009);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1249 | + d="m 36.5,25.5 0,18 c 0,0.905333 -0.160268,1 -1,1 l -24,0 c -0.839733,0 -1,-0.09467 -1,-1 l 0,-18 26,0 z" | |
| 1250 | + id="rect1512" | |
| 1251 | + sodipodi:nodetypes="ccccccc" /><path | |
| 1252 | + style="fill:url(#linearGradient5011);fill-opacity:1;fill-rule:evenodd" | |
| 1253 | + id="path2327" | |
| 1254 | + d="M 22,31 21.9657,44 13.083607,44 13,31 l 9,0 z" | |
| 1255 | + clip-rule="evenodd" | |
| 1256 | + sodipodi:nodetypes="ccccc" /><path | |
| 1257 | + sodipodi:nodetypes="ccccc" | |
| 1258 | + id="path2357" | |
| 1259 | + d="m 35.5,25.5 0,18 -24,0 0,-18 24,0 z" | |
| 1260 | + style="opacity:0.35;color:#000000;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /><path | |
| 1261 | + style="opacity:0.40909089;fill:url(#radialGradient5013);fill-opacity:1;fill-rule:evenodd" | |
| 1262 | + id="path2315" | |
| 1263 | + d="m 18.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" | |
| 1264 | + clip-rule="evenodd" /><rect | |
| 1265 | + style="color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" | |
| 1266 | + id="rect3851" | |
| 1267 | + width="7" | |
| 1268 | + height="12" | |
| 1269 | + x="14" | |
| 1270 | + y="32" /><path | |
| 1271 | + clip-rule="evenodd" | |
| 1272 | + d="m 18.462314,37.447175 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" | |
| 1273 | + id="path217" | |
| 1274 | + style="fill:url(#radialGradient5015);fill-opacity:1;fill-rule:evenodd" /><rect | |
| 1275 | + style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1276 | + id="rect3263" | |
| 1277 | + width="8" | |
| 1278 | + height="6.999999" | |
| 1279 | + x="24.5" | |
| 1280 | + y="32.5" /><path | |
| 1281 | + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient5017);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1282 | + d="m 25.014716,36.954984 c 2.841896,0.362925 4.341979,-1.584298 6.965859,-1.701594 L 32,33 l -7,0 0.01472,3.954959 -4e-6,2.5e-5 z" | |
| 1283 | + id="rect2363" | |
| 1284 | + sodipodi:nodetypes="cccccc" /><rect | |
| 1285 | + y="31.5" | |
| 1286 | + x="23.5" | |
| 1287 | + height="9" | |
| 1288 | + width="10" | |
| 1289 | + id="rect3748" | |
| 1290 | + style="opacity:0.5;color:#000000;fill:none;stroke:url(#linearGradient5019);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1291 | + ry="1" | |
| 1292 | + rx="1" /><path | |
| 1293 | + clip-rule="evenodd" | |
| 1294 | + d="m 11.5,31.5 0,5 14,-7 10,6 0,-4 -11,-7 -13,7 z" | |
| 1295 | + id="path23" | |
| 1296 | + style="opacity:0.2;fill:url(#radialGradient5021);fill-opacity:1;fill-rule:evenodd" | |
| 1297 | + sodipodi:nodetypes="ccccccc" /><path | |
| 1298 | + style="fill:#ef2929;stroke:#a40000;stroke-linecap:round;stroke-linejoin:round" | |
| 1299 | + id="path362" | |
| 1300 | + d="m 7.5,26.5 0,6 1.5,2 15.5,-8 13.5,8 1.5,-2 0,-6 -15,-9 -17,9 z" | |
| 1301 | + sodipodi:nodetypes="ccccccccc" /><path | |
| 1302 | + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient5023);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1303 | + d="m 7.9418605,26.898671 0,5 L 24.5,23.5 l 0,-5.318937 -16.5581395,8.717608 z" | |
| 1304 | + id="path1536" | |
| 1305 | + sodipodi:nodetypes="ccccc" /><path | |
| 1306 | + sodipodi:nodetypes="ccccc" | |
| 1307 | + id="path2337" | |
| 1308 | + d="m 24.5,23.5 0,-5.318937 14.558139,8.637874 0,5 L 24.5,23.5 z" | |
| 1309 | + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient5025);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g></g></svg> | |
| 0 | 1310 | \ No newline at end of file | ... | ... |
3.99 KB
| ... | ... | @@ -0,0 +1,1965 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
| 2 | +<!-- Created with Inkscape (http://www.inkscape.org/) --> | |
| 3 | + | |
| 4 | +<svg | |
| 5 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | |
| 6 | + xmlns:cc="http://creativecommons.org/ns#" | |
| 7 | + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
| 8 | + xmlns:svg="http://www.w3.org/2000/svg" | |
| 9 | + xmlns="http://www.w3.org/2000/svg" | |
| 10 | + xmlns:xlink="http://www.w3.org/1999/xlink" | |
| 11 | + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |
| 12 | + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |
| 13 | + width="48" | |
| 14 | + height="48" | |
| 15 | + id="svg2" | |
| 16 | + version="1.1" | |
| 17 | + inkscape:version="0.47 r22583" | |
| 18 | + sodipodi:docname="Ícone BSC 2.svg" | |
| 19 | + inkscape:export-filename="/home/caiosba/Colivre/Documentos/Ícones BSC 2.png" | |
| 20 | + inkscape:export-xdpi="90" | |
| 21 | + inkscape:export-ydpi="90"> | |
| 22 | + <defs | |
| 23 | + id="defs4"> | |
| 24 | + <inkscape:perspective | |
| 25 | + sodipodi:type="inkscape:persp3d" | |
| 26 | + inkscape:vp_x="0 : 526.18109 : 1" | |
| 27 | + inkscape:vp_y="0 : 1000 : 0" | |
| 28 | + inkscape:vp_z="744.09448 : 526.18109 : 1" | |
| 29 | + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" | |
| 30 | + id="perspective10" /> | |
| 31 | + <linearGradient | |
| 32 | + id="linearGradient5036"> | |
| 33 | + <stop | |
| 34 | + id="stop5038" | |
| 35 | + offset="0" | |
| 36 | + style="stop-color:#f5f5f5;stop-opacity:0.09;" /> | |
| 37 | + <stop | |
| 38 | + style="stop-color:#ffffff;stop-opacity:0.89999998;" | |
| 39 | + offset="0.2631579" | |
| 40 | + id="stop5044" /> | |
| 41 | + <stop | |
| 42 | + id="stop5088" | |
| 43 | + offset="0.74792242" | |
| 44 | + style="stop-color:#c7c7c7;stop-opacity:0.46000001;" /> | |
| 45 | + <stop | |
| 46 | + id="stop5040" | |
| 47 | + offset="1" | |
| 48 | + style="stop-color:#ffffff;stop-opacity:0.78039217;" /> | |
| 49 | + </linearGradient> | |
| 50 | + <linearGradient | |
| 51 | + id="linearGradient5058"> | |
| 52 | + <stop | |
| 53 | + id="stop5060" | |
| 54 | + offset="0" | |
| 55 | + style="stop-color:#959791;stop-opacity:1;" /> | |
| 56 | + <stop | |
| 57 | + style="stop-color:#f8f8f8;stop-opacity:1;" | |
| 58 | + offset="0.5" | |
| 59 | + id="stop5066" /> | |
| 60 | + <stop | |
| 61 | + id="stop5062" | |
| 62 | + offset="1" | |
| 63 | + style="stop-color:#8c8c8c;stop-opacity:1;" /> | |
| 64 | + </linearGradient> | |
| 65 | + <linearGradient | |
| 66 | + id="linearGradient5068"> | |
| 67 | + <stop | |
| 68 | + id="stop5070" | |
| 69 | + offset="0" | |
| 70 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 71 | + <stop | |
| 72 | + style="stop-color:#ffffff;stop-opacity:0.69;" | |
| 73 | + offset="0.32894737" | |
| 74 | + id="stop5078" /> | |
| 75 | + <stop | |
| 76 | + style="stop-color:#c2c2c2;stop-opacity:0.34;" | |
| 77 | + offset="0.65789473" | |
| 78 | + id="stop5076" /> | |
| 79 | + <stop | |
| 80 | + id="stop5072" | |
| 81 | + offset="1" | |
| 82 | + style="stop-color:#ffffff;stop-opacity:0;" /> | |
| 83 | + </linearGradient> | |
| 84 | + <linearGradient | |
| 85 | + id="linearGradient2966"> | |
| 86 | + <stop | |
| 87 | + id="stop2968" | |
| 88 | + offset="0" | |
| 89 | + style="stop-color:#ffd1d1;stop-opacity:1;" /> | |
| 90 | + <stop | |
| 91 | + style="stop-color:#ff1d1d;stop-opacity:1;" | |
| 92 | + offset="0.5" | |
| 93 | + id="stop3006" /> | |
| 94 | + <stop | |
| 95 | + id="stop2970" | |
| 96 | + offset="1" | |
| 97 | + style="stop-color:#6f0000;stop-opacity:1;" /> | |
| 98 | + </linearGradient> | |
| 99 | + <linearGradient | |
| 100 | + id="linearGradient2974"> | |
| 101 | + <stop | |
| 102 | + id="stop2976" | |
| 103 | + offset="0" | |
| 104 | + style="stop-color:#c1c1c1;stop-opacity:1;" /> | |
| 105 | + <stop | |
| 106 | + id="stop2978" | |
| 107 | + offset="1" | |
| 108 | + style="stop-color:#acacac;stop-opacity:1;" /> | |
| 109 | + </linearGradient> | |
| 110 | + <linearGradient | |
| 111 | + id="linearGradient2994"> | |
| 112 | + <stop | |
| 113 | + id="stop2996" | |
| 114 | + offset="0" | |
| 115 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 116 | + <stop | |
| 117 | + id="stop2998" | |
| 118 | + offset="1" | |
| 119 | + style="stop-color:#c9c9c9;stop-opacity:1;" /> | |
| 120 | + </linearGradient> | |
| 121 | + <linearGradient | |
| 122 | + id="linearGradient9910"> | |
| 123 | + <stop | |
| 124 | + id="stop9912" | |
| 125 | + offset="0" | |
| 126 | + style="stop-color:#729fcf;stop-opacity:1;" /> | |
| 127 | + <stop | |
| 128 | + style="stop-color:#a5bfda;stop-opacity:1;" | |
| 129 | + offset="0.31578946" | |
| 130 | + id="stop9918" /> | |
| 131 | + <stop | |
| 132 | + id="stop9914" | |
| 133 | + offset="1" | |
| 134 | + style="stop-color:#376ca4;stop-opacity:1;" /> | |
| 135 | + </linearGradient> | |
| 136 | + <linearGradient | |
| 137 | + id="linearGradient9920"> | |
| 138 | + <stop | |
| 139 | + style="stop-color:#5b90c8;stop-opacity:1;" | |
| 140 | + offset="0" | |
| 141 | + id="stop9922" /> | |
| 142 | + <stop | |
| 143 | + id="stop9924" | |
| 144 | + offset="0.31578946" | |
| 145 | + style="stop-color:#8fb0d1;stop-opacity:1;" /> | |
| 146 | + <stop | |
| 147 | + style="stop-color:#34679d;stop-opacity:1;" | |
| 148 | + offset="1" | |
| 149 | + id="stop9926" /> | |
| 150 | + </linearGradient> | |
| 151 | + <inkscape:perspective | |
| 152 | + id="perspective90" | |
| 153 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 154 | + inkscape:vp_z="48 : 24 : 1" | |
| 155 | + inkscape:vp_y="0 : 1000 : 0" | |
| 156 | + inkscape:vp_x="0 : 24 : 1" | |
| 157 | + sodipodi:type="inkscape:persp3d" /> | |
| 158 | + <linearGradient | |
| 159 | + id="linearGradient7121"> | |
| 160 | + <stop | |
| 161 | + id="stop7123" | |
| 162 | + offset="0" | |
| 163 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 164 | + <stop | |
| 165 | + id="stop7125" | |
| 166 | + offset="1" | |
| 167 | + style="stop-color:#8ae234;stop-opacity:1" /> | |
| 168 | + </linearGradient> | |
| 169 | + <inkscape:perspective | |
| 170 | + id="perspective27321" | |
| 171 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 172 | + inkscape:vp_z="48 : 24 : 1" | |
| 173 | + inkscape:vp_y="0 : 1000 : 0" | |
| 174 | + inkscape:vp_x="0 : 24 : 1" | |
| 175 | + sodipodi:type="inkscape:persp3d" /> | |
| 176 | + <linearGradient | |
| 177 | + y2="50.939667" | |
| 178 | + x2="45.380436" | |
| 179 | + y1="45.264122" | |
| 180 | + x1="46.834816" | |
| 181 | + gradientUnits="userSpaceOnUse" | |
| 182 | + id="linearGradient7186" | |
| 183 | + xlink:href="#linearGradient2871" | |
| 184 | + inkscape:collect="always" /> | |
| 185 | + <linearGradient | |
| 186 | + y2="26.649363" | |
| 187 | + x2="53.588623" | |
| 188 | + y1="23.667896" | |
| 189 | + x1="18.935766" | |
| 190 | + gradientUnits="userSpaceOnUse" | |
| 191 | + id="linearGradient7184" | |
| 192 | + xlink:href="#linearGradient2402" | |
| 193 | + inkscape:collect="always" /> | |
| 194 | + <linearGradient | |
| 195 | + y2="50.939667" | |
| 196 | + x2="45.380436" | |
| 197 | + y1="45.264122" | |
| 198 | + x1="46.834816" | |
| 199 | + gradientUnits="userSpaceOnUse" | |
| 200 | + id="linearGradient7182" | |
| 201 | + xlink:href="#linearGradient2871" | |
| 202 | + inkscape:collect="always" /> | |
| 203 | + <linearGradient | |
| 204 | + y2="20.60858" | |
| 205 | + x2="15.984863" | |
| 206 | + y1="36.061237" | |
| 207 | + x1="62.513836" | |
| 208 | + gradientUnits="userSpaceOnUse" | |
| 209 | + id="linearGradient7180" | |
| 210 | + xlink:href="#linearGradient2380" | |
| 211 | + inkscape:collect="always" /> | |
| 212 | + <linearGradient | |
| 213 | + gradientTransform="matrix(-1,0,0,-1,47.93934,50.02474)" | |
| 214 | + y2="23.554308" | |
| 215 | + x2="22.374878" | |
| 216 | + y1="13.604306" | |
| 217 | + x1="13.435029" | |
| 218 | + gradientUnits="userSpaceOnUse" | |
| 219 | + id="linearGradient7189" | |
| 220 | + xlink:href="#linearGradient7179" | |
| 221 | + inkscape:collect="always" /> | |
| 222 | + <linearGradient | |
| 223 | + gradientUnits="userSpaceOnUse" | |
| 224 | + y2="23.554308" | |
| 225 | + x2="22.374878" | |
| 226 | + y1="13.604306" | |
| 227 | + x1="13.435029" | |
| 228 | + id="linearGradient7185" | |
| 229 | + xlink:href="#linearGradient7179" | |
| 230 | + inkscape:collect="always" /> | |
| 231 | + <linearGradient | |
| 232 | + id="linearGradient1322"> | |
| 233 | + <stop | |
| 234 | + style="stop-color:#729fcf" | |
| 235 | + offset="0.0000000" | |
| 236 | + id="stop1324" /> | |
| 237 | + <stop | |
| 238 | + style="stop-color:#5187d6;stop-opacity:1.0000000;" | |
| 239 | + offset="1.0000000" | |
| 240 | + id="stop1326" /> | |
| 241 | + </linearGradient> | |
| 242 | + <linearGradient | |
| 243 | + id="linearGradient2316"> | |
| 244 | + <stop | |
| 245 | + id="stop2318" | |
| 246 | + offset="0" | |
| 247 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 248 | + <stop | |
| 249 | + id="stop2320" | |
| 250 | + offset="1" | |
| 251 | + style="stop-color:#ffffff;stop-opacity:0.65979379;" /> | |
| 252 | + </linearGradient> | |
| 253 | + <linearGradient | |
| 254 | + id="linearGradient7179" | |
| 255 | + inkscape:collect="always"> | |
| 256 | + <stop | |
| 257 | + id="stop7181" | |
| 258 | + offset="0" | |
| 259 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 260 | + <stop | |
| 261 | + id="stop7183" | |
| 262 | + offset="1" | |
| 263 | + style="stop-color:#ffffff;stop-opacity:0;" /> | |
| 264 | + </linearGradient> | |
| 265 | + <linearGradient | |
| 266 | + y2="26.048164" | |
| 267 | + x2="52.854095" | |
| 268 | + y1="26.048164" | |
| 269 | + x1="5.9649177" | |
| 270 | + gradientUnits="userSpaceOnUse" | |
| 271 | + id="linearGradient1491" | |
| 272 | + xlink:href="#linearGradient2797" | |
| 273 | + inkscape:collect="always" /> | |
| 274 | + <linearGradient | |
| 275 | + id="linearGradient2797" | |
| 276 | + inkscape:collect="always"> | |
| 277 | + <stop | |
| 278 | + id="stop2799" | |
| 279 | + offset="0" | |
| 280 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 281 | + <stop | |
| 282 | + id="stop2801" | |
| 283 | + offset="1" | |
| 284 | + style="stop-color:#ffffff;stop-opacity:0;" /> | |
| 285 | + </linearGradient> | |
| 286 | + <linearGradient | |
| 287 | + y2="26.048164" | |
| 288 | + x2="52.854095" | |
| 289 | + y1="26.048164" | |
| 290 | + x1="5.9649177" | |
| 291 | + gradientUnits="userSpaceOnUse" | |
| 292 | + id="linearGradient1493" | |
| 293 | + xlink:href="#linearGradient2797" | |
| 294 | + inkscape:collect="always" /> | |
| 295 | + <linearGradient | |
| 296 | + id="linearGradient2402"> | |
| 297 | + <stop | |
| 298 | + id="stop2404" | |
| 299 | + offset="0" | |
| 300 | + style="stop-color:#729fcf;stop-opacity:1;" /> | |
| 301 | + <stop | |
| 302 | + id="stop2406" | |
| 303 | + offset="1" | |
| 304 | + style="stop-color:#528ac5;stop-opacity:1;" /> | |
| 305 | + </linearGradient> | |
| 306 | + <linearGradient | |
| 307 | + id="linearGradient2871" | |
| 308 | + inkscape:collect="always"> | |
| 309 | + <stop | |
| 310 | + id="stop2873" | |
| 311 | + offset="0" | |
| 312 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 313 | + <stop | |
| 314 | + id="stop2875" | |
| 315 | + offset="1" | |
| 316 | + style="stop-color:#3465a4;stop-opacity:1" /> | |
| 317 | + </linearGradient> | |
| 318 | + <linearGradient | |
| 319 | + gradientTransform="translate(-48.77039,-5.765705)" | |
| 320 | + gradientUnits="userSpaceOnUse" | |
| 321 | + y2="24.842253" | |
| 322 | + x2="37.124462" | |
| 323 | + y1="30.748846" | |
| 324 | + x1="32.647972" | |
| 325 | + id="linearGradient2696" | |
| 326 | + xlink:href="#linearGradient2690" | |
| 327 | + inkscape:collect="always" /> | |
| 328 | + <linearGradient | |
| 329 | + id="linearGradient2690" | |
| 330 | + inkscape:collect="always"> | |
| 331 | + <stop | |
| 332 | + id="stop2692" | |
| 333 | + offset="0" | |
| 334 | + style="stop-color:#c4d7eb;stop-opacity:1;" /> | |
| 335 | + <stop | |
| 336 | + id="stop2694" | |
| 337 | + offset="1" | |
| 338 | + style="stop-color:#c4d7eb;stop-opacity:0;" /> | |
| 339 | + </linearGradient> | |
| 340 | + <linearGradient | |
| 341 | + gradientTransform="translate(-48.77039,-5.765705)" | |
| 342 | + gradientUnits="userSpaceOnUse" | |
| 343 | + y2="24.842253" | |
| 344 | + x2="37.124462" | |
| 345 | + y1="31.455952" | |
| 346 | + x1="36.713837" | |
| 347 | + id="linearGradient2688" | |
| 348 | + xlink:href="#linearGradient2682" | |
| 349 | + inkscape:collect="always" /> | |
| 350 | + <linearGradient | |
| 351 | + id="linearGradient2682"> | |
| 352 | + <stop | |
| 353 | + id="stop2684" | |
| 354 | + offset="0" | |
| 355 | + style="stop-color:#3977c3;stop-opacity:1;" /> | |
| 356 | + <stop | |
| 357 | + id="stop2686" | |
| 358 | + offset="1" | |
| 359 | + style="stop-color:#89aedc;stop-opacity:0;" /> | |
| 360 | + </linearGradient> | |
| 361 | + <linearGradient | |
| 362 | + id="linearGradient2380"> | |
| 363 | + <stop | |
| 364 | + id="stop2382" | |
| 365 | + offset="0" | |
| 366 | + style="stop-color:#b9cfe7;stop-opacity:1" /> | |
| 367 | + <stop | |
| 368 | + id="stop2384" | |
| 369 | + offset="1" | |
| 370 | + style="stop-color:#729fcf;stop-opacity:1" /> | |
| 371 | + </linearGradient> | |
| 372 | + <linearGradient | |
| 373 | + y2="19.115122" | |
| 374 | + x2="15.419417" | |
| 375 | + y1="10.612206" | |
| 376 | + x1="13.478554" | |
| 377 | + gradientTransform="translate(-48.30498,-6.043298)" | |
| 378 | + gradientUnits="userSpaceOnUse" | |
| 379 | + id="linearGradient1486" | |
| 380 | + xlink:href="#linearGradient2831" | |
| 381 | + inkscape:collect="always" /> | |
| 382 | + <linearGradient | |
| 383 | + id="linearGradient2831"> | |
| 384 | + <stop | |
| 385 | + id="stop2833" | |
| 386 | + offset="0" | |
| 387 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 388 | + <stop | |
| 389 | + style="stop-color:#5b86be;stop-opacity:1;" | |
| 390 | + offset="0.33333334" | |
| 391 | + id="stop2855" /> | |
| 392 | + <stop | |
| 393 | + id="stop2835" | |
| 394 | + offset="1" | |
| 395 | + style="stop-color:#83a8d8;stop-opacity:0;" /> | |
| 396 | + </linearGradient> | |
| 397 | + <linearGradient | |
| 398 | + y2="26.194071" | |
| 399 | + x2="37.065414" | |
| 400 | + y1="29.729605" | |
| 401 | + x1="37.128052" | |
| 402 | + gradientTransform="matrix(-1,0,0,-1,-1.24248,40.0817)" | |
| 403 | + gradientUnits="userSpaceOnUse" | |
| 404 | + id="linearGradient1488" | |
| 405 | + xlink:href="#linearGradient2847" | |
| 406 | + inkscape:collect="always" /> | |
| 407 | + <linearGradient | |
| 408 | + id="linearGradient2847" | |
| 409 | + inkscape:collect="always"> | |
| 410 | + <stop | |
| 411 | + id="stop2849" | |
| 412 | + offset="0" | |
| 413 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 414 | + <stop | |
| 415 | + id="stop2851" | |
| 416 | + offset="1" | |
| 417 | + style="stop-color:#3465a4;stop-opacity:0;" /> | |
| 418 | + </linearGradient> | |
| 419 | + <radialGradient | |
| 420 | + r="15.644737" | |
| 421 | + fy="36.421127" | |
| 422 | + fx="24.837126" | |
| 423 | + cy="36.421127" | |
| 424 | + cx="24.837126" | |
| 425 | + gradientTransform="matrix(1,0,0,0.536723,0,16.87306)" | |
| 426 | + gradientUnits="userSpaceOnUse" | |
| 427 | + id="radialGradient1503" | |
| 428 | + xlink:href="#linearGradient8662" | |
| 429 | + inkscape:collect="always" /> | |
| 430 | + <linearGradient | |
| 431 | + id="linearGradient8662" | |
| 432 | + inkscape:collect="always"> | |
| 433 | + <stop | |
| 434 | + id="stop8664" | |
| 435 | + offset="0" | |
| 436 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 437 | + <stop | |
| 438 | + id="stop8666" | |
| 439 | + offset="1" | |
| 440 | + style="stop-color:#000000;stop-opacity:0;" /> | |
| 441 | + </linearGradient> | |
| 442 | + <linearGradient | |
| 443 | + id="linearGradient7916"> | |
| 444 | + <stop | |
| 445 | + id="stop7918" | |
| 446 | + offset="0" | |
| 447 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 448 | + <stop | |
| 449 | + id="stop7920" | |
| 450 | + offset="1.0000000" | |
| 451 | + style="stop-color:#ffffff;stop-opacity:0.34020618;" /> | |
| 452 | + </linearGradient> | |
| 453 | + <inkscape:perspective | |
| 454 | + id="perspective70" | |
| 455 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 456 | + inkscape:vp_z="48 : 24 : 1" | |
| 457 | + inkscape:vp_y="0 : 1000 : 0" | |
| 458 | + inkscape:vp_x="0 : 24 : 1" | |
| 459 | + sodipodi:type="inkscape:persp3d" /> | |
| 460 | + <linearGradient | |
| 461 | + y2="50.939667" | |
| 462 | + x2="45.380436" | |
| 463 | + y1="45.264122" | |
| 464 | + x1="46.834816" | |
| 465 | + gradientUnits="userSpaceOnUse" | |
| 466 | + id="linearGradient7186-5" | |
| 467 | + xlink:href="#linearGradient2871-7" | |
| 468 | + inkscape:collect="always" /> | |
| 469 | + <linearGradient | |
| 470 | + y2="26.649363" | |
| 471 | + x2="53.588623" | |
| 472 | + y1="23.667896" | |
| 473 | + x1="18.935766" | |
| 474 | + gradientUnits="userSpaceOnUse" | |
| 475 | + id="linearGradient7184-5" | |
| 476 | + xlink:href="#linearGradient2402-4" | |
| 477 | + inkscape:collect="always" /> | |
| 478 | + <linearGradient | |
| 479 | + y2="50.939667" | |
| 480 | + x2="45.380436" | |
| 481 | + y1="45.264122" | |
| 482 | + x1="46.834816" | |
| 483 | + gradientUnits="userSpaceOnUse" | |
| 484 | + id="linearGradient7182-1" | |
| 485 | + xlink:href="#linearGradient2871-7" | |
| 486 | + inkscape:collect="always" /> | |
| 487 | + <linearGradient | |
| 488 | + y2="20.60858" | |
| 489 | + x2="15.984863" | |
| 490 | + y1="36.061237" | |
| 491 | + x1="62.513836" | |
| 492 | + gradientUnits="userSpaceOnUse" | |
| 493 | + id="linearGradient7180-4" | |
| 494 | + xlink:href="#linearGradient2380-9" | |
| 495 | + inkscape:collect="always" /> | |
| 496 | + <linearGradient | |
| 497 | + gradientTransform="matrix(-1,0,0,-1,47.93934,50.02474)" | |
| 498 | + y2="23.554308" | |
| 499 | + x2="22.374878" | |
| 500 | + y1="13.604306" | |
| 501 | + x1="13.435029" | |
| 502 | + gradientUnits="userSpaceOnUse" | |
| 503 | + id="linearGradient7189-5" | |
| 504 | + xlink:href="#linearGradient7179-1" | |
| 505 | + inkscape:collect="always" /> | |
| 506 | + <linearGradient | |
| 507 | + gradientUnits="userSpaceOnUse" | |
| 508 | + y2="23.554308" | |
| 509 | + x2="22.374878" | |
| 510 | + y1="13.604306" | |
| 511 | + x1="13.435029" | |
| 512 | + id="linearGradient7185-1" | |
| 513 | + xlink:href="#linearGradient7179-1" | |
| 514 | + inkscape:collect="always" /> | |
| 515 | + <linearGradient | |
| 516 | + id="linearGradient1322-5"> | |
| 517 | + <stop | |
| 518 | + style="stop-color:#729fcf" | |
| 519 | + offset="0.0000000" | |
| 520 | + id="stop1324-3" /> | |
| 521 | + <stop | |
| 522 | + style="stop-color:#5187d6;stop-opacity:1.0000000;" | |
| 523 | + offset="1.0000000" | |
| 524 | + id="stop1326-9" /> | |
| 525 | + </linearGradient> | |
| 526 | + <linearGradient | |
| 527 | + id="linearGradient2316-6"> | |
| 528 | + <stop | |
| 529 | + id="stop2318-0" | |
| 530 | + offset="0" | |
| 531 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 532 | + <stop | |
| 533 | + id="stop2320-8" | |
| 534 | + offset="1" | |
| 535 | + style="stop-color:#ffffff;stop-opacity:0.65979379;" /> | |
| 536 | + </linearGradient> | |
| 537 | + <linearGradient | |
| 538 | + id="linearGradient7179-1" | |
| 539 | + inkscape:collect="always"> | |
| 540 | + <stop | |
| 541 | + id="stop7181-7" | |
| 542 | + offset="0" | |
| 543 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 544 | + <stop | |
| 545 | + id="stop7183-0" | |
| 546 | + offset="1" | |
| 547 | + style="stop-color:#ffffff;stop-opacity:0;" /> | |
| 548 | + </linearGradient> | |
| 549 | + <linearGradient | |
| 550 | + y2="26.048164" | |
| 551 | + x2="52.854095" | |
| 552 | + y1="26.048164" | |
| 553 | + x1="5.9649177" | |
| 554 | + gradientUnits="userSpaceOnUse" | |
| 555 | + id="linearGradient1491-9" | |
| 556 | + xlink:href="#linearGradient2797-9" | |
| 557 | + inkscape:collect="always" /> | |
| 558 | + <linearGradient | |
| 559 | + id="linearGradient2797-9" | |
| 560 | + inkscape:collect="always"> | |
| 561 | + <stop | |
| 562 | + id="stop2799-7" | |
| 563 | + offset="0" | |
| 564 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 565 | + <stop | |
| 566 | + id="stop2801-4" | |
| 567 | + offset="1" | |
| 568 | + style="stop-color:#ffffff;stop-opacity:0;" /> | |
| 569 | + </linearGradient> | |
| 570 | + <linearGradient | |
| 571 | + y2="26.048164" | |
| 572 | + x2="52.854095" | |
| 573 | + y1="26.048164" | |
| 574 | + x1="5.9649177" | |
| 575 | + gradientUnits="userSpaceOnUse" | |
| 576 | + id="linearGradient1493-7" | |
| 577 | + xlink:href="#linearGradient2797-9" | |
| 578 | + inkscape:collect="always" /> | |
| 579 | + <linearGradient | |
| 580 | + id="linearGradient2402-4"> | |
| 581 | + <stop | |
| 582 | + id="stop2404-6" | |
| 583 | + offset="0" | |
| 584 | + style="stop-color:#729fcf;stop-opacity:1;" /> | |
| 585 | + <stop | |
| 586 | + id="stop2406-3" | |
| 587 | + offset="1" | |
| 588 | + style="stop-color:#528ac5;stop-opacity:1;" /> | |
| 589 | + </linearGradient> | |
| 590 | + <linearGradient | |
| 591 | + id="linearGradient2871-7" | |
| 592 | + inkscape:collect="always"> | |
| 593 | + <stop | |
| 594 | + id="stop2873-5" | |
| 595 | + offset="0" | |
| 596 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 597 | + <stop | |
| 598 | + id="stop2875-6" | |
| 599 | + offset="1" | |
| 600 | + style="stop-color:#3465a4;stop-opacity:1" /> | |
| 601 | + </linearGradient> | |
| 602 | + <linearGradient | |
| 603 | + gradientTransform="translate(-48.77039,-5.765705)" | |
| 604 | + gradientUnits="userSpaceOnUse" | |
| 605 | + y2="24.842253" | |
| 606 | + x2="37.124462" | |
| 607 | + y1="30.748846" | |
| 608 | + x1="32.647972" | |
| 609 | + id="linearGradient2696-9" | |
| 610 | + xlink:href="#linearGradient2690-0" | |
| 611 | + inkscape:collect="always" /> | |
| 612 | + <linearGradient | |
| 613 | + id="linearGradient2690-0" | |
| 614 | + inkscape:collect="always"> | |
| 615 | + <stop | |
| 616 | + id="stop2692-2" | |
| 617 | + offset="0" | |
| 618 | + style="stop-color:#c4d7eb;stop-opacity:1;" /> | |
| 619 | + <stop | |
| 620 | + id="stop2694-2" | |
| 621 | + offset="1" | |
| 622 | + style="stop-color:#c4d7eb;stop-opacity:0;" /> | |
| 623 | + </linearGradient> | |
| 624 | + <linearGradient | |
| 625 | + gradientTransform="translate(-48.77039,-5.765705)" | |
| 626 | + gradientUnits="userSpaceOnUse" | |
| 627 | + y2="24.842253" | |
| 628 | + x2="37.124462" | |
| 629 | + y1="31.455952" | |
| 630 | + x1="36.713837" | |
| 631 | + id="linearGradient2688-1" | |
| 632 | + xlink:href="#linearGradient2682-8" | |
| 633 | + inkscape:collect="always" /> | |
| 634 | + <linearGradient | |
| 635 | + id="linearGradient2682-8"> | |
| 636 | + <stop | |
| 637 | + id="stop2684-0" | |
| 638 | + offset="0" | |
| 639 | + style="stop-color:#3977c3;stop-opacity:1;" /> | |
| 640 | + <stop | |
| 641 | + id="stop2686-8" | |
| 642 | + offset="1" | |
| 643 | + style="stop-color:#89aedc;stop-opacity:0;" /> | |
| 644 | + </linearGradient> | |
| 645 | + <linearGradient | |
| 646 | + id="linearGradient2380-9"> | |
| 647 | + <stop | |
| 648 | + id="stop2382-6" | |
| 649 | + offset="0" | |
| 650 | + style="stop-color:#b9cfe7;stop-opacity:1" /> | |
| 651 | + <stop | |
| 652 | + id="stop2384-4" | |
| 653 | + offset="1" | |
| 654 | + style="stop-color:#729fcf;stop-opacity:1" /> | |
| 655 | + </linearGradient> | |
| 656 | + <linearGradient | |
| 657 | + y2="19.115122" | |
| 658 | + x2="15.419417" | |
| 659 | + y1="10.612206" | |
| 660 | + x1="13.478554" | |
| 661 | + gradientTransform="translate(-48.30498,-6.043298)" | |
| 662 | + gradientUnits="userSpaceOnUse" | |
| 663 | + id="linearGradient1486-1" | |
| 664 | + xlink:href="#linearGradient2831-1" | |
| 665 | + inkscape:collect="always" /> | |
| 666 | + <linearGradient | |
| 667 | + id="linearGradient2831-1"> | |
| 668 | + <stop | |
| 669 | + id="stop2833-6" | |
| 670 | + offset="0" | |
| 671 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 672 | + <stop | |
| 673 | + style="stop-color:#5b86be;stop-opacity:1;" | |
| 674 | + offset="0.33333334" | |
| 675 | + id="stop2855-6" /> | |
| 676 | + <stop | |
| 677 | + id="stop2835-2" | |
| 678 | + offset="1" | |
| 679 | + style="stop-color:#83a8d8;stop-opacity:0;" /> | |
| 680 | + </linearGradient> | |
| 681 | + <linearGradient | |
| 682 | + y2="26.194071" | |
| 683 | + x2="37.065414" | |
| 684 | + y1="29.729605" | |
| 685 | + x1="37.128052" | |
| 686 | + gradientTransform="matrix(-1,0,0,-1,-1.24248,40.0817)" | |
| 687 | + gradientUnits="userSpaceOnUse" | |
| 688 | + id="linearGradient1488-5" | |
| 689 | + xlink:href="#linearGradient2847-4" | |
| 690 | + inkscape:collect="always" /> | |
| 691 | + <linearGradient | |
| 692 | + id="linearGradient2847-4" | |
| 693 | + inkscape:collect="always"> | |
| 694 | + <stop | |
| 695 | + id="stop2849-0" | |
| 696 | + offset="0" | |
| 697 | + style="stop-color:#3465a4;stop-opacity:1;" /> | |
| 698 | + <stop | |
| 699 | + id="stop2851-8" | |
| 700 | + offset="1" | |
| 701 | + style="stop-color:#3465a4;stop-opacity:0;" /> | |
| 702 | + </linearGradient> | |
| 703 | + <radialGradient | |
| 704 | + r="15.644737" | |
| 705 | + fy="36.421127" | |
| 706 | + fx="24.837126" | |
| 707 | + cy="36.421127" | |
| 708 | + cx="24.837126" | |
| 709 | + gradientTransform="matrix(1,0,0,0.536723,0,16.87306)" | |
| 710 | + gradientUnits="userSpaceOnUse" | |
| 711 | + id="radialGradient1503-0" | |
| 712 | + xlink:href="#linearGradient8662-1" | |
| 713 | + inkscape:collect="always" /> | |
| 714 | + <linearGradient | |
| 715 | + id="linearGradient8662-1" | |
| 716 | + inkscape:collect="always"> | |
| 717 | + <stop | |
| 718 | + id="stop8664-1" | |
| 719 | + offset="0" | |
| 720 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 721 | + <stop | |
| 722 | + id="stop8666-7" | |
| 723 | + offset="1" | |
| 724 | + style="stop-color:#000000;stop-opacity:0;" /> | |
| 725 | + </linearGradient> | |
| 726 | + <linearGradient | |
| 727 | + id="linearGradient7916-1"> | |
| 728 | + <stop | |
| 729 | + id="stop7918-7" | |
| 730 | + offset="0" | |
| 731 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 732 | + <stop | |
| 733 | + id="stop7920-1" | |
| 734 | + offset="1.0000000" | |
| 735 | + style="stop-color:#ffffff;stop-opacity:0.34020618;" /> | |
| 736 | + </linearGradient> | |
| 737 | + <inkscape:perspective | |
| 738 | + id="perspective70-5" | |
| 739 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 740 | + inkscape:vp_z="48 : 24 : 1" | |
| 741 | + inkscape:vp_y="0 : 1000 : 0" | |
| 742 | + inkscape:vp_x="0 : 24 : 1" | |
| 743 | + sodipodi:type="inkscape:persp3d" /> | |
| 744 | + <inkscape:perspective | |
| 745 | + id="perspective29237" | |
| 746 | + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" | |
| 747 | + inkscape:vp_z="1 : 0.5 : 1" | |
| 748 | + inkscape:vp_y="0 : 1000 : 0" | |
| 749 | + inkscape:vp_x="0 : 0.5 : 1" | |
| 750 | + sodipodi:type="inkscape:persp3d" /> | |
| 751 | + <linearGradient | |
| 752 | + inkscape:collect="always" | |
| 753 | + id="linearGradient6998-2"> | |
| 754 | + <stop | |
| 755 | + style="stop-color:#000000;stop-opacity:1;" | |
| 756 | + offset="0" | |
| 757 | + id="stop7000-7" /> | |
| 758 | + <stop | |
| 759 | + style="stop-color:#000000;stop-opacity:0;" | |
| 760 | + offset="1" | |
| 761 | + id="stop7002-1" /> | |
| 762 | + </linearGradient> | |
| 763 | + <radialGradient | |
| 764 | + inkscape:collect="always" | |
| 765 | + xlink:href="#linearGradient6998-2" | |
| 766 | + id="radialGradient29477" | |
| 767 | + gradientUnits="userSpaceOnUse" | |
| 768 | + gradientTransform="matrix(1,0,0,0.3222749,0,20.728756)" | |
| 769 | + cx="19.688505" | |
| 770 | + cy="30.585787" | |
| 771 | + fx="19.688505" | |
| 772 | + fy="30.585787" | |
| 773 | + r="4.6624851" /> | |
| 774 | + <radialGradient | |
| 775 | + inkscape:collect="always" | |
| 776 | + xlink:href="#linearGradient6998-2" | |
| 777 | + id="radialGradient29479" | |
| 778 | + gradientUnits="userSpaceOnUse" | |
| 779 | + gradientTransform="matrix(1,0,0,0.3222749,0,20.728756)" | |
| 780 | + cx="19.688505" | |
| 781 | + cy="30.585787" | |
| 782 | + fx="19.688505" | |
| 783 | + fy="30.585787" | |
| 784 | + r="4.6624851" /> | |
| 785 | + <linearGradient | |
| 786 | + y2="35.739632" | |
| 787 | + x2="21.408455" | |
| 788 | + y1="36.390400" | |
| 789 | + x1="22.686766" | |
| 790 | + gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" | |
| 791 | + gradientUnits="userSpaceOnUse" | |
| 792 | + id="linearGradient4374" | |
| 793 | + xlink:href="#linearGradient4356" | |
| 794 | + inkscape:collect="always" /> | |
| 795 | + <linearGradient | |
| 796 | + y2="36.217758" | |
| 797 | + x2="22.626925" | |
| 798 | + y1="35.817974" | |
| 799 | + x1="20.661695" | |
| 800 | + gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.072120,-9.824920)" | |
| 801 | + gradientUnits="userSpaceOnUse" | |
| 802 | + id="linearGradient4372" | |
| 803 | + xlink:href="#linearGradient4356" | |
| 804 | + inkscape:collect="always" /> | |
| 805 | + <radialGradient | |
| 806 | + gradientUnits="userSpaceOnUse" | |
| 807 | + gradientTransform="matrix(1.000000,0.000000,0.000000,0.681917,0.000000,8.233773)" | |
| 808 | + r="13.565360" | |
| 809 | + fy="19.836468" | |
| 810 | + fx="16.214741" | |
| 811 | + cy="19.836468" | |
| 812 | + cx="16.214741" | |
| 813 | + id="radialGradient4350" | |
| 814 | + xlink:href="#linearGradient4344" | |
| 815 | + inkscape:collect="always" /> | |
| 816 | + <linearGradient | |
| 817 | + gradientTransform="translate(-13.12500,-7.000000)" | |
| 818 | + y2="35.803486" | |
| 819 | + x2="30.935921" | |
| 820 | + y1="29.553486" | |
| 821 | + x1="30.935921" | |
| 822 | + gradientUnits="userSpaceOnUse" | |
| 823 | + id="linearGradient4332" | |
| 824 | + xlink:href="#linearGradient3824" | |
| 825 | + inkscape:collect="always" /> | |
| 826 | + <linearGradient | |
| 827 | + y2="35.803486" | |
| 828 | + x2="30.935921" | |
| 829 | + y1="29.553486" | |
| 830 | + x1="30.935921" | |
| 831 | + gradientTransform="translate(-12.41789,-7.000000)" | |
| 832 | + gradientUnits="userSpaceOnUse" | |
| 833 | + id="linearGradient4326" | |
| 834 | + xlink:href="#linearGradient3824" | |
| 835 | + inkscape:collect="always" /> | |
| 836 | + <linearGradient | |
| 837 | + gradientTransform="translate(0.707108,0.000000)" | |
| 838 | + y2="35.803486" | |
| 839 | + x2="30.935921" | |
| 840 | + y1="29.553486" | |
| 841 | + x1="30.935921" | |
| 842 | + gradientUnits="userSpaceOnUse" | |
| 843 | + id="linearGradient4175" | |
| 844 | + xlink:href="#linearGradient3824" | |
| 845 | + inkscape:collect="always" /> | |
| 846 | + <radialGradient | |
| 847 | + gradientUnits="userSpaceOnUse" | |
| 848 | + r="9.1620579" | |
| 849 | + fy="17.064077" | |
| 850 | + fx="29.344931" | |
| 851 | + cy="17.064077" | |
| 852 | + cx="29.344931" | |
| 853 | + id="radialGradient3806" | |
| 854 | + xlink:href="#linearGradient3800" | |
| 855 | + inkscape:collect="always" /> | |
| 856 | + <linearGradient | |
| 857 | + id="linearGradient3800"> | |
| 858 | + <stop | |
| 859 | + id="stop3802" | |
| 860 | + offset="0.0000000" | |
| 861 | + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> | |
| 862 | + <stop | |
| 863 | + id="stop3804" | |
| 864 | + offset="1.0000000" | |
| 865 | + style="stop-color:#df9725;stop-opacity:1.0000000;" /> | |
| 866 | + </linearGradient> | |
| 867 | + <linearGradient | |
| 868 | + id="linearGradient3816" | |
| 869 | + inkscape:collect="always"> | |
| 870 | + <stop | |
| 871 | + id="stop3818" | |
| 872 | + offset="0" | |
| 873 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 874 | + <stop | |
| 875 | + id="stop3820" | |
| 876 | + offset="1" | |
| 877 | + style="stop-color:#000000;stop-opacity:0;" /> | |
| 878 | + </linearGradient> | |
| 879 | + <linearGradient | |
| 880 | + id="linearGradient3824"> | |
| 881 | + <stop | |
| 882 | + id="stop3826" | |
| 883 | + offset="0" | |
| 884 | + style="stop-color:#ffffff;stop-opacity:1;" /> | |
| 885 | + <stop | |
| 886 | + id="stop3828" | |
| 887 | + offset="1.0000000" | |
| 888 | + style="stop-color:#c9c9c9;stop-opacity:1.0000000;" /> | |
| 889 | + </linearGradient> | |
| 890 | + <linearGradient | |
| 891 | + id="linearGradient4163"> | |
| 892 | + <stop | |
| 893 | + id="stop4165" | |
| 894 | + offset="0.0000000" | |
| 895 | + style="stop-color:#3b74bc;stop-opacity:1.0000000;" /> | |
| 896 | + <stop | |
| 897 | + id="stop4167" | |
| 898 | + offset="1.0000000" | |
| 899 | + style="stop-color:#2d5990;stop-opacity:1.0000000;" /> | |
| 900 | + </linearGradient> | |
| 901 | + <linearGradient | |
| 902 | + id="linearGradient4338"> | |
| 903 | + <stop | |
| 904 | + style="stop-color:#e9b15e;stop-opacity:1.0000000;" | |
| 905 | + offset="0.0000000" | |
| 906 | + id="stop4340" /> | |
| 907 | + <stop | |
| 908 | + style="stop-color:#966416;stop-opacity:1.0000000;" | |
| 909 | + offset="1.0000000" | |
| 910 | + id="stop4342" /> | |
| 911 | + </linearGradient> | |
| 912 | + <linearGradient | |
| 913 | + id="linearGradient4344"> | |
| 914 | + <stop | |
| 915 | + id="stop4346" | |
| 916 | + offset="0" | |
| 917 | + style="stop-color:#727e0a;stop-opacity:1;" /> | |
| 918 | + <stop | |
| 919 | + id="stop4348" | |
| 920 | + offset="1.0000000" | |
| 921 | + style="stop-color:#5b6508;stop-opacity:1.0000000;" /> | |
| 922 | + </linearGradient> | |
| 923 | + <linearGradient | |
| 924 | + id="linearGradient4356" | |
| 925 | + inkscape:collect="always"> | |
| 926 | + <stop | |
| 927 | + id="stop4358" | |
| 928 | + offset="0" | |
| 929 | + style="stop-color:#000000;stop-opacity:1;" /> | |
| 930 | + <stop | |
| 931 | + id="stop4360" | |
| 932 | + offset="1" | |
| 933 | + style="stop-color:#000000;stop-opacity:0;" /> | |
| 934 | + </linearGradient> | |
| 935 | + <inkscape:perspective | |
| 936 | + id="perspective72" | |
| 937 | + inkscape:persp3d-origin="24 : 16 : 1" | |
| 938 | + inkscape:vp_z="48 : 24 : 1" | |
| 939 | + inkscape:vp_y="0 : 1000 : 0" | |
| 940 | + inkscape:vp_x="0 : 24 : 1" | |
| 941 | + sodipodi:type="inkscape:persp3d" /> | |
| 942 | + <radialGradient | |
| 943 | + inkscape:collect="always" | |
| 944 | + xlink:href="#linearGradient3816" | |
| 945 | + id="radialGradient4243" | |
| 946 | + gradientUnits="userSpaceOnUse" | |
| 947 | + cx="31.112698" | |
| 948 | + cy="19.008621" | |
| 949 | + fx="31.112698" | |
| 950 | + fy="19.008621" | |
| 951 | + r="8.6620579" /> | |
| 952 | + <radialGradient | |
| 953 | + inkscape:collect="always" | |
| 954 | + xlink:href="#linearGradient3800" | |
| 955 | + id="radialGradient4251" | |
| 956 | + gradientUnits="userSpaceOnUse" | |
| 957 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 958 | + cx="29.344931" | |
| 959 | + cy="17.064077" | |
| 960 | + fx="29.344931" | |
| 961 | + fy="17.064077" | |
| 962 | + r="9.1620579" /> | |
| 963 | + <radialGradient | |
| 964 | + inkscape:collect="always" | |
| 965 | + xlink:href="#linearGradient3816" | |
| 966 | + id="radialGradient4257" | |
| 967 | + gradientUnits="userSpaceOnUse" | |
| 968 | + cx="31.112698" | |
| 969 | + cy="19.008621" | |
| 970 | + fx="31.112698" | |
| 971 | + fy="19.008621" | |
| 972 | + r="8.6620579" /> | |
| 973 | + <radialGradient | |
| 974 | + inkscape:collect="always" | |
| 975 | + xlink:href="#linearGradient3816" | |
| 976 | + id="radialGradient4261" | |
| 977 | + gradientUnits="userSpaceOnUse" | |
| 978 | + cx="31.112698" | |
| 979 | + cy="19.008621" | |
| 980 | + fx="31.112698" | |
| 981 | + fy="19.008621" | |
| 982 | + r="8.6620579" /> | |
| 983 | + <radialGradient | |
| 984 | + inkscape:collect="always" | |
| 985 | + xlink:href="#linearGradient4338" | |
| 986 | + id="radialGradient4263" | |
| 987 | + gradientUnits="userSpaceOnUse" | |
| 988 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 989 | + cx="29.344931" | |
| 990 | + cy="17.064077" | |
| 991 | + fx="29.344931" | |
| 992 | + fy="17.064077" | |
| 993 | + r="9.1620579" /> | |
| 994 | + <linearGradient | |
| 995 | + inkscape:collect="always" | |
| 996 | + xlink:href="#linearGradient4356" | |
| 997 | + id="linearGradient4272" | |
| 998 | + gradientUnits="userSpaceOnUse" | |
| 999 | + gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,40.096379,991.52674)" | |
| 1000 | + x1="22.686766" | |
| 1001 | + y1="36.390400" | |
| 1002 | + x2="21.408455" | |
| 1003 | + y2="35.739632" /> | |
| 1004 | + <linearGradient | |
| 1005 | + inkscape:collect="always" | |
| 1006 | + xlink:href="#linearGradient4356" | |
| 1007 | + id="linearGradient4275" | |
| 1008 | + gradientUnits="userSpaceOnUse" | |
| 1009 | + gradientTransform="matrix(0.95236899,-0.304949,0.304949,0.95236899,-24.109161,1001.0625)" | |
| 1010 | + x1="20.661695" | |
| 1011 | + y1="35.817974" | |
| 1012 | + x2="22.626925" | |
| 1013 | + y2="36.217758" /> | |
| 1014 | + <linearGradient | |
| 1015 | + inkscape:collect="always" | |
| 1016 | + xlink:href="#linearGradient3824" | |
| 1017 | + id="linearGradient4278" | |
| 1018 | + gradientUnits="userSpaceOnUse" | |
| 1019 | + gradientTransform="translate(-14.127271,995.6454)" | |
| 1020 | + x1="30.935921" | |
| 1021 | + y1="29.553486" | |
| 1022 | + x2="30.935921" | |
| 1023 | + y2="35.803486" /> | |
| 1024 | + <radialGradient | |
| 1025 | + inkscape:collect="always" | |
| 1026 | + xlink:href="#linearGradient4344" | |
| 1027 | + id="radialGradient4287" | |
| 1028 | + gradientUnits="userSpaceOnUse" | |
| 1029 | + gradientTransform="matrix(1,0,0,0.681917,-1.7093807,1010.8792)" | |
| 1030 | + cx="16.214741" | |
| 1031 | + cy="19.836468" | |
| 1032 | + fx="16.214741" | |
| 1033 | + fy="19.836468" | |
| 1034 | + r="13.565360" /> | |
| 1035 | + <radialGradient | |
| 1036 | + inkscape:collect="always" | |
| 1037 | + xlink:href="#linearGradient4338" | |
| 1038 | + id="radialGradient4300" | |
| 1039 | + gradientUnits="userSpaceOnUse" | |
| 1040 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1041 | + cx="29.344931" | |
| 1042 | + cy="17.064077" | |
| 1043 | + fx="29.344931" | |
| 1044 | + fy="17.064077" | |
| 1045 | + r="9.1620579" /> | |
| 1046 | + <radialGradient | |
| 1047 | + inkscape:collect="always" | |
| 1048 | + xlink:href="#linearGradient4163" | |
| 1049 | + id="radialGradient4318" | |
| 1050 | + gradientUnits="userSpaceOnUse" | |
| 1051 | + gradientTransform="matrix(1.297564,0,0,0.884831,-4.2342547,1013.4195)" | |
| 1052 | + cx="28.089741" | |
| 1053 | + cy="27.203083" | |
| 1054 | + fx="28.089741" | |
| 1055 | + fy="27.203083" | |
| 1056 | + r="13.565360" /> | |
| 1057 | + <radialGradient | |
| 1058 | + inkscape:collect="always" | |
| 1059 | + xlink:href="#linearGradient3816" | |
| 1060 | + id="radialGradient4321" | |
| 1061 | + gradientUnits="userSpaceOnUse" | |
| 1062 | + cx="31.112698" | |
| 1063 | + cy="19.008621" | |
| 1064 | + fx="31.112698" | |
| 1065 | + fy="19.008621" | |
| 1066 | + r="8.6620579" /> | |
| 1067 | + <inkscape:perspective | |
| 1068 | + id="perspective4984" | |
| 1069 | + inkscape:persp3d-origin="0.5 : 0.33333333 : 1" | |
| 1070 | + inkscape:vp_z="1 : 0.5 : 1" | |
| 1071 | + inkscape:vp_y="0 : 1000 : 0" | |
| 1072 | + inkscape:vp_x="0 : 0.5 : 1" | |
| 1073 | + sodipodi:type="inkscape:persp3d" /> | |
| 1074 | + <linearGradient | |
| 1075 | + id="linearGradient5048"> | |
| 1076 | + <stop | |
| 1077 | + style="stop-color:black;stop-opacity:0;" | |
| 1078 | + offset="0" | |
| 1079 | + id="stop5050" /> | |
| 1080 | + <stop | |
| 1081 | + id="stop5056" | |
| 1082 | + offset="0.5" | |
| 1083 | + style="stop-color:black;stop-opacity:1;" /> | |
| 1084 | + <stop | |
| 1085 | + style="stop-color:black;stop-opacity:0;" | |
| 1086 | + offset="1" | |
| 1087 | + id="stop5052" /> | |
| 1088 | + </linearGradient> | |
| 1089 | + <linearGradient | |
| 1090 | + id="linearGradient259"> | |
| 1091 | + <stop | |
| 1092 | + id="stop260" | |
| 1093 | + offset="0.0000000" | |
| 1094 | + style="stop-color:#fafafa;stop-opacity:1.0000000;" /> | |
| 1095 | + <stop | |
| 1096 | + id="stop261" | |
| 1097 | + offset="1.0000000" | |
| 1098 | + style="stop-color:#bbbbbb;stop-opacity:1.0000000;" /> | |
| 1099 | + </linearGradient> | |
| 1100 | + <linearGradient | |
| 1101 | + id="linearGradient269"> | |
| 1102 | + <stop | |
| 1103 | + id="stop270" | |
| 1104 | + offset="0.0000000" | |
| 1105 | + style="stop-color:#a3a3a3;stop-opacity:1.0000000;" /> | |
| 1106 | + <stop | |
| 1107 | + id="stop271" | |
| 1108 | + offset="1.0000000" | |
| 1109 | + style="stop-color:#4c4c4c;stop-opacity:1.0000000;" /> | |
| 1110 | + </linearGradient> | |
| 1111 | + <linearGradient | |
| 1112 | + id="linearGradient15662"> | |
| 1113 | + <stop | |
| 1114 | + id="stop15664" | |
| 1115 | + offset="0.0000000" | |
| 1116 | + style="stop-color:#ffffff;stop-opacity:1.0000000;" /> | |
| 1117 | + <stop | |
| 1118 | + id="stop15666" | |
| 1119 | + offset="1.0000000" | |
| 1120 | + style="stop-color:#f8f8f8;stop-opacity:1.0000000;" /> | |
| 1121 | + </linearGradient> | |
| 1122 | + <linearGradient | |
| 1123 | + inkscape:collect="always" | |
| 1124 | + id="linearGradient5866"> | |
| 1125 | + <stop | |
| 1126 | + style="stop-color:#000000;stop-opacity:1;" | |
| 1127 | + offset="0" | |
| 1128 | + id="stop5868" /> | |
| 1129 | + <stop | |
| 1130 | + style="stop-color:#000000;stop-opacity:0;" | |
| 1131 | + offset="1" | |
| 1132 | + id="stop5870" /> | |
| 1133 | + </linearGradient> | |
| 1134 | + <linearGradient | |
| 1135 | + id="linearGradient2598"> | |
| 1136 | + <stop | |
| 1137 | + style="stop-color:#859dbc;stop-opacity:1;" | |
| 1138 | + offset="0" | |
| 1139 | + id="stop2600" /> | |
| 1140 | + <stop | |
| 1141 | + style="stop-color:#547299;stop-opacity:1;" | |
| 1142 | + offset="1" | |
| 1143 | + id="stop2602" /> | |
| 1144 | + </linearGradient> | |
| 1145 | + <linearGradient | |
| 1146 | + inkscape:collect="always" | |
| 1147 | + id="linearGradient4404"> | |
| 1148 | + <stop | |
| 1149 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 1150 | + offset="0" | |
| 1151 | + id="stop4406" /> | |
| 1152 | + <stop | |
| 1153 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 1154 | + offset="1" | |
| 1155 | + id="stop4408" /> | |
| 1156 | + </linearGradient> | |
| 1157 | + <linearGradient | |
| 1158 | + id="linearGradient5897"> | |
| 1159 | + <stop | |
| 1160 | + style="stop-color:#000000;stop-opacity:0.0000000;" | |
| 1161 | + offset="0.0000000" | |
| 1162 | + id="stop5899" /> | |
| 1163 | + <stop | |
| 1164 | + id="stop5905" | |
| 1165 | + offset="0.50000000" | |
| 1166 | + style="stop-color:#000000;stop-opacity:0.56701028;" /> | |
| 1167 | + <stop | |
| 1168 | + style="stop-color:#000000;stop-opacity:0.0000000;" | |
| 1169 | + offset="1.0000000" | |
| 1170 | + id="stop5901" /> | |
| 1171 | + </linearGradient> | |
| 1172 | + <linearGradient | |
| 1173 | + id="linearGradient2590"> | |
| 1174 | + <stop | |
| 1175 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 1176 | + offset="0" | |
| 1177 | + id="stop2592" /> | |
| 1178 | + <stop | |
| 1179 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 1180 | + offset="1" | |
| 1181 | + id="stop2594" /> | |
| 1182 | + </linearGradient> | |
| 1183 | + <linearGradient | |
| 1184 | + inkscape:collect="always" | |
| 1185 | + id="linearGradient2906"> | |
| 1186 | + <stop | |
| 1187 | + style="stop-color:#ffffff;stop-opacity:1;" | |
| 1188 | + offset="0" | |
| 1189 | + id="stop2908" /> | |
| 1190 | + <stop | |
| 1191 | + style="stop-color:#ffffff;stop-opacity:0;" | |
| 1192 | + offset="1" | |
| 1193 | + id="stop2910" /> | |
| 1194 | + </linearGradient> | |
| 1195 | + <linearGradient | |
| 1196 | + inkscape:collect="always" | |
| 1197 | + xlink:href="#linearGradient2896" | |
| 1198 | + id="linearGradient2902" | |
| 1199 | + x1="14.584077" | |
| 1200 | + y1="1.6392649" | |
| 1201 | + x2="14.552828" | |
| 1202 | + y2="2.4912448" | |
| 1203 | + gradientUnits="userSpaceOnUse" | |
| 1204 | + gradientTransform="matrix(1,0,0,1.594214,0,-0.790249)" /> | |
| 1205 | + <linearGradient | |
| 1206 | + inkscape:collect="always" | |
| 1207 | + id="linearGradient2896"> | |
| 1208 | + <stop | |
| 1209 | + style="stop-color:#000000;stop-opacity:1;" | |
| 1210 | + offset="0" | |
| 1211 | + id="stop2898" /> | |
| 1212 | + <stop | |
| 1213 | + style="stop-color:#000000;stop-opacity:0;" | |
| 1214 | + offset="1" | |
| 1215 | + id="stop2900" /> | |
| 1216 | + </linearGradient> | |
| 1217 | + <linearGradient | |
| 1218 | + inkscape:collect="always" | |
| 1219 | + xlink:href="#linearGradient2896" | |
| 1220 | + id="linearGradient5356" | |
| 1221 | + gradientUnits="userSpaceOnUse" | |
| 1222 | + gradientTransform="matrix(0.35541046,-0.09680687,0.16161446,0.54106498,4.9107799,1029.1036)" | |
| 1223 | + x1="14.584077" | |
| 1224 | + y1="1.6392649" | |
| 1225 | + x2="14.552828" | |
| 1226 | + y2="2.4912448" /> | |
| 1227 | + <linearGradient | |
| 1228 | + inkscape:collect="always" | |
| 1229 | + xlink:href="#linearGradient2906" | |
| 1230 | + id="linearGradient5359" | |
| 1231 | + gradientUnits="userSpaceOnUse" | |
| 1232 | + gradientTransform="matrix(0.35541046,-0.09680687,0.12011148,0.40211819,4.9170956,1029.1248)" | |
| 1233 | + x1="13.354311" | |
| 1234 | + y1="1.4866425" | |
| 1235 | + x2="14.075844" | |
| 1236 | + y2="2.4017651" /> | |
| 1237 | + <linearGradient | |
| 1238 | + inkscape:collect="always" | |
| 1239 | + xlink:href="#linearGradient2590" | |
| 1240 | + id="linearGradient5362" | |
| 1241 | + gradientUnits="userSpaceOnUse" | |
| 1242 | + gradientTransform="matrix(0.46898152,-0.12774141,0.12979691,0.43454379,2.9741905,1030.0125)" | |
| 1243 | + x1="19.970377" | |
| 1244 | + y1="6.1167107" | |
| 1245 | + x2="19.970377" | |
| 1246 | + y2="2.53125" /> | |
| 1247 | + <linearGradient | |
| 1248 | + inkscape:collect="always" | |
| 1249 | + xlink:href="#linearGradient5897" | |
| 1250 | + id="linearGradient5365" | |
| 1251 | + gradientUnits="userSpaceOnUse" | |
| 1252 | + gradientTransform="matrix(0.48606741,0,0,0.75585752,-291.56104,989.60553)" | |
| 1253 | + x1="19" | |
| 1254 | + y1="9.7738247" | |
| 1255 | + x2="19" | |
| 1256 | + y2="15.635596" /> | |
| 1257 | + <linearGradient | |
| 1258 | + inkscape:collect="always" | |
| 1259 | + xlink:href="#linearGradient4404" | |
| 1260 | + id="linearGradient5368" | |
| 1261 | + gradientUnits="userSpaceOnUse" | |
| 1262 | + gradientTransform="matrix(-0.46898152,0.12774141,0.1380797,0.46227355,19.308685,1025.339)" | |
| 1263 | + x1="16.8125" | |
| 1264 | + y1="1.875" | |
| 1265 | + x2="16.8125" | |
| 1266 | + y2="4.71875" /> | |
| 1267 | + <linearGradient | |
| 1268 | + inkscape:collect="always" | |
| 1269 | + xlink:href="#linearGradient2598" | |
| 1270 | + id="linearGradient5371" | |
| 1271 | + gradientUnits="userSpaceOnUse" | |
| 1272 | + gradientTransform="matrix(0.46898152,-0.12774141,0.13168827,0.44087584,3.7514528,1029.219)" | |
| 1273 | + x1="18.431311" | |
| 1274 | + y1="19.119474" | |
| 1275 | + x2="18.402472" | |
| 1276 | + y2="4.2702327" /> | |
| 1277 | + <linearGradient | |
| 1278 | + inkscape:collect="always" | |
| 1279 | + xlink:href="#linearGradient5866" | |
| 1280 | + id="linearGradient5374" | |
| 1281 | + gradientUnits="userSpaceOnUse" | |
| 1282 | + gradientTransform="matrix(0.43511303,-0.11851629,0.12998141,0.43516148,5.1497806,1029.4257)" | |
| 1283 | + x1="19.452349" | |
| 1284 | + y1="13.174174" | |
| 1285 | + x2="19.685436" | |
| 1286 | + y2="27.095339" /> | |
| 1287 | + <radialGradient | |
| 1288 | + inkscape:collect="always" | |
| 1289 | + xlink:href="#linearGradient15662" | |
| 1290 | + id="radialGradient5394" | |
| 1291 | + gradientUnits="userSpaceOnUse" | |
| 1292 | + gradientTransform="matrix(0.35842521,0,0,0.36658484,-288.74498,994.99084)" | |
| 1293 | + cx="8.1435566" | |
| 1294 | + cy="7.2678967" | |
| 1295 | + fx="8.1435566" | |
| 1296 | + fy="7.2678967" | |
| 1297 | + r="38.158695" /> | |
| 1298 | + <radialGradient | |
| 1299 | + inkscape:collect="always" | |
| 1300 | + xlink:href="#linearGradient259" | |
| 1301 | + id="radialGradient5397" | |
| 1302 | + gradientUnits="userSpaceOnUse" | |
| 1303 | + gradientTransform="matrix(0.353806,0,0,0.37006743,-289.95036,994.73776)" | |
| 1304 | + cx="33.966679" | |
| 1305 | + cy="35.736916" | |
| 1306 | + fx="33.966679" | |
| 1307 | + fy="35.736916" | |
| 1308 | + r="86.70845" /> | |
| 1309 | + <radialGradient | |
| 1310 | + inkscape:collect="always" | |
| 1311 | + xlink:href="#linearGradient269" | |
| 1312 | + id="radialGradient5399" | |
| 1313 | + gradientUnits="userSpaceOnUse" | |
| 1314 | + gradientTransform="matrix(0.35667183,0,0,0.36709384,-288.71505,994.96754)" | |
| 1315 | + cx="8.824419" | |
| 1316 | + cy="3.7561285" | |
| 1317 | + fx="8.824419" | |
| 1318 | + fy="3.7561285" | |
| 1319 | + r="37.751713" /> | |
| 1320 | + <radialGradient | |
| 1321 | + inkscape:collect="always" | |
| 1322 | + xlink:href="#linearGradient4163" | |
| 1323 | + id="radialGradient6182" | |
| 1324 | + gradientUnits="userSpaceOnUse" | |
| 1325 | + gradientTransform="matrix(1.297564,0,0,0.884831,-4.2342547,1013.4195)" | |
| 1326 | + cx="28.089741" | |
| 1327 | + cy="27.203083" | |
| 1328 | + fx="28.089741" | |
| 1329 | + fy="27.203083" | |
| 1330 | + r="13.565360" /> | |
| 1331 | + <radialGradient | |
| 1332 | + inkscape:collect="always" | |
| 1333 | + xlink:href="#linearGradient3816" | |
| 1334 | + id="radialGradient6184" | |
| 1335 | + gradientUnits="userSpaceOnUse" | |
| 1336 | + cx="31.112698" | |
| 1337 | + cy="19.008621" | |
| 1338 | + fx="31.112698" | |
| 1339 | + fy="19.008621" | |
| 1340 | + r="8.6620579" /> | |
| 1341 | + <radialGradient | |
| 1342 | + inkscape:collect="always" | |
| 1343 | + xlink:href="#linearGradient3800" | |
| 1344 | + id="radialGradient6186" | |
| 1345 | + gradientUnits="userSpaceOnUse" | |
| 1346 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1347 | + cx="29.344931" | |
| 1348 | + cy="17.064077" | |
| 1349 | + fx="29.344931" | |
| 1350 | + fy="17.064077" | |
| 1351 | + r="9.1620579" /> | |
| 1352 | + <radialGradient | |
| 1353 | + inkscape:collect="always" | |
| 1354 | + xlink:href="#linearGradient3816" | |
| 1355 | + id="radialGradient6197" | |
| 1356 | + gradientUnits="userSpaceOnUse" | |
| 1357 | + cx="31.112698" | |
| 1358 | + cy="19.008621" | |
| 1359 | + fx="31.112698" | |
| 1360 | + fy="19.008621" | |
| 1361 | + r="8.6620579" /> | |
| 1362 | + <radialGradient | |
| 1363 | + inkscape:collect="always" | |
| 1364 | + xlink:href="#linearGradient4163" | |
| 1365 | + id="radialGradient6199" | |
| 1366 | + gradientUnits="userSpaceOnUse" | |
| 1367 | + gradientTransform="matrix(1.297564,0,0,0.884831,-4.2342547,1013.4195)" | |
| 1368 | + cx="28.089741" | |
| 1369 | + cy="27.203083" | |
| 1370 | + fx="28.089741" | |
| 1371 | + fy="27.203083" | |
| 1372 | + r="13.565360" /> | |
| 1373 | + <radialGradient | |
| 1374 | + inkscape:collect="always" | |
| 1375 | + xlink:href="#linearGradient3816" | |
| 1376 | + id="radialGradient6201" | |
| 1377 | + gradientUnits="userSpaceOnUse" | |
| 1378 | + cx="31.112698" | |
| 1379 | + cy="19.008621" | |
| 1380 | + fx="31.112698" | |
| 1381 | + fy="19.008621" | |
| 1382 | + r="8.6620579" /> | |
| 1383 | + <radialGradient | |
| 1384 | + inkscape:collect="always" | |
| 1385 | + xlink:href="#linearGradient3800" | |
| 1386 | + id="radialGradient6203" | |
| 1387 | + gradientUnits="userSpaceOnUse" | |
| 1388 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1389 | + cx="29.344931" | |
| 1390 | + cy="17.064077" | |
| 1391 | + fx="29.344931" | |
| 1392 | + fy="17.064077" | |
| 1393 | + r="9.1620579" /> | |
| 1394 | + <radialGradient | |
| 1395 | + inkscape:collect="always" | |
| 1396 | + xlink:href="#linearGradient3816" | |
| 1397 | + id="radialGradient6242" | |
| 1398 | + gradientUnits="userSpaceOnUse" | |
| 1399 | + cx="31.112698" | |
| 1400 | + cy="19.008621" | |
| 1401 | + fx="31.112698" | |
| 1402 | + fy="19.008621" | |
| 1403 | + r="8.6620579" /> | |
| 1404 | + <radialGradient | |
| 1405 | + inkscape:collect="always" | |
| 1406 | + xlink:href="#linearGradient4344" | |
| 1407 | + id="radialGradient6244" | |
| 1408 | + gradientUnits="userSpaceOnUse" | |
| 1409 | + gradientTransform="matrix(1,0,0,0.681917,-1.7093807,1010.8792)" | |
| 1410 | + cx="16.214741" | |
| 1411 | + cy="19.836468" | |
| 1412 | + fx="16.214741" | |
| 1413 | + fy="19.836468" | |
| 1414 | + r="13.565360" /> | |
| 1415 | + <radialGradient | |
| 1416 | + inkscape:collect="always" | |
| 1417 | + xlink:href="#linearGradient3816" | |
| 1418 | + id="radialGradient6246" | |
| 1419 | + gradientUnits="userSpaceOnUse" | |
| 1420 | + cx="31.112698" | |
| 1421 | + cy="19.008621" | |
| 1422 | + fx="31.112698" | |
| 1423 | + fy="19.008621" | |
| 1424 | + r="8.6620579" /> | |
| 1425 | + <radialGradient | |
| 1426 | + inkscape:collect="always" | |
| 1427 | + xlink:href="#linearGradient4338" | |
| 1428 | + id="radialGradient6248" | |
| 1429 | + gradientUnits="userSpaceOnUse" | |
| 1430 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1431 | + cx="29.344931" | |
| 1432 | + cy="17.064077" | |
| 1433 | + fx="29.344931" | |
| 1434 | + fy="17.064077" | |
| 1435 | + r="9.1620579" /> | |
| 1436 | + <linearGradient | |
| 1437 | + inkscape:collect="always" | |
| 1438 | + xlink:href="#linearGradient3824" | |
| 1439 | + id="linearGradient6250" | |
| 1440 | + gradientUnits="userSpaceOnUse" | |
| 1441 | + gradientTransform="translate(-14.127271,995.6454)" | |
| 1442 | + x1="30.935921" | |
| 1443 | + y1="29.553486" | |
| 1444 | + x2="30.935921" | |
| 1445 | + y2="35.803486" /> | |
| 1446 | + <linearGradient | |
| 1447 | + inkscape:collect="always" | |
| 1448 | + xlink:href="#linearGradient4356" | |
| 1449 | + id="linearGradient6252" | |
| 1450 | + gradientUnits="userSpaceOnUse" | |
| 1451 | + gradientTransform="matrix(0.95236899,-0.304949,0.304949,0.95236899,-24.109161,1001.0625)" | |
| 1452 | + x1="20.661695" | |
| 1453 | + y1="35.817974" | |
| 1454 | + x2="22.626925" | |
| 1455 | + y2="36.217758" /> | |
| 1456 | + <linearGradient | |
| 1457 | + inkscape:collect="always" | |
| 1458 | + xlink:href="#linearGradient4356" | |
| 1459 | + id="linearGradient6254" | |
| 1460 | + gradientUnits="userSpaceOnUse" | |
| 1461 | + gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,40.096379,991.52674)" | |
| 1462 | + x1="22.686766" | |
| 1463 | + y1="36.390400" | |
| 1464 | + x2="21.408455" | |
| 1465 | + y2="35.739632" /> | |
| 1466 | + <radialGradient | |
| 1467 | + inkscape:collect="always" | |
| 1468 | + xlink:href="#linearGradient259" | |
| 1469 | + id="radialGradient6256" | |
| 1470 | + gradientUnits="userSpaceOnUse" | |
| 1471 | + gradientTransform="matrix(0.353806,0,0,0.37006743,-289.95036,994.73776)" | |
| 1472 | + cx="33.966679" | |
| 1473 | + cy="35.736916" | |
| 1474 | + fx="33.966679" | |
| 1475 | + fy="35.736916" | |
| 1476 | + r="86.70845" /> | |
| 1477 | + <radialGradient | |
| 1478 | + inkscape:collect="always" | |
| 1479 | + xlink:href="#linearGradient269" | |
| 1480 | + id="radialGradient6258" | |
| 1481 | + gradientUnits="userSpaceOnUse" | |
| 1482 | + gradientTransform="matrix(0.35667183,0,0,0.36709384,-288.71505,994.96754)" | |
| 1483 | + cx="8.824419" | |
| 1484 | + cy="3.7561285" | |
| 1485 | + fx="8.824419" | |
| 1486 | + fy="3.7561285" | |
| 1487 | + r="37.751713" /> | |
| 1488 | + <radialGradient | |
| 1489 | + inkscape:collect="always" | |
| 1490 | + xlink:href="#linearGradient15662" | |
| 1491 | + id="radialGradient6260" | |
| 1492 | + gradientUnits="userSpaceOnUse" | |
| 1493 | + gradientTransform="matrix(0.35842521,0,0,0.36658484,-288.74498,994.99084)" | |
| 1494 | + cx="8.1435566" | |
| 1495 | + cy="7.2678967" | |
| 1496 | + fx="8.1435566" | |
| 1497 | + fy="7.2678967" | |
| 1498 | + r="38.158695" /> | |
| 1499 | + <linearGradient | |
| 1500 | + inkscape:collect="always" | |
| 1501 | + xlink:href="#linearGradient2906" | |
| 1502 | + id="linearGradient6262" | |
| 1503 | + gradientUnits="userSpaceOnUse" | |
| 1504 | + gradientTransform="matrix(0.35541046,-0.09680687,0.12011148,0.40211819,4.9170956,1029.1248)" | |
| 1505 | + x1="13.354311" | |
| 1506 | + y1="1.4866425" | |
| 1507 | + x2="14.075844" | |
| 1508 | + y2="2.4017651" /> | |
| 1509 | + <linearGradient | |
| 1510 | + inkscape:collect="always" | |
| 1511 | + xlink:href="#linearGradient2896" | |
| 1512 | + id="linearGradient6264" | |
| 1513 | + gradientUnits="userSpaceOnUse" | |
| 1514 | + gradientTransform="matrix(0.35541046,-0.09680687,0.16161446,0.54106498,4.9107799,1029.1036)" | |
| 1515 | + x1="14.584077" | |
| 1516 | + y1="1.6392649" | |
| 1517 | + x2="14.552828" | |
| 1518 | + y2="2.4912448" /> | |
| 1519 | + <radialGradient | |
| 1520 | + inkscape:collect="always" | |
| 1521 | + xlink:href="#linearGradient4338" | |
| 1522 | + id="radialGradient6266" | |
| 1523 | + gradientUnits="userSpaceOnUse" | |
| 1524 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1525 | + cx="29.344931" | |
| 1526 | + cy="17.064077" | |
| 1527 | + fx="29.344931" | |
| 1528 | + fy="17.064077" | |
| 1529 | + r="9.1620579" /> | |
| 1530 | + <radialGradient | |
| 1531 | + inkscape:collect="always" | |
| 1532 | + xlink:href="#linearGradient4163" | |
| 1533 | + id="radialGradient6275" | |
| 1534 | + gradientUnits="userSpaceOnUse" | |
| 1535 | + gradientTransform="matrix(1.297564,0,0,0.884831,-4.2342547,1013.4195)" | |
| 1536 | + cx="28.089741" | |
| 1537 | + cy="27.203083" | |
| 1538 | + fx="28.089741" | |
| 1539 | + fy="27.203083" | |
| 1540 | + r="13.565360" /> | |
| 1541 | + <radialGradient | |
| 1542 | + inkscape:collect="always" | |
| 1543 | + xlink:href="#linearGradient3816" | |
| 1544 | + id="radialGradient6277" | |
| 1545 | + gradientUnits="userSpaceOnUse" | |
| 1546 | + cx="31.112698" | |
| 1547 | + cy="19.008621" | |
| 1548 | + fx="31.112698" | |
| 1549 | + fy="19.008621" | |
| 1550 | + r="8.6620579" /> | |
| 1551 | + <radialGradient | |
| 1552 | + inkscape:collect="always" | |
| 1553 | + xlink:href="#linearGradient3800" | |
| 1554 | + id="radialGradient6279" | |
| 1555 | + gradientUnits="userSpaceOnUse" | |
| 1556 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1557 | + cx="29.344931" | |
| 1558 | + cy="17.064077" | |
| 1559 | + fx="29.344931" | |
| 1560 | + fy="17.064077" | |
| 1561 | + r="9.1620579" /> | |
| 1562 | + <radialGradient | |
| 1563 | + inkscape:collect="always" | |
| 1564 | + xlink:href="#linearGradient4163" | |
| 1565 | + id="radialGradient6286" | |
| 1566 | + gradientUnits="userSpaceOnUse" | |
| 1567 | + gradientTransform="matrix(1.297564,0,0,0.884831,-6.8592547,1012.4195)" | |
| 1568 | + cx="28.089741" | |
| 1569 | + cy="27.203083" | |
| 1570 | + fx="28.089741" | |
| 1571 | + fy="27.203083" | |
| 1572 | + r="13.565360" /> | |
| 1573 | + <radialGradient | |
| 1574 | + inkscape:collect="always" | |
| 1575 | + xlink:href="#linearGradient3800" | |
| 1576 | + id="radialGradient6300" | |
| 1577 | + gradientUnits="userSpaceOnUse" | |
| 1578 | + gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" | |
| 1579 | + cx="29.344931" | |
| 1580 | + cy="17.064077" | |
| 1581 | + fx="29.344931" | |
| 1582 | + fy="17.064077" | |
| 1583 | + r="9.1620579" /> | |
| 1584 | + </defs> | |
| 1585 | + <sodipodi:namedview | |
| 1586 | + id="base" | |
| 1587 | + pagecolor="#ffffff" | |
| 1588 | + bordercolor="#666666" | |
| 1589 | + borderopacity="1.0" | |
| 1590 | + inkscape:pageopacity="0.0" | |
| 1591 | + inkscape:pageshadow="2" | |
| 1592 | + inkscape:zoom="15.729167" | |
| 1593 | + inkscape:cx="24" | |
| 1594 | + inkscape:cy="23.872848" | |
| 1595 | + inkscape:document-units="px" | |
| 1596 | + inkscape:current-layer="layer1" | |
| 1597 | + showgrid="false" | |
| 1598 | + inkscape:window-width="1280" | |
| 1599 | + inkscape:window-height="975" | |
| 1600 | + inkscape:window-x="0" | |
| 1601 | + inkscape:window-y="0" | |
| 1602 | + inkscape:window-maximized="1" /> | |
| 1603 | + <metadata | |
| 1604 | + id="metadata7"> | |
| 1605 | + <rdf:RDF> | |
| 1606 | + <cc:Work | |
| 1607 | + rdf:about=""> | |
| 1608 | + <dc:format>image/svg+xml</dc:format> | |
| 1609 | + <dc:type | |
| 1610 | + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |
| 1611 | + <dc:title></dc:title> | |
| 1612 | + </cc:Work> | |
| 1613 | + </rdf:RDF> | |
| 1614 | + </metadata> | |
| 1615 | + <g | |
| 1616 | + inkscape:label="Camada 1" | |
| 1617 | + inkscape:groupmode="layer" | |
| 1618 | + id="layer1" | |
| 1619 | + transform="translate(0,-1004.3622)"> | |
| 1620 | + <g | |
| 1621 | + id="g6205" | |
| 1622 | + transform="translate(-0.25,-0.625)"> | |
| 1623 | + <path | |
| 1624 | + transform="matrix(1.77551,0,0,0.959183,-39.087601,1014.4169)" | |
| 1625 | + sodipodi:type="arc" | |
| 1626 | + style="color:#000000;fill:url(#radialGradient6242);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1627 | + id="path4177" | |
| 1628 | + sodipodi:cx="31.112698" | |
| 1629 | + sodipodi:cy="19.008621" | |
| 1630 | + sodipodi:rx="8.6620579" | |
| 1631 | + sodipodi:ry="8.6620579" | |
| 1632 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1633 | + <path | |
| 1634 | + style="color:#000000;fill:url(#radialGradient6244);fill-opacity:1;fill-rule:evenodd;stroke:#404604;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1635 | + d="m 11.151793,1037.2814 10.606602,0 c 3.005204,0 5.980484,-1.1019 7.071067,-4.2426 1.035639,-2.9825 0.176777,-8.6621 -6.540737,-13.2583 l -12.5511457,0 c -6.717514,4.2427 -7.556991,10.0449 -6.010407,13.4351 1.575595,3.4538 4.24264,4.0658 7.4246207,4.0658 z" | |
| 1636 | + id="path2329" | |
| 1637 | + sodipodi:nodetypes="cczcczc" /> | |
| 1638 | + <path | |
| 1639 | + sodipodi:nodetypes="cccc" | |
| 1640 | + id="path3812" | |
| 1641 | + d="m 16.222986,1022.4322 c 0,0 -2.151323,1.6603 -1.965991,3.6605 -2.041226,-1.8008 -2.099873,-5.2515 -2.099873,-5.2515 l 4.065864,1.591 z" | |
| 1642 | + style="color:#000000;fill:#9db029;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" /> | |
| 1643 | + <path | |
| 1644 | + sodipodi:nodetypes="cczcczc" | |
| 1645 | + id="path3838" | |
| 1646 | + d="m 11.257258,1036.2172 10.31667,0 c 2.639723,0 5.253161,-0.9679 6.211112,-3.7266 0.909689,-2.6198 -0.09472,-7.6086 -5.995279,-11.6459 l -11.524725,0 c -5.9005567,3.7267 -6.8879397,8.8233 -5.5294457,11.8011 1.383978,3.0338 3.726667,3.5714 6.5216677,3.5714 z" | |
| 1647 | + style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> | |
| 1648 | + <path | |
| 1649 | + style="color:#000000;fill:#9db029;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1650 | + d="m 17.201414,1022.4322 c 0,0 2.151323,1.6603 1.965991,3.6605 2.041226,-1.8008 2.099873,-5.2515 2.099873,-5.2515 l -4.065864,1.591 z" | |
| 1651 | + id="path3810" | |
| 1652 | + sodipodi:nodetypes="cccc" /> | |
| 1653 | + <path | |
| 1654 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1655 | + sodipodi:ry="8.6620579" | |
| 1656 | + sodipodi:rx="8.6620579" | |
| 1657 | + sodipodi:cy="19.008621" | |
| 1658 | + sodipodi:cx="31.112698" | |
| 1659 | + id="path3814" | |
| 1660 | + style="color:#000000;fill:url(#radialGradient6246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1661 | + sodipodi:type="arc" | |
| 1662 | + transform="translate(-14.959381,999.1454)" /> | |
| 1663 | + <g | |
| 1664 | + id="g4290"> | |
| 1665 | + <path | |
| 1666 | + transform="translate(-14.834381,995.6454)" | |
| 1667 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1668 | + sodipodi:ry="8.6620579" | |
| 1669 | + sodipodi:rx="8.6620579" | |
| 1670 | + sodipodi:cy="19.008621" | |
| 1671 | + sodipodi:cx="31.112698" | |
| 1672 | + id="path2327" | |
| 1673 | + style="color:#000000;fill:url(#radialGradient6248);fill-opacity:1;fill-rule:evenodd;stroke:#6f4709;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1674 | + sodipodi:type="arc" /> | |
| 1675 | + <path | |
| 1676 | + transform="matrix(0.877095,0,0,0.877095,-11.010454,997.98167)" | |
| 1677 | + sodipodi:type="arc" | |
| 1678 | + style="opacity:0.12658231;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1679 | + id="path3834" | |
| 1680 | + sodipodi:cx="31.112698" | |
| 1681 | + sodipodi:cy="19.008621" | |
| 1682 | + sodipodi:rx="8.6620579" | |
| 1683 | + sodipodi:ry="8.6620579" | |
| 1684 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1685 | + </g> | |
| 1686 | + <path | |
| 1687 | + style="color:#000000;fill:url(#linearGradient6250);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1688 | + d="m 20.874513,1029.68 4.24264,0 -2.474873,-2.2981 -0.53033,0.7072 -0.530331,-0.5304 -0.707106,2.1213 z" | |
| 1689 | + id="path4173" /> | |
| 1690 | + <path | |
| 1691 | + style="opacity:0.22784807;color:#000000;fill:url(#linearGradient6252);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1692 | + d="m 10.187502,1031.9428 c -1.3569797,0.1098 -2.4699596,-0.7834 -2.4699596,-0.7834 -1.1826865,-3.9834 -0.053718,-7.9677 -0.053718,-7.9677 0,0 1.0230233,6.7272 2.5236776,8.7511 z" | |
| 1693 | + id="path4368" | |
| 1694 | + sodipodi:nodetypes="cccc" /> | |
| 1695 | + <path | |
| 1696 | + sodipodi:nodetypes="cccc" | |
| 1697 | + id="path4370" | |
| 1698 | + d="m 25.74428,1035.3888 c 1.231251,-0.581 1.80438,-2.0023 1.80438,-2.0023 -0.95912,-4.043 -3.976149,-6.8428 -3.976149,-6.8428 0,0 2.464593,6.3426 2.171769,8.8451 z" | |
| 1699 | + style="opacity:0.22784807;color:#000000;fill:url(#linearGradient6254);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" /> | |
| 1700 | + <rect | |
| 1701 | + transform="matrix(0.96484871,-0.26280595,0.28620224,0.95816923,0,0)" | |
| 1702 | + rx="0.42326209" | |
| 1703 | + ry="0.40700412" | |
| 1704 | + y="996.03387" | |
| 1705 | + x="-287.51788" | |
| 1706 | + height="14.54507" | |
| 1707 | + width="12.846511" | |
| 1708 | + id="rect15391" | |
| 1709 | + style="color:#000000;fill:url(#radialGradient6256);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient6258);stroke-width:1.00014806;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1710 | + <rect | |
| 1711 | + transform="matrix(0.96484871,-0.26280595,0.28620224,0.95816923,0,0)" | |
| 1712 | + rx="0.054903328" | |
| 1713 | + ry="0.052794438" | |
| 1714 | + y="996.38843" | |
| 1715 | + x="-287.14862" | |
| 1716 | + height="13.824175" | |
| 1717 | + width="12.132636" | |
| 1718 | + id="rect15660" | |
| 1719 | + style="color:#000000;fill:none;stroke:url(#radialGradient6260);stroke-width:0.36121485;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1720 | + <path | |
| 1721 | + sodipodi:nodetypes="cc" | |
| 1722 | + id="path15672" | |
| 1723 | + d="m 9.6371294,1030.1227 3.8428056,12.8652" | |
| 1724 | + style="fill:none;stroke:#000000;stroke-width:0.35702735;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.01754384;display:inline" /> | |
| 1725 | + <path | |
| 1726 | + sodipodi:nodetypes="cc" | |
| 1727 | + id="path15674" | |
| 1728 | + d="m 9.9424741,1029.8656 3.8540689,12.903" | |
| 1729 | + style="fill:none;stroke:#ffffff;stroke-width:0.36116153;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.20467828;display:inline" /> | |
| 1730 | + <g | |
| 1731 | + transform="matrix(0.35541046,-0.09680687,0.10137564,0.33939294,4.9908869,1029.3718)" | |
| 1732 | + id="g2188"> | |
| 1733 | + <rect | |
| 1734 | + ry="0.065390877" | |
| 1735 | + rx="0.13778631" | |
| 1736 | + y="9" | |
| 1737 | + x="15.999994" | |
| 1738 | + height="1" | |
| 1739 | + width="20.000006" | |
| 1740 | + id="rect15686" | |
| 1741 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1742 | + <rect | |
| 1743 | + ry="0.065390877" | |
| 1744 | + rx="0.13778631" | |
| 1745 | + y="11" | |
| 1746 | + x="15.999994" | |
| 1747 | + height="1" | |
| 1748 | + width="20.000006" | |
| 1749 | + id="rect15688" | |
| 1750 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1751 | + <rect | |
| 1752 | + ry="0.065390877" | |
| 1753 | + rx="0.13778631" | |
| 1754 | + y="13" | |
| 1755 | + x="15.999994" | |
| 1756 | + height="1" | |
| 1757 | + width="20.000006" | |
| 1758 | + id="rect15690" | |
| 1759 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1760 | + <rect | |
| 1761 | + ry="0.065390877" | |
| 1762 | + rx="0.13778631" | |
| 1763 | + y="15" | |
| 1764 | + x="15.999994" | |
| 1765 | + height="1" | |
| 1766 | + width="20.000006" | |
| 1767 | + id="rect15692" | |
| 1768 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1769 | + <rect | |
| 1770 | + ry="0.065390877" | |
| 1771 | + rx="0.13778631" | |
| 1772 | + y="17" | |
| 1773 | + x="15.999994" | |
| 1774 | + height="1" | |
| 1775 | + width="20.000006" | |
| 1776 | + id="rect15694" | |
| 1777 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1778 | + <rect | |
| 1779 | + ry="0.065390877" | |
| 1780 | + rx="0.13778631" | |
| 1781 | + y="19" | |
| 1782 | + x="15.999994" | |
| 1783 | + height="1" | |
| 1784 | + width="20.000006" | |
| 1785 | + id="rect15696" | |
| 1786 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1787 | + <rect | |
| 1788 | + ry="0.065390877" | |
| 1789 | + rx="0.13778631" | |
| 1790 | + y="21" | |
| 1791 | + x="15.999994" | |
| 1792 | + height="1" | |
| 1793 | + width="20.000006" | |
| 1794 | + id="rect15698" | |
| 1795 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1796 | + <rect | |
| 1797 | + ry="0.065390877" | |
| 1798 | + rx="0.13778631" | |
| 1799 | + y="23" | |
| 1800 | + x="15.999994" | |
| 1801 | + height="1" | |
| 1802 | + width="20.000006" | |
| 1803 | + id="rect15700" | |
| 1804 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1805 | + <rect | |
| 1806 | + ry="0.065390877" | |
| 1807 | + rx="0.062003858" | |
| 1808 | + y="25" | |
| 1809 | + x="15.999986" | |
| 1810 | + height="1" | |
| 1811 | + width="9.0000057" | |
| 1812 | + id="rect15732" | |
| 1813 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1814 | + <rect | |
| 1815 | + ry="0.065390877" | |
| 1816 | + rx="0.13778631" | |
| 1817 | + y="29" | |
| 1818 | + x="15.999986" | |
| 1819 | + height="1" | |
| 1820 | + width="20.000006" | |
| 1821 | + id="rect15736" | |
| 1822 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1823 | + <rect | |
| 1824 | + ry="0.065390877" | |
| 1825 | + rx="0.13778631" | |
| 1826 | + y="31" | |
| 1827 | + x="15.999986" | |
| 1828 | + height="1" | |
| 1829 | + width="20.000006" | |
| 1830 | + id="rect15738" | |
| 1831 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1832 | + <rect | |
| 1833 | + ry="0.065390877" | |
| 1834 | + rx="0.13778631" | |
| 1835 | + y="33" | |
| 1836 | + x="15.999986" | |
| 1837 | + height="1" | |
| 1838 | + width="20.000006" | |
| 1839 | + id="rect15740" | |
| 1840 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1841 | + <rect | |
| 1842 | + ry="0.065390877" | |
| 1843 | + rx="0.13778631" | |
| 1844 | + y="35" | |
| 1845 | + x="15.999986" | |
| 1846 | + height="1" | |
| 1847 | + width="20.000006" | |
| 1848 | + id="rect15742" | |
| 1849 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1850 | + <rect | |
| 1851 | + ry="0.065390877" | |
| 1852 | + rx="0.096450485" | |
| 1853 | + y="37" | |
| 1854 | + x="15.999986" | |
| 1855 | + height="1" | |
| 1856 | + width="14.000014" | |
| 1857 | + id="rect15744" | |
| 1858 | + style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> | |
| 1859 | + </g> | |
| 1860 | + <path | |
| 1861 | + sodipodi:nodetypes="cccc" | |
| 1862 | + id="path2894" | |
| 1863 | + d="m 10.77767,1029.241 -0.310195,-0.9816 c -0.7572021,0.2062 -0.5578178,0.8619 -0.459453,1.1912 l 0.769647,-0.2096 z" | |
| 1864 | + style="opacity:0.48295456;color:#000000;fill:url(#linearGradient6262);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10533953;marker:none;visibility:visible;display:inline;overflow:visible" /> | |
| 1865 | + <path | |
| 1866 | + style="opacity:0.35795456;color:#000000;fill:url(#linearGradient6264);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10533953;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1867 | + d="m 10.77767,1029.241 -0.229976,-0.7131 c -0.8149432,0.2286 -0.539672,0.9227 -0.539672,0.9227 l 0.769647,-0.2096 z" | |
| 1868 | + id="path2904" | |
| 1869 | + sodipodi:nodetypes="cccc" /> | |
| 1870 | + <path | |
| 1871 | + transform="matrix(0.41151985,0,0,0.41151985,-5.6291758,1025.7467)" | |
| 1872 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1873 | + sodipodi:ry="8.6620579" | |
| 1874 | + sodipodi:rx="8.6620579" | |
| 1875 | + sodipodi:cy="19.008621" | |
| 1876 | + sodipodi:cx="31.112698" | |
| 1877 | + id="path4296" | |
| 1878 | + style="color:#000000;fill:url(#radialGradient6266);fill-opacity:1;fill-rule:evenodd;stroke:#6f4709;stroke-width:2.43001652;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1879 | + sodipodi:type="arc" /> | |
| 1880 | + <path | |
| 1881 | + transform="matrix(0.360942,0,0,0.360942,-4.0555539,1026.7081)" | |
| 1882 | + sodipodi:type="arc" | |
| 1883 | + style="opacity:0.12658231;color:#000000;fill:none;stroke:#ffffff;stroke-width:2.77052832;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1884 | + id="path4298" | |
| 1885 | + sodipodi:cx="31.112698" | |
| 1886 | + sodipodi:cy="19.008621" | |
| 1887 | + sodipodi:rx="8.6620579" | |
| 1888 | + sodipodi:ry="8.6620579" | |
| 1889 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1890 | + </g> | |
| 1891 | + <path | |
| 1892 | + transform="matrix(0.42405721,0,0,0.42405721,8.1654039,1030.3792)" | |
| 1893 | + sodipodi:type="arc" | |
| 1894 | + style="color:#000000;fill:url(#radialGradient6300);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:2.35817238;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1895 | + id="path6296" | |
| 1896 | + sodipodi:cx="31.112698" | |
| 1897 | + sodipodi:cy="19.008621" | |
| 1898 | + sodipodi:rx="8.6620579" | |
| 1899 | + sodipodi:ry="8.6620579" | |
| 1900 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1901 | + <path | |
| 1902 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1903 | + sodipodi:ry="8.6620579" | |
| 1904 | + sodipodi:rx="8.6620579" | |
| 1905 | + sodipodi:cy="19.008621" | |
| 1906 | + sodipodi:cx="31.112698" | |
| 1907 | + id="path6298" | |
| 1908 | + style="opacity:0.19620254000000001;color:#000000;fill:none;stroke:#ffffff;stroke-width:2.68861682;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1909 | + sodipodi:type="arc" | |
| 1910 | + transform="matrix(0.37193846,0,0,0.37193846,9.7869677,1031.3699)" /> | |
| 1911 | + <path | |
| 1912 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1913 | + sodipodi:ry="8.6620579" | |
| 1914 | + sodipodi:rx="8.6620579" | |
| 1915 | + sodipodi:cy="19.008621" | |
| 1916 | + sodipodi:cx="31.112698" | |
| 1917 | + id="path4306" | |
| 1918 | + style="color:#000000;fill:url(#radialGradient6197);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1919 | + sodipodi:type="arc" | |
| 1920 | + transform="matrix(1.77551,0,0,0.583984,-23.12897,1035.6326)" /> | |
| 1921 | + <path | |
| 1922 | + sodipodi:nodetypes="cczcczc" | |
| 1923 | + id="path4308" | |
| 1924 | + d="m 27.485424,1049.115 10.606602,0 c 3.005204,0 5.980484,-1.1019 7.071067,-4.2426 1.035639,-2.9825 0.176777,-8.6621 -6.540737,-13.2583 l -12.551146,0 c -6.717514,4.2427 -7.556991,10.0449 -6.010407,13.4351 1.575595,3.4538 4.24264,4.0658 7.424621,4.0658 z" | |
| 1925 | + style="color:#000000;fill:url(#radialGradient6286);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> | |
| 1926 | + <path | |
| 1927 | + style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1928 | + d="m 27.414112,1048.0729 10.493447,-0.022 c 2.639723,0 5.253161,-0.9679 6.211112,-3.7266 0.909689,-2.6198 -0.09472,-7.6086 -5.995279,-11.6459 l -11.524725,-0.243 c -5.900557,3.7266 -7.04262,8.8232 -5.662029,12.0441 1.380592,3.221 3.395211,3.5714 6.477474,3.5935 z" | |
| 1929 | + id="path4314" | |
| 1930 | + sodipodi:nodetypes="cczcczc" /> | |
| 1931 | + <path | |
| 1932 | + transform="translate(1.3742503,1010.979)" | |
| 1933 | + sodipodi:type="arc" | |
| 1934 | + style="color:#000000;fill:url(#radialGradient6277);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1935 | + id="path4318" | |
| 1936 | + sodipodi:cx="31.112698" | |
| 1937 | + sodipodi:cy="19.008621" | |
| 1938 | + sodipodi:rx="8.6620579" | |
| 1939 | + sodipodi:ry="8.6620579" | |
| 1940 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1941 | + <g | |
| 1942 | + id="g6288"> | |
| 1943 | + <path | |
| 1944 | + transform="translate(1.4992503,1007.479)" | |
| 1945 | + sodipodi:type="arc" | |
| 1946 | + style="color:#000000;fill:url(#radialGradient6279);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1947 | + id="path4320" | |
| 1948 | + sodipodi:cx="31.112698" | |
| 1949 | + sodipodi:cy="19.008621" | |
| 1950 | + sodipodi:rx="8.6620579" | |
| 1951 | + sodipodi:ry="8.6620579" | |
| 1952 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" /> | |
| 1953 | + <path | |
| 1954 | + d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" | |
| 1955 | + sodipodi:ry="8.6620579" | |
| 1956 | + sodipodi:rx="8.6620579" | |
| 1957 | + sodipodi:cy="19.008621" | |
| 1958 | + sodipodi:cx="31.112698" | |
| 1959 | + id="path4322" | |
| 1960 | + style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" | |
| 1961 | + sodipodi:type="arc" | |
| 1962 | + transform="matrix(0.877095,0,0,0.877095,5.3231773,1009.8153)" /> | |
| 1963 | + </g> | |
| 1964 | + </g> | |
| 1965 | +</svg> | ... | ... |
| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | +.controller-profile_editor a.control-panel-bsc-enterprises {background-image: url(images/manage-bsc-enterprises.png)} | |
| 2 | +.controller-profile_editor .msie6 a.control-panel-bsc-enterprises {background-image: url(images/manage-bsc-enterprises.gif)} | |
| 3 | + | |
| 4 | +.controller-profile_editor a.control-panel-transfer-enterprise-ownership {background-image: url(images/transfer-ownership.png)} | |
| 5 | + | |
| 6 | +.icon-menu-bsc { | |
| 7 | + background-image: url(images/manage-bsc-enterprises-icon.png); | |
| 8 | +} | |
| 9 | + | |
| 10 | +#content .token-input-list { | |
| 11 | + margin-bottom: 30px; | |
| 12 | +} | ... | ... |
plugins/bsc/test/functional/bsc_plugin_environment_controller_test.rb
0 → 100644
| ... | ... | @@ -0,0 +1,82 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../controllers/bsc_plugin_environment_controller' | |
| 3 | +require File.dirname(__FILE__) + '/../../../../app/models/uploaded_file' | |
| 4 | + | |
| 5 | +# Re-raise errors caught by the controller. | |
| 6 | +class BscPluginEnvironmentController; def rescue_action(e) raise e end; end | |
| 7 | + | |
| 8 | +class BscPluginEnvironmentControllerTest < Test::Unit::TestCase | |
| 9 | + | |
| 10 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 11 | + | |
| 12 | + def setup | |
| 13 | + @controller = BscPluginEnvironmentController.new | |
| 14 | + @request = ActionController::TestRequest.new | |
| 15 | + @response = ActionController::TestResponse.new | |
| 16 | + user_login = create_admin_user(Environment.default) | |
| 17 | + login_as(user_login) | |
| 18 | + @admin = User[user_login].person | |
| 19 | + e = Environment.default | |
| 20 | + e.enabled_plugins = ['BscPlugin'] | |
| 21 | + e.save! | |
| 22 | + end | |
| 23 | + | |
| 24 | + attr_accessor :admin | |
| 25 | + | |
| 26 | + should 'create a new bsc' do | |
| 27 | + assert_difference BscPlugin::Bsc, :count, 1 do | |
| 28 | + post :new, :profile_data => {:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ} | |
| 29 | + end | |
| 30 | + | |
| 31 | + assert_redirected_to :controller => 'profile_editor', :profile => 'sample-bsc' | |
| 32 | + end | |
| 33 | + | |
| 34 | + should 'not create an invalid bsc' do | |
| 35 | + assert_difference BscPlugin::Bsc, :count, 0 do | |
| 36 | + post :new, :profile_data => {:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => '29837492304'} | |
| 37 | + end | |
| 38 | + | |
| 39 | + assert_response 200 | |
| 40 | + end | |
| 41 | + | |
| 42 | + should 'set the current user as the bsc admin' do | |
| 43 | + name = 'Sample Bsc' | |
| 44 | + post :new, :profile_data => {:business_name => name, :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ} | |
| 45 | + bsc = BscPlugin::Bsc.find_by_name(name) | |
| 46 | + assert_includes bsc.admins, admin | |
| 47 | + end | |
| 48 | + | |
| 49 | + should 'list correct enterprises on search' do | |
| 50 | + # Should list if: not validated AND (name matches OR identifier matches) AND not bsc | |
| 51 | + e1 = Enterprise.create!(:name => 'Sample Enterprise 1', :identifier => 'bli', :validated => false) | |
| 52 | + e2 = Enterprise.create!(:name => 'Bla', :identifier => 'sample-enterprise-6', :validated => false) | |
| 53 | + e3 = Enterprise.create!(:name => 'Blo', :identifier => 'blo', :validated => false) | |
| 54 | + e4 = BscPlugin::Bsc.create!(:business_name => "Sample Bsc", :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ, :validated => false) | |
| 55 | + e5 = Enterprise.create!(:name => 'Sample Enterprise 5', :identifier => 'sample-enterprise-5') | |
| 56 | + e5.validated = true | |
| 57 | + e5.save! | |
| 58 | + | |
| 59 | + get :search_enterprise, :q => 'sampl' | |
| 60 | + | |
| 61 | + assert_match /#{e1.name}/, @response.body | |
| 62 | + assert_match /#{e2.name}/, @response.body | |
| 63 | + assert_no_match /#{e3.name}/, @response.body | |
| 64 | + assert_no_match /#{e4.name}/, @response.body | |
| 65 | + assert_no_match /#{e5.name}/, @response.body | |
| 66 | + end | |
| 67 | + | |
| 68 | + should 'save validations' do | |
| 69 | + e1 = fast_create(Enterprise, :validated => false) | |
| 70 | + e2 = fast_create(Enterprise, :validated => false) | |
| 71 | + e3 = fast_create(Enterprise, :validated => false) | |
| 72 | + | |
| 73 | + post :save_validations, :q => "#{e1.id},#{e2.id}" | |
| 74 | + e1.reload | |
| 75 | + e2.reload | |
| 76 | + e3.reload | |
| 77 | + | |
| 78 | + assert e1.validated | |
| 79 | + assert e2.validated | |
| 80 | + assert !e3.validated | |
| 81 | + end | |
| 82 | +end | ... | ... |
plugins/bsc/test/functional/bsc_plugin_myprofile_controller_test.rb
0 → 100644
| ... | ... | @@ -0,0 +1,112 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../controllers/bsc_plugin_myprofile_controller' | |
| 3 | +require File.dirname(__FILE__) + '/../../../../app/models/uploaded_file' | |
| 4 | + | |
| 5 | +# Re-raise errors caught by the controller. | |
| 6 | +class BscPluginMyprofileController; def rescue_action(e) raise e end; end | |
| 7 | + | |
| 8 | +class BscPluginMyprofileControllerTest < Test::Unit::TestCase | |
| 9 | + | |
| 10 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 11 | + | |
| 12 | + def setup | |
| 13 | + @controller = BscPluginMyprofileController.new | |
| 14 | + @request = ActionController::TestRequest.new | |
| 15 | + @response = ActionController::TestResponse.new | |
| 16 | + @bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) | |
| 17 | + @admin = create_user('admin').person | |
| 18 | + @bsc.add_admin(@admin) | |
| 19 | + login_as(@admin.user.login) | |
| 20 | + e = Environment.default | |
| 21 | + e.enabled_plugins = ['BscPlugin'] | |
| 22 | + e.save! | |
| 23 | + end | |
| 24 | + | |
| 25 | + attr_accessor :admin, :bsc | |
| 26 | + | |
| 27 | + should 'list enterprises on search' do | |
| 28 | + # Should list if match name | |
| 29 | + e1 = Enterprise.create!(:name => 'sample enterprise 1', :identifier => 'sample-enterprise-1') | |
| 30 | + # Should be case insensitive | |
| 31 | + e2 = Enterprise.create!(:name => 'SaMpLe eNtErPrIsE 2', :identifier => 'sample-enterprise-2') | |
| 32 | + # Should not list if don't match name | |
| 33 | + e3 = Enterprise.create!(:name => 'blo', :identifier => 'blo') | |
| 34 | + # Should not list if is has a bsc | |
| 35 | + e4 = Enterprise.create!(:name => 'sample enterprise 4', :identifier => 'sample-enterprise-4', :bsc => bsc) | |
| 36 | + # Should not list if is enabled | |
| 37 | + e5 = Enterprise.create!(:name => 'sample enterprise 5', :identifier => 'sample-enterprise-5', :enabled => true) | |
| 38 | + BscPlugin::AssociateEnterprise.create!(:requestor => admin, :target => e5, :bsc => bsc) | |
| 39 | + # Should search by identifier | |
| 40 | + e6 = Enterprise.create!(:name => 'Bla', :identifier => 'sample-enterprise-6') | |
| 41 | + | |
| 42 | + get :search_enterprise, :profile => bsc.identifier, :q => 'sampl' | |
| 43 | + | |
| 44 | + assert_match /#{e1.name}/, @response.body | |
| 45 | + assert_match /#{e2.name}/, @response.body | |
| 46 | + assert_no_match /#{e3.name}/, @response.body | |
| 47 | + assert_no_match /#{e4.name}/, @response.body | |
| 48 | + assert_no_match /#{e5.name}/, @response.body | |
| 49 | + assert_no_match /#{bsc.name}/, @response.body | |
| 50 | + assert_match /#{e6.name}/, @response.body | |
| 51 | + end | |
| 52 | + | |
| 53 | + should 'save associations' do | |
| 54 | + e1 = fast_create(Enterprise, :enabled => false) | |
| 55 | + e2 = fast_create(Enterprise, :enabled => false) | |
| 56 | + | |
| 57 | + post :save_associations, :profile => bsc.identifier, :q => "#{e1.id},#{e2.id}" | |
| 58 | + e1.reload | |
| 59 | + e2.reload | |
| 60 | + assert_equal e1.bsc, bsc | |
| 61 | + assert_equal e2.bsc, bsc | |
| 62 | + | |
| 63 | + post :save_associations, :profile => bsc.identifier, :q => "#{e1.id}" | |
| 64 | + e1.reload | |
| 65 | + e2.reload | |
| 66 | + assert_equal e1.bsc, bsc | |
| 67 | + assert_not_equal e2.bsc, bsc | |
| 68 | + end | |
| 69 | + | |
| 70 | + should 'create a task to the enabled enterprise instead of associating it' do | |
| 71 | + e = fast_create(Enterprise, :enabled => true) | |
| 72 | + | |
| 73 | + assert_difference BscPlugin::AssociateEnterprise, :count, 1 do | |
| 74 | + post :save_associations, :profile => bsc.identifier, :q => "#{e.id}" | |
| 75 | + bsc.reload | |
| 76 | + assert_not_includes bsc.enterprises, e | |
| 77 | + end | |
| 78 | + end | |
| 79 | + | |
| 80 | + should 'transfer ownership' do | |
| 81 | + p1 = create_user('p1').person | |
| 82 | + p2 = create_user('p2').person | |
| 83 | + p3 = create_user('p3').person | |
| 84 | + | |
| 85 | + role = Profile::Roles.admin(bsc.environment.id) | |
| 86 | + | |
| 87 | + bsc.add_admin(p1) | |
| 88 | + bsc.add_admin(p2) | |
| 89 | + | |
| 90 | + post :transfer_ownership, :profile => bsc.identifier, 'q_'+role.key => "#{p3.id}" | |
| 91 | + | |
| 92 | + assert_response :redirect | |
| 93 | + | |
| 94 | + assert_not_includes bsc.admins, p1 | |
| 95 | + assert_not_includes bsc.admins, p2 | |
| 96 | + assert_includes bsc.admins, p3 | |
| 97 | + end | |
| 98 | + | |
| 99 | + should 'create enterprise' do | |
| 100 | + assert_difference Enterprise, :count, 1 do | |
| 101 | + post :create_enterprise, :profile => bsc.identifier, :create_enterprise => {:name => 'Test Bsc', :identifier => 'test-bsc'} | |
| 102 | + end | |
| 103 | + | |
| 104 | + enterprise = Enterprise.find_by_identifier('test-bsc') | |
| 105 | + | |
| 106 | + assert_equal true, enterprise.enabled | |
| 107 | + assert_equal false, enterprise.validated | |
| 108 | + assert_equal enterprise.bsc, bsc | |
| 109 | + end | |
| 110 | + | |
| 111 | +end | |
| 112 | + | ... | ... |
plugins/bsc/test/unit/bsc_plugin/associate_enterprise_test.rb
0 → 100644
| ... | ... | @@ -0,0 +1,53 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' | |
| 3 | + | |
| 4 | +class BscPlugin::AssociateEnterpriseTest < Test::Unit::TestCase | |
| 5 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 6 | + | |
| 7 | + def setup | |
| 8 | + @enterprise = fast_create(Enterprise) | |
| 9 | + @person = create_user('user').person | |
| 10 | + @bsc = BscPlugin::Bsc.create!(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc Ltda.', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ) | |
| 11 | + end | |
| 12 | + | |
| 13 | + attr_accessor :enterprise, :person, :bsc | |
| 14 | + | |
| 15 | + should 'associate enteprise with bsc after perform' do | |
| 16 | + task = BscPlugin::AssociateEnterprise.create!(:requestor => person, :target => enterprise, :bsc => bsc) | |
| 17 | + task.perform | |
| 18 | + bsc.reload | |
| 19 | + | |
| 20 | + assert_includes bsc.enterprises, enterprise | |
| 21 | + end | |
| 22 | + | |
| 23 | + should 'notify enterprise when some bsc create the request' do | |
| 24 | + enterprise.contact_email = 'enterprise@bsc.org' | |
| 25 | + enterprise.save! | |
| 26 | + assert_difference ActionMailer::Base.deliveries, :count, 1 do | |
| 27 | + BscPlugin::AssociateEnterprise.create!(:requestor => person, :target => enterprise, :bsc => bsc) | |
| 28 | + end | |
| 29 | + assert_includes ActionMailer::Base.deliveries.last.to, enterprise.contact_email | |
| 30 | + end | |
| 31 | + | |
| 32 | + should 'notify requestor when some enterprise reject the request' do | |
| 33 | + person.email = 'person@bsc.org' | |
| 34 | + person.save! | |
| 35 | + task = BscPlugin::AssociateEnterprise.create!(:requestor => person, :target => enterprise, :bsc => bsc) | |
| 36 | + assert_difference ActionMailer::Base.deliveries, :count, 1 do | |
| 37 | + task.cancel | |
| 38 | + end | |
| 39 | + assert_includes ActionMailer::Base.deliveries.last.to, person.contact_email | |
| 40 | + end | |
| 41 | + | |
| 42 | + should 'notify requestor when some enterprise accept the request' do | |
| 43 | + person.email = 'person@bsc.org' | |
| 44 | + person.save! | |
| 45 | + task = BscPlugin::AssociateEnterprise.create!(:requestor => person, :target => enterprise, :bsc => bsc) | |
| 46 | + assert_difference ActionMailer::Base.deliveries, :count, 1 do | |
| 47 | + task.finish | |
| 48 | + end | |
| 49 | + assert_includes ActionMailer::Base.deliveries.last.to, person.contact_email | |
| 50 | + end | |
| 51 | + | |
| 52 | +end | |
| 53 | + | ... | ... |
| ... | ... | @@ -0,0 +1,86 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' | |
| 3 | +require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' | |
| 4 | + | |
| 5 | +class BscPlugin::BscTest < Test::Unit::TestCase | |
| 6 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 7 | + | |
| 8 | + should 'validate presence of cnpj' do | |
| 9 | + bsc = BscPlugin::Bsc.new() | |
| 10 | + bsc.valid? | |
| 11 | + | |
| 12 | + assert bsc.errors.invalid?(:cnpj) | |
| 13 | + end | |
| 14 | + | |
| 15 | + should 'validate uniqueness of cnpj' do | |
| 16 | + bsc1 = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) | |
| 17 | + bsc2 = BscPlugin::Bsc.new(:cnpj => VALID_CNPJ) | |
| 18 | + bsc2.valid? | |
| 19 | + assert bsc2.errors.invalid?(:cnpj) | |
| 20 | + end | |
| 21 | + | |
| 22 | + should 'have many enterprises' do | |
| 23 | + e1 = Enterprise.new(:name => 'Enterprise1', :identifier => 'enterprise1') | |
| 24 | + e2 = Enterprise.new(:name => 'Enterprise2', :identifier => 'enterprise2') | |
| 25 | + bsc = BscPlugin::Bsc.new(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc Ltda.', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ) | |
| 26 | + bsc.enterprises << e1 | |
| 27 | + bsc.enterprises << e2 | |
| 28 | + bsc.save! | |
| 29 | + | |
| 30 | + assert_equal e1.bsc, bsc | |
| 31 | + assert_equal e2.bsc, bsc | |
| 32 | + end | |
| 33 | + | |
| 34 | + should 'verify already requested enterprises' do | |
| 35 | + e1 = fast_create(Enterprise) | |
| 36 | + e2 = fast_create(Enterprise) | |
| 37 | + bsc = BscPlugin::Bsc.new() | |
| 38 | + task = BscPlugin::AssociateEnterprise.new(:target => e1, :bsc => bsc) | |
| 39 | + bsc.enterprise_requests.stubs(:pending).returns([task]) | |
| 40 | + | |
| 41 | + assert bsc.already_requested?(e1) | |
| 42 | + assert !bsc.already_requested?(e2) | |
| 43 | + end | |
| 44 | + | |
| 45 | + should 'return associated enterprises products' do | |
| 46 | + e1 = fast_create(Enterprise) | |
| 47 | + e2 = fast_create(Enterprise) | |
| 48 | + category = fast_create(ProductCategory) | |
| 49 | + bsc = BscPlugin::Bsc.new() | |
| 50 | + | |
| 51 | + p1 = fast_create(Product, :product_category_id => category.id) | |
| 52 | + p2 = fast_create(Product, :product_category_id => category.id) | |
| 53 | + p3 = fast_create(Product, :product_category_id => category.id) | |
| 54 | + | |
| 55 | + e1.products << p1 | |
| 56 | + e1.products << p2 | |
| 57 | + e2.products << p3 | |
| 58 | + | |
| 59 | + bsc.enterprises << e1 | |
| 60 | + bsc.enterprises << e2 | |
| 61 | + | |
| 62 | + assert_includes bsc.products, p1 | |
| 63 | + assert_includes bsc.products, p2 | |
| 64 | + assert_includes bsc.products, p3 | |
| 65 | + end | |
| 66 | + | |
| 67 | + should 'reload products' do | |
| 68 | + e = fast_create(Enterprise) | |
| 69 | + category = fast_create(ProductCategory) | |
| 70 | + bsc = BscPlugin::Bsc.create!(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ) | |
| 71 | + p = fast_create(Product, :product_category_id => category.id) | |
| 72 | + | |
| 73 | + e.bsc = bsc | |
| 74 | + e.save! | |
| 75 | + e.products << p | |
| 76 | + | |
| 77 | + assert_equal [], bsc.products | |
| 78 | + assert_equal [p], bsc.products(true) | |
| 79 | + end | |
| 80 | + | |
| 81 | + should 'not be able to create product' do | |
| 82 | + bsc = BscPlugin::Bsc.new | |
| 83 | + assert !bsc.create_product? | |
| 84 | + end | |
| 85 | + | |
| 86 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' | |
| 3 | +require File.dirname(__FILE__) + '/../../../../../app/models/enterprise' | |
| 4 | +require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' | |
| 5 | + | |
| 6 | +class ProductTest < Test::Unit::TestCase | |
| 7 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 8 | + | |
| 9 | + should 'belongs to a bsc' do | |
| 10 | + bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) | |
| 11 | + enterprise = fast_create(Enterprise, :bsc_id => bsc.id) | |
| 12 | + | |
| 13 | + assert_equal bsc, enterprise.bsc | |
| 14 | + end | |
| 15 | + | |
| 16 | + should 'return correct enterprises on validated and not validated namedscopes' do | |
| 17 | + validated_enterprise = fast_create(Enterprise, :validated => true) | |
| 18 | + not_validated_enterprise = fast_create(Enterprise, :validated => false) | |
| 19 | + | |
| 20 | + assert_includes Enterprise.validated, validated_enterprise | |
| 21 | + assert_not_includes Enterprise.validated, not_validated_enterprise | |
| 22 | + assert_not_includes Enterprise.not_validated, validated_enterprise | |
| 23 | + assert_includes Enterprise.not_validated, not_validated_enterprise | |
| 24 | + end | |
| 25 | +end | |
| 26 | + | ... | ... |
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' | |
| 3 | + | |
| 4 | +class ProductTest < Test::Unit::TestCase | |
| 5 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 6 | + | |
| 7 | + should 'return have bsc' do | |
| 8 | + bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) | |
| 9 | + enterprise = fast_create(Enterprise, :bsc_id => bsc.id) | |
| 10 | + product = fast_create(Product, :enterprise_id => enterprise.id) | |
| 11 | + | |
| 12 | + assert_equal bsc, product.bsc | |
| 13 | + end | |
| 14 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,36 @@ |
| 1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | |
| 2 | +require File.dirname(__FILE__) + '/../../../../app/models/uploaded_file' | |
| 3 | +require File.dirname(__FILE__) + '/../../lib/ext/enterprise' | |
| 4 | + | |
| 5 | +class BscPluginTest < Test::Unit::TestCase | |
| 6 | + | |
| 7 | + VALID_CNPJ = '94.132.024/0001-48' | |
| 8 | + | |
| 9 | + should 'add profile controller filter correctly' do | |
| 10 | + bsc_plugin = BscPlugin.new | |
| 11 | + person = fast_create(Person) | |
| 12 | + context = mock() | |
| 13 | + context.stubs(:profile).returns(person) | |
| 14 | + context.stubs(:params).returns({:profile => person.identifier}) | |
| 15 | + context.stubs(:user).returns(person) | |
| 16 | + context.stubs(:environment).returns(person.environment) | |
| 17 | + bsc_plugin.stubs(:context).returns(context) | |
| 18 | + | |
| 19 | + assert_nil bsc_plugin.profile_controller_filters.first[:block].call | |
| 20 | + assert_nil bsc_plugin.content_viewer_controller_filters.first[:block].call | |
| 21 | + | |
| 22 | + enterprise = fast_create(Enterprise, :validated => false) | |
| 23 | + enterprise.bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) | |
| 24 | + enterprise.save! | |
| 25 | + context.stubs(:profile).returns(enterprise) | |
| 26 | + context.stubs(:params).returns({:profile => enterprise.identifier}) | |
| 27 | + context.stubs(:environment).returns(enterprise.environment) | |
| 28 | + | |
| 29 | + assert_raise NameError do | |
| 30 | + bsc_plugin.profile_controller_filters.first[:block].call | |
| 31 | + end | |
| 32 | + assert_raise NameError do | |
| 33 | + bsc_plugin.content_viewer_controller_filters.first[:block].call | |
| 34 | + end | |
| 35 | + end | |
| 36 | +end | ... | ... |
plugins/bsc/views/bsc_plugin/mailer/admin_notification.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1 @@ |
| 1 | +<%= _('The management of %{bsc} was transferred to you.') % {:bsc => @bsc.name}%> | ... | ... |
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +<%= error_messages_for :bsc %> | |
| 2 | +<h1><%= _('BSC registration') %></h1> | |
| 3 | + | |
| 4 | +<% labelled_form_for :profile_data, @bsc do |f| %> | |
| 5 | + <%= render :partial => 'shared/fields', :locals => {:f => f, :profile => @bsc} %> | |
| 6 | + | |
| 7 | + <% button_bar do %> | |
| 8 | + <%= submit_button('save', _('Save')) %> | |
| 9 | + <%= button('cancel', _('Cancel'), {:controller => 'admin_panel'}) %> | |
| 10 | + <% end %> | |
| 11 | +<% end %> | ... | ... |
plugins/bsc/views/bsc_plugin_environment/validate_enterprises.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,31 @@ |
| 1 | +<h1><%= _('Validate enterprises') %></h1> | |
| 2 | + | |
| 3 | +<% form_tag :action => 'save_validations' do %> | |
| 4 | + <%= text_field_tag(:q, nil, :id => 'search-enterprises') %> | |
| 5 | + | |
| 6 | + <% button_bar do %> | |
| 7 | + <%= submit_button('save', _('Save'))%> | |
| 8 | + <%= button('cancel', _('Cancel'), {:controller => 'admin_panel'})%> | |
| 9 | + <% end %> | |
| 10 | +<% end %> | |
| 11 | + | |
| 12 | +<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %> | |
| 13 | +<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %> | |
| 14 | +<% search_url = url_for(:action => 'search_enterprise') %> | |
| 15 | +<script type="text/javascript"> | |
| 16 | + jQuery("#search-enterprises") | |
| 17 | + .tokenInput("<%= search_url %>", { | |
| 18 | + hintText: <%= _('Type in a search term for enterprise').to_json %>, | |
| 19 | + noResultsText: <%= _('No results').to_json %>, | |
| 20 | + searchingText: <%= _('Searching...').to_json %>, | |
| 21 | + searchDelay: 500, | |
| 22 | + backspaceDeleteItem: false | |
| 23 | + }) | |
| 24 | + .focus(); | |
| 25 | + | |
| 26 | + jQuery("#token-input-search-enterprises") | |
| 27 | + .live("keydown", function(event){ | |
| 28 | + if(event.keyCode == "13") return false; | |
| 29 | + }); | |
| 30 | +</script> | |
| 31 | + | ... | ... |
plugins/bsc/views/bsc_plugin_myprofile/_similar_enterprises.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +<div id="similar-enterprises" style="display: none; border-bottom: 2px solid #babdb6;"> | |
| 2 | + <p><b><%= _('Existing enterprises:') %></b></p> | |
| 3 | + <p><i style="text-align: center;"><%= _('Were found %{count} enterprises with similar names on the same city, you can decide to associate one of them or create the new enterprise confirming the informations you typed in.') % {:count => content_tag('span', '', :id => 'similar-enterprises-count')} %></i></p> | |
| 4 | + <ul id="create-enterprise-similar-enterprises"></ul> | |
| 5 | + <% query = bsc.enterprises.map(&:id).join(',') %> | |
| 6 | + <script type="text/javascript"> | |
| 7 | + update_enterprises = function(enterprises){ | |
| 8 | + var association_url = <%= url_for({:controller => 'bsc_plugin_myprofile', :action => 'save_associations', :profile => bsc.identifier}).to_json %>; | |
| 9 | + jQuery('#create-enterprise-similar-enterprises').empty(); | |
| 10 | + jQuery.each(enterprises, function(index, enterprise){ | |
| 11 | + var id = enterprise[0] | |
| 12 | + var name = enterprise[1] | |
| 13 | + var query = <%= query.to_json %>; | |
| 14 | + if(query) | |
| 15 | + query += ','; | |
| 16 | + query += id.toString(); | |
| 17 | + query = '?q='+query; | |
| 18 | + var url = association_url + query; | |
| 19 | + jQuery('#create-enterprise-similar-enterprises').append( | |
| 20 | + '<li>' + name + ' - <a href="' + url +'">' + <%= _('Associate').to_json %> + '</a></li>' | |
| 21 | + ); | |
| 22 | + }); | |
| 23 | + if (jQuery(enterprises).length > 0){ | |
| 24 | + jQuery('#similar-enterprises-count').text(jQuery(enterprises).length.toString()); | |
| 25 | + jQuery('#similar-enterprises').fadeIn(); | |
| 26 | + } | |
| 27 | + else | |
| 28 | + jQuery('#similar-enterprises').fadeOut(); | |
| 29 | + } | |
| 30 | + jQuery('#create_enterprise_name,#create_enterprise_city').change(function() { | |
| 31 | + var parameters = {}; | |
| 32 | + if(jQuery('#create_enterprise_name').length) | |
| 33 | + parameters.name = jQuery('#create_enterprise_name').val(); | |
| 34 | + if(jQuery('#create_enterprise_city').length) | |
| 35 | + parameters.city = jQuery('#create_enterprise_city').val(); | |
| 36 | + | |
| 37 | + jQuery.ajax({ | |
| 38 | + url: <%= url_for({:controller => 'bsc_plugin_myprofile', :action => 'similar_enterprises', :profile => bsc.identifier}).to_json %>, | |
| 39 | + dataType: 'json', | |
| 40 | + data: parameters, | |
| 41 | + success: function(data){ update_enterprises(data); }, | |
| 42 | + error: function(ajax, stat, errorThrown) { | |
| 43 | + alert(stat+': '+errorThrown); | |
| 44 | + } | |
| 45 | + }); | |
| 46 | + }); | |
| 47 | + </script> | |
| 48 | +</div> | ... | ... |
plugins/bsc/views/bsc_plugin_myprofile/create_enterprise.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +<%= error_messages_for 'create_enterprise' %> | |
| 2 | + | |
| 3 | +<h1><%= __('Enterprise registration') %></h1> | |
| 4 | + | |
| 5 | +<%= required_fields_message %> | |
| 6 | + | |
| 7 | +<% labelled_form_for(:create_enterprise, @create_enterprise) do |f| %> | |
| 8 | + | |
| 9 | + <%= required f.text_field 'name', :onchange => "updateUrlField(this, 'create_enterprise_identifier')", :size => 40 %> | |
| 10 | + <%= render :partial => 'shared/organization_custom_fields', :locals => { :f => f, :object_name => :create_enterprise, :profile => @create_enterprise } %> | |
| 11 | + <p style="border-bottom: 2px solid #babdb6"></p> | |
| 12 | + <%= required labelled_form_field(_('Address'), content_tag('code', environment.top_url + "/" + text_field(:create_enterprise, 'identifier', :size => 26))) %> | |
| 13 | + <p style="border-bottom: 2px solid #babdb6"></p> | |
| 14 | + <%= render :partial => 'similar_enterprises', :locals => {:bsc => profile}%> | |
| 15 | + | |
| 16 | + <% button_bar do %> | |
| 17 | + <%= submit_button('save', _('Save'), :cancel => {:controller => 'profile_editor', :profile => profile.identifier}) %> | |
| 18 | + <% end %> | |
| 19 | +<% end %> | |
| 20 | + | |
| 21 | + | ... | ... |
plugins/bsc/views/bsc_plugin_myprofile/manage_associated_enterprises.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,43 @@ |
| 1 | +<h1><%= _('Manage associated enterprises') %></h1> | |
| 2 | + | |
| 3 | +<% if !@pending_enterprises.blank? %> | |
| 4 | + <%= _('Associations awaiting approval:') %> | |
| 5 | + <ul> | |
| 6 | + <% @pending_enterprises.each do |enterprise| %> | |
| 7 | + <li><%= enterprise.name %></li> | |
| 8 | + <% end %> | |
| 9 | + </ul> | |
| 10 | +<% end %> | |
| 11 | + | |
| 12 | +<% form_tag :action => 'save_associations' do %> | |
| 13 | + <%= text_field_tag(:q, nil, :id => 'search-enterprises') %> | |
| 14 | + | |
| 15 | + <%= button('add', _('Add new enterprise'), {:action => 'create_enterprise'}) %> | |
| 16 | + | |
| 17 | + <% button_bar do %> | |
| 18 | + <%= submit_button('save', _('Save'))%> | |
| 19 | + <%= button('cancel', _('Cancel'), {:controller => 'profile_editor'})%> | |
| 20 | + <% end %> | |
| 21 | + | |
| 22 | +<% end %> | |
| 23 | +<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %> | |
| 24 | +<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %> | |
| 25 | +<% search_url = url_for(:action => 'search_enterprise', :profile => profile.identifier) %> | |
| 26 | +<script type="text/javascript"> | |
| 27 | + jQuery("#search-enterprises") | |
| 28 | + .tokenInput("<%= search_url %>", { | |
| 29 | + minChars: 3, | |
| 30 | + prePopulate: <%= profile.enterprises_to_json %>, | |
| 31 | + hintText: <%= _('Type in a search term for enterprise').to_json %>, | |
| 32 | + noResultsText: <%= _('No results').to_json %>, | |
| 33 | + searchingText: <%= _('Searching...').to_json %>, | |
| 34 | + searchDelay: 500, | |
| 35 | + backspaceDeleteItem: false | |
| 36 | + }) | |
| 37 | + .focus(); | |
| 38 | + | |
| 39 | + jQuery("#token-input-search-enterprises") | |
| 40 | + .live("keydown", function(event){ | |
| 41 | + if(event.keyCode == "13") return false; | |
| 42 | + }); | |
| 43 | +</script> | ... | ... |
plugins/bsc/views/bsc_plugin_myprofile/transfer_ownership.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,54 @@ |
| 1 | +<h1><%= _('Transfer Ownership') %></h1> | |
| 2 | + | |
| 3 | +<div id='last-admin-message' style="margin-bottom: 20px;"> | |
| 4 | + <%= _('This option allows you to transfer this enterprise\'s management to another user. This action will remove all the current administrators. Be careful when confirming this procedure.') %> | |
| 5 | +</div> | |
| 6 | + | |
| 7 | +<% if !profile.admins.blank? %> | |
| 8 | + <%= _('Current administrators:') %> | |
| 9 | + <ul style="list-style-type: none;"> | |
| 10 | + <% profile.admins.each do |admin| %> | |
| 11 | + <li><%= link_to(profile_image(admin, :icon, :style => 'margin-right: 3px;'), admin.url) + link_to(admin.name, admin.url, :style => 'margin-top: -3px;') %></li> | |
| 12 | + <% end %> | |
| 13 | + </ul> | |
| 14 | +<% end %> | |
| 15 | + | |
| 16 | +<% form_tag do %> | |
| 17 | + <% @roles.each do |role|%> | |
| 18 | + <%= content_tag('b', _('Administrator:')) %> | |
| 19 | + <%= text_field_tag('q_'+role.key, nil, :id => 'search_'+role.key) %> | |
| 20 | + <% end %> | |
| 21 | + | |
| 22 | + <% button_bar do %> | |
| 23 | + <%= submit_button('save', _('Save'))%> | |
| 24 | + <%= button('cancel', _('Cancel'), {:controller => 'profile_editor'})%> | |
| 25 | + <% end %> | |
| 26 | +<% end %> | |
| 27 | + | |
| 28 | +<%= javascript_include_tag '/plugins/bsc/jquery_tokeninput/src/jquery.tokeninput.js' %> | |
| 29 | +<% stylesheet('/plugins/bsc/jquery_tokeninput/styles/token-input.css') %> | |
| 30 | + | |
| 31 | +<% @roles.each do |role| %> | |
| 32 | + <% search_url = url_for(:controller => 'profile_members', :action => 'search_user', :role => role.id, :profile => profile.identifier) %> | |
| 33 | + <script type="text/javascript"> | |
| 34 | + jQuery(<%= ('#search_' + role.key).to_json %>) | |
| 35 | + .tokenInput("<%= search_url %>", { | |
| 36 | + hintText: <%= _('Type in a search term for the new administrator').to_json %>, | |
| 37 | + noResultsText: <%= _('No results').to_json %>, | |
| 38 | + searchingText: <%= _('Searching...').to_json %>, | |
| 39 | + searchDelay: 500, | |
| 40 | + backspaceDeleteItem: false, | |
| 41 | + preventDuplicates: true, | |
| 42 | + tokenLimit: 1, | |
| 43 | + queryParam: <%= ('q_'+role.key).to_json %> | |
| 44 | + }) | |
| 45 | + .focus(); | |
| 46 | + | |
| 47 | + jQuery("#token-input-search-enterprises") | |
| 48 | + .live("keydown", function(event){ | |
| 49 | + if(event.keyCode == "13") return false; | |
| 50 | + }); | |
| 51 | + </script> | |
| 52 | +<% end %> | |
| 53 | + | |
| 54 | + | ... | ... |
| ... | ... | @@ -0,0 +1,6 @@ |
| 1 | +<ul> | |
| 2 | + <%= content_tag('li', content_tag('b', _('Contact phone: ')) + profile.contact_phone) if !profile.contact_phone.blank? %> | |
| 3 | + <%= content_tag('li', content_tag('b', _('Email: ')) + profile.contact_email) if !profile.contact_email.blank? %> | |
| 4 | + <%= content_tag('li', content_tag('b', _('Location: ')) + profile.state) if !profile.state.blank? %> | |
| 5 | + <%= content_tag('li', content_tag('b', _('Address: ')) + profile.address) if !profile.address.blank? %> | |
| 6 | +</ul> | ... | ... |
plugins/bsc/views/profile_editor/bsc_plugin/_bsc.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,66 @@ |
| 1 | +<!-- This line should be uncommented when bsc is merged with the former plugin --> | |
| 2 | +<%# extend FormerPlugin::FieldHelper %> | |
| 3 | + | |
| 4 | +<fieldset> | |
| 5 | + <legend><%= _('Basic information')%></legend> | |
| 6 | + <%= required f.text_field(:business_name, :onchange => "updateUrlField(this, 'profile_data_identifier')") %> | |
| 7 | + <%= required f.text_field(:company_name) %> | |
| 8 | + <%= required f.text_field(:cnpj) %> | |
| 9 | + <!-- This line should be uncommented when bsc is merged with the former plugin --> | |
| 10 | + <%#= widgets_for_form(f, :bsc_fields) %> | |
| 11 | + | |
| 12 | + <script type="text/javascript"> | |
| 13 | + function submit_button(index) { | |
| 14 | + return $("profile_data_identifier").form.select("input.submit")[index]; | |
| 15 | + } | |
| 16 | + function warn_value_change() { | |
| 17 | + show_warning('bsc-formitem', "identifier-change-confirmation"); | |
| 18 | + disable_button(submit_button(0)); | |
| 19 | + } | |
| 20 | + function confirm_change() { | |
| 21 | + enable_button(submit_button(0)); | |
| 22 | + hide_warning('identifier-change-confirmation'); | |
| 23 | + } | |
| 24 | + function no_change() { | |
| 25 | + $("profile_data_identifier").value = $("old_bsc_identifier").value; | |
| 26 | + enable_button(submit_button(0)); | |
| 27 | + hide_warning('identifier-change-confirmation'); | |
| 28 | + } | |
| 29 | + </script> | |
| 30 | + | |
| 31 | + <%= hidden_field_tag 'old_bsc_identifier', profile.identifier %> | |
| 32 | + <div id="bsc-formitem"> | |
| 33 | + <%= content_tag('code', | |
| 34 | + environment.top_url + '/ ' + | |
| 35 | + text_field(:profile_data, :identifier, :onchange => "warn_value_change()", :size => 25) | |
| 36 | + ) + | |
| 37 | + content_tag('div', | |
| 38 | + content_tag('strong', _('WARNING!')) + ' ' + | |
| 39 | + _("You are about to change the address, and this will break external links to this bsc or to posts inside it. Do you really want to change?") + | |
| 40 | + content_tag('div', | |
| 41 | + button_to_function(:ok, _("Yes"), "confirm_change()") + ' ' + | |
| 42 | + button_to_function(:cancel, _('No'), 'no_change()') | |
| 43 | + ), | |
| 44 | + :id => 'identifier-change-confirmation', | |
| 45 | + :class => 'change-confirmation', | |
| 46 | + :style => 'display: none;' | |
| 47 | + ) | |
| 48 | + %> | |
| 49 | + </div> | |
| 50 | +</fieldset> | |
| 51 | + | |
| 52 | +<fieldset> | |
| 53 | + <legend><%= _('Contact')%></legend> | |
| 54 | + <%= f.text_field(:contact_email) %> | |
| 55 | + <%= f.text_field(:organization_website) %> | |
| 56 | + <%= f.text_field(:contact_phone) %> | |
| 57 | +</fieldset> | |
| 58 | + | |
| 59 | +<fieldset> | |
| 60 | + <legend><%= _('Location')%></legend> | |
| 61 | + <%= f.text_field(:address) %> | |
| 62 | + <%= f.text_field(:zip_code) %> | |
| 63 | + <%= f.text_field(:city) %> | |
| 64 | + <%= f.text_field(:state) %> | |
| 65 | + <%= select_country(_('Country'), :profile_data, 'country', {:class => 'type-select'}) %> | |
| 66 | +</fieldset> | ... | ... |
plugins/mezuro/lib/mezuro_plugin.rb
| ... | ... | @@ -19,7 +19,7 @@ class MezuroPlugin < Noosfero::Plugin |
| 19 | 19 | MezuroPlugin::Project.by_profile(context.profile).with_tab.map do |project| |
| 20 | 20 | { :title => 'Mezuro ' + project.name, |
| 21 | 21 | :id => 'mezuro-project-'+project.identifier, |
| 22 | - :content => expanded_template("show.html.erb",{:current_project => project}) } | |
| 22 | + :content => lambda { render :partial => 'project_tab', :locals => {:current_project => project} } } | |
| 23 | 23 | end |
| 24 | 24 | end |
| 25 | 25 | end | ... | ... |
| ... | ... | @@ -0,0 +1,81 @@ |
| 1 | +<% @project = current_project %> | |
| 2 | +<% @total_metrics = @project.total_metrics if @project != nil %> | |
| 3 | +<% @statistical_metrics = @project.statistical_metrics if @project != nil %> | |
| 4 | +<% @svn_error = @project.svn_error if (@project != nil && @project.svn_error) %> | |
| 5 | + | |
| 6 | +<h1> <%= @project.name %>'s Info</h1> | |
| 7 | +<table id="show_info"> | |
| 8 | + <tr> | |
| 9 | + <td><%= _("Name") %></td> | |
| 10 | + <td><%= @project.name %></td> | |
| 11 | + </tr> | |
| 12 | + <% if (@project.description != nil && @project.description != "" ) %> | |
| 13 | + <tr> | |
| 14 | + <td><%= _("Description") %></td> | |
| 15 | + <td><%= @project.description %></td> | |
| 16 | + </tr> | |
| 17 | + <% end %> | |
| 18 | + <tr> | |
| 19 | + <td><%= _("Repository address") %></td> | |
| 20 | + <td><%= @project.repository_url %></td> | |
| 21 | + </tr> | |
| 22 | +</table> | |
| 23 | + | |
| 24 | +<br /> | |
| 25 | + | |
| 26 | + | |
| 27 | +<% if @svn_error %> | |
| 28 | + <h3>ERROR</h3> | |
| 29 | + <div id="svn_error"> | |
| 30 | + <%= @svn_error %> | |
| 31 | + </div> | |
| 32 | + <br /> | |
| 33 | + <br /> | |
| 34 | + <p> | |
| 35 | + <%= _("Possible causes:") %> | |
| 36 | + <ul> | |
| 37 | + <li> | |
| 38 | + <%= _("Server is down") %> | |
| 39 | + </li> | |
| 40 | + <li> | |
| 41 | + <% _("URL invalid, in this case create another project with the correct URL | |
| 42 | + (Sorry for the incovenience, we're working for a better solution)") %> | |
| 43 | + </li> | |
| 44 | + </ul> | |
| 45 | + </p> | |
| 46 | +<%else%> | |
| 47 | + <h3> <%= _("Metric Results") %> </h3> | |
| 48 | + <% if @project.metrics_calculated? %> | |
| 49 | + <h3> <% _("Total Metrics") %> </h3> | |
| 50 | + <table id="total_metrics"> | |
| 51 | + <% @total_metrics.each_with_index do |metric, index| %> | |
| 52 | + <tr id="tr_<%= metric.name %>" class="d<%= index % 2 %>"> | |
| 53 | + <td class="metric_name"> <%= metric.name %> </td> | |
| 54 | + <td class="metric_value"> <%= metric.value %> </td> | |
| 55 | + </tr> | |
| 56 | + <% end %> | |
| 57 | + </table> | |
| 58 | + | |
| 59 | + <h3> <%= _("Statistical Metrics") %> </h3> | |
| 60 | + <% @statistical_metrics.each_key do |metric_name| %> | |
| 61 | + <div id="statistical_metrics"> | |
| 62 | + <%= "#{metric_name}_average: #{@statistical_metrics[metric_name]["average"]}" %> | |
| 63 | + <ul> | |
| 64 | + <% @statistical_metrics[metric_name].each do |stat_name, stat_value| %> | |
| 65 | + <% if stat_name != "average" %> | |
| 66 | + <li> | |
| 67 | + <%= "#{metric_name}_#{stat_name}: #{stat_value}" %> | |
| 68 | + </li> | |
| 69 | + <% end %> | |
| 70 | + <% end %> | |
| 71 | + </ul> | |
| 72 | + </div> | |
| 73 | + <% end %> | |
| 74 | + | |
| 75 | + <% else %> | |
| 76 | + <div id="progress_message"> | |
| 77 | + <%= _("Wait a moment while the metrics are calculated.<br/> | |
| 78 | + Reload the page manually in a few moment. ") %> | |
| 79 | + </div> | |
| 80 | + <% end %> | |
| 81 | +<% end %> | ... | ... |
plugins/mezuro/views/show.html.erb
| ... | ... | @@ -1,81 +0,0 @@ |
| 1 | -<% @project = locals[:current_project] %> | |
| 2 | -<% @total_metrics = @project.total_metrics if @project != nil %> | |
| 3 | -<% @statistical_metrics = @project.statistical_metrics if @project != nil %> | |
| 4 | -<% @svn_error = @project.svn_error if (@project != nil && @project.svn_error) %> | |
| 5 | - | |
| 6 | -<h1> <%= @project.name %>'s Info</h1> | |
| 7 | -<table id="show_info"> | |
| 8 | - <tr> | |
| 9 | - <td><%= _("Name") %></td> | |
| 10 | - <td><%= @project.name %></td> | |
| 11 | - </tr> | |
| 12 | - <% if (@project.description != nil && @project.description != "" ) %> | |
| 13 | - <tr> | |
| 14 | - <td><%= _("Description") %></td> | |
| 15 | - <td><%= @project.description %></td> | |
| 16 | - </tr> | |
| 17 | - <% end %> | |
| 18 | - <tr> | |
| 19 | - <td><%= _("Repository address") %></td> | |
| 20 | - <td><%= @project.repository_url %></td> | |
| 21 | - </tr> | |
| 22 | -</table> | |
| 23 | - | |
| 24 | -<br /> | |
| 25 | - | |
| 26 | - | |
| 27 | -<% if @svn_error %> | |
| 28 | - <h3>ERROR</h3> | |
| 29 | - <div id="svn_error"> | |
| 30 | - <%= @svn_error %> | |
| 31 | - </div> | |
| 32 | - <br /> | |
| 33 | - <br /> | |
| 34 | - <p> | |
| 35 | - <%= _("Possible causes:") %> | |
| 36 | - <ul> | |
| 37 | - <li> | |
| 38 | - <%= _("Server is down") %> | |
| 39 | - </li> | |
| 40 | - <li> | |
| 41 | - <% _("URL invalid, in this case create another project with the correct URL | |
| 42 | - (Sorry for the incovenience, we're working for a better solution)") %> | |
| 43 | - </li> | |
| 44 | - </ul> | |
| 45 | - </p> | |
| 46 | -<%else%> | |
| 47 | - <h3> <%= _("Metric Results") %> </h3> | |
| 48 | - <% if @project.metrics_calculated? %> | |
| 49 | - <h3> <% _("Total Metrics") %> </h3> | |
| 50 | - <table id="total_metrics"> | |
| 51 | - <% @total_metrics.each_with_index do |metric, index| %> | |
| 52 | - <tr id="tr_<%= metric.name %>" class="d<%= index % 2 %>"> | |
| 53 | - <td class="metric_name"> <%= metric.name %> </td> | |
| 54 | - <td class="metric_value"> <%= metric.value %> </td> | |
| 55 | - </tr> | |
| 56 | - <% end %> | |
| 57 | - </table> | |
| 58 | - | |
| 59 | - <h3> <%= _("Statistical Metrics") %> </h3> | |
| 60 | - <% @statistical_metrics.each_key do |metric_name| %> | |
| 61 | - <div id="statistical_metrics"> | |
| 62 | - <%= "#{metric_name}_average: #{@statistical_metrics[metric_name]["average"]}" %> | |
| 63 | - <ul> | |
| 64 | - <% @statistical_metrics[metric_name].each do |stat_name, stat_value| %> | |
| 65 | - <% if stat_name != "average" %> | |
| 66 | - <li> | |
| 67 | - <%= "#{metric_name}_#{stat_name}: #{stat_value}" %> | |
| 68 | - </li> | |
| 69 | - <% end %> | |
| 70 | - <% end %> | |
| 71 | - </ul> | |
| 72 | - </div> | |
| 73 | - <% end %> | |
| 74 | - | |
| 75 | - <% else %> | |
| 76 | - <div id="progress_message"> | |
| 77 | - <%= _("Wait a moment while the metrics are calculated.<br/> | |
| 78 | - Reload the page manually in a few moment. ") %> | |
| 79 | - </div> | |
| 80 | - <% end %> | |
| 81 | -<% end %> |
| ... | ... | @@ -0,0 +1,793 @@ |
| 1 | +/* | |
| 2 | + * jQuery Plugin: Tokenizing Autocomplete Text Entry | |
| 3 | + * Version 1.5.0 | |
| 4 | + * | |
| 5 | + * Copyright (c) 2009 James Smith (http://loopj.com) | |
| 6 | + * Licensed jointly under the GPL and MIT licenses, | |
| 7 | + * choose which one suits your project best! | |
| 8 | + * | |
| 9 | + */ | |
| 10 | + | |
| 11 | +(function ($) { | |
| 12 | +// Default settings | |
| 13 | +var DEFAULT_SETTINGS = { | |
| 14 | + hintText: "Type in a search term", | |
| 15 | + noResultsText: "No results", | |
| 16 | + searchingText: "Searching...", | |
| 17 | + deleteText: "×", | |
| 18 | + searchDelay: 300, | |
| 19 | + minChars: 1, | |
| 20 | + tokenLimit: null, | |
| 21 | + jsonContainer: null, | |
| 22 | + method: "GET", | |
| 23 | + contentType: "json", | |
| 24 | + queryParam: "q", | |
| 25 | + tokenDelimiter: ",", | |
| 26 | + preventDuplicates: false, | |
| 27 | + prePopulate: null, | |
| 28 | + processPrePopulate: false, | |
| 29 | + animateDropdown: true, | |
| 30 | + onResult: null, | |
| 31 | + onAdd: null, | |
| 32 | + onDelete: null, | |
| 33 | + idPrefix: "token-input-", | |
| 34 | + backspaceDeleteItem: true | |
| 35 | +}; | |
| 36 | + | |
| 37 | +// Default classes to use when theming | |
| 38 | +var DEFAULT_CLASSES = { | |
| 39 | + tokenList: "token-input-list", | |
| 40 | + token: "token-input-token", | |
| 41 | + tokenDelete: "token-input-delete-token", | |
| 42 | + selectedToken: "token-input-selected-token", | |
| 43 | + highlightedToken: "token-input-highlighted-token", | |
| 44 | + dropdown: "token-input-dropdown", | |
| 45 | + dropdownItem: "token-input-dropdown-item", | |
| 46 | + dropdownItem2: "token-input-dropdown-item2", | |
| 47 | + selectedDropdownItem: "token-input-selected-dropdown-item", | |
| 48 | + inputToken: "token-input-input-token" | |
| 49 | +}; | |
| 50 | + | |
| 51 | +// Input box position "enum" | |
| 52 | +var POSITION = { | |
| 53 | + BEFORE: 0, | |
| 54 | + AFTER: 1, | |
| 55 | + END: 2 | |
| 56 | +}; | |
| 57 | + | |
| 58 | +// Keys "enum" | |
| 59 | +var KEY = { | |
| 60 | + BACKSPACE: 8, | |
| 61 | + TAB: 9, | |
| 62 | + ENTER: 13, | |
| 63 | + ESCAPE: 27, | |
| 64 | + SPACE: 32, | |
| 65 | + PAGE_UP: 33, | |
| 66 | + PAGE_DOWN: 34, | |
| 67 | + END: 35, | |
| 68 | + HOME: 36, | |
| 69 | + LEFT: 37, | |
| 70 | + UP: 38, | |
| 71 | + RIGHT: 39, | |
| 72 | + DOWN: 40, | |
| 73 | + NUMPAD_ENTER: 108, | |
| 74 | + COMMA: 188 | |
| 75 | +}; | |
| 76 | + | |
| 77 | +// Additional public (exposed) methods | |
| 78 | +var methods = { | |
| 79 | + init: function(url_or_data_or_function, options) { | |
| 80 | + var settings = $.extend({}, DEFAULT_SETTINGS, options || {}); | |
| 81 | + | |
| 82 | + return this.each(function () { | |
| 83 | + $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings)); | |
| 84 | + }); | |
| 85 | + }, | |
| 86 | + clear: function() { | |
| 87 | + this.data("tokenInputObject").clear(); | |
| 88 | + return this; | |
| 89 | + }, | |
| 90 | + add: function(item) { | |
| 91 | + this.data("tokenInputObject").add(item); | |
| 92 | + return this; | |
| 93 | + }, | |
| 94 | + remove: function(item) { | |
| 95 | + this.data("tokenInputObject").remove(item); | |
| 96 | + return this; | |
| 97 | + } | |
| 98 | +} | |
| 99 | + | |
| 100 | +// Expose the .tokenInput function to jQuery as a plugin | |
| 101 | +$.fn.tokenInput = function (method) { | |
| 102 | + // Method calling and initialization logic | |
| 103 | + if(methods[method]) { | |
| 104 | + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); | |
| 105 | + } else { | |
| 106 | + return methods.init.apply(this, arguments); | |
| 107 | + } | |
| 108 | +}; | |
| 109 | + | |
| 110 | +// TokenList class for each input | |
| 111 | +$.TokenList = function (input, url_or_data, settings) { | |
| 112 | + // | |
| 113 | + // Initialization | |
| 114 | + // | |
| 115 | + | |
| 116 | + // Configure the data source | |
| 117 | + if(typeof(url_or_data) === "string") { | |
| 118 | + // Set the url to query against | |
| 119 | + settings.url = url_or_data; | |
| 120 | + | |
| 121 | + // Make a smart guess about cross-domain if it wasn't explicitly specified | |
| 122 | + if(settings.crossDomain === undefined) { | |
| 123 | + if(settings.url.indexOf("://") === -1) { | |
| 124 | + settings.crossDomain = false; | |
| 125 | + } else { | |
| 126 | + settings.crossDomain = (location.href.split(/\/+/g)[1] !== settings.url.split(/\/+/g)[1]); | |
| 127 | + } | |
| 128 | + } | |
| 129 | + } else if(typeof(url_or_data) === "object") { | |
| 130 | + // Set the local data to search through | |
| 131 | + settings.local_data = url_or_data; | |
| 132 | + } | |
| 133 | + | |
| 134 | + // Build class names | |
| 135 | + if(settings.classes) { | |
| 136 | + // Use custom class names | |
| 137 | + settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes); | |
| 138 | + } else if(settings.theme) { | |
| 139 | + // Use theme-suffixed default class names | |
| 140 | + settings.classes = {}; | |
| 141 | + $.each(DEFAULT_CLASSES, function(key, value) { | |
| 142 | + settings.classes[key] = value + "-" + settings.theme; | |
| 143 | + }); | |
| 144 | + } else { | |
| 145 | + settings.classes = DEFAULT_CLASSES; | |
| 146 | + } | |
| 147 | + | |
| 148 | + | |
| 149 | + // Save the tokens | |
| 150 | + var saved_tokens = []; | |
| 151 | + | |
| 152 | + // Keep track of the number of tokens in the list | |
| 153 | + var token_count = 0; | |
| 154 | + | |
| 155 | + // Basic cache to save on db hits | |
| 156 | + var cache = new $.TokenList.Cache(); | |
| 157 | + | |
| 158 | + // Keep track of the timeout, old vals | |
| 159 | + var timeout; | |
| 160 | + var input_val; | |
| 161 | + | |
| 162 | + // Create a new text input an attach keyup events | |
| 163 | + var input_box = $("<input type=\"text\" autocomplete=\"off\">") | |
| 164 | + .css({ | |
| 165 | + outline: "none" | |
| 166 | + }) | |
| 167 | + .attr("id", settings.idPrefix + input.id) | |
| 168 | + .focus(function () { | |
| 169 | + if (settings.tokenLimit === null || settings.tokenLimit !== token_count) { | |
| 170 | + show_dropdown_hint(); | |
| 171 | + } | |
| 172 | + }) | |
| 173 | + .blur(function () { | |
| 174 | + hide_dropdown(); | |
| 175 | + $(this).val(""); | |
| 176 | + }) | |
| 177 | + .bind("keyup keydown blur update", resize_input) | |
| 178 | + .keydown(function (event) { | |
| 179 | + var previous_token; | |
| 180 | + var next_token; | |
| 181 | + | |
| 182 | + switch(event.keyCode) { | |
| 183 | + case KEY.LEFT: | |
| 184 | + case KEY.RIGHT: | |
| 185 | + case KEY.UP: | |
| 186 | + case KEY.DOWN: | |
| 187 | + if(!$(this).val()) { | |
| 188 | + previous_token = input_token.prev(); | |
| 189 | + next_token = input_token.next(); | |
| 190 | + | |
| 191 | + if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) { | |
| 192 | + // Check if there is a previous/next token and it is selected | |
| 193 | + if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) { | |
| 194 | + deselect_token($(selected_token), POSITION.BEFORE); | |
| 195 | + } else { | |
| 196 | + deselect_token($(selected_token), POSITION.AFTER); | |
| 197 | + } | |
| 198 | + } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) { | |
| 199 | + // We are moving left, select the previous token if it exists | |
| 200 | + select_token($(previous_token.get(0))); | |
| 201 | + } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) { | |
| 202 | + // We are moving right, select the next token if it exists | |
| 203 | + select_token($(next_token.get(0))); | |
| 204 | + } | |
| 205 | + } else { | |
| 206 | + var dropdown_item = null; | |
| 207 | + | |
| 208 | + if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) { | |
| 209 | + dropdown_item = $(selected_dropdown_item).next(); | |
| 210 | + } else { | |
| 211 | + dropdown_item = $(selected_dropdown_item).prev(); | |
| 212 | + } | |
| 213 | + | |
| 214 | + if(dropdown_item.length) { | |
| 215 | + select_dropdown_item(dropdown_item); | |
| 216 | + } | |
| 217 | + return false; | |
| 218 | + } | |
| 219 | + break; | |
| 220 | + | |
| 221 | + case KEY.BACKSPACE: | |
| 222 | + previous_token = input_token.prev(); | |
| 223 | + if(!$(this).val().length && settings.backspaceDeleteItem) { | |
| 224 | + if(selected_token) { | |
| 225 | + delete_token($(selected_token)); | |
| 226 | + } else if(previous_token.length) { | |
| 227 | + select_token($(previous_token.get(0))); | |
| 228 | + } | |
| 229 | + | |
| 230 | + return false; | |
| 231 | + } else if($(this).val().length === 1) { | |
| 232 | + hide_dropdown(); | |
| 233 | + } else { | |
| 234 | + // set a timeout just long enough to let this function finish. | |
| 235 | + setTimeout(function(){do_search();}, 5); | |
| 236 | + } | |
| 237 | + break; | |
| 238 | + | |
| 239 | + case KEY.TAB: | |
| 240 | + case KEY.ENTER: | |
| 241 | + case KEY.NUMPAD_ENTER: | |
| 242 | + case KEY.COMMA: | |
| 243 | + if(selected_dropdown_item) { | |
| 244 | + add_token($(selected_dropdown_item).data("tokeninput")); | |
| 245 | + return false; | |
| 246 | + } | |
| 247 | + break; | |
| 248 | + | |
| 249 | + case KEY.ESCAPE: | |
| 250 | + hide_dropdown(); | |
| 251 | + return true; | |
| 252 | + | |
| 253 | + default: | |
| 254 | + if(String.fromCharCode(event.which)) { | |
| 255 | + // set a timeout just long enough to let this function finish. | |
| 256 | + setTimeout(function(){do_search();}, 5); | |
| 257 | + } | |
| 258 | + break; | |
| 259 | + } | |
| 260 | + }); | |
| 261 | + | |
| 262 | + // Keep a reference to the original input box | |
| 263 | + var hidden_input = $(input) | |
| 264 | + .hide() | |
| 265 | + .val("") | |
| 266 | + .focus(function () { | |
| 267 | + input_box.focus(); | |
| 268 | + }) | |
| 269 | + .blur(function () { | |
| 270 | + input_box.blur(); | |
| 271 | + }); | |
| 272 | + | |
| 273 | + // Keep a reference to the selected token and dropdown item | |
| 274 | + var selected_token = null; | |
| 275 | + var selected_token_index = 0; | |
| 276 | + var selected_dropdown_item = null; | |
| 277 | + | |
| 278 | + // The list to store the token items in | |
| 279 | + var token_list = $("<ul />") | |
| 280 | + .addClass(settings.classes.tokenList) | |
| 281 | + .click(function (event) { | |
| 282 | + var li = $(event.target).closest("li"); | |
| 283 | + if(li && li.get(0) && $.data(li.get(0), "tokeninput")) { | |
| 284 | + toggle_select_token(li); | |
| 285 | + } else { | |
| 286 | + // Deselect selected token | |
| 287 | + if(selected_token) { | |
| 288 | + deselect_token($(selected_token), POSITION.END); | |
| 289 | + } | |
| 290 | + | |
| 291 | + // Focus input box | |
| 292 | + input_box.focus(); | |
| 293 | + } | |
| 294 | + }) | |
| 295 | + .mouseover(function (event) { | |
| 296 | + var li = $(event.target).closest("li"); | |
| 297 | + if(li && selected_token !== this) { | |
| 298 | + li.addClass(settings.classes.highlightedToken); | |
| 299 | + } | |
| 300 | + }) | |
| 301 | + .mouseout(function (event) { | |
| 302 | + var li = $(event.target).closest("li"); | |
| 303 | + if(li && selected_token !== this) { | |
| 304 | + li.removeClass(settings.classes.highlightedToken); | |
| 305 | + } | |
| 306 | + }) | |
| 307 | + .insertBefore(hidden_input); | |
| 308 | + | |
| 309 | + // The token holding the input box | |
| 310 | + var input_token = $("<li />") | |
| 311 | + .addClass(settings.classes.inputToken) | |
| 312 | + .appendTo(token_list) | |
| 313 | + .append(input_box); | |
| 314 | + | |
| 315 | + // The list to store the dropdown items in | |
| 316 | + var dropdown = $("<div>") | |
| 317 | + .addClass(settings.classes.dropdown) | |
| 318 | + .appendTo("body") | |
| 319 | + .hide(); | |
| 320 | + | |
| 321 | + // Magic element to help us resize the text input | |
| 322 | + var input_resizer = $("<tester/>") | |
| 323 | + .insertAfter(input_box) | |
| 324 | + .css({ | |
| 325 | + position: "absolute", | |
| 326 | + top: -9999, | |
| 327 | + left: -9999, | |
| 328 | + width: "auto", | |
| 329 | + fontSize: input_box.css("fontSize"), | |
| 330 | + fontFamily: input_box.css("fontFamily"), | |
| 331 | + fontWeight: input_box.css("fontWeight"), | |
| 332 | + letterSpacing: input_box.css("letterSpacing"), | |
| 333 | + whiteSpace: "nowrap" | |
| 334 | + }); | |
| 335 | + | |
| 336 | + // Pre-populate list if items exist | |
| 337 | + hidden_input.val(""); | |
| 338 | + var li_data = settings.prePopulate || hidden_input.data("pre"); | |
| 339 | + if(settings.processPrePopulate && $.isFunction(settings.onResult)) { | |
| 340 | + li_data = settings.onResult.call(hidden_input, li_data); | |
| 341 | + } | |
| 342 | + if(li_data && li_data.length) { | |
| 343 | + $.each(li_data, function (index, value) { | |
| 344 | + insert_token(value); | |
| 345 | + checkTokenLimit(); | |
| 346 | + }); | |
| 347 | + } | |
| 348 | + | |
| 349 | + | |
| 350 | + // | |
| 351 | + // Public functions | |
| 352 | + // | |
| 353 | + | |
| 354 | + this.clear = function() { | |
| 355 | + token_list.children("li").each(function() { | |
| 356 | + if ($(this).children("input").length === 0) { | |
| 357 | + delete_token($(this)); | |
| 358 | + } | |
| 359 | + }); | |
| 360 | + } | |
| 361 | + | |
| 362 | + this.add = function(item) { | |
| 363 | + add_token(item); | |
| 364 | + } | |
| 365 | + | |
| 366 | + this.remove = function(item) { | |
| 367 | + token_list.children("li").each(function() { | |
| 368 | + if ($(this).children("input").length === 0) { | |
| 369 | + var currToken = $(this).data("tokeninput"); | |
| 370 | + var match = true; | |
| 371 | + for (var prop in item) { | |
| 372 | + if (item[prop] !== currToken[prop]) { | |
| 373 | + match = false; | |
| 374 | + break; | |
| 375 | + } | |
| 376 | + } | |
| 377 | + if (match) { | |
| 378 | + delete_token($(this)); | |
| 379 | + } | |
| 380 | + } | |
| 381 | + }); | |
| 382 | + } | |
| 383 | + | |
| 384 | + // | |
| 385 | + // Private functions | |
| 386 | + // | |
| 387 | + | |
| 388 | + function checkTokenLimit() { | |
| 389 | + if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) { | |
| 390 | + input_box.hide(); | |
| 391 | + hide_dropdown(); | |
| 392 | + return; | |
| 393 | + } else { | |
| 394 | + input_box.focus(); | |
| 395 | + } | |
| 396 | + } | |
| 397 | + | |
| 398 | + function resize_input() { | |
| 399 | + if(input_val === (input_val = input_box.val())) {return;} | |
| 400 | + | |
| 401 | + // Enter new content into resizer and resize input accordingly | |
| 402 | + var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>'); | |
| 403 | + input_resizer.html(escaped); | |
| 404 | + input_box.width(input_resizer.width() + 30); | |
| 405 | + } | |
| 406 | + | |
| 407 | + function is_printable_character(keycode) { | |
| 408 | + return ((keycode >= 48 && keycode <= 90) || // 0-1a-z | |
| 409 | + (keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * . | |
| 410 | + (keycode >= 186 && keycode <= 192) || // ; = , - . / ^ | |
| 411 | + (keycode >= 219 && keycode <= 222)); // ( \ ) ' | |
| 412 | + } | |
| 413 | + | |
| 414 | + // Inner function to a token to the list | |
| 415 | + function insert_token(item) { | |
| 416 | + var this_token = $("<li><p>"+ item.name +"</p></li>") | |
| 417 | + .addClass(settings.classes.token) | |
| 418 | + .insertBefore(input_token); | |
| 419 | + | |
| 420 | + // The 'delete token' button | |
| 421 | + $("<span>" + settings.deleteText + "</span>") | |
| 422 | + .addClass(settings.classes.tokenDelete) | |
| 423 | + .appendTo(this_token) | |
| 424 | + .click(function () { | |
| 425 | + delete_token($(this).parent()); | |
| 426 | + return false; | |
| 427 | + }); | |
| 428 | + | |
| 429 | + // Store data on the token | |
| 430 | + var token_data = {"id": item.id, "name": item.name}; | |
| 431 | + $.data(this_token.get(0), "tokeninput", item); | |
| 432 | + | |
| 433 | + // Save this token for duplicate checking | |
| 434 | + saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index)); | |
| 435 | + selected_token_index++; | |
| 436 | + | |
| 437 | + // Update the hidden input | |
| 438 | + var token_ids = $.map(saved_tokens, function (el) { | |
| 439 | + return el.id; | |
| 440 | + }); | |
| 441 | + hidden_input.val(token_ids.join(settings.tokenDelimiter)); | |
| 442 | + | |
| 443 | + token_count += 1; | |
| 444 | + | |
| 445 | + return this_token; | |
| 446 | + } | |
| 447 | + | |
| 448 | + // Add a token to the token list based on user input | |
| 449 | + function add_token (item) { | |
| 450 | + var callback = settings.onAdd; | |
| 451 | + | |
| 452 | + // See if the token already exists and select it if we don't want duplicates | |
| 453 | + if(token_count > 0 && settings.preventDuplicates) { | |
| 454 | + var found_existing_token = null; | |
| 455 | + token_list.children().each(function () { | |
| 456 | + var existing_token = $(this); | |
| 457 | + var existing_data = $.data(existing_token.get(0), "tokeninput"); | |
| 458 | + if(existing_data && existing_data.id === item.id) { | |
| 459 | + found_existing_token = existing_token; | |
| 460 | + return false; | |
| 461 | + } | |
| 462 | + }); | |
| 463 | + | |
| 464 | + if(found_existing_token) { | |
| 465 | + select_token(found_existing_token); | |
| 466 | + input_token.insertAfter(found_existing_token); | |
| 467 | + input_box.focus(); | |
| 468 | + return; | |
| 469 | + } | |
| 470 | + } | |
| 471 | + | |
| 472 | + // Insert the new tokens | |
| 473 | + insert_token(item); | |
| 474 | + checkTokenLimit(); | |
| 475 | + | |
| 476 | + // Clear input box | |
| 477 | + input_box.val(""); | |
| 478 | + | |
| 479 | + // Don't show the help dropdown, they've got the idea | |
| 480 | + hide_dropdown(); | |
| 481 | + | |
| 482 | + // Execute the onAdd callback if defined | |
| 483 | + if($.isFunction(callback)) { | |
| 484 | + callback.call(hidden_input,item); | |
| 485 | + } | |
| 486 | + } | |
| 487 | + | |
| 488 | + // Select a token in the token list | |
| 489 | + function select_token (token) { | |
| 490 | + token.addClass(settings.classes.selectedToken); | |
| 491 | + selected_token = token.get(0); | |
| 492 | + | |
| 493 | + // Hide input box | |
| 494 | + input_box.val(""); | |
| 495 | + | |
| 496 | + // Hide dropdown if it is visible (eg if we clicked to select token) | |
| 497 | + hide_dropdown(); | |
| 498 | + } | |
| 499 | + | |
| 500 | + // Deselect a token in the token list | |
| 501 | + function deselect_token (token, position) { | |
| 502 | + token.removeClass(settings.classes.selectedToken); | |
| 503 | + selected_token = null; | |
| 504 | + | |
| 505 | + if(position === POSITION.BEFORE) { | |
| 506 | + input_token.insertBefore(token); | |
| 507 | + selected_token_index--; | |
| 508 | + } else if(position === POSITION.AFTER) { | |
| 509 | + input_token.insertAfter(token); | |
| 510 | + selected_token_index++; | |
| 511 | + } else { | |
| 512 | + input_token.appendTo(token_list); | |
| 513 | + selected_token_index = token_count; | |
| 514 | + } | |
| 515 | + | |
| 516 | + // Show the input box and give it focus again | |
| 517 | + input_box.focus(); | |
| 518 | + } | |
| 519 | + | |
| 520 | + // Toggle selection of a token in the token list | |
| 521 | + function toggle_select_token(token) { | |
| 522 | + var previous_selected_token = selected_token; | |
| 523 | + | |
| 524 | + if(selected_token) { | |
| 525 | + deselect_token($(selected_token), POSITION.END); | |
| 526 | + } | |
| 527 | + | |
| 528 | + if(previous_selected_token === token.get(0)) { | |
| 529 | + deselect_token(token, POSITION.END); | |
| 530 | + } else { | |
| 531 | + select_token(token); | |
| 532 | + } | |
| 533 | + } | |
| 534 | + | |
| 535 | + // Delete a token from the token list | |
| 536 | + function delete_token (token) { | |
| 537 | + // Remove the id from the saved list | |
| 538 | + var token_data = $.data(token.get(0), "tokeninput"); | |
| 539 | + var callback = settings.onDelete; | |
| 540 | + | |
| 541 | + var index = token.prevAll().length; | |
| 542 | + if(index > selected_token_index) index--; | |
| 543 | + | |
| 544 | + // Delete the token | |
| 545 | + token.remove(); | |
| 546 | + selected_token = null; | |
| 547 | + | |
| 548 | + // Show the input box and give it focus again | |
| 549 | + input_box.focus(); | |
| 550 | + | |
| 551 | + // Remove this token from the saved list | |
| 552 | + saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1)); | |
| 553 | + if(index < selected_token_index) selected_token_index--; | |
| 554 | + | |
| 555 | + // Update the hidden input | |
| 556 | + var token_ids = $.map(saved_tokens, function (el) { | |
| 557 | + return el.id; | |
| 558 | + }); | |
| 559 | + hidden_input.val(token_ids.join(settings.tokenDelimiter)); | |
| 560 | + | |
| 561 | + token_count -= 1; | |
| 562 | + | |
| 563 | + if(settings.tokenLimit !== null) { | |
| 564 | + input_box | |
| 565 | + .show() | |
| 566 | + .val("") | |
| 567 | + .focus(); | |
| 568 | + } | |
| 569 | + | |
| 570 | + // Execute the onDelete callback if defined | |
| 571 | + if($.isFunction(callback)) { | |
| 572 | + callback.call(hidden_input,token_data); | |
| 573 | + } | |
| 574 | + } | |
| 575 | + | |
| 576 | + // Hide and clear the results dropdown | |
| 577 | + function hide_dropdown () { | |
| 578 | + dropdown.hide().empty(); | |
| 579 | + selected_dropdown_item = null; | |
| 580 | + } | |
| 581 | + | |
| 582 | + function show_dropdown() { | |
| 583 | + dropdown | |
| 584 | + .css({ | |
| 585 | + position: "absolute", | |
| 586 | + top: $(token_list).offset().top + $(token_list).outerHeight(), | |
| 587 | + left: $(token_list).offset().left, | |
| 588 | + zindex: 999 | |
| 589 | + }) | |
| 590 | + .show(); | |
| 591 | + } | |
| 592 | + | |
| 593 | + function show_dropdown_searching () { | |
| 594 | + if(settings.searchingText) { | |
| 595 | + dropdown.html("<p>"+settings.searchingText+"</p>"); | |
| 596 | + show_dropdown(); | |
| 597 | + } | |
| 598 | + } | |
| 599 | + | |
| 600 | + function show_dropdown_hint () { | |
| 601 | + if(settings.hintText) { | |
| 602 | + dropdown.html("<p>"+settings.hintText+"</p>"); | |
| 603 | + show_dropdown(); | |
| 604 | + } | |
| 605 | + } | |
| 606 | + | |
| 607 | + // Highlight the query part of the search term | |
| 608 | + function highlight_term(value, term) { | |
| 609 | + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>"); | |
| 610 | + } | |
| 611 | + | |
| 612 | + // Populate the results dropdown with some results | |
| 613 | + function populate_dropdown (query, results) { | |
| 614 | + if(results && results.length) { | |
| 615 | + dropdown.empty(); | |
| 616 | + var dropdown_ul = $("<ul>") | |
| 617 | + .appendTo(dropdown) | |
| 618 | + .mouseover(function (event) { | |
| 619 | + select_dropdown_item($(event.target).closest("li")); | |
| 620 | + }) | |
| 621 | + .mousedown(function (event) { | |
| 622 | + add_token($(event.target).closest("li").data("tokeninput")); | |
| 623 | + return false; | |
| 624 | + }) | |
| 625 | + .hide(); | |
| 626 | + | |
| 627 | + $.each(results, function(index, value) { | |
| 628 | + var this_li = $("<li>" + highlight_term(value.name, query) + "</li>") | |
| 629 | + .appendTo(dropdown_ul); | |
| 630 | + | |
| 631 | + if(index % 2) { | |
| 632 | + this_li.addClass(settings.classes.dropdownItem); | |
| 633 | + } else { | |
| 634 | + this_li.addClass(settings.classes.dropdownItem2); | |
| 635 | + } | |
| 636 | + | |
| 637 | + if(index === 0) { | |
| 638 | + select_dropdown_item(this_li); | |
| 639 | + } | |
| 640 | + | |
| 641 | + $.data(this_li.get(0), "tokeninput", value); | |
| 642 | + }); | |
| 643 | + | |
| 644 | + show_dropdown(); | |
| 645 | + | |
| 646 | + if(settings.animateDropdown) { | |
| 647 | + dropdown_ul.slideDown("fast"); | |
| 648 | + } else { | |
| 649 | + dropdown_ul.show(); | |
| 650 | + } | |
| 651 | + } else { | |
| 652 | + if(settings.noResultsText) { | |
| 653 | + dropdown.html("<p>"+settings.noResultsText+"</p>"); | |
| 654 | + show_dropdown(); | |
| 655 | + } | |
| 656 | + } | |
| 657 | + } | |
| 658 | + | |
| 659 | + // Highlight an item in the results dropdown | |
| 660 | + function select_dropdown_item (item) { | |
| 661 | + if(item) { | |
| 662 | + if(selected_dropdown_item) { | |
| 663 | + deselect_dropdown_item($(selected_dropdown_item)); | |
| 664 | + } | |
| 665 | + | |
| 666 | + item.addClass(settings.classes.selectedDropdownItem); | |
| 667 | + selected_dropdown_item = item.get(0); | |
| 668 | + } | |
| 669 | + } | |
| 670 | + | |
| 671 | + // Remove highlighting from an item in the results dropdown | |
| 672 | + function deselect_dropdown_item (item) { | |
| 673 | + item.removeClass(settings.classes.selectedDropdownItem); | |
| 674 | + selected_dropdown_item = null; | |
| 675 | + } | |
| 676 | + | |
| 677 | + // Do a search and show the "searching" dropdown if the input is longer | |
| 678 | + // than settings.minChars | |
| 679 | + function do_search() { | |
| 680 | + var query = input_box.val().toLowerCase(); | |
| 681 | + | |
| 682 | + if(query && query.length) { | |
| 683 | + if(selected_token) { | |
| 684 | + deselect_token($(selected_token), POSITION.AFTER); | |
| 685 | + } | |
| 686 | + | |
| 687 | + if(query.length >= settings.minChars) { | |
| 688 | + show_dropdown_searching(); | |
| 689 | + clearTimeout(timeout); | |
| 690 | + | |
| 691 | + timeout = setTimeout(function(){ | |
| 692 | + run_search(query); | |
| 693 | + }, settings.searchDelay); | |
| 694 | + } else { | |
| 695 | + hide_dropdown(); | |
| 696 | + } | |
| 697 | + } | |
| 698 | + } | |
| 699 | + | |
| 700 | + // Do the actual search | |
| 701 | + function run_search(query) { | |
| 702 | + var cached_results = cache.get(query); | |
| 703 | + if(cached_results) { | |
| 704 | + populate_dropdown(query, cached_results); | |
| 705 | + } else { | |
| 706 | + // Are we doing an ajax search or local data search? | |
| 707 | + if(settings.url) { | |
| 708 | + // Extract exisiting get params | |
| 709 | + var ajax_params = {}; | |
| 710 | + ajax_params.data = {}; | |
| 711 | + if(settings.url.indexOf("?") > -1) { | |
| 712 | + var parts = settings.url.split("?"); | |
| 713 | + ajax_params.url = parts[0]; | |
| 714 | + | |
| 715 | + var param_array = parts[1].split("&"); | |
| 716 | + $.each(param_array, function (index, value) { | |
| 717 | + var kv = value.split("="); | |
| 718 | + ajax_params.data[kv[0]] = kv[1]; | |
| 719 | + }); | |
| 720 | + } else { | |
| 721 | + ajax_params.url = settings.url; | |
| 722 | + } | |
| 723 | + | |
| 724 | + // Prepare the request | |
| 725 | + ajax_params.data[settings.queryParam] = query; | |
| 726 | + ajax_params.type = settings.method; | |
| 727 | + ajax_params.dataType = settings.contentType; | |
| 728 | + if(settings.crossDomain) { | |
| 729 | + ajax_params.dataType = "jsonp"; | |
| 730 | + } | |
| 731 | + | |
| 732 | + // Attach the success callback | |
| 733 | + ajax_params.success = function(results) { | |
| 734 | + if($.isFunction(settings.onResult)) { | |
| 735 | + results = settings.onResult.call(hidden_input, results); | |
| 736 | + } | |
| 737 | + cache.add(query, settings.jsonContainer ? results[settings.jsonContainer] : results); | |
| 738 | + | |
| 739 | + // only populate the dropdown if the results are associated with the active search query | |
| 740 | + if(input_box.val().toLowerCase() === query) { | |
| 741 | + populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results); | |
| 742 | + } | |
| 743 | + }; | |
| 744 | + | |
| 745 | + // Make the request | |
| 746 | + $.ajax(ajax_params); | |
| 747 | + } else if(settings.local_data) { | |
| 748 | + // Do the search through local data | |
| 749 | + var results = $.grep(settings.local_data, function (row) { | |
| 750 | + return row.name.toLowerCase().indexOf(query.toLowerCase()) > -1; | |
| 751 | + }); | |
| 752 | + | |
| 753 | + if($.isFunction(settings.onResult)) { | |
| 754 | + results = settings.onResult.call(hidden_input, results); | |
| 755 | + } | |
| 756 | + cache.add(query, results); | |
| 757 | + populate_dropdown(query, results); | |
| 758 | + } | |
| 759 | + } | |
| 760 | + } | |
| 761 | +}; | |
| 762 | + | |
| 763 | +// Really basic cache for the results | |
| 764 | +$.TokenList.Cache = function (options) { | |
| 765 | + var settings = $.extend({ | |
| 766 | + max_size: 500 | |
| 767 | + }, options); | |
| 768 | + | |
| 769 | + var data = {}; | |
| 770 | + var size = 0; | |
| 771 | + | |
| 772 | + var flush = function () { | |
| 773 | + data = {}; | |
| 774 | + size = 0; | |
| 775 | + }; | |
| 776 | + | |
| 777 | + this.add = function (query, results) { | |
| 778 | + if(size > settings.max_size) { | |
| 779 | + flush(); | |
| 780 | + } | |
| 781 | + | |
| 782 | + if(!data[query]) { | |
| 783 | + size += 1; | |
| 784 | + } | |
| 785 | + | |
| 786 | + data[query] = results; | |
| 787 | + }; | |
| 788 | + | |
| 789 | + this.get = function (query) { | |
| 790 | + return data[query]; | |
| 791 | + }; | |
| 792 | +}; | |
| 793 | +}(jQuery)); | ... | ... |
| ... | ... | @@ -0,0 +1,122 @@ |
| 1 | +/* Example tokeninput style #2: Facebook style */ | |
| 2 | +ul.token-input-list-facebook { | |
| 3 | + overflow: hidden; | |
| 4 | + height: auto !important; | |
| 5 | + height: 1%; | |
| 6 | + width: 400px; | |
| 7 | + border: 1px solid #8496ba; | |
| 8 | + cursor: text; | |
| 9 | + font-size: 12px; | |
| 10 | + font-family: Verdana; | |
| 11 | + min-height: 1px; | |
| 12 | + z-index: 999; | |
| 13 | + margin: 0; | |
| 14 | + padding: 0; | |
| 15 | + background-color: #fff; | |
| 16 | + list-style-type: none; | |
| 17 | + clear: left; | |
| 18 | +} | |
| 19 | + | |
| 20 | +ul.token-input-list-facebook li input { | |
| 21 | + border: 0; | |
| 22 | + width: 100px; | |
| 23 | + padding: 3px 8px; | |
| 24 | + background-color: white; | |
| 25 | + margin: 2px 0; | |
| 26 | + -webkit-appearance: caret; | |
| 27 | +} | |
| 28 | + | |
| 29 | +li.token-input-token-facebook { | |
| 30 | + overflow: hidden; | |
| 31 | + height: auto !important; | |
| 32 | + height: 15px; | |
| 33 | + margin: 3px; | |
| 34 | + padding: 1px 3px; | |
| 35 | + background-color: #eff2f7; | |
| 36 | + color: #000; | |
| 37 | + cursor: default; | |
| 38 | + border: 1px solid #ccd5e4; | |
| 39 | + font-size: 11px; | |
| 40 | + border-radius: 5px; | |
| 41 | + -moz-border-radius: 5px; | |
| 42 | + -webkit-border-radius: 5px; | |
| 43 | + float: left; | |
| 44 | + white-space: nowrap; | |
| 45 | +} | |
| 46 | + | |
| 47 | +li.token-input-token-facebook p { | |
| 48 | + display: inline; | |
| 49 | + padding: 0; | |
| 50 | + margin: 0; | |
| 51 | +} | |
| 52 | + | |
| 53 | +li.token-input-token-facebook span { | |
| 54 | + color: #a6b3cf; | |
| 55 | + margin-left: 5px; | |
| 56 | + font-weight: bold; | |
| 57 | + cursor: pointer; | |
| 58 | +} | |
| 59 | + | |
| 60 | +li.token-input-selected-token-facebook { | |
| 61 | + background-color: #5670a6; | |
| 62 | + border: 1px solid #3b5998; | |
| 63 | + color: #fff; | |
| 64 | +} | |
| 65 | + | |
| 66 | +li.token-input-input-token-facebook { | |
| 67 | + float: left; | |
| 68 | + margin: 0; | |
| 69 | + padding: 0; | |
| 70 | + list-style-type: none; | |
| 71 | +} | |
| 72 | + | |
| 73 | +div.token-input-dropdown-facebook { | |
| 74 | + position: absolute; | |
| 75 | + width: 400px; | |
| 76 | + background-color: #fff; | |
| 77 | + overflow: hidden; | |
| 78 | + border-left: 1px solid #ccc; | |
| 79 | + border-right: 1px solid #ccc; | |
| 80 | + border-bottom: 1px solid #ccc; | |
| 81 | + cursor: default; | |
| 82 | + font-size: 11px; | |
| 83 | + font-family: Verdana; | |
| 84 | + z-index: 1; | |
| 85 | +} | |
| 86 | + | |
| 87 | +div.token-input-dropdown-facebook p { | |
| 88 | + margin: 0; | |
| 89 | + padding: 5px; | |
| 90 | + font-weight: bold; | |
| 91 | + color: #777; | |
| 92 | +} | |
| 93 | + | |
| 94 | +div.token-input-dropdown-facebook ul { | |
| 95 | + margin: 0; | |
| 96 | + padding: 0; | |
| 97 | +} | |
| 98 | + | |
| 99 | +div.token-input-dropdown-facebook ul li { | |
| 100 | + background-color: #fff; | |
| 101 | + padding: 3px; | |
| 102 | + margin: 0; | |
| 103 | + list-style-type: none; | |
| 104 | +} | |
| 105 | + | |
| 106 | +div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook { | |
| 107 | + background-color: #fff; | |
| 108 | +} | |
| 109 | + | |
| 110 | +div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook { | |
| 111 | + background-color: #fff; | |
| 112 | +} | |
| 113 | + | |
| 114 | +div.token-input-dropdown-facebook ul li em { | |
| 115 | + font-weight: bold; | |
| 116 | + font-style: normal; | |
| 117 | +} | |
| 118 | + | |
| 119 | +div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook { | |
| 120 | + background-color: #3b5998; | |
| 121 | + color: #fff; | |
| 122 | +} | |
| 0 | 123 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,204 @@ |
| 1 | +/* Example tokeninput style #2: Mac Style */ | |
| 2 | +fieldset.token-input-mac { | |
| 3 | + position: relative; | |
| 4 | + padding: 0; | |
| 5 | + margin: 5px 0; | |
| 6 | + background: #fff; | |
| 7 | + width: 400px; | |
| 8 | + border: 1px solid #A4BDEC; | |
| 9 | + border-radius: 10px; | |
| 10 | + -moz-border-radius: 10px; | |
| 11 | + -webkit-border-radius: 10px; | |
| 12 | +} | |
| 13 | + | |
| 14 | +fieldset.token-input-mac.token-input-dropdown-mac { | |
| 15 | + border-radius: 10px 10px 0 0; | |
| 16 | + -moz-border-radius: 10px 10px 0 0; | |
| 17 | + -webkit-border-radius: 10px 10px 0 0; | |
| 18 | + box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 19 | + -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 20 | + -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 21 | +} | |
| 22 | + | |
| 23 | +ul.token-input-list-mac { | |
| 24 | + overflow: hidden; | |
| 25 | + height: auto !important; | |
| 26 | + height: 1%; | |
| 27 | + cursor: text; | |
| 28 | + font-size: 12px; | |
| 29 | + font-family: Verdana; | |
| 30 | + min-height: 1px; | |
| 31 | + z-index: 999; | |
| 32 | + margin: 0; | |
| 33 | + padding: 3px; | |
| 34 | + background: transparent; | |
| 35 | +} | |
| 36 | + | |
| 37 | +ul.token-input-list-mac.error { | |
| 38 | + border: 1px solid #C52020; | |
| 39 | +} | |
| 40 | + | |
| 41 | +ul.token-input-list-mac li { | |
| 42 | + list-style-type: none; | |
| 43 | +} | |
| 44 | + | |
| 45 | +li.token-input-token-mac p { | |
| 46 | + display: inline; | |
| 47 | + padding: 0; | |
| 48 | + margin: 0; | |
| 49 | +} | |
| 50 | + | |
| 51 | +li.token-input-token-mac span { | |
| 52 | + color: #a6b3cf; | |
| 53 | + margin-left: 5px; | |
| 54 | + font-weight: bold; | |
| 55 | + cursor: pointer; | |
| 56 | +} | |
| 57 | + | |
| 58 | +/* TOKENS */ | |
| 59 | + | |
| 60 | +li.token-input-token-mac { | |
| 61 | + font-family: "Lucida Grande", Arial, serif; | |
| 62 | + font-size: 9pt; | |
| 63 | + line-height: 12pt; | |
| 64 | + overflow: hidden; | |
| 65 | + height: 16px; | |
| 66 | + margin: 3px; | |
| 67 | + padding: 0 10px; | |
| 68 | + background: none; | |
| 69 | + background-color: #dee7f8; | |
| 70 | + color: #000; | |
| 71 | + cursor: default; | |
| 72 | + border: 1px solid #a4bdec; | |
| 73 | + border-radius: 15px; | |
| 74 | + -moz-border-radius: 15px; | |
| 75 | + -webkit-border-radius: 15px; | |
| 76 | + float: left; | |
| 77 | +} | |
| 78 | + | |
| 79 | +li.token-input-highlighted-token-mac { | |
| 80 | + background-color: #bbcef1; | |
| 81 | + border: 1px solid #598bec; | |
| 82 | + color: #000; | |
| 83 | +} | |
| 84 | + | |
| 85 | +li.token-input-selected-token-mac { | |
| 86 | + background-color: #598bec; | |
| 87 | + border: 1px solid transparent; | |
| 88 | + color: #fff; | |
| 89 | +} | |
| 90 | + | |
| 91 | +li.token-input-highlighted-token-mac span.token-input-delete-token-mac { | |
| 92 | + color: #000; | |
| 93 | +} | |
| 94 | + | |
| 95 | +li.token-input-selected-token-mac span.token-input-delete-token-mac { | |
| 96 | + color: #fff; | |
| 97 | +} | |
| 98 | + | |
| 99 | +li.token-input-input-token-mac { | |
| 100 | + border: none; | |
| 101 | + background: transparent; | |
| 102 | + float: left; | |
| 103 | + padding: 0; | |
| 104 | + margin: 0; | |
| 105 | +} | |
| 106 | + | |
| 107 | +li.token-input-input-token-mac input { | |
| 108 | + border: 0; | |
| 109 | + width: 100px; | |
| 110 | + padding: 3px; | |
| 111 | + background-color: transparent; | |
| 112 | + margin: 0; | |
| 113 | +} | |
| 114 | + | |
| 115 | +div.token-input-dropdown-mac { | |
| 116 | + position: absolute; | |
| 117 | + border: 1px solid #A4BDEC; | |
| 118 | + border-top: none; | |
| 119 | + left: -1px; | |
| 120 | + right: -1px; | |
| 121 | + background-color: #fff; | |
| 122 | + overflow: hidden; | |
| 123 | + cursor: default; | |
| 124 | + font-size: 10pt; | |
| 125 | + font-family: "Lucida Grande", Arial, serif; | |
| 126 | + padding: 5px; | |
| 127 | + border-radius: 0 0 10px 10px; | |
| 128 | + -moz-border-radius: 0 0 10px 10px; | |
| 129 | + -webkit-border-radius: 0 0 10px 10px; | |
| 130 | + box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 131 | + -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 132 | + -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); | |
| 133 | + clip:rect(0px, 1000px, 1000px, -10px); | |
| 134 | +} | |
| 135 | + | |
| 136 | +div.token-input-dropdown-mac p { | |
| 137 | + font-size: 8pt; | |
| 138 | + margin: 0; | |
| 139 | + padding: 0 5px; | |
| 140 | + font-style: italic; | |
| 141 | + color: #aaa; | |
| 142 | +} | |
| 143 | + | |
| 144 | +div.token-input-dropdown-mac h3.token-input-dropdown-category-mac { | |
| 145 | + font-family: "Lucida Grande", Arial, serif; | |
| 146 | + font-size: 10pt; | |
| 147 | + font-weight: bold; | |
| 148 | + border: none; | |
| 149 | + padding: 0 5px; | |
| 150 | + margin: 0; | |
| 151 | +} | |
| 152 | + | |
| 153 | +div.token-input-dropdown-mac ul { | |
| 154 | + margin: 0; | |
| 155 | + padding: 0; | |
| 156 | +} | |
| 157 | + | |
| 158 | +div.token-input-dropdown-mac ul li { | |
| 159 | + list-style-type: none; | |
| 160 | + cursor: pointer; | |
| 161 | + background: none; | |
| 162 | + background-color: #fff; | |
| 163 | + margin: 0; | |
| 164 | + padding: 0 0 0 25px; | |
| 165 | +} | |
| 166 | + | |
| 167 | +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac { | |
| 168 | + background-color: #fff; | |
| 169 | +} | |
| 170 | + | |
| 171 | +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac.odd { | |
| 172 | + background-color: #ECF4F9; | |
| 173 | + border-radius: 15px; | |
| 174 | + -moz-border-radius: 15px; | |
| 175 | + -webkit-border-radius: 15px; | |
| 176 | +} | |
| 177 | + | |
| 178 | +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac span.token-input-dropdown-item-description-mac { | |
| 179 | + float: right; | |
| 180 | + font-size: 8pt; | |
| 181 | + font-style: italic; | |
| 182 | + padding: 0 10px 0 0; | |
| 183 | + color: #999; | |
| 184 | +} | |
| 185 | + | |
| 186 | +div.token-input-dropdown-mac ul li strong { | |
| 187 | + font-weight: bold; | |
| 188 | + text-decoration: underline; | |
| 189 | + font-style: none; | |
| 190 | +} | |
| 191 | + | |
| 192 | +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac, | |
| 193 | +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd { | |
| 194 | + background-color: #598bec; | |
| 195 | + color: #fff; | |
| 196 | + border-radius: 15px; | |
| 197 | + -moz-border-radius: 15px; | |
| 198 | + -webkit-border-radius: 15px; | |
| 199 | +} | |
| 200 | + | |
| 201 | +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac span.token-input-dropdown-item-description-mac, | |
| 202 | +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd span.token-input-dropdown-item-description-mac { | |
| 203 | + color: #fff; | |
| 204 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,113 @@ |
| 1 | +/* Example tokeninput style #1: Token vertical list*/ | |
| 2 | +ul.token-input-list { | |
| 3 | + overflow: hidden; | |
| 4 | + height: auto !important; | |
| 5 | + height: 1%; | |
| 6 | + width: 497px; | |
| 7 | + border: 1px solid #999; | |
| 8 | + cursor: text; | |
| 9 | + font-size: 12px; | |
| 10 | + font-family: Verdana; | |
| 11 | + z-index: 999; | |
| 12 | + margin: 0; | |
| 13 | + padding: 0; | |
| 14 | + background-color: #fff; | |
| 15 | + list-style-type: none; | |
| 16 | + clear: left; | |
| 17 | +} | |
| 18 | + | |
| 19 | +ul.token-input-list li { | |
| 20 | + list-style-type: none; | |
| 21 | +} | |
| 22 | + | |
| 23 | +ul.token-input-list li input { | |
| 24 | + border: 0; | |
| 25 | + width: 350px; | |
| 26 | + padding: 3px 8px; | |
| 27 | + background-color: white; | |
| 28 | + -webkit-appearance: caret; | |
| 29 | +} | |
| 30 | + | |
| 31 | +li.token-input-token { | |
| 32 | + overflow: hidden; | |
| 33 | + height: auto !important; | |
| 34 | + height: 1%; | |
| 35 | + margin: 3px; | |
| 36 | + padding: 3px 5px; | |
| 37 | + background-color: #d0efa0; | |
| 38 | + color: #000; | |
| 39 | + font-weight: bold; | |
| 40 | + cursor: default; | |
| 41 | + display: block; | |
| 42 | +} | |
| 43 | + | |
| 44 | +li.token-input-token p { | |
| 45 | + float: left; | |
| 46 | + padding: 0; | |
| 47 | + margin: 0; | |
| 48 | +} | |
| 49 | + | |
| 50 | +li.token-input-token span { | |
| 51 | + float: right; | |
| 52 | + color: #777; | |
| 53 | + cursor: pointer; | |
| 54 | +} | |
| 55 | + | |
| 56 | +li.token-input-selected-token { | |
| 57 | + background-color: #08844e; | |
| 58 | + color: #fff; | |
| 59 | +} | |
| 60 | + | |
| 61 | +li.token-input-selected-token span { | |
| 62 | + color: #bbb; | |
| 63 | +} | |
| 64 | + | |
| 65 | +div.token-input-dropdown { | |
| 66 | + position: absolute; | |
| 67 | + width: 497px; | |
| 68 | + background-color: #fff; | |
| 69 | + overflow: hidden; | |
| 70 | + border-left: 1px solid #ccc; | |
| 71 | + border-right: 1px solid #ccc; | |
| 72 | + border-bottom: 1px solid #ccc; | |
| 73 | + cursor: default; | |
| 74 | + font-size: 12px; | |
| 75 | + font-family: Verdana; | |
| 76 | + z-index: 1; | |
| 77 | +} | |
| 78 | + | |
| 79 | +div.token-input-dropdown p { | |
| 80 | + margin: 0; | |
| 81 | + padding: 5px; | |
| 82 | + font-weight: bold; | |
| 83 | + color: #777; | |
| 84 | +} | |
| 85 | + | |
| 86 | +div.token-input-dropdown ul { | |
| 87 | + margin: 0; | |
| 88 | + padding: 0; | |
| 89 | +} | |
| 90 | + | |
| 91 | +div.token-input-dropdown ul li { | |
| 92 | + background-color: #fff; | |
| 93 | + padding: 3px; | |
| 94 | + list-style-type: none; | |
| 95 | +} | |
| 96 | + | |
| 97 | +div.token-input-dropdown ul li.token-input-dropdown-item { | |
| 98 | + background-color: #fafafa; | |
| 99 | +} | |
| 100 | + | |
| 101 | +div.token-input-dropdown ul li.token-input-dropdown-item2 { | |
| 102 | + background-color: #fff; | |
| 103 | +} | |
| 104 | + | |
| 105 | +div.token-input-dropdown ul li em { | |
| 106 | + font-weight: bold; | |
| 107 | + font-style: normal; | |
| 108 | +} | |
| 109 | + | |
| 110 | +div.token-input-dropdown ul li.token-input-selected-dropdown-item { | |
| 111 | + background-color: #d0efa0; | |
| 112 | +} | |
| 113 | + | ... | ... |
script/sample-profiles
test/functional/account_controller_test.rb
| ... | ... | @@ -667,17 +667,21 @@ class AccountControllerTest < Test::Unit::TestCase |
| 667 | 667 | end |
| 668 | 668 | |
| 669 | 669 | should 'merge user data with extra stuff from plugins' do |
| 670 | - plugin1 = mock() | |
| 671 | - plugin1.stubs(:user_data_extras).returns({ :foo => 'bar' }) | |
| 672 | - | |
| 673 | - plugin2 = mock() | |
| 674 | - plugin2.stubs(:user_data_extras).returns({ :test => 5 }) | |
| 670 | + class Plugin1 < Noosfero::Plugin | |
| 671 | + def user_data_extras | |
| 672 | + {:foo => 'bar'} | |
| 673 | + end | |
| 674 | + end | |
| 675 | 675 | |
| 676 | - enabled_plugins = [plugin1, plugin2] | |
| 676 | + class Plugin2 < Noosfero::Plugin | |
| 677 | + def user_data_extras | |
| 678 | + {:test => 5} | |
| 679 | + end | |
| 680 | + end | |
| 677 | 681 | |
| 678 | - plugins = mock() | |
| 679 | - plugins.stubs(:enabled_plugins).returns(enabled_plugins) | |
| 680 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 682 | + e = User.find_by_login('ze').environment | |
| 683 | + e.enable_plugin(Plugin1.name) | |
| 684 | + e.enable_plugin(Plugin2.name) | |
| 681 | 685 | |
| 682 | 686 | login_as 'ze' |
| 683 | 687 | ... | ... |
test/functional/admin_panel_controller_test.rb
| ... | ... | @@ -342,4 +342,20 @@ class AdminPanelControllerTest < Test::Unit::TestCase |
| 342 | 342 | assert_equal 3, Environment.default.news_amount_by_folder |
| 343 | 343 | end |
| 344 | 344 | |
| 345 | + should 'display plugins links' do | |
| 346 | + plugin1_link = {:title => 'Plugin1 link', :url => 'plugin1.com'} | |
| 347 | + plugin2_link = {:title => 'Plugin2 link', :url => 'plugin2.com'} | |
| 348 | + links = [plugin1_link, plugin2_link] | |
| 349 | + plugins = mock() | |
| 350 | + plugins.stubs(:map).with(:admin_panel_links).returns(links) | |
| 351 | + plugins.stubs(:enabled_plugins).returns([]) | |
| 352 | + plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 353 | + Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 354 | + | |
| 355 | + get :index | |
| 356 | + | |
| 357 | + assert_tag :tag => 'a', :content => /#{plugin1_link[:title]}/, :attributes => {:href => /#{plugin1_link[:url]}/} | |
| 358 | + assert_tag :tag => 'a', :content => /#{plugin2_link[:title]}/, :attributes => {:href => /#{plugin2_link[:url]}/} | |
| 359 | + end | |
| 360 | + | |
| 345 | 361 | end | ... | ... |
test/functional/application_controller_test.rb
| ... | ... | @@ -442,28 +442,23 @@ class ApplicationControllerTest < Test::Unit::TestCase |
| 442 | 442 | end |
| 443 | 443 | |
| 444 | 444 | should 'include stylesheets supplied by plugins' do |
| 445 | - plugin1 = mock() | |
| 446 | - plugin1.stubs(:stylesheet?).returns(true) | |
| 447 | - plugin1.stubs(:js_files).returns([]) | |
| 448 | - plugin1_class = mock() | |
| 445 | + class Plugin1 < Noosfero::Plugin | |
| 446 | + def stylesheet? | |
| 447 | + true | |
| 448 | + end | |
| 449 | + end | |
| 449 | 450 | plugin1_path = '/plugin1/style.css' |
| 450 | - plugin1_class.stubs(:public_path).with('style.css').returns(plugin1_path) | |
| 451 | - plugin1.stubs(:class).returns(plugin1_class) | |
| 452 | 451 | |
| 453 | - plugin2 = mock() | |
| 454 | - plugin2.stubs(:stylesheet?).returns(true) | |
| 455 | - plugin2.stubs(:js_files).returns([]) | |
| 456 | - plugin2_class = mock() | |
| 452 | + class Plugin2 < Noosfero::Plugin | |
| 453 | + def stylesheet? | |
| 454 | + true | |
| 455 | + end | |
| 456 | + end | |
| 457 | 457 | plugin2_path = '/plugin2/style.css' |
| 458 | - plugin2_class.stubs(:public_path).with('style.css').returns(plugin2_path) | |
| 459 | - plugin2.stubs(:class).returns(plugin2_class) | |
| 460 | - | |
| 461 | - enabled_plugins = [plugin1, plugin2] | |
| 462 | 458 | |
| 463 | - plugins = mock() | |
| 464 | - plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 465 | - plugins.stubs(:enabled_plugins).returns(enabled_plugins) | |
| 466 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 459 | + environment = Environment.default | |
| 460 | + environment.enable_plugin(Plugin1.name) | |
| 461 | + environment.enable_plugin(Plugin2.name) | |
| 467 | 462 | |
| 468 | 463 | get :index |
| 469 | 464 | |
| ... | ... | @@ -472,33 +467,29 @@ class ApplicationControllerTest < Test::Unit::TestCase |
| 472 | 467 | end |
| 473 | 468 | |
| 474 | 469 | should 'include javascripts supplied by plugins' do |
| 470 | + class Plugin1 < Noosfero::Plugin | |
| 471 | + def js_files | |
| 472 | + ['js1.js'] | |
| 473 | + end | |
| 474 | + end | |
| 475 | + | |
| 475 | 476 | js1 = 'js1.js' |
| 476 | - plugin1 = mock() | |
| 477 | - plugin1.stubs(:stylesheet?).returns(false) | |
| 478 | - plugin1.stubs(:js_files).returns([js1]) | |
| 479 | - plugin1_class = mock() | |
| 480 | 477 | plugin1_path = '/plugin1/'+js1 |
| 481 | - plugin1_class.stubs(:public_path).with(js1).returns(plugin1_path) | |
| 482 | - plugin1.stubs(:class).returns(plugin1_class) | |
| 478 | + | |
| 479 | + class Plugin2 < Noosfero::Plugin | |
| 480 | + def js_files | |
| 481 | + ['js2.js', 'js3.js'] | |
| 482 | + end | |
| 483 | + end | |
| 483 | 484 | |
| 484 | 485 | js2 = 'js2.js' |
| 485 | 486 | js3 = 'js3.js' |
| 486 | - plugin2 = mock() | |
| 487 | - plugin2.stubs(:stylesheet?).returns(false) | |
| 488 | - plugin2.stubs(:js_files).returns([js2, js3]) | |
| 489 | - plugin2_class = mock() | |
| 490 | 487 | plugin2_path2 = '/plugin2/'+js2 |
| 491 | 488 | plugin2_path3 = '/plugin2/'+js3 |
| 492 | - plugin2_class.stubs(:public_path).with(js2).returns(plugin2_path2) | |
| 493 | - plugin2_class.stubs(:public_path).with(js3).returns(plugin2_path3) | |
| 494 | - plugin2.stubs(:class).returns(plugin2_class) | |
| 495 | 489 | |
| 496 | - enabled_plugins = [plugin1, plugin2] | |
| 497 | - | |
| 498 | - plugins = mock() | |
| 499 | - plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 500 | - plugins.stubs(:enabled_plugins).returns(enabled_plugins) | |
| 501 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 490 | + environment = Environment.default | |
| 491 | + environment.enable_plugin(Plugin1.name) | |
| 492 | + environment.enable_plugin(Plugin2.name) | |
| 502 | 493 | |
| 503 | 494 | get :index |
| 504 | 495 | ... | ... |
test/functional/catalog_controller_test.rb
| ... | ... | @@ -94,23 +94,27 @@ class CatalogControllerTest < Test::Unit::TestCase |
| 94 | 94 | end |
| 95 | 95 | |
| 96 | 96 | should 'include extra content supplied by plugins on catalog item extras' do |
| 97 | + class Plugin1 < Noosfero::Plugin | |
| 98 | + def catalog_item_extras(product) | |
| 99 | + lambda {"<span id='plugin1'>This is Plugin1 speaking!</span>"} | |
| 100 | + end | |
| 101 | + end | |
| 102 | + | |
| 103 | + class Plugin2 < Noosfero::Plugin | |
| 104 | + def catalog_item_extras(product) | |
| 105 | + lambda {"<span id='plugin2'>This is Plugin2 speaking!</span>"} | |
| 106 | + end | |
| 107 | + end | |
| 108 | + | |
| 97 | 109 | product = fast_create(Product, :enterprise_id => @enterprise.id) |
| 98 | - plugin1_local_variable = "Plugin1" | |
| 99 | - plugin1_content = lambda {"<span id='plugin1'>This is #{plugin1_local_variable} speaking!</span>"} | |
| 100 | - plugin2_local_variable = "Plugin2" | |
| 101 | - plugin2_content = lambda {"<span id='plugin2'>This is #{plugin2_local_variable} speaking!</span>"} | |
| 102 | - contents = [plugin1_content, plugin2_content] | |
| 103 | - | |
| 104 | - plugins = mock() | |
| 105 | - plugins.stubs(:enabled_plugins).returns([]) | |
| 106 | - plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 107 | - plugins.stubs(:map).with(:catalog_item_extras, product).returns(contents) | |
| 108 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 110 | + environment = Environment.default | |
| 111 | + environment.enable_plugin(Plugin1.name) | |
| 112 | + environment.enable_plugin(Plugin2.name) | |
| 109 | 113 | |
| 110 | 114 | get :index, :profile => @enterprise.identifier |
| 111 | 115 | |
| 112 | - assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'} | |
| 113 | - assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'} | |
| 116 | + assert_tag :tag => 'span', :content => 'This is Plugin1 speaking!', :attributes => {:id => 'plugin1'} | |
| 117 | + assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'} | |
| 114 | 118 | end |
| 115 | 119 | |
| 116 | 120 | end | ... | ... |
test/functional/enterprise_registration_controller_test.rb
test/functional/manage_products_controller_test.rb
| ... | ... | @@ -455,4 +455,16 @@ class ManageProductsControllerTest < Test::Unit::TestCase |
| 455 | 455 | assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'} |
| 456 | 456 | assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'} |
| 457 | 457 | end |
| 458 | + | |
| 459 | + should 'not allow product creation for profiles that can\'t do it' do | |
| 460 | + class SpecialEnterprise < Enterprise | |
| 461 | + def create_product? | |
| 462 | + false | |
| 463 | + end | |
| 464 | + end | |
| 465 | + enterprise = SpecialEnterprise.create!(:identifier => 'special-enterprise', :name => 'Special Enterprise') | |
| 466 | + get 'new', :profile => enterprise.identifier | |
| 467 | + assert_response 403 | |
| 468 | + end | |
| 469 | + | |
| 458 | 470 | end | ... | ... |
test/functional/profile_controller_test.rb
| ... | ... | @@ -1163,19 +1163,31 @@ class ProfileControllerTest < Test::Unit::TestCase |
| 1163 | 1163 | end |
| 1164 | 1164 | |
| 1165 | 1165 | should 'display plugins tabs' do |
| 1166 | - plugin1_tab = {:title => 'Plugin1 tab', :id => 'plugin1_tab', :content => 'Content from plugin1.'} | |
| 1167 | - plugin2_tab = {:title => 'Plugin2 tab', :id => 'plugin2_tab', :content => 'Content from plugin2.'} | |
| 1168 | - tabs = [plugin1_tab, plugin2_tab] | |
| 1169 | - plugins = mock() | |
| 1170 | - plugins.stubs(:map).with(:profile_tabs).returns(tabs) | |
| 1171 | - plugins.stubs(:enabled_plugins).returns([]) | |
| 1172 | - plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 1173 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 1166 | + class Plugin1 < Noosfero::Plugin | |
| 1167 | + def profile_tabs | |
| 1168 | + {:title => 'Plugin1 tab', :id => 'plugin1_tab', :content => lambda { 'Content from plugin1.' }} | |
| 1169 | + end | |
| 1170 | + end | |
| 1171 | + | |
| 1172 | + class Plugin2 < Noosfero::Plugin | |
| 1173 | + def profile_tabs | |
| 1174 | + {:title => 'Plugin2 tab', :id => 'plugin2_tab', :content => lambda { 'Content from plugin2.' }} | |
| 1175 | + end | |
| 1176 | + end | |
| 1177 | + | |
| 1178 | + e = profile.environment | |
| 1179 | + e.enable_plugin(Plugin1.name) | |
| 1180 | + e.enable_plugin(Plugin2.name) | |
| 1174 | 1181 | |
| 1175 | 1182 | get :index, :profile => profile.identifier |
| 1176 | 1183 | |
| 1177 | - assert_tag :tag => 'a', :content => /#{plugin1_tab[:title]}/, :attributes => {:href => /#{plugin1_tab[:id]}/} | |
| 1178 | - assert_tag :tag => 'div', :content => /#{plugin1_tab[:content]}/, :attributes => {:id => /#{plugin1_tab[:id]}/} | |
| 1184 | + plugin1 = Plugin1.new | |
| 1185 | + plugin2 = Plugin2.new | |
| 1186 | + | |
| 1187 | + assert_tag :tag => 'a', :content => /#{plugin1.profile_tabs[:title]}/, :attributes => {:href => /#{plugin1.profile_tabs[:id]}/} | |
| 1188 | + assert_tag :tag => 'div', :content => /#{instance_eval(&plugin1.profile_tabs[:content])}/, :attributes => {:id => /#{plugin1.profile_tabs[:id]}/} | |
| 1189 | + assert_tag :tag => 'a', :content => /#{plugin2.profile_tabs[:title]}/, :attributes => {:href => /#{plugin2.profile_tabs[:id]}/} | |
| 1190 | + assert_tag :tag => 'div', :content => /#{instance_eval(&plugin2.profile_tabs[:content])}/, :attributes => {:id => /#{plugin2.profile_tabs[:id]}/} | |
| 1179 | 1191 | end |
| 1180 | 1192 | |
| 1181 | 1193 | should 'redirect to profile page when try to request join_not_logged via GET method' do | ... | ... |
test/functional/profile_members_controller_test.rb
| ... | ... | @@ -233,59 +233,87 @@ class ProfileMembersControllerTest < Test::Unit::TestCase |
| 233 | 233 | assert_not_includes com.members, u |
| 234 | 234 | end |
| 235 | 235 | |
| 236 | - should 'find users' do | |
| 237 | - ent = fast_create(Enterprise, :name => 'Test Ent', :identifier => 'test_ent') | |
| 238 | - user = create_user_full('test_user').person | |
| 239 | - person = create_user_with_permission('ent_user', 'manage_memberships', ent) | |
| 240 | - login_as :ent_user | |
| 241 | - | |
| 242 | - get :find_users, :profile => ent.identifier, :query => 'test*', :scope => 'all_users' | |
| 243 | - | |
| 244 | - assert_includes assigns(:users_found), user | |
| 245 | - end | |
| 246 | - | |
| 247 | - should 'not display members when finding users in all_users scope' do | |
| 248 | - ent = fast_create(Enterprise, :name => 'Test Ent', :identifier => 'test_ent') | |
| 249 | - user = create_user_full('test_user').person | |
| 250 | - | |
| 251 | - person = create_user_with_permission('ent_user', 'manage_memberships', ent) | |
| 252 | - login_as :ent_user | |
| 253 | - | |
| 254 | - get :find_users, :profile => ent.identifier, :query => '*user', :scope => 'all_users' | |
| 255 | - | |
| 256 | - assert_tag :tag => 'a', :content => /#{user.name}/ | |
| 257 | - assert_no_tag :tag => 'a', :content => /#{person.name}/ | |
| 258 | - end | |
| 259 | - | |
| 260 | - should 'not display admins when finding users in new_admins scope' do | |
| 261 | - ent = fast_create(Enterprise, :name => 'Test Ent', :identifier => 'test_ent') | |
| 262 | - | |
| 263 | - person = create_user('admin_user').person | |
| 264 | - ent.add_admin(person) | |
| 265 | - | |
| 266 | - user = create_user_full('test_user').person | |
| 267 | - ent.add_member(user).finish | |
| 268 | - | |
| 269 | - login_as :admin_user | |
| 270 | - | |
| 271 | - get :find_users, :profile => ent.identifier, :query => '*user', :scope => 'new_admins' | |
| 236 | + should 'list users on search by role' do | |
| 237 | + e = Enterprise.create!(:name => 'Sample Enterprise', :identifier => 'sample-enterprise') | |
| 238 | + user = create_user_with_permission('test_user', 'manage_memberships', e) | |
| 239 | + login_as :test_user | |
| 272 | 240 | |
| 273 | - assert_tag :tag => 'a', :content => /#{user.name}/ | |
| 274 | - assert_no_tag :tag => 'a', :content => /#{person.name}/ | |
| 241 | + # Should list if match name | |
| 242 | + p1 = create_user('person_1').person | |
| 243 | + p2 = create_user('person_2').person | |
| 244 | + # Should not list if don't match name | |
| 245 | + p3 = create_user('blo').person | |
| 246 | + r1 = Profile::Roles.organization_member_roles(e.environment.id).first | |
| 247 | + r2 = Profile::Roles.organization_member_roles(e.environment.id).last | |
| 248 | + | |
| 249 | + p4 = create_user('person_4').person | |
| 250 | + e.affiliate(p4, r1) | |
| 251 | + p5 = create_user('person_5').person | |
| 252 | + e.affiliate(p5, r2) | |
| 253 | + | |
| 254 | + # Should be case insensitive | |
| 255 | + p6 = create_user('PeRsOn_2').person | |
| 256 | + # Should list if match identifier | |
| 257 | + p7 = create_user('person_7').person | |
| 258 | + p7.name = 'Bli' | |
| 259 | + p7.save! | |
| 260 | + | |
| 261 | + get :search_user, :profile => e.identifier, 'q_'+r1.key => 'per', :role => r1.id | |
| 262 | + assert_match /#{p1.name}/, @response.body | |
| 263 | + assert_match /#{p2.name}/, @response.body | |
| 264 | + assert_no_match /#{p3.name}/, @response.body | |
| 265 | + assert_no_match /#{p4.name}/, @response.body | |
| 266 | + assert_match /#{p5.name}/, @response.body | |
| 267 | + assert_match /#{p6.name}/, @response.body | |
| 268 | + assert_match /#{p7.name}/, @response.body | |
| 269 | + | |
| 270 | + get :search_user, :profile => e.identifier, 'q_'+r2.key => 'per', :role => r2.id | |
| 271 | + assert_match /#{p1.name}/, @response.body | |
| 272 | + assert_match /#{p2.name}/, @response.body | |
| 273 | + assert_no_match /#{p3.name}/, @response.body | |
| 274 | + assert_match /#{p4.name}/, @response.body | |
| 275 | + assert_no_match /#{p5.name}/, @response.body | |
| 276 | + assert_match /#{p6.name}/, @response.body | |
| 277 | + assert_match /#{p7.name}/, @response.body | |
| 275 | 278 | end |
| 276 | 279 | |
| 277 | - should 'return users with <query> as a prefix' do | |
| 278 | - daniel = create_user_full('daniel').person | |
| 279 | - daniela = create_user_full('daniela').person | |
| 280 | - | |
| 281 | - ent = fast_create(Enterprise, :name => 'Test Ent', :identifier => 'test_ent') | |
| 282 | - person = create_user_with_permission('test_user', 'manage_memberships', ent) | |
| 280 | + should 'save associations' do | |
| 281 | + e = Enterprise.create!(:name => 'Sample Enterprise', :identifier => 'sample-enterprise') | |
| 282 | + user = create_user_with_permission('test_user', 'manage_memberships', e) | |
| 283 | 283 | login_as :test_user |
| 284 | 284 | |
| 285 | - get :find_users, :profile => ent.identifier, :query => 'daniel', :scope => 'all_users' | |
| 286 | - | |
| 287 | - assert_includes assigns(:users_found), daniel | |
| 288 | - assert_includes assigns(:users_found), daniela | |
| 285 | + p1 = create_user('person-1').person | |
| 286 | + p2 = create_user('person-2').person | |
| 287 | + p3 = create_user('person-3').person | |
| 288 | + roles = Profile::Roles.organization_member_roles(e.environment.id) | |
| 289 | + r1 = roles.first | |
| 290 | + r2 = roles.last | |
| 291 | + roles.delete(r1) | |
| 292 | + roles.delete(r2) | |
| 293 | + | |
| 294 | + roles_params = roles.inject({}) { |result, role| result.merge({'q_'+role.key => ''})} | |
| 295 | + | |
| 296 | + post :save_associations, | |
| 297 | + {:profile => e.identifier, | |
| 298 | + 'q_'+r1.key => "#{p1.id},#{p2.id},#{user.id}", | |
| 299 | + 'q_'+r2.key => "#{p2.id},#{p3.id}"}.merge(roles_params) | |
| 300 | + assert_includes e.members_by_role(r1), p1 | |
| 301 | + assert_includes e.members_by_role(r1), p2 | |
| 302 | + assert_not_includes e.members_by_role(r1), p3 | |
| 303 | + assert_not_includes e.members_by_role(r2), p1 | |
| 304 | + assert_includes e.members_by_role(r2), p2 | |
| 305 | + assert_includes e.members_by_role(r2), p3 | |
| 306 | + | |
| 307 | + post :save_associations, | |
| 308 | + {:profile => e.identifier, | |
| 309 | + 'q_'+r1.key => "#{p2.id},#{p3.id},#{user.id}", | |
| 310 | + 'q_'+r2.key => "#{p1.id},#{p2.id}"}.merge(roles_params) | |
| 311 | + assert_not_includes e.members_by_role(r1), p1 | |
| 312 | + assert_includes e.members_by_role(r1), p2 | |
| 313 | + assert_includes e.members_by_role(r1), p3 | |
| 314 | + assert_includes e.members_by_role(r2), p1 | |
| 315 | + assert_includes e.members_by_role(r2), p2 | |
| 316 | + assert_not_includes e.members_by_role(r2), p3 | |
| 289 | 317 | end |
| 290 | 318 | |
| 291 | 319 | should 'ignore roles with id zero' do | ... | ... |
test/functional/search_controller_test.rb
| ... | ... | @@ -290,24 +290,53 @@ class SearchControllerTest < Test::Unit::TestCase |
| 290 | 290 | end |
| 291 | 291 | |
| 292 | 292 | should 'include extra content supplied by plugins on product asset' do |
| 293 | + class Plugin1 < Noosfero::Plugin | |
| 294 | + def asset_product_extras(product, enterprise) | |
| 295 | + lambda {"<span id='plugin1'>This is Plugin1 speaking!</span>"} | |
| 296 | + end | |
| 297 | + end | |
| 298 | + | |
| 299 | + class Plugin2 < Noosfero::Plugin | |
| 300 | + def asset_product_extras(product, enterprise) | |
| 301 | + lambda {"<span id='plugin2'>This is Plugin2 speaking!</span>"} | |
| 302 | + end | |
| 303 | + end | |
| 304 | + | |
| 293 | 305 | enterprise = fast_create(Enterprise) |
| 294 | 306 | product = fast_create(Product, :enterprise_id => enterprise.id) |
| 295 | - plugin1_local_variable = "Plugin1" | |
| 296 | - plugin1_content = lambda {"<span id='plugin1'>This is #{plugin1_local_variable} speaking!</span>"} | |
| 297 | - plugin2_local_variable = "Plugin2" | |
| 298 | - plugin2_content = lambda {"<span id='plugin2'>This is #{plugin2_local_variable} speaking!</span>"} | |
| 299 | - contents = [plugin1_content, plugin2_content] | |
| 300 | - | |
| 301 | - plugins = mock() | |
| 302 | - plugins.stubs(:enabled_plugins).returns([]) | |
| 303 | - plugins.stubs(:map).with(:body_beginning).returns([]) | |
| 304 | - plugins.stubs(:map).with(:asset_product_extras, product, enterprise).returns(contents) | |
| 305 | - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) | |
| 307 | + | |
| 308 | + e = Environment.default | |
| 309 | + e.enable_plugin(Plugin1.name) | |
| 310 | + e.enable_plugin(Plugin2.name) | |
| 311 | + | |
| 312 | + get :assets, :asset => 'products' | |
| 313 | + | |
| 314 | + assert_tag :tag => 'span', :content => 'This is Plugin1 speaking!', :attributes => {:id => 'plugin1'} | |
| 315 | + assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'} | |
| 316 | + end | |
| 317 | + | |
| 318 | + should 'include extra properties of the product supplied by plugins' do | |
| 319 | + class Plugin1 < Noosfero::Plugin | |
| 320 | + def asset_product_properties(product) | |
| 321 | + return { :name => _('Property1'), :content => lambda { link_to(product.name, '/plugin1') } } | |
| 322 | + end | |
| 323 | + end | |
| 324 | + class Plugin2 < Noosfero::Plugin | |
| 325 | + def asset_product_properties(product) | |
| 326 | + return { :name => _('Property2'), :content => lambda { link_to(product.name, '/plugin2') } } | |
| 327 | + end | |
| 328 | + end | |
| 329 | + enterprise = fast_create(Enterprise) | |
| 330 | + product = fast_create(Product, :enterprise_id => enterprise.id) | |
| 331 | + | |
| 332 | + environment = Environment.default | |
| 333 | + environment.enable_plugin(Plugin1.name) | |
| 334 | + environment.enable_plugin(Plugin2.name) | |
| 306 | 335 | |
| 307 | 336 | get :assets, :asset => 'products' |
| 308 | 337 | |
| 309 | - assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'} | |
| 310 | - assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'} | |
| 338 | + assert_tag :tag => 'li', :content => /Property1/, :child => {:tag => 'a', :attributes => {:href => '/plugin1'}, :content => product.name} | |
| 339 | + assert_tag :tag => 'li', :content => /Property2/, :child => {:tag => 'a', :attributes => {:href => '/plugin2'}, :content => product.name} | |
| 311 | 340 | end |
| 312 | 341 | |
| 313 | 342 | should 'paginate enterprise listing' do | ... | ... |
test/unit/application_helper_test.rb
| ... | ... | @@ -18,18 +18,6 @@ class ApplicationHelperTest < Test::Unit::TestCase |
| 18 | 18 | |
| 19 | 19 | File.expects(:exists?).with(p1+"test/_integer.rhtml").returns(true) |
| 20 | 20 | |
| 21 | - assert_equal 'integer', partial_for_class(Integer) | |
| 22 | - end | |
| 23 | - | |
| 24 | - | |
| 25 | - should 'calculate correctly partial for models recursively' do | |
| 26 | - p1 = 'path1/' | |
| 27 | - p2 = 'path2/' | |
| 28 | - @controller = mock() | |
| 29 | - @controller.stubs(:view_paths).returns([p1,p2]) | |
| 30 | - | |
| 31 | - self.stubs(:params).returns({:controller => 'test'}) | |
| 32 | - | |
| 33 | 21 | File.expects(:exists?).with(p1+"test/_float.rhtml").returns(false) |
| 34 | 22 | File.expects(:exists?).with(p1+"test/_float.html.erb").returns(false) |
| 35 | 23 | File.expects(:exists?).with(p2+"test/_float.rhtml").returns(false) |
| ... | ... | @@ -40,22 +28,13 @@ class ApplicationHelperTest < Test::Unit::TestCase |
| 40 | 28 | File.expects(:exists?).with(p1+"test/_numeric.html.erb").returns(false) |
| 41 | 29 | File.expects(:exists?).with(p2+"test/_numeric.rhtml").returns(true) |
| 42 | 30 | |
| 43 | - assert_equal 'numeric', partial_for_class(Float) | |
| 44 | - end | |
| 45 | - | |
| 46 | - should 'raise error when partial is missing' do | |
| 47 | - p1 = 'path1/' | |
| 48 | - p2 = 'path2/' | |
| 49 | - @controller = mock() | |
| 50 | - @controller.stubs(:view_paths).returns([p1,p2]) | |
| 51 | - | |
| 52 | - self.stubs(:params).returns({:controller => 'test'}) | |
| 53 | - | |
| 54 | 31 | File.expects(:exists?).with(p1+"test/_object.rhtml").returns(false) |
| 55 | 32 | File.expects(:exists?).with(p1+"test/_object.html.erb").returns(false) |
| 56 | 33 | File.expects(:exists?).with(p2+"test/_object.rhtml").returns(false) |
| 57 | 34 | File.expects(:exists?).with(p2+"test/_object.html.erb").returns(false) |
| 58 | 35 | |
| 36 | + assert_equal 'integer', partial_for_class(Integer) | |
| 37 | + assert_equal 'numeric', partial_for_class(Float) | |
| 59 | 38 | assert_raises ArgumentError do |
| 60 | 39 | partial_for_class(Object) |
| 61 | 40 | end |
| ... | ... | @@ -74,6 +53,15 @@ class ApplicationHelperTest < Test::Unit::TestCase |
| 74 | 53 | assert_equal 'test/application_helper_test/school/project', partial_for_class(School::Project) |
| 75 | 54 | end |
| 76 | 55 | |
| 56 | + should 'look for superclasses on view_for_profile actions' do | |
| 57 | + File.expects(:exists?).with("#{RAILS_ROOT}/app/views/blocks/profile_info_actions/float.rhtml").returns(false) | |
| 58 | + File.expects(:exists?).with("#{RAILS_ROOT}/app/views/blocks/profile_info_actions/float.html.erb").returns(false) | |
| 59 | + File.expects(:exists?).with("#{RAILS_ROOT}/app/views/blocks/profile_info_actions/numeric.rhtml").returns(false) | |
| 60 | + File.expects(:exists?).with("#{RAILS_ROOT}/app/views/blocks/profile_info_actions/numeric.html.erb").returns(true) | |
| 61 | + | |
| 62 | + assert_equal 'blocks/profile_info_actions/numeric.html.erb', view_for_profile_actions(Float) | |
| 63 | + end | |
| 64 | + | |
| 77 | 65 | should 'give error when there is no partial for class' do |
| 78 | 66 | assert_raises ArgumentError do |
| 79 | 67 | partial_for_class(nil) | ... | ... |
test/unit/enterprise_test.rb
| ... | ... | @@ -350,6 +350,20 @@ class EnterpriseTest < Test::Unit::TestCase |
| 350 | 350 | assert_equal false, Enterprise['test_ent'].enabled? |
| 351 | 351 | end |
| 352 | 352 | |
| 353 | + should 'enterprise is validated according to feature enterprises_are_validated_when_created' do | |
| 354 | + e = Environment.default | |
| 355 | + | |
| 356 | + e.enable('enterprises_are_validated_when_created') | |
| 357 | + e.save | |
| 358 | + enterprise = Enterprise.create(:name => 'test enteprise', :identifier => 'test_ent1') | |
| 359 | + assert enterprise.validated | |
| 360 | + | |
| 361 | + e.disable('enterprises_are_validated_when_created') | |
| 362 | + e.save | |
| 363 | + enterprise = Enterprise.create(:name => 'test enteprise', :identifier => 'test_ent2') | |
| 364 | + assert !enterprise.validated | |
| 365 | + end | |
| 366 | + | |
| 353 | 367 | should 'have inactive_template when creating enterprise and feature is enabled' do |
| 354 | 368 | inactive_template = fast_create(Enterprise, :name => 'inactive enteprise template', :identifier => 'inactive_enterprise_template') |
| 355 | 369 | inactive_template.boxes.destroy_all | ... | ... |
test/unit/environment_test.rb
| ... | ... | @@ -1183,4 +1183,17 @@ class EnvironmentTest < Test::Unit::TestCase |
| 1183 | 1183 | assert_equal env.settings[:string_key], 'new value' |
| 1184 | 1184 | end |
| 1185 | 1185 | |
| 1186 | + should 'be able to enable or disable a plugin' do | |
| 1187 | + environment = Environment.default | |
| 1188 | + plugin = 'Plugin' | |
| 1189 | + | |
| 1190 | + environment.enable_plugin(plugin) | |
| 1191 | + environment.reload | |
| 1192 | + assert_includes environment.enabled_plugins, plugin | |
| 1193 | + | |
| 1194 | + environment.disable_plugin(plugin) | |
| 1195 | + environment.reload | |
| 1196 | + assert_not_includes environment.enabled_plugins, plugin | |
| 1197 | + end | |
| 1198 | + | |
| 1186 | 1199 | end | ... | ... |
test/unit/organization_test.rb
| ... | ... | @@ -386,4 +386,26 @@ class OrganizationTest < Test::Unit::TestCase |
| 386 | 386 | assert_includes Organization.more_active, profile |
| 387 | 387 | end |
| 388 | 388 | |
| 389 | + should 'validates format of cnpj' do | |
| 390 | + organization = Organization.new(:cnpj => '239-234.234') | |
| 391 | + organization.valid? | |
| 392 | + assert organization.errors.invalid?(:cnpj) | |
| 393 | + | |
| 394 | + organization.cnpj = '94.132.024/0001-48' | |
| 395 | + organization.valid? | |
| 396 | + assert !organization.errors.invalid?(:cnpj) | |
| 397 | + end | |
| 398 | + | |
| 399 | + should 'return members by role in a json format' do | |
| 400 | + organization = fast_create(Organization) | |
| 401 | + p1 = create_user('person-1').person | |
| 402 | + p2 = create_user('person-2').person | |
| 403 | + role = Profile::Roles.organization_member_roles(organization.environment.id).last | |
| 404 | + | |
| 405 | + organization.affiliate(p1, role) | |
| 406 | + organization.affiliate(p2, role) | |
| 407 | + | |
| 408 | + assert_match [{:id => p1.id, :name => p1.name}, {:id => p2.id, :name => p2.name}].to_json, organization.members_by_role_to_json(role) | |
| 409 | + end | |
| 410 | + | |
| 389 | 411 | end | ... | ... |
test/unit/profile_test.rb
| ... | ... | @@ -1726,6 +1726,20 @@ class ProfileTest < Test::Unit::TestCase |
| 1726 | 1726 | assert_not_includes env.profiles.without_image, with_image |
| 1727 | 1727 | end |
| 1728 | 1728 | |
| 1729 | + should 'return enterprises subclasses too on namedscope enterprises' do | |
| 1730 | + class EnterpriseSubclass < Enterprise; end | |
| 1731 | + child = EnterpriseSubclass.create!(:identifier => 'child', :name => 'Child') | |
| 1732 | + | |
| 1733 | + assert_includes Profile.enterprises, child | |
| 1734 | + end | |
| 1735 | + | |
| 1736 | + should 'return communities subclasses too on namedscope communities' do | |
| 1737 | + class CommunitySubclass < Community; end | |
| 1738 | + child = CommunitySubclass.create!(:identifier => 'child', :name => 'Child') | |
| 1739 | + | |
| 1740 | + assert_includes Profile.communities, child | |
| 1741 | + end | |
| 1742 | + | |
| 1729 | 1743 | private |
| 1730 | 1744 | |
| 1731 | 1745 | def assert_invalid_identifier(id) | ... | ... |
| ... | ... | @@ -0,0 +1,13 @@ |
| 1 | +Validacao de CNPJ | |
| 2 | +================= | |
| 3 | + | |
| 4 | +Plugin para validacao do formato e dos digitos verificadores de um CNPJ. | |
| 5 | + | |
| 6 | +Uso: | |
| 7 | + Adicione ao modelo: | |
| 8 | + validates_as_cnpj :nome_do_campo | |
| 9 | + | |
| 10 | +Exemplo: | |
| 11 | + class Empresa < ActiveRecord::Base | |
| 12 | + validates_as_cnpj :cnpj | |
| 13 | + end | ... | ... |
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +# init.rb - initialize the plugin | |
| 2 | +# | |
| 3 | +# Copyright (c) 2006 O.S. Systems | |
| 4 | +# | |
| 5 | +# Authors: André Ribeiro Camargo <andre@boaideia.inf.br>, | |
| 6 | +# Luis Gustavo S. Barreto <gustavo@ossystems.com.br> | |
| 7 | +# | |
| 8 | +# This program is free software; you can redistribute it and/or modify | |
| 9 | +# it under the terms of the GNU General Public License as published by | |
| 10 | +# the Free Software Foundation; either version 2 of the License, or | |
| 11 | +# (at your option) any later version. | |
| 12 | +# | |
| 13 | +# This program is distributed in the hope that it will be useful, but | |
| 14 | +# WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 | +# General Public License for more details. | |
| 17 | +require 'validates_as_cnpj' | ... | ... |
vendor/plugins/validates_as_cnpj/lib/validates_as_cnpj.rb
0 → 100755
| ... | ... | @@ -0,0 +1,78 @@ |
| 1 | +# validates_as_cnpj.rb - implement the validation of cnpj | |
| 2 | +# | |
| 3 | +# Copyright (c) 2006 O.S. Systems | |
| 4 | +# | |
| 5 | +# Authors: André Ribeiro Camargo <andre@boaideia.inf.br>, | |
| 6 | +# Luis Gustavo S. Barreto <gustavo@ossystems.com.br> | |
| 7 | +# | |
| 8 | +# This program is free software; you can redistribute it and/or modify | |
| 9 | +# it under the terms of the GNU General Public License as published by | |
| 10 | +# the Free Software Foundation; either version 2 of the License, or | |
| 11 | +# (at your option) any later version. | |
| 12 | +# | |
| 13 | +# This program is distributed in the hope that it will be useful, but | |
| 14 | +# WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 | +# General Public License for more details. | |
| 17 | +module ValidaCNPJ | |
| 18 | + def self.valida_cnpj(cnpj = nil) | |
| 19 | + return nil if cnpj.nil? | |
| 20 | + | |
| 21 | + nulos = %w{11111111111111 | |
| 22 | + 22222222222222 | |
| 23 | + 33333333333333 | |
| 24 | + 44444444444444 | |
| 25 | + 55555555555555 | |
| 26 | + 66666666666666 | |
| 27 | + 77777777777777 | |
| 28 | + 88888888888888 | |
| 29 | + 99999999999999 | |
| 30 | + 00000000000000} | |
| 31 | + | |
| 32 | + valor = cnpj.scan(/[0-9]/).collect{|x| x.to_i} | |
| 33 | + | |
| 34 | + fatores = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] | |
| 35 | + | |
| 36 | + if valor.length == 14 and not nulos.member?(valor.to_s) | |
| 37 | + soma = 0 | |
| 38 | + 0.upto(11) do |i| | |
| 39 | + soma += valor[i] * fatores[i] | |
| 40 | + end | |
| 41 | + | |
| 42 | + resto = soma % 11 | |
| 43 | + dv1 = resto < 2 ? 0 : 11 - resto | |
| 44 | + | |
| 45 | + if dv1 == valor[12] | |
| 46 | + soma = 0 | |
| 47 | + 0.upto(12) do |i| | |
| 48 | + soma += valor[i] * (i == 0 ? 6 : fatores[i-1]) | |
| 49 | + end | |
| 50 | + | |
| 51 | + resto = soma % 11 | |
| 52 | + dv2 = resto < 2 ? 0 : 11 - resto | |
| 53 | + | |
| 54 | + return true if dv2 == valor[13] | |
| 55 | + end | |
| 56 | + end | |
| 57 | + return nil | |
| 58 | + end | |
| 59 | +end | |
| 60 | + | |
| 61 | +module ActiveRecord | |
| 62 | + module Validations | |
| 63 | + module ClassMethods | |
| 64 | + def validates_as_cnpj(*attr_names) | |
| 65 | + configuration = { :message => "%{fn} is invalid" } | |
| 66 | + configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash) | |
| 67 | + | |
| 68 | + validates_each(attr_names, configuration) do |record, attr_name, value| | |
| 69 | + next if value.blank? | |
| 70 | + | |
| 71 | + unless ValidaCNPJ::valida_cnpj(value) | |
| 72 | + record.errors.add(attr_name, configuration[:message]) | |
| 73 | + end | |
| 74 | + end | |
| 75 | + end | |
| 76 | + end | |
| 77 | + end | |
| 78 | +end | ... | ... |