function comboClear(dom) { let elem = qi('comboContainer_' + dom) if (elem) { elem.style.display = 'none' } activeCombo = undefined; currentItem = undefined; } function comboSelect(dom, row, feed, mod, id) { let elem = qi(dom); comboClear(dom); if (qi(id)) elem.setAttribute("data-bind", qi(id).getAttribute('data-bind')); elem.value = row; elem.style.backgroundColor = 'white'; direct(tuple(atom('comboSelect'), string(dom), string(row), string(feed), atom(mod))); } function comboLookupChange(dom) { let elem = qi(dom); if (elem && elem.value == "" && elem.getAttribute("data-bind")) { elem.removeAttribute("data-bind"); } } function comboLookupClick(dom, feed, mod) { var char = event.which || event.keyCode; if (char == 1 && !activeCombo && qi(dom).value == '') { activeCombo = dom; currentItem = undefined; direct(tuple(atom('comboKey'), atom('all'), string(dom), string(feed), atom(mod))); return } else if(char == 1 && activeCombo == dom){comboClear(dom);} } function comboLookupKeydown(dom, feed, mod) { var char = event.which || event.keyCode; if (char == 40 && !activeCombo && qi(dom).value == '') { activeCombo = dom; currentItem = undefined; direct(tuple(atom('comboKey'), atom('all'), string(dom), string(feed), atom(mod))); return } if (activeCombo && [38, 40].includes(char)) { event.preventDefault(); console.log('Keycode: ' + char + ", DOM: " + dom); if (char == 40) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling) ? currentItem.nextSibling : qi('comboContainer_' + dom).firstChild, true) } if (char == 38) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling) ? currentItem.previousSibling : qi('comboContainer_' + dom).lastChild, true) } } } function comboLookupKeyup(dom, feed, mod) { var char = event.which || event.keyCode; if (char == 27 || (char == 8 || char == 46) && qi(dom).value == '') { qi(dom).value = ''; comboClear(dom); return } if (char == 13 && currentItem) { currentItem.click(); return } if ([33, 34, 35, 36, 37, 39].includes(char)) { return } if (activeCombo && [38, 40].includes(char)) { return } else { activeCombo = dom; currentItem = undefined; direct(tuple(atom('comboKey'), bin(qi(dom).value), string(dom), string(feed), atom(mod))); } } function comboLookupMouseMove(dom) { set_focus(event.target.closest('.dropdown-item'), false) } function set_focus(elem, scroll) { if (elem) { if(currentItem) {currentItem.className = "dropdown-item"} elem.className = "dropdown-item focus" if (scroll==true) {elem.scrollIntoView({block: "nearest", inline: "nearest"})} currentItem = elem } } document.addEventListener("click", () => { if (activeCombo && event.target.className != 'triangle' && !event.target.closest('#comboContainer_' + activeCombo)) { qi(activeCombo).value = ''; comboClear(activeCombo); } }) function comboLostFocus(e) { } function comboOnFocus(e) { } function comboLookupMouseOut(dom) { } var activeCombo = undefined var currentItem = undefined var cycleEnabled = false