diff --git a/app/assets/javascripts/app.js.coffee b/app/assets/javascripts/app.js.coffee index fa999da0a..8e153867d 100644 --- a/app/assets/javascripts/app.js.coffee +++ b/app/assets/javascripts/app.js.coffee @@ -1,20 +1,9 @@ -registrarSource = new Bloodhound( - datumTokenizer: (d) -> - Bloodhound.tokenizers.whitespace d.display_key +Autocomplete.bindTypeahead + remote: '/admin/registrars/search' + selector: '.js-registrar-typeahead' + hiddenSelector: '.js-registrar-id' - queryTokenizer: Bloodhound.tokenizers.whitespace - remote: "/admin/registrars/search?q=%QUERY" -) - -registrarSource.initialize() -$(".js-registrars-typeahead").typeahead( - highlight: true, - hint: false -, - displayKey: "display_key" - source: registrarSource.ttAdapter() -).on('typeahead:selected', (e, obj) -> - $('input[name="domain[registrar_id]"]').val obj.id - $('.js-registrar-selected').removeClass('hidden') - $('.js-registrar-unselected').addClass('hidden') -) +Autocomplete.bindTypeahead + remote: '/admin/contacts/search' + selector: '.js-contact-typeahead' + hiddenSelector: '.js-contact-id' diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 473fbc9c3..501c73d89 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -5,7 +5,8 @@ #= require nprogress #= require nprogress-turbolinks #= require typeahead.bundle.min -#= require_tree . +#= require autocomplete +#= require app NProgress.configure showSpinner: false diff --git a/app/assets/javascripts/autocomplete.js.coffee b/app/assets/javascripts/autocomplete.js.coffee new file mode 100644 index 000000000..5c9155e41 --- /dev/null +++ b/app/assets/javascripts/autocomplete.js.coffee @@ -0,0 +1,29 @@ +class @Autocomplete + @bindTypeahead: (obj) -> + $(obj.selector).typeahead( + highlight: true, + hint: false + , + displayKey: "display_key" + source: Autocomplete.constructSourceAdapter(obj.remote) + ).on('typeahead:selected', (e, item) -> + $(obj.hiddenSelector).val item.id + + ok = $(obj.hiddenSelector).parent('div.has-feedback').find('.js-typeahead-ok') + remove = $(obj.hiddenSelector).parents('div.has-feedback').find('.js-typeahead-remove') + + ok.removeClass('hidden') + remove.addClass('hidden') + ) + + @constructSourceAdapter: (remote) -> + source = new Bloodhound( + datumTokenizer: (d) -> + Bloodhound.tokenizers.whitespace d.display_key + + queryTokenizer: Bloodhound.tokenizers.whitespace + remote: "#{remote}?q=%QUERY" + ) + + source.initialize() + source.ttAdapter() diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 8df0bd5b4..6220d5143 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -1,7 +1,5 @@ class Admin::ContactsController < ApplicationController def search - c = Contact.arel_table - query_string = "%#{params[:query]}%" - render json: Contact.where(c[:code].matches(query_string)).pluck(:code) + render json: Contact.search_by_query(params[:q]) end end diff --git a/app/models/contact.rb b/app/models/contact.rb index ee290a58b..8be915b5a 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -144,6 +144,11 @@ class Contact < ActiveRecord::Base res end + + def search_by_query(query) + res = search(code_cont: query).result + res.reduce([]) { |o, v| o << { id: v[:id], display_key: "#{v.name} (#{v.code})" } } + end end private diff --git a/app/models/registrar.rb b/app/models/registrar.rb index d63fed123..3620c9a56 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -10,7 +10,7 @@ class Registrar < ActiveRecord::Base class << self def search_by_query(query) - res = Registrar.search(name_or_reg_no_cont: query).result + res = search(name_or_reg_no_cont: query).result res.reduce([]) { |o, v| o << { id: v[:id], display_key: "#{v[:name]} (#{v[:reg_no]})" } } end end diff --git a/app/views/admin/domains/new.haml b/app/views/admin/domains/new.haml index edac8b4fe..a52f75bb8 100644 --- a/app/views/admin/domains/new.haml +++ b/app/views/admin/domains/new.haml @@ -12,13 +12,16 @@ .col-md-6 .form-group.has-feedback = f.label :registrar - = f.text_field(:registrar, class: 'form-control js-typeahead js-registrars-typeahead', placeholder: t('shared.registrar_name'), autocomplete: 'off') - %span.glyphicon.glyphicon-remove.form-control-feedback.js-registrar-unselected - %span.glyphicon.glyphicon-ok.form-control-feedback.js-registrar-selected.hidden - = f.hidden_field(:registrar_id) - .form-group + = f.text_field(:registrar, class: 'form-control js-registrar-typeahead', placeholder: t('shared.registrar_name'), autocomplete: 'off') + %span.glyphicon.glyphicon-ok.form-control-feedback.js-typeahead-ok.hidden + %span.glyphicon.glyphicon-remove.form-control-feedback.js-typeahead-remove + = f.hidden_field(:registrar_id, class: 'js-registrar-id') + .form-group.has-feedback = f.label :owner_contact - = f.text_field(:owner_contact, class: 'form-control js-contacts-typeahead', placeholder: t('shared.contact_code'), autocomplete: 'off') + = f.text_field(:owner_contact, class: 'form-control js-contact-typeahead', placeholder: t('shared.contact_code'), autocomplete: 'off') + %span.glyphicon.glyphicon-ok.form-control-feedback.js-typeahead-ok.hidden + %span.glyphicon.glyphicon-remove.form-control-feedback.js-typeahead-remove + = f.hidden_field(:owner_contact, class: 'js-contact-id') .row .col-md-12.text-right = button_tag(t('shared.save'), class: 'btn btn-primary')