diff --git a/app/assets/javascripts/app/controllers/navigation.coffee b/app/assets/javascripts/app/controllers/navigation.coffee index 55ad1234c..4464bf1e7 100644 --- a/app/assets/javascripts/app/controllers/navigation.coffee +++ b/app/assets/javascripts/app/controllers/navigation.coffee @@ -15,7 +15,7 @@ class App.Navigation extends App.ControllerWidgetPermanent 'focus #global-search': 'searchFocus' 'blur #global-search': 'searchBlur' 'keyup #global-search': 'listNavigate' - 'click .js-global-search-result': 'andClose' + 'click .js-global-search-result': 'emptyAndClose' 'click .js-details-link': 'openExtendedSearch' 'change .js-menu .js-switch input': 'switch' @@ -156,31 +156,31 @@ class App.Navigation extends App.ControllerWidgetPermanent type: 'personal' ) - renderResult: (result = []) => - - # remove result if not result exists - if _.isEmpty(result) - @searchContainer.removeClass('open') - @globalSearch.close() - @searchResult.html('') + renderResult: (result = [], noChange) => + if noChange return + # show no results placeholder if no result exists + if _.isEmpty(result) + @searchContainer.addClass('no-match') + @searchResult.html(App.view('navigation/no_result')()) + return + + @searchContainer.removeClass('no-match') + # build markup html = App.view('navigation/result')( result: result ) @searchResult.html(html) - # show result list - @searchContainer.addClass('open') - # start ticket popups @ticketPopups() # start user popups @userPopups() - # start oorganization popups + # start organization popups @organizationPopups() render: -> @@ -205,26 +205,22 @@ class App.Navigation extends App.ControllerWidgetPermanent searchFocus: (e) => @query = '' # reset query cache - @searchContainer.addClass('focused') @anyPopoversDestroy() - @search() + @searchContainer.addClass('focused') searchBlur: (e) => - # delay to be able to click x update = => query = @searchInput.val().trim() if !query @emptyAndClose() return - @searchContainer.removeClass('focused') @delay(update, 100, 'removeFocused') listNavigate: (e) => if e.keyCode is 27 # close on esc @emptyAndClose() - @searchInput.blur() return else if e.keyCode is 38 # up @nudge(e, -1) @@ -233,14 +229,13 @@ class App.Navigation extends App.ControllerWidgetPermanent @nudge(e, 1) return else if e.keyCode is 13 # enter - if @$('.global-search-menu .js-details-link.is-hover').get(0) - @openExtendedSearch() - return - href = @$('.global-search-result .nav-tab.is-hover').attr('href') - return if !href - @navigate(href) - @emptyAndClose() @searchInput.blur() + href = @$('.global-search-result .nav-tab.is-hover').attr('href') + if href + @navigate(href) + else + @openExtendedSearch() + @emptyAndClose() return # on other keys, show result @@ -284,25 +279,33 @@ class App.Navigation extends App.ControllerWidgetPermanent @scrollToIfNeeded(prev, false) emptyAndClose: => + @query = '' @searchInput.val('') - @searchContainer.removeClass('filled').removeClass('open').removeClass('focused') + @searchContainer.removeClass('focused filled open no-match') @globalSearch.close() - - # remove not needed popovers @delay(@anyPopoversDestroy, 100, 'removePopovers') andClose: => + @query = '' @searchInput.blur() - @searchContainer.removeClass('open') + @searchContainer.removeClass('open no-match') @globalSearch.close() @delay(@anyPopoversDestroy, 100, 'removePopovers') search: => query = @searchInput.val().trim() - return if !query - return if query is @query + @searchContainer.toggleClass('filled', !!query) + # if we started a new search and already typed something in + if @query == '' and query != '' + @searchContainer.addClass('open no-match') + @searchResult.html(App.view('navigation/search_placeholder')()) + @query = query - @searchContainer.toggleClass('filled', !!@query) + + if @query == '' + @searchContainer.removeClass('open') + return + @globalSearch.search(query: @query) filterNavbar: (values, user, parent = null) -> @@ -402,11 +405,11 @@ class App.Navigation extends App.ControllerWidgetPermanent url = params.url type = params.type if type is 'menu' - @$('.js-menu .is-active, .js-details-link.is-active').removeClass('is-active') + @$('.js-menu .is-active').removeClass('is-active') else @$('.is-active').removeClass('is-active') return if !url || url is '#' - @$("[href=\"#{url}\"]").addClass('is-active') + @$(".js-menu [href=\"#{url}\"], .tasks [href=\"#{url}\"]").addClass('is-active') recentViewNavbarItemsRebuild: => diff --git a/app/assets/javascripts/app/controllers/search.coffee b/app/assets/javascripts/app/controllers/search.coffee index 4c66dcf2f..1e252214c 100644 --- a/app/assets/javascripts/app/controllers/search.coffee +++ b/app/assets/javascripts/app/controllers/search.coffee @@ -125,7 +125,8 @@ class App.Search extends App.Controller @globalSearch.search(query: @query) - renderResult: (result = []) => + renderResult: (result = [], noChange) => + return if noChange @result = result for tab in @tabs count = 0 diff --git a/app/assets/javascripts/app/lib/app_post/global_search.coffee b/app/assets/javascripts/app/lib/app_post/global_search.coffee index 2724624fe..1e115fdf1 100644 --- a/app/assets/javascripts/app/lib/app_post/global_search.coffee +++ b/app/assets/javascripts/app/lib/app_post/global_search.coffee @@ -45,10 +45,12 @@ class App.GlobalSearch extends App.Controller renderTry: (result, query) => # if result hasn't changed, do not rerender - diff = false if @lastQuery is query && @searchResultCache[query] diff = difference(@searchResultCache[query].result, result) - return if diff isnt false && _.isEmpty(diff) + if _.isEmpty(diff) + @render(result, true) + return + @lastQuery = query # cache search result diff --git a/app/assets/javascripts/app/views/navigation/no_result.jst.eco b/app/assets/javascripts/app/views/navigation/no_result.jst.eco new file mode 100644 index 000000000..b335db81a --- /dev/null +++ b/app/assets/javascripts/app/views/navigation/no_result.jst.eco @@ -0,0 +1,4 @@ +