fiedl/your_platform

View on GitHub
app/assets/javascripts/your_platform/group_select_fields.coffee

Summary

Maintainability
Test Coverage
$(document).ready ->
  App.process_group_id_fields()

App.process_group_id_fields = ->
  $('input.group_id').each ->
    if $(this).siblings('input.group_name_select').length == 0
      $(this).before("<input type=\"text\" class=\"group_name_select\" placeholder=\"#{I18n.t('search_group')}\">")
      $(this).after('<ul class="group_search_results"></ul>')
      $(this).addClass 'group_id_hidden'

$(document).on 'keypress', '.group_name_select', (e)->
  $(this).closest('form').find('input[type="submit"]').hide()
  has_selected_group = true if $(this).hasClass('success')
  $(this).removeClass('success failure progress')

  if e.keyCode == 13 # enter

    # The user wants to submit the form.
    if has_selected_group? && has_selected_group
      $(this).closest('form').submit()

    # The user wants to select an entry from the results.
    else if $('.group_search_results li.selected').length > 0
      $('.group_search_results li.selected a').click()

    # The user wants to submit a search.
    else
      group_name_select = $(this)
      query = group_name_select.val()
      if query.length > 3
        url = "/api/v1/search_groups/"
        data = {
          query: query,
          limit: 10
        }
        group_name_select.removeClass('success')
            .removeClass('failure').addClass('progress')
        $.ajax {
          type: 'GET',
          url: url,
          data: data,
          success: (groups)->
            group_name_select.removeClass('progress').removeClass('failure')
            group_name_select.siblings('ul.group_search_results').find('li').remove()
            for group in groups
              breadcrumbs_string = group.breadcrumb_titles.join(" > ")
              li = "<li><a href=\"#\" data-group-id=\"#{group.id}\">
                <div class='group_name'>#{group.name}</div>
                <div class='result_breadcrumbs'>#{breadcrumbs_string}</div>
              </a></li>"
              group_name_select.siblings('ul.group_search_results').append(li)

          error: (result)->
            group_name_select.removeClass('progress')
                .removeClass('success').addClass('failure')
        }
    return false

$(document).on 'keydown', '.group_name_select, .group_search_results', (e)->
  currently_selected_li = $('.group_search_results li.selected')
  $('.group_search_results li').removeClass('selected') unless e.keyCode == 13 # enter
  if e.keyCode == 38 # up arrow
    if currently_selected_li.length > 0
      currently_selected_li.prev('li').addClass('selected')
    else
      $('.group_search_results li:last').addClass('selected')
  else if e.keyCode == 40 # down arrow
    if currently_selected_li.length > 0
      currently_selected_li.next('li').addClass('selected')
    else
      $('.group_search_results li:first').addClass('selected')


$(document).on 'click', 'ul.group_search_results li a', ->
  a = $(this)
  group_id = a.data('group-id')
  group_name = a.find('.group_name').text()
  a.closest('form').find('input[type=submit]').show()
  ul = a.closest('ul')
  ul.find('li').remove()
  ul.siblings('.group_name_select').val(group_name).addClass('success')
  ul.siblings('.group_id').val(group_id)
  false