comboLookup.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. function comboOpenFormById(formId) {
  2. var form = qi(formId);
  3. form && comboOpenForm(form);
  4. }
  5. function comboCloseFormById(formId) {
  6. var form = qi(formId);
  7. form && comboCloseForm(form);
  8. }
  9. function comboOpenForm(container) {
  10. var dropdown = container.parentNode.querySelector('.dropdown');
  11. container.scrollTop = 0;
  12. container.parentNode.classList.add('dropdown-open');
  13. dropdown.classList.add('dropdown-open');
  14. activeForm = container.id;
  15. };
  16. function comboCloseForm(container) {
  17. container.parentNode.classList.remove('dropdown-open');
  18. //container.previousSibling.classList.remove('dropdown-open');
  19. activeForm = undefined;
  20. };
  21. function comboLookupTextApply(dom) {
  22. let elem = qi(dom);
  23. if (elem) {
  24. let textareaSplit = dom.split('_');
  25. textareaSplit.pop();
  26. const textarea = qi(textareaSplit.join('_'));
  27. textarea ? textarea.value = elem.value : null;
  28. }
  29. }
  30. function comboClear(dom) {
  31. let elem = qi('comboContainer_' + dom)
  32. var dropdown = qi(dom).closest('.dropdown');
  33. if (elem) { elem.style.display = 'none' }
  34. dropdown.classList.remove('dropdown-open');
  35. dropdown.classList.remove('is-reversed');
  36. activeCombo = undefined; currentItem = undefined;
  37. }
  38. function comboSelect(dom, row, feed, mod, id) {
  39. let elem = qi(dom);
  40. comboClear(dom);
  41. if (qi(id)) elem.setAttribute("data-bind", qi(id).getAttribute('data-bind'));
  42. elem.value = row;
  43. elem.style.backgroundColor = 'white';
  44. var dropdown = qi(dom).closest('.dropdown');
  45. dropdown.classList.remove('dropdown-open');
  46. dropdown.classList.remove('is-reversed');
  47. dropdown.classList.add('dropdown-bind');
  48. let value = qi(id) ? dec(unbase64(qi(id).getAttribute('data-bind'))) : string(row);
  49. direct(tuple(atom('comboSelect'),
  50. value,
  51. string(dom),
  52. string(feed),
  53. atom(mod)));
  54. comboLookupTextApply(dom);
  55. }
  56. function comboLookupChange(dom) {
  57. let elem = qi(dom);
  58. if (elem) {
  59. elem.removeAttribute("data-bind");
  60. const dropdown = qi(dom).closest('.dropdown');
  61. if (dropdown) { dropdown.classList.remove('dropdown-bind'); }
  62. comboLookupTextApply(dom);
  63. }
  64. }
  65. function comboLookupClick(dom, feed, mod) {
  66. var dropdown = qi(dom).closest('.dropdown');
  67. var char = event.which || event.keyCode;
  68. if (char == 1 && !activeCombo && qi(dom).value == '') {
  69. activeCombo = dom;
  70. currentItem = undefined;
  71. dropdown.classList.add('dropdown-open');
  72. if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100)
  73. dropdown.classList.add('is-reversed');
  74. direct(tuple(atom('comboKey'),
  75. atom('all'),
  76. string(dom),
  77. string(feed),
  78. atom(mod)));
  79. return
  80. } else if (char == 1 && activeCombo == dom) { comboClear(dom); }
  81. }
  82. function comboLookupKeydown(dom, feed, mod) {
  83. var dropdown = qi(dom).closest('.dropdown');
  84. var char = event.which || event.keyCode;
  85. if (char == 40 && !activeCombo && qi(dom).value == '') {
  86. activeCombo = dom;
  87. currentItem = undefined;
  88. dropdown.classList.add('dropdown-open');
  89. if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100)
  90. dropdown.classList.add('is-reversed');
  91. direct(tuple(atom('comboKey'),
  92. atom('all'),
  93. string(dom),
  94. string(feed),
  95. atom(mod)));
  96. return
  97. }
  98. if (activeCombo && [35, 36, 38, 40].includes(char)) {
  99. event.preventDefault();
  100. if (char == 40) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling)
  101. ? currentItem.nextSibling : qi('comboContainer_' + dom).firstChild, true) }
  102. if (char == 35) { set_focus( currentItem && ( !cycleEnabled || currentItem.nextSibling)
  103. ? currentItem.parentNode.lastChild : currentItem, true) }
  104. if (char == 38) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling)
  105. ? currentItem.previousSibling : qi('comboContainer_' + dom).lastChild, true) }
  106. if (char == 36) { set_focus( currentItem && ( !cycleEnabled || currentItem.previousSibling)
  107. ? currentItem.parentNode.firstChild : currentItem, true) }
  108. }
  109. if (char == 13) { event.preventDefault(); return }
  110. }
  111. function comboLookupKeyup(dom, feed, mod) {
  112. var dropdown = qi(dom).closest('.dropdown')
  113. var char = event.which || event.keyCode;
  114. if (char == 27 || (char == 8 || char == 46) && qi(dom).value == '') { clearInput(dom); return }
  115. if (char == 13 && currentItem) { currentItem.click(); return }
  116. if ([33, 34, 37, 39].includes(char)) { return }
  117. if (activeCombo && [35, 36, 38, 40].includes(char)) { return }
  118. else {
  119. activeCombo = dom;
  120. currentItem = undefined;
  121. dropdown.classList.add('dropdown-open');
  122. if (window.innerHeight - dropdown.getBoundingClientRect().bottom < 100)
  123. dropdown.classList.add('is-reversed');
  124. direct(tuple(atom('comboKey'),
  125. bin(qi(dom).value),
  126. string(dom),
  127. string(feed),
  128. atom(mod)));
  129. }
  130. }
  131. function comboLookupMouseMove(dom) {
  132. set_focus(event.target.closest('.dropdown-item'), false)
  133. }
  134. function set_focus(elem, scroll) {
  135. if (elem) {
  136. if(currentItem) {currentItem.className = "dropdown-item"}
  137. elem.className = "dropdown-item focus"
  138. if (scroll==true) {elem.scrollIntoView({block: "nearest", inline: "nearest"})}
  139. currentItem = elem
  140. }
  141. }
  142. function clearInput(dom) {
  143. const input = qi(dom);
  144. if (input) {
  145. input.value = '';
  146. input.removeAttribute('value');
  147. }
  148. comboLookupChange(dom);
  149. comboClear(dom);
  150. }
  151. document.addEventListener("click", () => {
  152. if (activeCombo && event.target.className != 'triangle' &&
  153. !event.target.closest('#comboContainer_' + activeCombo)) {
  154. qi(activeCombo).value = '';
  155. comboClear(activeCombo);
  156. } else if (activeForm && event.target.className != 'triangle' &&
  157. !event.target.closest("#" + activeForm)) {
  158. comboCloseFormById(activeForm);
  159. }
  160. })
  161. function comboLostFocus(e) { }
  162. function comboOnFocus(e) { }
  163. function comboLookupMouseOut(dom) { }
  164. var activeCombo = undefined
  165. var activeForm = undefined
  166. var currentItem = undefined
  167. var cycleEnabled = false