From a1ffce58c3ccfb789d65deee5ef9ba72f7722a64 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 14 Nov 2012 02:05:53 +0100 Subject: [PATCH] Init version of ticket search. --- .../app/controllers/navigation.js.coffee | 87 +++++++++++++++++-- .../app/lib/app_post/clipboard.js.coffee | 42 +++++++++ .../javascripts/app/views/navigation.jst.eco | 13 ++- app/controllers/tickets_controller.rb | 34 ++++++++ app/controllers/users_controller.rb | 8 +- config/routes/ticket.rb | 1 + 6 files changed, 172 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/app/controllers/navigation.js.coffee b/app/assets/javascripts/app/controllers/navigation.js.coffee index f234c1367..bcfd38129 100644 --- a/app/assets/javascripts/app/controllers/navigation.js.coffee +++ b/app/assets/javascripts/app/controllers/navigation.js.coffee @@ -50,13 +50,88 @@ class App.Navigation extends App.Controller href = $(d).attr('href') active_tab[href] = true ) - + + search = @el.find('#global-search').val() @html App.view('navigation')( - navbar_left: nav_left, - navbar_right: nav_right, - open_tab: open_tab, - active_tab: active_tab, - user: user, + navbar_left: nav_left + navbar_right: nav_right + open_tab: open_tab + active_tab: active_tab + user: user + tickets: @tickets || [] + search: search + ) + + # set focus to search box + if @searchFocus + @searchFocusSet = true + App.ClipBoard.setPosition( 'global-search', search.length ) + + else + @searchFocusSet = false + + searchFunction = => + App.Com.ajax( + id: 'ticket_search' + type: 'GET' + url: '/api/tickets/search' + data: + term: @term + processData: true, + success: (data, status, xhr) => + console.log data + + # load user collection + if data.users + App.Collection.load( type: 'User', data: data.users ) + + # load ticket collection + if data.tickets + App.Collection.load( type: 'Ticket', data: data.tickets ) + + @tickets = [] + + for ticket_raw in data.tickets + ticket = App.Collection.find( 'Ticket', ticket_raw.id ) + @tickets.push ticket + @render(user) + ) + + # observer search box + @el.find('#global-search').bind( 'focusin', (e) => + + # remember to set search box + @searchFocus = true + + # check if search is needed + @term = @el.find('#global-search').val() + return if @searchFocusSet + return if !@term + @delay( searchFunction, 200, 'search' ) + ) + + # remove search result + @el.find('#global-search').bind( 'focusout', (e) => + @delay( + => + @searchFocus = false + @tickets = [] + @render(user) + 320 + ) + ) + + # prevent submit of search box + @el.find('#global-search').parent().bind( 'submit', (e) => + e.preventDefault() + ) + + # start search + @el.find('#global-search').bind( 'keyup', (e) => + @term = @el.find('#global-search').val() + return if !@term + return if @term is search + @delay( searchFunction, 200, 'search' ) ) getItems: (data) -> diff --git a/app/assets/javascripts/app/lib/app_post/clipboard.js.coffee b/app/assets/javascripts/app/lib/app_post/clipboard.js.coffee index 1ad6ffeb2..36801a7af 100644 --- a/app/assets/javascripts/app/lib/app_post/clipboard.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/clipboard.js.coffee @@ -16,6 +16,16 @@ class App.ClipBoard _instance ?= new _Singleton _instance.getSelectedLast() + @getPosition: (el) -> + if _instance == undefined + _instance ?= new _Singleton + _instance.getPosition(el) + + @setPosition: ( el, pos ) -> + if _instance == undefined + _instance ?= new _Singleton + _instance.setPosition( el, pos ) + @keycode: (code) -> if _instance == undefined _instance ?= new _Singleton @@ -71,6 +81,38 @@ class _Singleton getSelectedLast: -> @selectionLast + getPosition: (el) -> + pos = 0 + el = document.getElementById(el) + + # IE Support + if document.selection + el.focus() + Sel = document.selection.createRange() + Sel.moveStart( 'character', -el.value.length ) + pos = Sel.text.length + + # Firefox support + else if (el.selectionStart || el.selectionStart == '0') + pos = el.selectionStart + return pos + + setPosition: (el, pos) -> + el = document.getElementById(el) + + # IE Support + if el.setSelectionRange + el.focus() + el.setSelectionRange( pos, pos ) + + # Firefox support + else if el.createTextRange + range = el.createTextRange() + range.collapse(true) + range.moveEnd( 'character', pos ) + range.moveStart('character', pos) + range.select() + keycode: (code) -> for key, value of @keycodesTable() if value.toString() is code.toString() diff --git a/app/assets/javascripts/app/views/navigation.jst.eco b/app/assets/javascripts/app/views/navigation.jst.eco index c6441c82c..2ed847e28 100644 --- a/app/assets/javascripts/app/views/navigation.jst.eco +++ b/app/assets/javascripts/app/views/navigation.jst.eco @@ -23,10 +23,17 @@
  • <%- @T( item.name ) %>
  • <% end %> <% end %> + -
    <% if @user: %>