uiUtil.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.PickerModeMap = void 0;
  7. exports.addGlobalMousedownEvent = addGlobalMousedownEvent;
  8. exports.createKeydownHandler = createKeydownHandler;
  9. exports.elementsContains = elementsContains;
  10. exports.getDefaultFormat = getDefaultFormat;
  11. exports.getInputSize = getInputSize;
  12. exports.getTargetFromEvent = getTargetFromEvent;
  13. exports.scrollTo = scrollTo;
  14. exports.waitElementReady = waitElementReady;
  15. var _isVisible = _interopRequireDefault(require("../../vc-util/Dom/isVisible"));
  16. var _KeyCode = _interopRequireDefault(require("../../_util/KeyCode"));
  17. var _raf = _interopRequireDefault(require("../../_util/raf"));
  18. const scrollIds = new Map();
  19. /** Trigger when element is visible in view */
  20. function waitElementReady(element, callback) {
  21. let id;
  22. function tryOrNextFrame() {
  23. if ((0, _isVisible.default)(element)) {
  24. callback();
  25. } else {
  26. id = (0, _raf.default)(() => {
  27. tryOrNextFrame();
  28. });
  29. }
  30. }
  31. tryOrNextFrame();
  32. return () => {
  33. _raf.default.cancel(id);
  34. };
  35. }
  36. /* eslint-disable no-param-reassign */
  37. function scrollTo(element, to, duration) {
  38. if (scrollIds.get(element)) {
  39. _raf.default.cancel(scrollIds.get(element));
  40. }
  41. // jump to target if duration zero
  42. if (duration <= 0) {
  43. scrollIds.set(element, (0, _raf.default)(() => {
  44. element.scrollTop = to;
  45. }));
  46. return;
  47. }
  48. const difference = to - element.scrollTop;
  49. const perTick = difference / duration * 10;
  50. scrollIds.set(element, (0, _raf.default)(() => {
  51. element.scrollTop += perTick;
  52. if (element.scrollTop !== to) {
  53. scrollTo(element, to, duration - 10);
  54. }
  55. }));
  56. }
  57. function createKeydownHandler(event, _ref) {
  58. let {
  59. onLeftRight,
  60. onCtrlLeftRight,
  61. onUpDown,
  62. onPageUpDown,
  63. onEnter
  64. } = _ref;
  65. const {
  66. which,
  67. ctrlKey,
  68. metaKey
  69. } = event;
  70. switch (which) {
  71. case _KeyCode.default.LEFT:
  72. if (ctrlKey || metaKey) {
  73. if (onCtrlLeftRight) {
  74. onCtrlLeftRight(-1);
  75. return true;
  76. }
  77. } else if (onLeftRight) {
  78. onLeftRight(-1);
  79. return true;
  80. }
  81. /* istanbul ignore next */
  82. break;
  83. case _KeyCode.default.RIGHT:
  84. if (ctrlKey || metaKey) {
  85. if (onCtrlLeftRight) {
  86. onCtrlLeftRight(1);
  87. return true;
  88. }
  89. } else if (onLeftRight) {
  90. onLeftRight(1);
  91. return true;
  92. }
  93. /* istanbul ignore next */
  94. break;
  95. case _KeyCode.default.UP:
  96. if (onUpDown) {
  97. onUpDown(-1);
  98. return true;
  99. }
  100. /* istanbul ignore next */
  101. break;
  102. case _KeyCode.default.DOWN:
  103. if (onUpDown) {
  104. onUpDown(1);
  105. return true;
  106. }
  107. /* istanbul ignore next */
  108. break;
  109. case _KeyCode.default.PAGE_UP:
  110. if (onPageUpDown) {
  111. onPageUpDown(-1);
  112. return true;
  113. }
  114. /* istanbul ignore next */
  115. break;
  116. case _KeyCode.default.PAGE_DOWN:
  117. if (onPageUpDown) {
  118. onPageUpDown(1);
  119. return true;
  120. }
  121. /* istanbul ignore next */
  122. break;
  123. case _KeyCode.default.ENTER:
  124. if (onEnter) {
  125. onEnter();
  126. return true;
  127. }
  128. /* istanbul ignore next */
  129. break;
  130. }
  131. return false;
  132. }
  133. // ===================== Format =====================
  134. function getDefaultFormat(format, picker, showTime, use12Hours) {
  135. let mergedFormat = format;
  136. if (!mergedFormat) {
  137. switch (picker) {
  138. case 'time':
  139. mergedFormat = use12Hours ? 'hh:mm:ss a' : 'HH:mm:ss';
  140. break;
  141. case 'week':
  142. mergedFormat = 'gggg-wo';
  143. break;
  144. case 'month':
  145. mergedFormat = 'YYYY-MM';
  146. break;
  147. case 'quarter':
  148. mergedFormat = 'YYYY-[Q]Q';
  149. break;
  150. case 'year':
  151. mergedFormat = 'YYYY';
  152. break;
  153. default:
  154. mergedFormat = showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD';
  155. }
  156. }
  157. return mergedFormat;
  158. }
  159. function getInputSize(picker, format, generateConfig) {
  160. const defaultSize = picker === 'time' ? 8 : 10;
  161. const length = typeof format === 'function' ? format(generateConfig.getNow()).length : format.length;
  162. return Math.max(defaultSize, length) + 2;
  163. }
  164. let globalClickFunc = null;
  165. const clickCallbacks = new Set();
  166. function addGlobalMousedownEvent(callback) {
  167. if (!globalClickFunc && typeof window !== 'undefined' && window.addEventListener) {
  168. globalClickFunc = e => {
  169. // Clone a new list to avoid repeat trigger events
  170. [...clickCallbacks].forEach(queueFunc => {
  171. queueFunc(e);
  172. });
  173. };
  174. window.addEventListener('mousedown', globalClickFunc);
  175. }
  176. clickCallbacks.add(callback);
  177. return () => {
  178. clickCallbacks.delete(callback);
  179. if (clickCallbacks.size === 0) {
  180. window.removeEventListener('mousedown', globalClickFunc);
  181. globalClickFunc = null;
  182. }
  183. };
  184. }
  185. function getTargetFromEvent(e) {
  186. var _a;
  187. const target = e.target;
  188. // get target if in shadow dom
  189. if (e.composed && target.shadowRoot) {
  190. return ((_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)[0]) || target;
  191. }
  192. return target;
  193. }
  194. // ====================== Mode ======================
  195. const getYearNextMode = next => {
  196. if (next === 'month' || next === 'date') {
  197. return 'year';
  198. }
  199. return next;
  200. };
  201. const getMonthNextMode = next => {
  202. if (next === 'date') {
  203. return 'month';
  204. }
  205. return next;
  206. };
  207. const getQuarterNextMode = next => {
  208. if (next === 'month' || next === 'date') {
  209. return 'quarter';
  210. }
  211. return next;
  212. };
  213. const getWeekNextMode = next => {
  214. if (next === 'date') {
  215. return 'week';
  216. }
  217. return next;
  218. };
  219. const PickerModeMap = exports.PickerModeMap = {
  220. year: getYearNextMode,
  221. month: getMonthNextMode,
  222. quarter: getQuarterNextMode,
  223. week: getWeekNextMode,
  224. time: null,
  225. date: null
  226. };
  227. function elementsContains(elements, target) {
  228. if (process.env.NODE_ENV === 'test') {
  229. return false;
  230. }
  231. return elements.some(ele => ele && ele.contains(target));
  232. }