From 844304db138e2c7bb6234be39301f054b7a657cb Mon Sep 17 00:00:00 2001 From: Larissa Reis Date: Mon, 6 Jan 2014 13:43:11 -0300 Subject: [PATCH] Plugins can provide additional search fields for invites --- app/controllers/public/invite_controller.rb | 5 ++++- app/helpers/invite_helper.rb | 15 +++++++++++++++ app/views/invite/invite_friends.rhtml | 2 +- lib/noosfero/plugin.rb | 6 ++++++ test/functional/invite_controller_test.rb | 24 ++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/app/controllers/public/invite_controller.rb b/app/controllers/public/invite_controller.rb index 79033c9..24e1a51 100644 --- a/app/controllers/public/invite_controller.rb +++ b/app/controllers/public/invite_controller.rb @@ -74,8 +74,11 @@ class InviteController < PublicController end end + include InviteHelper + helper :invite + def search_friend - fields = %w[name identifier email] + fields = %w[name identifier email] + plugins_options.map {|field| field[:field].to_s } values = ["%#{params['q']}%"] * fields.count render :text => environment.people.find(:all, :joins => ['INNER JOIN users ON profiles.user_id=users.id'], :conditions => [fields.map {|field| "LOWER(#{field}) LIKE ?"}.join(' OR '), *values]). map {|person| {:id => person.id, :name => person.name} }.to_json diff --git a/app/helpers/invite_helper.rb b/app/helpers/invite_helper.rb index 389f123..ec327aa 100644 --- a/app/helpers/invite_helper.rb +++ b/app/helpers/invite_helper.rb @@ -1,2 +1,17 @@ module InviteHelper + def plugins_options + @plugins.dispatch(:search_friend_fields) + end + + def search_friend_fields + labels = [ + _('Name'), + _('Username'), + _('Email'), + ] + plugins_options.map { |options| options[:name] } + + last = labels.pop + label = labels.join(', ') + "#{label} #{_('or')} #{last}" + end end diff --git a/app/views/invite/invite_friends.rhtml b/app/views/invite/invite_friends.rhtml index 5dc4375..950afc5 100644 --- a/app/views/invite/invite_friends.rhtml +++ b/app/views/invite/invite_friends.rhtml @@ -12,7 +12,7 @@ <% form_tag :action => 'invite_registered_friend' do %> <% search_action = url_for(:action => 'search_friend') %> <%= token_input_field_tag(:q, 'search-friends', search_action, - { :hint_text => _('Type in a search for your friend'), + { :hint_text => _('Type in your friend\'s ') + search_friend_fields, :focus => false }) %> <%= render :partial => 'invite/personalize_invitation_mail', :locals => {:mail_template => @mail_template } %> diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 75179a7..e11ae4c 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -437,6 +437,12 @@ class Noosfero::Plugin nil end + # -> Adds aditional fields for invite_friends search + # returns = [{:field => 'field1', :name => 'field 1 name'}, {...}] + def search_friend_fields + nil + end + # -> Adds additional blocks to profiles and environments. # Your plugin must implements a class method called 'extra_blocks' # that returns a hash with the following syntax. diff --git a/test/functional/invite_controller_test.rb b/test/functional/invite_controller_test.rb index dba423c..c21e906 100644 --- a/test/functional/invite_controller_test.rb +++ b/test/functional/invite_controller_test.rb @@ -255,6 +255,30 @@ class InviteControllerTest < ActionController::TestCase assert_equal [{"name" => friend1.name, "id" => friend1.id}, {"name" => friend2.name, "id" => friend2.id}].to_json, @response.body end + should 'search friends profiles by fields provided by plugins' do + class Plugin1 < Noosfero::Plugin + def search_friend_fields + [{:field => 'nickname'}, {:field => 'contact_phone'}] + end + end + + environment = Environment.default + environment.enable_plugin(Plugin1) + + friend1 = create_user('harry').person + friend2 = create_user('william').person + friend1.nickname = 'prince' + friend2.contact_phone = '2222' + friend1.save + friend2.save + + get :search_friend, :profile => profile.identifier, :q => 'prince' + assert_equal [{"name" => friend1.name, "id" => friend1.id}].to_json, @response.body + + get :search_friend, :profile => profile.identifier, :q => '222' + assert_equal [{"name" => friend2.name, "id" => friend2.id}].to_json, @response.body + end + should 'invite registered users through profile id' do friend1 = create_user('testuser1').person friend2 = create_user('testuser2').person -- libgit2 0.21.2