comboLookup.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. function comboClear(dom) {
  2. let elem = qi('comboContainer_' + dom)
  3. if (elem) { elem.style.display = 'none' }
  4. activeCombo = undefined; currentItem = undefined;
  5. }
  6. function comboSelect(dom, row, feed, mod, id) {
  7. let elem = qi(dom); comboClear(dom);
  8. if (qi(id)) elem.setAttribute("data-bind", qi(id).getAttribute('data-bind'));
  9. elem.value = row;
  10. elem.style.backgroundColor = 'white';
  11. direct(tuple(atom('comboSelect'),
  12. string(dom),
  13. string(row),
  14. string(feed),
  15. atom(mod)));
  16. }
  17. function comboLookupChange(dom) {
  18. let elem = qi(dom);
  19. if (elem && elem.value == "" && elem.getAttribute("data-bind")) {
  20. elem.removeAttribute("data-bind");
  21. }
  22. }
  23. function comboLookupKeydown(dom, feed, mod) {
  24. var char = event.which || event.keyCode;
  25. if (char == 40 && !activeCombo && qi(dom).value == '') {
  26. activeCombo = dom;
  27. currentItem = undefined;
  28. direct(tuple(atom('comboKey'),
  29. atom('all'),
  30. string(dom),
  31. string(feed),
  32. atom(mod)));
  33. return
  34. }
  35. if (activeCombo && [38, 40].includes(char)) {
  36. event.preventDefault();
  37. console.log('Keycode: ' + char + ", DOM: " + dom);
  38. if (char == 40) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling)
  39. ? currentItem.nextSibling : qi('comboContainer_' + dom).firstChild, true) }
  40. if (char == 38) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling)
  41. ? currentItem.previousSibling : qi('comboContainer_' + dom).lastChild, true) }
  42. }
  43. }
  44. function comboLookupKeyup(dom, feed, mod) {
  45. var char = event.which || event.keyCode;
  46. if (char == 27 || (char == 8 || char == 46) && qi(dom).value == '') {
  47. qi(dom).value = '';
  48. comboClear(dom);
  49. return
  50. }
  51. if (char == 13 && currentItem) { currentItem.click(); return }
  52. if ([33, 34, 35, 36, 37, 39].includes(char)) { return }
  53. if (activeCombo && [38, 40].includes(char)) { return }
  54. else {
  55. activeCombo = dom;
  56. currentItem = undefined;
  57. direct(tuple(atom('comboKey'),
  58. bin(qi(dom).value),
  59. string(dom),
  60. string(feed),
  61. atom(mod)));
  62. }
  63. }
  64. function comboLookupMouseMove(dom) {
  65. set_focus(event.target.closest('.dropdown-item'), false)
  66. }
  67. function set_focus(elem, scroll) {
  68. if (elem) {
  69. if(currentItem) {currentItem.className = "dropdown-item"}
  70. elem.className = "dropdown-item focus"
  71. if (scroll==true) {elem.scrollIntoView({block: "center", inline: "nearest"})}
  72. currentItem = elem
  73. }
  74. }
  75. document.addEventListener("click", () => {
  76. if (activeCombo && !event.target.closest('#comboContainer_' + activeCombo)) {
  77. qi(activeCombo).value = '';
  78. comboClear(activeCombo);
  79. }
  80. })
  81. function comboLostFocus(e) { }
  82. function comboOnFocus(e) { }
  83. function comboLookupMouseOut(dom) { }
  84. var activeCombo = undefined
  85. var currentItem = undefined
  86. var cycleEnabled = false