mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 09:12:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const keycodes = [32, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 106, 107, 109, 110, 111, 186, 187, 188, 189, 190, 191, 219, 220, 221, 222]
 | 
						|
 | 
						|
$(document).ready(function () {
 | 
						|
  $('.autocomplete').keyup(function (e) {
 | 
						|
    const target = $('#' + e.target.id)
 | 
						|
    const prefix = target.attr('id')
 | 
						|
    const api_url = target.attr('api_url')
 | 
						|
    let api_url_suffix = target.attr('api_url_suffix')
 | 
						|
    if (!api_url_suffix) { api_url_suffix = '' }
 | 
						|
    let name_field = target.attr('name_field')
 | 
						|
    if (!name_field) { name_field = 'name' }
 | 
						|
    const input = target.val()
 | 
						|
    target.addClass('is-invalid')
 | 
						|
    target.removeClass('is-valid')
 | 
						|
 | 
						|
    $.getJSON(api_url + (api_url.includes('?') ? '&' : '?') + 'format=json&search=^' + input + api_url_suffix, function (objects) {
 | 
						|
      let html = '<ul class="list-group list-group-flush" id="' + prefix + '_list">'
 | 
						|
 | 
						|
      objects.results.forEach(function (obj) {
 | 
						|
        html += li(prefix + '_' + obj.id, obj[name_field])
 | 
						|
      })
 | 
						|
      html += '</ul>'
 | 
						|
 | 
						|
      target.tooltip({
 | 
						|
        html: true,
 | 
						|
        placement: 'bottom',
 | 
						|
        trigger: 'manual',
 | 
						|
        container: target.parent(),
 | 
						|
        fallbackPlacement: 'clockwise'
 | 
						|
      })
 | 
						|
 | 
						|
      target.attr("data-original-title", html).tooltip("show")
 | 
						|
 | 
						|
      objects.results.forEach(function (obj) {
 | 
						|
        $('#' + prefix + '_' + obj.id).click(function () {
 | 
						|
          target.val(obj[name_field])
 | 
						|
          $('#' + prefix + '_pk').val(obj.id)
 | 
						|
 | 
						|
          target.tooltip("hide")
 | 
						|
          target.removeClass('is-invalid')
 | 
						|
          target.addClass('is-valid')
 | 
						|
 | 
						|
          if (typeof autocompleted !== 'undefined') { autocompleted(obj, prefix) }
 | 
						|
        })
 | 
						|
      })
 | 
						|
 | 
						|
      if (objects.results.length >= 2) {
 | 
						|
        $('#' + prefix + '_pk').val(objects.results[0].id)
 | 
						|
      }
 | 
						|
      if (objects.results.length === 1 &&
 | 
						|
          (keycodes.includes(e.originalEvent.keyCode) ||
 | 
						|
            input === objects.results[0][name_field])) {
 | 
						|
        $('#' + prefix + '_' + objects.results[0].id).trigger('click')
 | 
						|
      }
 | 
						|
    })
 | 
						|
  })
 | 
						|
 | 
						|
  $('.autocomplete-reset').click(function () {
 | 
						|
    const name = $(this).attr('id').replace('_reset', '')
 | 
						|
    $('#' + name + '_pk').val('')
 | 
						|
    $('#' + name).val('')
 | 
						|
    $('#' + name).tooltip('hide')
 | 
						|
  })
 | 
						|
})
 |