option-list.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. (function() {
  2. function showOptionsList(_input) {
  3. let ol = $(_input).next('.data-option-list');
  4. if(ol.length && !ol.is(':visible')) {
  5. ol.show();
  6. return true;
  7. }
  8. return false;
  9. }
  10. function hideOptionsList(_input) {
  11. let ol = $(_input).next('.data-option-list');
  12. if(ol.length && ol.is(':visible')) {
  13. ol.hide();
  14. return true;
  15. }
  16. return false;
  17. }
  18. function init() {
  19. $(document)
  20. .off('mousedown.option-list', '.data-option-list>div')
  21. .on('mousedown.option-list', '.data-option-list>div', function(_e) {
  22. _e.stopPropagation();
  23. _e.preventDefault();
  24. markEventAsConsumed(_e);
  25. let elem = $(this).parent().prev('input[data-option-list]'),
  26. text = $(this).text();
  27. if(!elem.is('[multi-option-list]')) {
  28. elem.val('');
  29. }
  30. else {
  31. elem.val($.trim(elem.val()));
  32. elem[0].selectionStart = elem[0].selectionEnd = elem.val().length;
  33. if(elem.val() !== '') text = ', ' + text;
  34. }
  35. elem.focus();
  36. document.execCommand('insertText', false, text);
  37. if(!elem.is('[sticky-option-list]')) {
  38. $(this).closest('.data-option-list').hide();
  39. }
  40. return false;
  41. });
  42. $(document)
  43. .off('click.trigger-option-list', 'input[data-option-list]')
  44. .on('click.trigger-option-list', 'input[data-option-list]', function() {
  45. showOptionsList(this);
  46. })
  47. .off('focus.trigger-option-list', 'input[data-option-list]')
  48. .on('focus.trigger-option-list', 'input[data-option-list]', function() {
  49. showOptionsList(this);
  50. })
  51. .off('blur.trigger-option-list', 'input[data-option-list]')
  52. .on('blur.trigger-option-list', 'input[data-option-list]', function() {
  53. hideOptionsList(this);
  54. })
  55. .off('keydown.discard-option-list', 'input[data-option-list]')
  56. .on('keydown.discard-option-list', 'input[data-option-list]', function(_e) {
  57. if(_e.which === 27) {
  58. if(hideOptionsList(this)) {
  59. markEventAsConsumed(_e);
  60. return false;
  61. }
  62. }
  63. })
  64. }
  65. addMCInitializer('option-list', init);
  66. })();