TimeColumn.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = TimeColumn;
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  10. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  11. var _classnames = _interopRequireDefault(require("classnames"));
  12. var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
  13. var React = _interopRequireWildcard(require("react"));
  14. var _context = require("../../context");
  15. var _useScrollTo3 = _interopRequireDefault(require("./useScrollTo"));
  16. var SCROLL_DELAY = 300;
  17. // Not use JSON.stringify to avoid dead loop
  18. function flattenUnits(units) {
  19. return units.map(function (_ref) {
  20. var value = _ref.value,
  21. label = _ref.label,
  22. disabled = _ref.disabled;
  23. return [value, label, disabled].join(',');
  24. }).join(';');
  25. }
  26. function TimeColumn(props) {
  27. var units = props.units,
  28. value = props.value,
  29. optionalValue = props.optionalValue,
  30. type = props.type,
  31. onChange = props.onChange,
  32. onHover = props.onHover,
  33. onDblClick = props.onDblClick,
  34. changeOnScroll = props.changeOnScroll;
  35. var _usePanelContext = (0, _context.usePanelContext)(),
  36. prefixCls = _usePanelContext.prefixCls,
  37. cellRender = _usePanelContext.cellRender,
  38. now = _usePanelContext.now,
  39. locale = _usePanelContext.locale;
  40. var panelPrefixCls = "".concat(prefixCls, "-time-panel");
  41. var cellPrefixCls = "".concat(prefixCls, "-time-panel-cell");
  42. // ========================== Refs ==========================
  43. var ulRef = React.useRef(null);
  44. // ========================= Scroll =========================
  45. var checkDelayRef = React.useRef();
  46. var clearDelayCheck = function clearDelayCheck() {
  47. clearTimeout(checkDelayRef.current);
  48. };
  49. // ========================== Sync ==========================
  50. var _useScrollTo = (0, _useScrollTo3.default)(ulRef, value !== null && value !== void 0 ? value : optionalValue),
  51. _useScrollTo2 = (0, _slicedToArray2.default)(_useScrollTo, 3),
  52. syncScroll = _useScrollTo2[0],
  53. stopScroll = _useScrollTo2[1],
  54. isScrolling = _useScrollTo2[2];
  55. // Effect sync value scroll
  56. (0, _useLayoutEffect.default)(function () {
  57. syncScroll();
  58. clearDelayCheck();
  59. return function () {
  60. stopScroll();
  61. clearDelayCheck();
  62. };
  63. }, [value, optionalValue, flattenUnits(units)]);
  64. // ========================= Change =========================
  65. // Scroll event if sync onScroll
  66. var onInternalScroll = function onInternalScroll(event) {
  67. clearDelayCheck();
  68. var target = event.target;
  69. if (!isScrolling() && changeOnScroll) {
  70. checkDelayRef.current = setTimeout(function () {
  71. var ul = ulRef.current;
  72. var firstLiTop = ul.querySelector("li").offsetTop;
  73. var liList = Array.from(ul.querySelectorAll("li"));
  74. var liTopList = liList.map(function (li) {
  75. return li.offsetTop - firstLiTop;
  76. });
  77. var liDistList = liTopList.map(function (top, index) {
  78. if (units[index].disabled) {
  79. return Number.MAX_SAFE_INTEGER;
  80. }
  81. return Math.abs(top - target.scrollTop);
  82. });
  83. // Find min distance index
  84. var minDist = Math.min.apply(Math, (0, _toConsumableArray2.default)(liDistList));
  85. var minDistIndex = liDistList.findIndex(function (dist) {
  86. return dist === minDist;
  87. });
  88. var targetUnit = units[minDistIndex];
  89. if (targetUnit && !targetUnit.disabled) {
  90. onChange(targetUnit.value);
  91. }
  92. }, SCROLL_DELAY);
  93. }
  94. };
  95. // ========================= Render =========================
  96. var columnPrefixCls = "".concat(panelPrefixCls, "-column");
  97. return /*#__PURE__*/React.createElement("ul", {
  98. className: columnPrefixCls,
  99. ref: ulRef,
  100. "data-type": type,
  101. onScroll: onInternalScroll
  102. }, units.map(function (_ref2) {
  103. var label = _ref2.label,
  104. unitValue = _ref2.value,
  105. disabled = _ref2.disabled;
  106. var inner = /*#__PURE__*/React.createElement("div", {
  107. className: "".concat(cellPrefixCls, "-inner")
  108. }, label);
  109. return /*#__PURE__*/React.createElement("li", {
  110. key: unitValue,
  111. className: (0, _classnames.default)(cellPrefixCls, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(cellPrefixCls, "-selected"), value === unitValue), "".concat(cellPrefixCls, "-disabled"), disabled)),
  112. onClick: function onClick() {
  113. if (!disabled) {
  114. onChange(unitValue);
  115. }
  116. },
  117. onDoubleClick: function onDoubleClick() {
  118. if (!disabled && onDblClick) {
  119. onDblClick();
  120. }
  121. },
  122. onMouseEnter: function onMouseEnter() {
  123. onHover(unitValue);
  124. },
  125. onMouseLeave: function onMouseLeave() {
  126. onHover(null);
  127. },
  128. "data-value": unitValue
  129. }, cellRender ? cellRender(unitValue, {
  130. prefixCls: prefixCls,
  131. originNode: inner,
  132. today: now,
  133. type: 'time',
  134. subType: type,
  135. locale: locale
  136. }) : inner);
  137. }));
  138. }