RangeSelector.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  13. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  14. var _classnames = _interopRequireDefault(require("classnames"));
  15. var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer"));
  16. var _rcUtil = require("rc-util");
  17. var React = _interopRequireWildcard(require("react"));
  18. var _context = _interopRequireDefault(require("../context"));
  19. var _useInputProps3 = _interopRequireDefault(require("./hooks/useInputProps"));
  20. var _useRootProps = _interopRequireDefault(require("./hooks/useRootProps"));
  21. var _Icon = _interopRequireWildcard(require("./Icon"));
  22. var _Input = _interopRequireDefault(require("./Input"));
  23. var _excluded = ["id", "prefix", "clearIcon", "suffixIcon", "separator", "activeIndex", "activeHelp", "allHelp", "focused", "onFocus", "onBlur", "onKeyDown", "locale", "generateConfig", "placeholder", "className", "style", "onClick", "onClear", "value", "onChange", "onSubmit", "onInputChange", "format", "maskFormat", "preserveInvalidOnBlur", "onInvalid", "disabled", "invalid", "inputReadOnly", "direction", "onOpenChange", "onActiveInfo", "placement", "onMouseDown", "required", "aria-required", "autoFocus", "tabIndex"],
  24. _excluded2 = ["index"];
  25. function RangeSelector(props, ref) {
  26. var id = props.id,
  27. prefix = props.prefix,
  28. clearIcon = props.clearIcon,
  29. suffixIcon = props.suffixIcon,
  30. _props$separator = props.separator,
  31. separator = _props$separator === void 0 ? '~' : _props$separator,
  32. activeIndex = props.activeIndex,
  33. activeHelp = props.activeHelp,
  34. allHelp = props.allHelp,
  35. focused = props.focused,
  36. onFocus = props.onFocus,
  37. onBlur = props.onBlur,
  38. onKeyDown = props.onKeyDown,
  39. locale = props.locale,
  40. generateConfig = props.generateConfig,
  41. placeholder = props.placeholder,
  42. className = props.className,
  43. style = props.style,
  44. onClick = props.onClick,
  45. onClear = props.onClear,
  46. value = props.value,
  47. onChange = props.onChange,
  48. onSubmit = props.onSubmit,
  49. onInputChange = props.onInputChange,
  50. format = props.format,
  51. maskFormat = props.maskFormat,
  52. preserveInvalidOnBlur = props.preserveInvalidOnBlur,
  53. onInvalid = props.onInvalid,
  54. disabled = props.disabled,
  55. invalid = props.invalid,
  56. inputReadOnly = props.inputReadOnly,
  57. direction = props.direction,
  58. onOpenChange = props.onOpenChange,
  59. onActiveInfo = props.onActiveInfo,
  60. placement = props.placement,
  61. _onMouseDown = props.onMouseDown,
  62. required = props.required,
  63. ariaRequired = props['aria-required'],
  64. autoFocus = props.autoFocus,
  65. tabIndex = props.tabIndex,
  66. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  67. var rtl = direction === 'rtl';
  68. // ======================== Prefix ========================
  69. var _React$useContext = React.useContext(_context.default),
  70. prefixCls = _React$useContext.prefixCls;
  71. // ========================== Id ==========================
  72. var ids = React.useMemo(function () {
  73. if (typeof id === 'string') {
  74. return [id];
  75. }
  76. var mergedId = id || {};
  77. return [mergedId.start, mergedId.end];
  78. }, [id]);
  79. // ========================= Refs =========================
  80. var rootRef = React.useRef();
  81. var inputStartRef = React.useRef();
  82. var inputEndRef = React.useRef();
  83. var getInput = function getInput(index) {
  84. var _index;
  85. return (_index = [inputStartRef, inputEndRef][index]) === null || _index === void 0 ? void 0 : _index.current;
  86. };
  87. React.useImperativeHandle(ref, function () {
  88. return {
  89. nativeElement: rootRef.current,
  90. focus: function focus(options) {
  91. if ((0, _typeof2.default)(options) === 'object') {
  92. var _getInput;
  93. var _ref = options || {},
  94. _ref$index = _ref.index,
  95. _index2 = _ref$index === void 0 ? 0 : _ref$index,
  96. rest = (0, _objectWithoutProperties2.default)(_ref, _excluded2);
  97. (_getInput = getInput(_index2)) === null || _getInput === void 0 || _getInput.focus(rest);
  98. } else {
  99. var _getInput2;
  100. (_getInput2 = getInput(options !== null && options !== void 0 ? options : 0)) === null || _getInput2 === void 0 || _getInput2.focus();
  101. }
  102. },
  103. blur: function blur() {
  104. var _getInput3, _getInput4;
  105. (_getInput3 = getInput(0)) === null || _getInput3 === void 0 || _getInput3.blur();
  106. (_getInput4 = getInput(1)) === null || _getInput4 === void 0 || _getInput4.blur();
  107. }
  108. };
  109. });
  110. // ======================== Props =========================
  111. var rootProps = (0, _useRootProps.default)(restProps);
  112. // ===================== Placeholder ======================
  113. var mergedPlaceholder = React.useMemo(function () {
  114. return Array.isArray(placeholder) ? placeholder : [placeholder, placeholder];
  115. }, [placeholder]);
  116. // ======================== Inputs ========================
  117. var _useInputProps = (0, _useInputProps3.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
  118. id: ids,
  119. placeholder: mergedPlaceholder
  120. })),
  121. _useInputProps2 = (0, _slicedToArray2.default)(_useInputProps, 1),
  122. getInputProps = _useInputProps2[0];
  123. // ====================== ActiveBar =======================
  124. var _React$useState = React.useState({
  125. position: 'absolute',
  126. width: 0
  127. }),
  128. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  129. activeBarStyle = _React$useState2[0],
  130. setActiveBarStyle = _React$useState2[1];
  131. var syncActiveOffset = (0, _rcUtil.useEvent)(function () {
  132. var input = getInput(activeIndex);
  133. if (input) {
  134. var inputRect = input.nativeElement.getBoundingClientRect();
  135. var parentRect = rootRef.current.getBoundingClientRect();
  136. var rectOffset = inputRect.left - parentRect.left;
  137. setActiveBarStyle(function (ori) {
  138. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ori), {}, {
  139. width: inputRect.width,
  140. left: rectOffset
  141. });
  142. });
  143. onActiveInfo([inputRect.left, inputRect.right, parentRect.width]);
  144. }
  145. });
  146. React.useEffect(function () {
  147. syncActiveOffset();
  148. }, [activeIndex]);
  149. // ======================== Clear =========================
  150. var showClear = clearIcon && (value[0] && !disabled[0] || value[1] && !disabled[1]);
  151. // ======================= Disabled =======================
  152. var startAutoFocus = autoFocus && !disabled[0];
  153. var endAutoFocus = autoFocus && !startAutoFocus && !disabled[1];
  154. // ======================== Render ========================
  155. return /*#__PURE__*/React.createElement(_rcResizeObserver.default, {
  156. onResize: syncActiveOffset
  157. }, /*#__PURE__*/React.createElement("div", (0, _extends2.default)({}, rootProps, {
  158. className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-range"), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-focused"), focused), "".concat(prefixCls, "-disabled"), disabled.every(function (i) {
  159. return i;
  160. })), "".concat(prefixCls, "-invalid"), invalid.some(function (i) {
  161. return i;
  162. })), "".concat(prefixCls, "-rtl"), rtl), className),
  163. style: style,
  164. ref: rootRef,
  165. onClick: onClick
  166. // Not lose current input focus
  167. ,
  168. onMouseDown: function onMouseDown(e) {
  169. var target = e.target;
  170. if (target !== inputStartRef.current.inputElement && target !== inputEndRef.current.inputElement) {
  171. e.preventDefault();
  172. }
  173. _onMouseDown === null || _onMouseDown === void 0 || _onMouseDown(e);
  174. }
  175. }), prefix && /*#__PURE__*/React.createElement("div", {
  176. className: "".concat(prefixCls, "-prefix")
  177. }, prefix), /*#__PURE__*/React.createElement(_Input.default, (0, _extends2.default)({
  178. ref: inputStartRef
  179. }, getInputProps(0), {
  180. autoFocus: startAutoFocus,
  181. tabIndex: tabIndex,
  182. "date-range": "start"
  183. })), /*#__PURE__*/React.createElement("div", {
  184. className: "".concat(prefixCls, "-range-separator")
  185. }, separator), /*#__PURE__*/React.createElement(_Input.default, (0, _extends2.default)({
  186. ref: inputEndRef
  187. }, getInputProps(1), {
  188. autoFocus: endAutoFocus,
  189. tabIndex: tabIndex,
  190. "date-range": "end"
  191. })), /*#__PURE__*/React.createElement("div", {
  192. className: "".concat(prefixCls, "-active-bar"),
  193. style: activeBarStyle
  194. }), /*#__PURE__*/React.createElement(_Icon.default, {
  195. type: "suffix",
  196. icon: suffixIcon
  197. }), showClear && /*#__PURE__*/React.createElement(_Icon.ClearIcon, {
  198. icon: clearIcon,
  199. onClear: onClear
  200. })));
  201. }
  202. var RefRangeSelector = /*#__PURE__*/React.forwardRef(RangeSelector);
  203. if (process.env.NODE_ENV !== 'production') {
  204. RefRangeSelector.displayName = 'RangeSelector';
  205. }
  206. var _default = exports.default = RefRangeSelector;