import { Controller } from '@hotwired/stimulus' export default class extends Controller { static outlets = ['modal'] result = null elemId = null input = null lastValue = '' connect (e) { console.log('connect asociable_inline') const that = this // ID Ășnico para identificar el campo y el modal this.input = this.element.querySelector('input[type=text]') this.elemId = Math.trunc(Math.random() * 1000000000) this.element.classList.add(`asociable-${this.elemId}`) this.result = document.createElement('div') this.result.setAttribute('id', `resultados-${this.elemId}`) this.result.classList.add('resultados-wrapper') this.input.parentNode.appendChild(this.result) this.input.parentNode.appendChild(this.result) this.element.querySelector('.pencil').onclick = (e) => { that.input.focus() } if(this.input.value) { this.element.classList.add('filled') } let debounce = function(callback, wait) { let timerId; return (...args) => { clearTimeout(timerId); timerId = setTimeout(() => { callback(...args); }, wait); }; } const doSearchBounce = debounce((force) => { that.doSearch(force) }, 200) this.input.addEventListener('blur', (e) => { this.input.placeholder = "" }) this.input.onfocus = (e) => { this.input.select() if(this.input.value.length == 0) { this.escribiAlgo() } } this.input.onkeyup = (e) => { if(this.input.value.length == 0) { this.escribiAlgo() } if(e.keyCode == 13) { doSearchBounce(true) } else { doSearchBounce() } } this.input.onkeydown = (e) => { if(e.keyCode == 13) { e.preventDefault(); return false; } } } buscando() { this.result.innerHTML = `
Buscando...
` } escribiAlgo() { this.input.placeholder = "EscribĂ­ algo para buscar" } doSearch(force = false) { if(!force && this.input.value.length < 3) { return } if(!force && this.input.value == this.lastValue) { return } this.lastValue = this.input.value let timerId = setTimeout(() => { this.buscando() }, 200) document.addEventListener("turbo:before-stream-render", function(e) { clearTimeout(timerId) }) let url = `${this.input.dataset.url}?id=${this.elemId}` const form = document.createElement('form') form.setAttribute('method', 'post') form.setAttribute('action', url) form.setAttribute('data-turbo-stream', true) let partial = document.createElement('input') partial.setAttribute('type', 'hidden') partial.setAttribute('name', 'partial') partial.setAttribute('value', 'pg_associable/resultados_inline') form.appendChild(partial) let query = document.createElement('input') query.setAttribute('type', 'hidden') query.setAttribute('name', 'query') query.setAttribute('value', this.input.value) form.appendChild(query) document.body.prepend(form) form.requestSubmit() form.remove() } completarCampo (id, text) { const textField = this.element.querySelector('input[type=text]') const hiddenField = this.element.querySelector('input[type=hidden]') if( id === undefined ) { id = null } hiddenField.value = id if (id) { textField.value = text this.element.classList.add('filled') } else { this.element.classList.remove('filled') textField.value = null } } selectItem (e) { console.log('select') // TODO: text en data this.completarCampo(e.target.dataset.id, e.target.text) this.result.innerHTML = '' } disconnect (e) { console.log('disconnect asociable_inline') } }