RangeSelector.js 8.4 KB

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