usePickerInput.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = usePickerInput;
  7. var _vue = require("vue");
  8. var _KeyCode = _interopRequireDefault(require("../../_util/KeyCode"));
  9. var _uiUtil = require("../utils/uiUtil");
  10. var _raf = _interopRequireDefault(require("../../_util/raf"));
  11. function usePickerInput(_ref) {
  12. var open = _ref.open,
  13. value = _ref.value,
  14. isClickOutside = _ref.isClickOutside,
  15. triggerOpen = _ref.triggerOpen,
  16. forwardKeydown = _ref.forwardKeydown,
  17. _onKeydown = _ref.onKeydown,
  18. blurToCancel = _ref.blurToCancel,
  19. onSubmit = _ref.onSubmit,
  20. onCancel = _ref.onCancel,
  21. _onFocus = _ref.onFocus,
  22. _onBlur = _ref.onBlur;
  23. var typing = (0, _vue.ref)(false);
  24. var focused = (0, _vue.ref)(false);
  25. /**
  26. * We will prevent blur to handle open event when user click outside,
  27. * since this will repeat trigger `onOpenChange` event.
  28. */
  29. var preventBlurRef = (0, _vue.ref)(false);
  30. var valueChangedRef = (0, _vue.ref)(false);
  31. var preventDefaultRef = (0, _vue.ref)(false);
  32. var inputProps = (0, _vue.computed)(function () {
  33. return {
  34. onMousedown: function onMousedown() {
  35. typing.value = true;
  36. triggerOpen(true);
  37. },
  38. onKeydown: function onKeydown(e) {
  39. var preventDefault = function preventDefault() {
  40. preventDefaultRef.value = true;
  41. };
  42. _onKeydown(e, preventDefault);
  43. if (preventDefaultRef.value) return;
  44. switch (e.which) {
  45. case _KeyCode.default.ENTER:
  46. {
  47. if (!open.value) {
  48. triggerOpen(true);
  49. } else if (onSubmit() !== false) {
  50. typing.value = true;
  51. }
  52. e.preventDefault();
  53. return;
  54. }
  55. case _KeyCode.default.TAB:
  56. {
  57. if (typing.value && open.value && !e.shiftKey) {
  58. typing.value = false;
  59. e.preventDefault();
  60. } else if (!typing.value && open.value) {
  61. if (!forwardKeydown(e) && e.shiftKey) {
  62. typing.value = true;
  63. e.preventDefault();
  64. }
  65. }
  66. return;
  67. }
  68. case _KeyCode.default.ESC:
  69. {
  70. typing.value = true;
  71. onCancel();
  72. return;
  73. }
  74. }
  75. if (!open.value && ![_KeyCode.default.SHIFT].includes(e.which)) {
  76. triggerOpen(true);
  77. } else if (!typing.value) {
  78. // Let popup panel handle keyboard
  79. forwardKeydown(e);
  80. }
  81. },
  82. onFocus: function onFocus(e) {
  83. typing.value = true;
  84. focused.value = true;
  85. if (_onFocus) {
  86. _onFocus(e);
  87. }
  88. },
  89. onBlur: function onBlur(e) {
  90. if (preventBlurRef.value || !isClickOutside(document.activeElement)) {
  91. preventBlurRef.value = false;
  92. return;
  93. }
  94. if (blurToCancel.value) {
  95. setTimeout(function () {
  96. var _document = document,
  97. activeElement = _document.activeElement;
  98. while (activeElement && activeElement.shadowRoot) {
  99. activeElement = activeElement.shadowRoot.activeElement;
  100. }
  101. if (isClickOutside(activeElement)) {
  102. onCancel();
  103. }
  104. }, 0);
  105. } else if (open.value) {
  106. triggerOpen(false);
  107. if (valueChangedRef.value) {
  108. onSubmit();
  109. }
  110. }
  111. focused.value = false;
  112. if (_onBlur) {
  113. _onBlur(e);
  114. }
  115. }
  116. };
  117. });
  118. // check if value changed
  119. (0, _vue.watch)(open, function () {
  120. valueChangedRef.value = false;
  121. });
  122. (0, _vue.watch)(value, function () {
  123. valueChangedRef.value = true;
  124. });
  125. var globalMousedownEvent = (0, _vue.ref)();
  126. // Global click handler
  127. (0, _vue.onMounted)(function () {
  128. globalMousedownEvent.value = (0, _uiUtil.addGlobalMousedownEvent)(function (e) {
  129. var target = (0, _uiUtil.getTargetFromEvent)(e);
  130. if (open.value) {
  131. var clickedOutside = isClickOutside(target);
  132. if (!clickedOutside) {
  133. preventBlurRef.value = true;
  134. // Always set back in case `onBlur` prevented by user
  135. (0, _raf.default)(function () {
  136. preventBlurRef.value = false;
  137. });
  138. } else if (!focused.value || clickedOutside) {
  139. triggerOpen(false);
  140. }
  141. }
  142. });
  143. });
  144. (0, _vue.onBeforeUnmount)(function () {
  145. globalMousedownEvent.value && globalMousedownEvent.value();
  146. });
  147. return [inputProps, {
  148. focused: focused,
  149. typing: typing
  150. }];
  151. }