From 79d5dfdd7618349892fe4a88054d985326487b8a Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 22 May 2013 00:30:09 +0200 Subject: [PATCH] Init version of new search. --- .../_application_controller.js.coffee | 54 ++++++++++++- .../app/controllers/navigation.js.coffee | 69 ++++++++++++---- .../app/views/agent_ticket_zoom.jst.eco | 2 +- .../javascripts/app/views/navigation.jst.eco | 13 ++- .../app/views/organization_info_small.jst.eco | 6 ++ .../app/views/ticket_info_small.jst.eco | 17 ++++ app/controllers/search_controller.rb | 80 +++++++++++++++++++ app/controllers/tickets_controller.rb | 51 ++++-------- app/controllers/users_controller.rb | 13 +-- app/models/organization.rb | 21 +++++ app/models/user.rb | 20 +++++ config/routes/search.rb | 9 +++ db/seeds.rb | 1 + 13 files changed, 289 insertions(+), 67 deletions(-) create mode 100644 app/assets/javascripts/app/views/organization_info_small.jst.eco create mode 100644 app/assets/javascripts/app/views/ticket_info_small.jst.eco create mode 100644 app/controllers/search_controller.rb create mode 100644 config/routes/search.rb diff --git a/app/assets/javascripts/app/controllers/_application_controller.js.coffee b/app/assets/javascripts/app/controllers/_application_controller.js.coffee index 540ab2d2d..1adb5cba8 100644 --- a/app/assets/javascripts/app/controllers/_application_controller.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller.js.coffee @@ -219,12 +219,39 @@ class App.Controller extends Spine.Controller interval: (callback, interval, interval_id, level) => App.Interval.set(callback, interval, interval_id, level) + ticketPopups: (position = 'right') -> + + # remove old popovers + $('.popover-inner').parent().remove() + + # show ticket popup + ui = @ + $('.ticket-data').popover( + trigger: 'hover' + html: true + delay: { show: 500, hide: 1200 } +# placement: 'bottom' + placement: position + title: -> + ticket_id = $(@).data('id') + ticket = App.Collection.find( 'Ticket', ticket_id ) + ticket.title + content: -> + ticket_id = $(@).data('id') + ticket = App.Collection.find( 'Ticket', ticket_id ) + ticket.humanTime = ui.humanTime(ticket.created_at) + # insert data + App.view('ticket_info_small')( + ticket: ticket, + ) + ) + userPopups: (position = 'right') -> # remove old popovers $('.popover-inner').parent().remove() - # show user popup + # show user popup $('.user-data').popover( trigger: 'hover' html: true @@ -265,6 +292,31 @@ class App.Controller extends Spine.Controller ) ) + organizationPopups: (position = 'right') -> + + # remove old popovers + $('.popover-inner').parent().remove() + + # show organization popup + $('.organization-data').popover( + trigger: 'hover' + html: true + delay: { show: 500, hide: 1200 } +# placement: 'bottom' + placement: position + title: -> + organization_id = $(@).data('id') + organization = App.Collection.find( 'Organization', organization_id ) + organization.name + content: -> + organization_id = $(@).data('id') + organization = App.Collection.find( 'Organization', organization_id ) + # insert data + App.view('organization_info_small')( + organization: organization, + ) + ) + userTicketPopups: (data) -> # remove old popovers diff --git a/app/assets/javascripts/app/controllers/navigation.js.coffee b/app/assets/javascripts/app/controllers/navigation.js.coffee index ff4b2541d..7c605ebb9 100644 --- a/app/assets/javascripts/app/controllers/navigation.js.coffee +++ b/app/assets/javascripts/app/controllers/navigation.js.coffee @@ -61,10 +61,19 @@ class App.Navigation extends App.Controller open_tab: open_tab active_tab: active_tab user: user - tickets: @tickets || [] + result: @result || [] search: search ) + # start ticket popups + @ticketPopups('right') + + # start user popups + @userPopups('right') + + # start oorganization popups + @organizationPopups('right') + # set focus to search box if @searchFocus @searchFocusSet = true @@ -77,29 +86,59 @@ class App.Navigation extends App.Controller App.Com.ajax( id: 'ticket_search' type: 'GET' - url: 'api/tickets/search' + url: 'api/search' data: term: @term processData: true, success: (data, status, xhr) => # load user collection - if data.users - App.Collection.load( type: 'User', data: data.users ) + if data.load.organizations + App.Collection.load( type: 'Organization', data: data.load.organizations ) + # load user collection + if data.load.users + App.Collection.load( type: 'User', data: data.load.users ) + # load ticket collection - if data.tickets - App.Collection.load( type: 'Ticket', data: data.tickets ) + if data.load.tickets + App.Collection.load( type: 'Ticket', data: data.load.tickets ) - @tickets = [] + @result = data.result + for area in @result + if area.name is 'Ticket' + area.result = [] + for id in area.ids + ticket = App.Collection.find( 'Ticket', id ) + ticket.humanTime = @humanTime(ticket.created_at) + data = + display: "##{ticket.number} - #{ticket.title} - #{ticket.humanTime}" + id: ticket.id + class: "ticket-data" + url: "#ticket/zoom/#{ticket.id}" + area.result.push data + else if area.name is 'User' + area.result = [] + for id in area.ids + user = App.Collection.find( 'User', id ) + data = + display: "#{user.displayName()}" + id: user.id + class: "user-data" + url: "#users/#{user.id}" + area.result.push data + else if area.name is 'Organization' + area.result = [] + for id in area.ids + organization = App.Collection.find( 'Organization', id ) + data = + display: "#{organization.displayName()}" + id: organization.id + class: "organization-data" + url: "#organizations/#{ticket.id}" + area.result.push data - for ticket_raw in data.tickets - ticket = App.Collection.find( 'Ticket', ticket_raw.id ) - - # set human time - ticket.humanTime = @humanTime(ticket.created_at) - - @tickets.push ticket + if @result @render(user) ) @@ -121,7 +160,7 @@ class App.Navigation extends App.Controller @delay( => @searchFocus = false - @tickets = [] + @result = [] @render(user) 320 ) diff --git a/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco b/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco index b7b5db8bb..07e817736 100644 --- a/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco +++ b/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco @@ -79,7 +79,7 @@
- +
diff --git a/app/assets/javascripts/app/views/navigation.jst.eco b/app/assets/javascripts/app/views/navigation.jst.eco index 1864adafe..c1610e980 100644 --- a/app/assets/javascripts/app/views/navigation.jst.eco +++ b/app/assets/javascripts/app/views/navigation.jst.eco @@ -23,16 +23,21 @@
  • <%- @T( item.name ) %>
  • <% end %> <% end %> -
    -
    <% if @user: %> diff --git a/app/assets/javascripts/app/views/organization_info_small.jst.eco b/app/assets/javascripts/app/views/organization_info_small.jst.eco new file mode 100644 index 000000000..8815b391c --- /dev/null +++ b/app/assets/javascripts/app/views/organization_info_small.jst.eco @@ -0,0 +1,6 @@ + + + + + +
    <%- @P( @organization ) %>...
    \ No newline at end of file diff --git a/app/assets/javascripts/app/views/ticket_info_small.jst.eco b/app/assets/javascripts/app/views/ticket_info_small.jst.eco new file mode 100644 index 000000000..24a6d720e --- /dev/null +++ b/app/assets/javascripts/app/views/ticket_info_small.jst.eco @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + +
    #<%- @P( @ticket.number ) %><%- @P( @ticket.humanTime ) %>
    <%- @P( @ticket.group ) %><%- @T( @ticket.ticket_state.name ) %>
    <%- @T( @ticket.ticket_priority.name ) %>
    <%- @P( @ticket.owner ) %>
    \ No newline at end of file diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb new file mode 100644 index 000000000..d2a5e974c --- /dev/null +++ b/app/controllers/search_controller.rb @@ -0,0 +1,80 @@ +class SearchController < ApplicationController + before_filter :authentication_check + + # GET /api/search + def search + + # build result list + tickets = Ticket.search( + :limit => params[:limit], + :query => params[:term], + :current_user => current_user, + ) + users_data = {} + ticket_result = [] + tickets.each do |ticket| + ticket_result.push ticket.id + users_data[ ticket['owner_id'] ] = User.user_data_full( ticket['owner_id'] ) + users_data[ ticket['customer_id'] ] = User.user_data_full( ticket['customer_id'] ) + users_data[ ticket['created_by_id'] ] = User.user_data_full( ticket['created_by_id'] ) + end + + # do query + users = User.search( + :query => params[:term], + :limit => params[:limit], + :current_user => current_user, + ) + user_result = [] + users.each do |user| + user_result.push user.id + users_data[ user.id ] = User.user_data_full( user.id ) + end + + organizations = Organization.search( + :query => params[:term], + :limit => params[:limit], + :current_user => current_user, + ) + organizations_data = {} + organization_result = [] + organizations.each do |organization| + organization_result.push organization.id + organizations_data[ organization.id ] = Organization.find( organization.id ) + end + + result = [] + if ticket_result[0] + data = { + :name => 'Ticket', + :ids => ticket_result, + } + result.push data + end + if user_result[0] + data = { + :name => 'User', + :ids => user_result, + } + result.push data + end + if organization_result[0] + data = { + :name => 'Organization', + :ids => organization_result, + } + result.push data + end + + # return result + render :json => { + :load => { + :tickets => tickets, + :users => users_data, + :organizations => organizations_data, + }, + :result => result, + } + end + +end diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index afdc06d52..392d09826 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -445,48 +445,25 @@ class TicketsController < ApplicationController # GET /api/tickets/search def search - # get params - query = params[:term] - limit = params[:limit] || 15 - - conditions = [] - if current_user.is_role('Agent') - group_ids = Group.select( 'groups.id' ).joins(:users). - where( 'groups_users.user_id = ?', current_user.id ). - where( 'groups.active = ?', true ). - map( &:id ) - conditions = [ 'group_id IN (?)', group_ids ] - else - if !current_user.organization || ( !current_user.organization.shared || current_user.organization.shared == false ) - conditions = [ 'customer_id = ?', current_user.id ] - else - conditions = [ '( customer_id = ? OR organization_id = ? )', current_user.id, current_user.organization.id ] - end - end - - # do query - tickets_all = Ticket.select('DISTINCT(tickets.id)'). - where(conditions). - where( '( `tickets`.`title` LIKE ? OR `tickets`.`number` LIKE ? OR `ticket_articles`.`body` LIKE ? OR `ticket_articles`.`from` LIKE ? OR `ticket_articles`.`to` LIKE ? OR `ticket_articles`.`subject` LIKE ?)', "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%" ). - joins(:articles). - limit(limit). - order('`tickets`.`created_at` DESC') - # build result list - tickets = [] - users = {} - tickets_all.each do |ticket| - ticket_tmp = Ticket.lookup( :id => ticket.id ) - tickets.push ticket_tmp - users[ ticket['owner_id'] ] = User.user_data_full( ticket_tmp['owner_id'] ) - users[ ticket['customer_id'] ] = User.user_data_full( ticket_tmp['customer_id'] ) - users[ ticket['created_by_id'] ] = User.user_data_full( ticket_tmp['created_by_id'] ) + tickets = Ticket.search( + :limit => params[:limit], + :query => params[:term], + :current_user => current_user, + ) + users_data = {} + ticket_result = [] + tickets.each do |ticket| + ticket_result.push ticket.id + users_data[ ticket['owner_id'] ] = User.user_data_full( ticket['owner_id'] ) + users_data[ ticket['customer_id'] ] = User.user_data_full( ticket['customer_id'] ) + users_data[ ticket['created_by_id'] ] = User.user_data_full( ticket['created_by_id'] ) end # return result render :json => { - :tickets => tickets, - :users => users, + :tickets => ticket_result, + :users => users_data, } end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 283d6dccd..c1c7d3216 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -306,16 +306,11 @@ curl http://localhost/api/users/2.json -v -u #{login}:#{password} -H "Content-Ty # GET /api/users/search def search - # get params - query = params[:term] - limit = params[:limit] || 18 - # do query - user_all = User.find( - :all, - :limit => limit, - :conditions => ['firstname LIKE ? or lastname LIKE ? or email LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%"], - :order => 'firstname' + user_all = User.search( + :query => params[:term], + :limit => params[:limit], + :current_user => current_user, ) # build result list diff --git a/app/models/organization.rb b/app/models/organization.rb index fa23bff35..67747c88d 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -1,4 +1,25 @@ class Organization < ApplicationModel has_and_belongs_to_many :users validates :name, :presence => true + + def self.search(params) + + # get params + query = params[:query] + limit = params[:limit] || 10 + current_user = params[:current_user] + + # enable search only for agents and admins + return [] if !current_user.is_role('Agent') && !current_user.is_role('Admin') + + # do query + organizations = Organization.find( + :all, + :limit => limit, + :conditions => ['name LIKE ?', "%#{query}%"], + :order => 'name' + ) + return organizations + end + end diff --git a/app/models/user.rb b/app/models/user.rb index 116c0ef1f..e70a887a1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -247,6 +247,26 @@ Your #{config.product_name} Team return user end + def self.search(params) + + # get params + query = params[:query] + limit = params[:limit] || 10 + current_user = params[:current_user] + + # enable search only for agents and admins + return [] if !current_user.is_role('Agent') && !current_user.is_role('Admin') + + # do query + users = User.find( + :all, + :limit => limit, + :conditions => ['(firstname LIKE ? or lastname LIKE ? or email LIKE ?) AND id != 1', "%#{query}%", "%#{query}%", "%#{query}%"], + :order => 'firstname' + ) + return users + end + def self.find_fulldata(user_id) cache = self.cache_get(user_id, true) diff --git a/config/routes/search.rb b/config/routes/search.rb new file mode 100644 index 000000000..da334fa3e --- /dev/null +++ b/config/routes/search.rb @@ -0,0 +1,9 @@ +module ExtraRoutes + def add(map) + + # search + map.match '/api/search', :to => 'search#search', :via => [:get, :post] + + end + module_function :add +end \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index dafd98c65..72c4dce4e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1578,6 +1578,7 @@ Translation.create_if_not_exists( :locale => 'de', :source => "Settings", :targe Translation.create_if_not_exists( :locale => 'de', :source => "Overviews", :target => "Übersichten" ) Translation.create_if_not_exists( :locale => 'de', :source => "Manage", :target => "Verwalten" ) Translation.create_if_not_exists( :locale => 'de', :source => "Users", :target => "Benutzer" ) +Translation.create_if_not_exists( :locale => 'de', :source => "User", :target => "Benutzer" ) Translation.create_if_not_exists( :locale => 'de', :source => "Groups", :target => "Gruppen" ) Translation.create_if_not_exists( :locale => 'de', :source => "Group", :target => "Gruppe" ) Translation.create_if_not_exists( :locale => 'de', :source => "Organizations", :target => "Organisationen" )