Fixes empty menu when typing on search input for the very first time

This commit is contained in:
Alfredo Sumaran 2016-03-23 14:12:33 -05:00
parent 4fcd7ba954
commit 44817726fe
2 changed files with 69 additions and 51 deletions

View File

@ -31,6 +31,8 @@ class @SearchAutocomplete
@saveOriginalState()
@createAutocomplete()
@searchInput.addClass('disabled')
@autocomplete = false
@ -43,6 +45,57 @@ class @SearchAutocomplete
saveOriginalState: ->
@originalState = @serializeState()
createAutocomplete: ->
@searchInput.glDropdown
filterInputBlur: false
filterable: true
filterRemote: true
highlight: true
filterInput: 'input#search'
search:
fields: ['text']
data: @getData.bind(@)
getData: (term, callback) ->
_this = @
# Ensure this is not called when autocomplete is disabled because
# this method still will be called because `GitLabDropdownFilter` is triggering this on keyup
return if @autocomplete is false
# Do not trigger request if input is empty
return if @searchInput.val() is ''
# Prevent multiple ajax calls
return if @loadingSuggestions
@loadingSuggestions = true
jqXHR = $.get(@autocompletePath, {
project_id: @projectId
project_ref: @projectRef
term: term
}, (response) ->
data = []
# List results
for suggestion in response
# Add group header before list each group
if lastCategory isnt suggestion.category
data.push
header: suggestion.category
lastCategory = suggestion.category
data.push
text: suggestion.label
url: suggestion.url
callback(data)
).always ->
_this.loadingSuggestions = false
serializeState: ->
{
# Search Criteria
@ -57,7 +110,8 @@ class @SearchAutocomplete
}
bindEvents: ->
@searchInput.on 'keydown', @onSearchInputKeyDown
@searchInput.on 'keyup', @onSearchInputKeyUp
@searchInput.on 'click', @onSearchInputClick
@searchInput.on 'focus', @onSearchInputFocus
@searchInput.on 'blur', @onSearchInputBlur
@clearInput.on 'click', @onRemoveLocationClick
@ -67,53 +121,7 @@ class @SearchAutocomplete
dropdownMenu = @dropdown.find('.dropdown-menu')
_this = @
loading = false
@searchInput.glDropdown
filterInputBlur: false
filterable: true
filterRemote: true
highlight: true
filterInput: 'input#search'
search:
fields: ['text']
data: (term, callback) ->
# Ensure this is not called when autocomplete is disabled because
# this method still will be called because `GitLabDropdownFilter` is triggering this on keyup
return if _this.autocomplete is false
# Do not trigger request if input is empty
return if _this.searchInput.val() is ''
# Prevent multiple ajax calls
return if loading
loading = true
jqXHR = $.get(_this.autocompletePath, {
project_id: _this.projectId
project_ref: _this.projectRef
term: term
}, (response) ->
data = []
# List results
for suggestion in response
# Add group header before list each group
if lastCategory isnt suggestion.category
data.push
header: suggestion.category
lastCategory = suggestion.category
data.push
text: suggestion.label
url: suggestion.url
callback(data)
).always ->
loading = false
@loadingSuggestions = false
@dropdown.addClass('open')
@searchInput.removeClass('disabled')
@ -122,7 +130,7 @@ class @SearchAutocomplete
onDropdownOpen: (e) =>
@dropdown.dropdown('toggle')
onSearchInputKeyDown: (e) =>
onSearchInputKeyUp: (e) =>
switch e.keyCode
when KEYCODE.BACKSPACE
if e.currentTarget.value is ''
@ -139,11 +147,18 @@ class @SearchAutocomplete
if @badgePresent()
@disableAutocomplete()
else
@enableAutocomplete()
# We should display the menu only when input is not empty
if @searchInput.val() isnt ''
@enableAutocomplete()
# Avoid falsy value to be returned
return
onSearchInputClick: =>
if (@searchInput.val() is '')
@disableAutocomplete()
onSearchInputFocus: =>
@wrap.addClass('search-active')

View File

@ -15,7 +15,10 @@
.dropdown{ data: {url: search_autocomplete_path } }
= search_field_tag "search", nil, placeholder: 'Search', class: "search-input dropdown-menu-toggle", spellcheck: false, tabindex: "1", autocomplete: 'off', data: { toggle: 'dropdown' }
.dropdown-menu.dropdown-select
= dropdown_content
= dropdown_content do
%li
%a.is-focused
Loading...
= dropdown_loading
%i.search-icon
%i.clear-icon.js-clear-input