fiedl/your_platform

View on GitHub
app/assets/javascripts/your_platform/compact_nav_search.js.coffee

Summary

Maintainability
Test Coverage
window.App = {} if typeof(App) == 'undefined'

class App.CompactNav
  
  search_box_selector: '.compact-nav-search-input'
  results:             []
  
  constructor: ->
    self = this  # since "this" is overridden by the event handler
    $(document).on 'keydown', @search_box_selector, (event)->
      self.tab_has_been_pressed() if event.keyCode == 9
    $(document).on 'keyup', @search_box_selector, (event)->
      self.space_has_been_pressed() if event.keyCode == 32
      self.backspace_has_been_pressed() if event.keyCode == 8
      self.return_has_been_pressed() if event.keyCode == 13
      
  tab_has_been_pressed: ->
    if @query_string() != ""
      @perform_query()
      return false  # do not focus away

  space_has_been_pressed: ->
    @perform_query()
    
  backspace_has_been_pressed: ->
    if @query_string() == ""
      @results.pop()
      $('.compact-nav-button:last').remove()
      
  return_has_been_pressed: ->
    if @query_string() == ""
      if @results.last()
        @navigate_to @results.last().url
      else
        @navigate_to "/"
    else
      @perform_search_for_multiple_results()
      
  perform_search_for_multiple_results: ->
    params = {
      query: @query_string(),
      search_base: @results.last()
    }
    @navigate_to (@search_url() + "?" + $.param(params))
  
  query_string: ->
    $.trim(@search_box().val())
  
  search_url: ->
    $('#compact-nav-search form').attr('action')
  
  search_box: ->
    $(@search_box_selector)    

  navigate_to: (url)->
    Turbolinks.visit url

  perform_query: ->
    self = this  # since "this" is overridden by the event handler
    query = @query_string()
    @remove_query_from_input(query)
    @mark_as_turbolinks_permanent()
    $.ajax {
      url: @search_url() + ".json",
      data: {
        query: query,
        search_base: @results.last()
      },
      success: (result)->
        if typeof(result.title) == "undefined"
          self.add_query_to_input(query)
        else
          self.results.push(result)
          self.add_result(result)
    }
  
  add_query_to_input: (query)->
    $(@search_box_selector).val (index, value)->
      query + " " + value

  remove_query_from_input: (query)->
    $(@search_box_selector).val (index, value)->
      value.replace(query + " ", "").replace(query, "")

  add_result: (result)->
    $(@search_box_selector).before(result.button_html)
  
  resize_search_box: ->
    # search_box = $(search_box_selector)
    # search_box.css({
    #   "width": ($('#user-menu').position().left - search_box.position().left) * 0.8
    # })
    
  focus_search_box: ->
    @search_box().focus() if @search_box().count() > 0
    
  mark_as_turbolinks_permanent: ->
    # In order to keep the compact navigation untouched by
    # turbolinks when the user actually uses it, mark the
    # navigation bar as permanent.
    $('#compact-nav-bar').attr('data-turbolinks-permanent', true)

App.compact_nav = new App.CompactNav()

$(document).ready ->
  App.compact_nav.resize_search_box()

  # Import breadcrumbs: This is used when the site is visited
  # via a link to a specific page.
  if App.compact_nav.results.count() == 0
    $('.compact-nav-button').each (index)->
      App.compact_nav.results.push($(this).data('search-base'))
  
  # Suppress form submission via return key, since this is
  # handled manually.
  $('.compact-nav-search-form').on 'keypress', (e)->
    if e.keyCode == 13
      return false

  # Focus the compact nav search box.
  App.compact_nav.focus_search_box()