RangePicker.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
  3. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  4. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  5. import { useEvent, useMergedState } from 'rc-util';
  6. import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
  7. import omit from "rc-util/es/omit";
  8. import pickAttrs from "rc-util/es/pickAttrs";
  9. import warning from "rc-util/es/warning";
  10. import * as React from 'react';
  11. import PickerTrigger from "../PickerTrigger";
  12. import { pickTriggerProps } from "../PickerTrigger/util";
  13. import { fillIndex, getFromDate, toArray } from "../utils/miscUtil";
  14. import PickerContext from "./context";
  15. import useCellRender from "./hooks/useCellRender";
  16. import useFieldsInvalidate from "./hooks/useFieldsInvalidate";
  17. import useFilledProps from "./hooks/useFilledProps";
  18. import useOpen from "./hooks/useOpen";
  19. import usePickerRef from "./hooks/usePickerRef";
  20. import usePresets from "./hooks/usePresets";
  21. import useRangeActive from "./hooks/useRangeActive";
  22. import useRangeDisabledDate from "./hooks/useRangeDisabledDate";
  23. import useRangePickerValue from "./hooks/useRangePickerValue";
  24. import useRangeValue, { useInnerValue } from "./hooks/useRangeValue";
  25. import useShowNow from "./hooks/useShowNow";
  26. import Popup from "./Popup";
  27. import RangeSelector from "./Selector/RangeSelector";
  28. function separateConfig(config, defaultConfig) {
  29. var singleConfig = config !== null && config !== void 0 ? config : defaultConfig;
  30. if (Array.isArray(singleConfig)) {
  31. return singleConfig;
  32. }
  33. return [singleConfig, singleConfig];
  34. }
  35. /** Used for change event, it should always be not undefined */
  36. function getActiveRange(activeIndex) {
  37. return activeIndex === 1 ? 'end' : 'start';
  38. }
  39. function RangePicker(props, ref) {
  40. // ========================= Prop =========================
  41. var _useFilledProps = useFilledProps(props, function () {
  42. var disabled = props.disabled,
  43. allowEmpty = props.allowEmpty;
  44. var mergedDisabled = separateConfig(disabled, false);
  45. var mergedAllowEmpty = separateConfig(allowEmpty, false);
  46. return {
  47. disabled: mergedDisabled,
  48. allowEmpty: mergedAllowEmpty
  49. };
  50. }),
  51. _useFilledProps2 = _slicedToArray(_useFilledProps, 6),
  52. filledProps = _useFilledProps2[0],
  53. internalPicker = _useFilledProps2[1],
  54. complexPicker = _useFilledProps2[2],
  55. formatList = _useFilledProps2[3],
  56. maskFormat = _useFilledProps2[4],
  57. isInvalidateDate = _useFilledProps2[5];
  58. var prefixCls = filledProps.prefixCls,
  59. styles = filledProps.styles,
  60. classNames = filledProps.classNames,
  61. defaultValue = filledProps.defaultValue,
  62. value = filledProps.value,
  63. needConfirm = filledProps.needConfirm,
  64. onKeyDown = filledProps.onKeyDown,
  65. disabled = filledProps.disabled,
  66. allowEmpty = filledProps.allowEmpty,
  67. disabledDate = filledProps.disabledDate,
  68. minDate = filledProps.minDate,
  69. maxDate = filledProps.maxDate,
  70. defaultOpen = filledProps.defaultOpen,
  71. open = filledProps.open,
  72. onOpenChange = filledProps.onOpenChange,
  73. locale = filledProps.locale,
  74. generateConfig = filledProps.generateConfig,
  75. picker = filledProps.picker,
  76. showNow = filledProps.showNow,
  77. showToday = filledProps.showToday,
  78. showTime = filledProps.showTime,
  79. mode = filledProps.mode,
  80. onPanelChange = filledProps.onPanelChange,
  81. onCalendarChange = filledProps.onCalendarChange,
  82. onOk = filledProps.onOk,
  83. defaultPickerValue = filledProps.defaultPickerValue,
  84. pickerValue = filledProps.pickerValue,
  85. onPickerValueChange = filledProps.onPickerValueChange,
  86. inputReadOnly = filledProps.inputReadOnly,
  87. suffixIcon = filledProps.suffixIcon,
  88. onFocus = filledProps.onFocus,
  89. onBlur = filledProps.onBlur,
  90. presets = filledProps.presets,
  91. ranges = filledProps.ranges,
  92. components = filledProps.components,
  93. cellRender = filledProps.cellRender,
  94. dateRender = filledProps.dateRender,
  95. monthCellRender = filledProps.monthCellRender,
  96. onClick = filledProps.onClick;
  97. // ========================= Refs =========================
  98. var selectorRef = usePickerRef(ref);
  99. // ========================= Open =========================
  100. var _useOpen = useOpen(open, defaultOpen, disabled, onOpenChange),
  101. _useOpen2 = _slicedToArray(_useOpen, 2),
  102. mergedOpen = _useOpen2[0],
  103. setMergeOpen = _useOpen2[1];
  104. var triggerOpen = function triggerOpen(nextOpen, config) {
  105. // No need to open if all disabled
  106. if (disabled.some(function (fieldDisabled) {
  107. return !fieldDisabled;
  108. }) || !nextOpen) {
  109. setMergeOpen(nextOpen, config);
  110. }
  111. };
  112. // ======================== Values ========================
  113. var _useInnerValue = useInnerValue(generateConfig, locale, formatList, true, false, defaultValue, value, onCalendarChange, onOk),
  114. _useInnerValue2 = _slicedToArray(_useInnerValue, 5),
  115. mergedValue = _useInnerValue2[0],
  116. setInnerValue = _useInnerValue2[1],
  117. getCalendarValue = _useInnerValue2[2],
  118. triggerCalendarChange = _useInnerValue2[3],
  119. triggerOk = _useInnerValue2[4];
  120. var calendarValue = getCalendarValue();
  121. // ======================== Active ========================
  122. var _useRangeActive = useRangeActive(disabled, allowEmpty, mergedOpen),
  123. _useRangeActive2 = _slicedToArray(_useRangeActive, 9),
  124. focused = _useRangeActive2[0],
  125. triggerFocus = _useRangeActive2[1],
  126. lastOperation = _useRangeActive2[2],
  127. activeIndex = _useRangeActive2[3],
  128. setActiveIndex = _useRangeActive2[4],
  129. nextActiveIndex = _useRangeActive2[5],
  130. activeIndexList = _useRangeActive2[6],
  131. updateSubmitIndex = _useRangeActive2[7],
  132. hasActiveSubmitValue = _useRangeActive2[8];
  133. var onSharedFocus = function onSharedFocus(event, index) {
  134. triggerFocus(true);
  135. onFocus === null || onFocus === void 0 || onFocus(event, {
  136. range: getActiveRange(index !== null && index !== void 0 ? index : activeIndex)
  137. });
  138. };
  139. var onSharedBlur = function onSharedBlur(event, index) {
  140. triggerFocus(false);
  141. onBlur === null || onBlur === void 0 || onBlur(event, {
  142. range: getActiveRange(index !== null && index !== void 0 ? index : activeIndex)
  143. });
  144. };
  145. // ======================= ShowTime =======================
  146. /** Used for Popup panel */
  147. var mergedShowTime = React.useMemo(function () {
  148. if (!showTime) {
  149. return null;
  150. }
  151. var disabledTime = showTime.disabledTime;
  152. var proxyDisabledTime = disabledTime ? function (date) {
  153. var range = getActiveRange(activeIndex);
  154. var fromDate = getFromDate(calendarValue, activeIndexList, activeIndex);
  155. return disabledTime(date, range, {
  156. from: fromDate
  157. });
  158. } : undefined;
  159. return _objectSpread(_objectSpread({}, showTime), {}, {
  160. disabledTime: proxyDisabledTime
  161. });
  162. }, [showTime, activeIndex, calendarValue, activeIndexList]);
  163. // ========================= Mode =========================
  164. var _useMergedState = useMergedState([picker, picker], {
  165. value: mode
  166. }),
  167. _useMergedState2 = _slicedToArray(_useMergedState, 2),
  168. modes = _useMergedState2[0],
  169. setModes = _useMergedState2[1];
  170. var mergedMode = modes[activeIndex] || picker;
  171. /** Extends from `mergedMode` to patch `datetime` mode */
  172. var internalMode = mergedMode === 'date' && mergedShowTime ? 'datetime' : mergedMode;
  173. // ====================== PanelCount ======================
  174. var multiplePanel = internalMode === picker && internalMode !== 'time';
  175. // ======================= Show Now =======================
  176. var mergedShowNow = useShowNow(picker, mergedMode, showNow, showToday, true);
  177. // ======================== Value =========================
  178. var _useRangeValue = useRangeValue(filledProps, mergedValue, setInnerValue, getCalendarValue, triggerCalendarChange, disabled, formatList, focused, mergedOpen, isInvalidateDate),
  179. _useRangeValue2 = _slicedToArray(_useRangeValue, 2),
  180. /** Trigger `onChange` by check `disabledDate` */
  181. flushSubmit = _useRangeValue2[0],
  182. /** Trigger `onChange` directly without check `disabledDate` */
  183. triggerSubmitChange = _useRangeValue2[1];
  184. // ===================== DisabledDate =====================
  185. var mergedDisabledDate = useRangeDisabledDate(calendarValue, disabled, activeIndexList, generateConfig, locale, disabledDate);
  186. // ======================= Validate =======================
  187. var _useFieldsInvalidate = useFieldsInvalidate(calendarValue, isInvalidateDate, allowEmpty),
  188. _useFieldsInvalidate2 = _slicedToArray(_useFieldsInvalidate, 2),
  189. submitInvalidates = _useFieldsInvalidate2[0],
  190. onSelectorInvalid = _useFieldsInvalidate2[1];
  191. // ===================== Picker Value =====================
  192. var _useRangePickerValue = useRangePickerValue(generateConfig, locale, calendarValue, modes, mergedOpen, activeIndex, internalPicker, multiplePanel, defaultPickerValue, pickerValue, mergedShowTime === null || mergedShowTime === void 0 ? void 0 : mergedShowTime.defaultOpenValue, onPickerValueChange, minDate, maxDate),
  193. _useRangePickerValue2 = _slicedToArray(_useRangePickerValue, 2),
  194. currentPickerValue = _useRangePickerValue2[0],
  195. setCurrentPickerValue = _useRangePickerValue2[1];
  196. // >>> Mode need wait for `pickerValue`
  197. var triggerModeChange = useEvent(function (nextPickerValue, nextMode, triggerEvent) {
  198. var clone = fillIndex(modes, activeIndex, nextMode);
  199. if (clone[0] !== modes[0] || clone[1] !== modes[1]) {
  200. setModes(clone);
  201. }
  202. // Compatible with `onPanelChange`
  203. if (onPanelChange && triggerEvent !== false) {
  204. var clonePickerValue = _toConsumableArray(calendarValue);
  205. if (nextPickerValue) {
  206. clonePickerValue[activeIndex] = nextPickerValue;
  207. }
  208. onPanelChange(clonePickerValue, clone);
  209. }
  210. });
  211. // ======================== Change ========================
  212. var fillCalendarValue = function fillCalendarValue(date, index) {
  213. return (
  214. // Trigger change only when date changed
  215. fillIndex(calendarValue, index, date)
  216. );
  217. };
  218. // ======================== Submit ========================
  219. /**
  220. * Trigger by confirm operation.
  221. * This function has already handle the `needConfirm` check logic.
  222. * - Selector: enter key
  223. * - Panel: OK button
  224. */
  225. var triggerPartConfirm = function triggerPartConfirm(date, skipFocus) {
  226. var nextValue = calendarValue;
  227. if (date) {
  228. nextValue = fillCalendarValue(date, activeIndex);
  229. }
  230. updateSubmitIndex(activeIndex);
  231. // Get next focus index
  232. var nextIndex = nextActiveIndex(nextValue);
  233. // Change calendar value and tell flush it
  234. triggerCalendarChange(nextValue);
  235. flushSubmit(activeIndex, nextIndex === null);
  236. if (nextIndex === null) {
  237. triggerOpen(false, {
  238. force: true
  239. });
  240. } else if (!skipFocus) {
  241. selectorRef.current.focus({
  242. index: nextIndex
  243. });
  244. }
  245. };
  246. // ======================== Click =========================
  247. var onSelectorClick = function onSelectorClick(event) {
  248. var _activeElement;
  249. var rootNode = event.target.getRootNode();
  250. if (!selectorRef.current.nativeElement.contains((_activeElement = rootNode.activeElement) !== null && _activeElement !== void 0 ? _activeElement : document.activeElement)) {
  251. // Click to focus the enabled input
  252. var enabledIndex = disabled.findIndex(function (d) {
  253. return !d;
  254. });
  255. if (enabledIndex >= 0) {
  256. selectorRef.current.focus({
  257. index: enabledIndex
  258. });
  259. }
  260. }
  261. triggerOpen(true);
  262. onClick === null || onClick === void 0 || onClick(event);
  263. };
  264. var onSelectorClear = function onSelectorClear() {
  265. triggerSubmitChange(null);
  266. triggerOpen(false, {
  267. force: true
  268. });
  269. };
  270. // ======================== Hover =========================
  271. var _React$useState = React.useState(null),
  272. _React$useState2 = _slicedToArray(_React$useState, 2),
  273. hoverSource = _React$useState2[0],
  274. setHoverSource = _React$useState2[1];
  275. var _React$useState3 = React.useState(null),
  276. _React$useState4 = _slicedToArray(_React$useState3, 2),
  277. internalHoverValues = _React$useState4[0],
  278. setInternalHoverValues = _React$useState4[1];
  279. var hoverValues = React.useMemo(function () {
  280. return internalHoverValues || calendarValue;
  281. }, [calendarValue, internalHoverValues]);
  282. // Clean up `internalHoverValues` when closed
  283. React.useEffect(function () {
  284. if (!mergedOpen) {
  285. setInternalHoverValues(null);
  286. }
  287. }, [mergedOpen]);
  288. // ========================================================
  289. // == Panels ==
  290. // ========================================================
  291. // Save the offset with active bar position
  292. // const [activeOffset, setActiveOffset] = React.useState(0);
  293. var _React$useState5 = React.useState([0, 0, 0]),
  294. _React$useState6 = _slicedToArray(_React$useState5, 2),
  295. activeInfo = _React$useState6[0],
  296. setActiveInfo = _React$useState6[1];
  297. // ======================= Presets ========================
  298. var presetList = usePresets(presets, ranges);
  299. var onPresetHover = function onPresetHover(nextValues) {
  300. setInternalHoverValues(nextValues);
  301. setHoverSource('preset');
  302. };
  303. var onPresetSubmit = function onPresetSubmit(nextValues) {
  304. var passed = triggerSubmitChange(nextValues);
  305. if (passed) {
  306. triggerOpen(false, {
  307. force: true
  308. });
  309. }
  310. };
  311. var onNow = function onNow(now) {
  312. triggerPartConfirm(now);
  313. };
  314. // ======================== Panel =========================
  315. var onPanelHover = function onPanelHover(date) {
  316. setInternalHoverValues(date ? fillCalendarValue(date, activeIndex) : null);
  317. setHoverSource('cell');
  318. };
  319. // >>> Focus
  320. var onPanelFocus = function onPanelFocus(event) {
  321. triggerOpen(true);
  322. onSharedFocus(event);
  323. };
  324. // >>> MouseDown
  325. var onPanelMouseDown = function onPanelMouseDown() {
  326. lastOperation('panel');
  327. };
  328. // >>> Calendar
  329. var onPanelSelect = function onPanelSelect(date) {
  330. var clone = fillIndex(calendarValue, activeIndex, date);
  331. // Only trigger calendar event but not update internal `calendarValue` state
  332. triggerCalendarChange(clone);
  333. // >>> Trigger next active if !needConfirm
  334. // Fully logic check `useRangeValue` hook
  335. if (!needConfirm && !complexPicker && internalPicker === internalMode) {
  336. triggerPartConfirm(date);
  337. }
  338. };
  339. // >>> Close
  340. var onPopupClose = function onPopupClose() {
  341. // Close popup
  342. triggerOpen(false);
  343. };
  344. // >>> cellRender
  345. var onInternalCellRender = useCellRender(cellRender, dateRender, monthCellRender, getActiveRange(activeIndex));
  346. // >>> Value
  347. var panelValue = calendarValue[activeIndex] || null;
  348. // >>> invalid
  349. var isPopupInvalidateDate = useEvent(function (date) {
  350. return isInvalidateDate(date, {
  351. activeIndex: activeIndex
  352. });
  353. });
  354. var panelProps = React.useMemo(function () {
  355. var domProps = pickAttrs(filledProps, false);
  356. var restProps = omit(filledProps, [].concat(_toConsumableArray(Object.keys(domProps)), ['onChange', 'onCalendarChange', 'style', 'className', 'onPanelChange', 'disabledTime']));
  357. return restProps;
  358. }, [filledProps]);
  359. // >>> Render
  360. var panel = /*#__PURE__*/React.createElement(Popup, _extends({}, panelProps, {
  361. showNow: mergedShowNow,
  362. showTime: mergedShowTime
  363. // Range
  364. ,
  365. range: true,
  366. multiplePanel: multiplePanel,
  367. activeInfo: activeInfo
  368. // Disabled
  369. ,
  370. disabledDate: mergedDisabledDate
  371. // Focus
  372. ,
  373. onFocus: onPanelFocus,
  374. onBlur: onSharedBlur,
  375. onPanelMouseDown: onPanelMouseDown
  376. // Mode
  377. ,
  378. picker: picker,
  379. mode: mergedMode,
  380. internalMode: internalMode,
  381. onPanelChange: triggerModeChange
  382. // Value
  383. ,
  384. format: maskFormat,
  385. value: panelValue,
  386. isInvalid: isPopupInvalidateDate,
  387. onChange: null,
  388. onSelect: onPanelSelect
  389. // PickerValue
  390. ,
  391. pickerValue: currentPickerValue,
  392. defaultOpenValue: toArray(showTime === null || showTime === void 0 ? void 0 : showTime.defaultOpenValue)[activeIndex],
  393. onPickerValueChange: setCurrentPickerValue
  394. // Hover
  395. ,
  396. hoverValue: hoverValues,
  397. onHover: onPanelHover
  398. // Submit
  399. ,
  400. needConfirm: needConfirm,
  401. onSubmit: triggerPartConfirm,
  402. onOk: triggerOk
  403. // Preset
  404. ,
  405. presets: presetList,
  406. onPresetHover: onPresetHover,
  407. onPresetSubmit: onPresetSubmit
  408. // Now
  409. ,
  410. onNow: onNow
  411. // Render
  412. ,
  413. cellRender: onInternalCellRender
  414. }));
  415. // ========================================================
  416. // == Selector ==
  417. // ========================================================
  418. // ======================== Change ========================
  419. var onSelectorChange = function onSelectorChange(date, index) {
  420. var clone = fillCalendarValue(date, index);
  421. triggerCalendarChange(clone);
  422. };
  423. var onSelectorInputChange = function onSelectorInputChange() {
  424. lastOperation('input');
  425. };
  426. // ======================= Selector =======================
  427. var onSelectorFocus = function onSelectorFocus(event, index) {
  428. // Check if `needConfirm` but user not submit yet
  429. var activeListLen = activeIndexList.length;
  430. var lastActiveIndex = activeIndexList[activeListLen - 1];
  431. if (activeListLen && lastActiveIndex !== index && needConfirm &&
  432. // Not change index if is not filled
  433. !allowEmpty[lastActiveIndex] && !hasActiveSubmitValue(lastActiveIndex) && calendarValue[lastActiveIndex]) {
  434. selectorRef.current.focus({
  435. index: lastActiveIndex
  436. });
  437. return;
  438. }
  439. lastOperation('input');
  440. triggerOpen(true, {
  441. inherit: true
  442. });
  443. // When click input to switch the field, it will not trigger close.
  444. // Which means it will lose the part confirm and we need fill back.
  445. // ref: https://github.com/ant-design/ant-design/issues/49512
  446. if (activeIndex !== index && mergedOpen && !needConfirm && complexPicker) {
  447. triggerPartConfirm(null, true);
  448. }
  449. setActiveIndex(index);
  450. onSharedFocus(event, index);
  451. };
  452. var onSelectorBlur = function onSelectorBlur(event, index) {
  453. triggerOpen(false);
  454. if (!needConfirm && lastOperation() === 'input') {
  455. var nextIndex = nextActiveIndex(calendarValue);
  456. flushSubmit(activeIndex, nextIndex === null);
  457. }
  458. onSharedBlur(event, index);
  459. };
  460. var onSelectorKeyDown = function onSelectorKeyDown(event, preventDefault) {
  461. if (event.key === 'Tab') {
  462. triggerPartConfirm(null, true);
  463. }
  464. onKeyDown === null || onKeyDown === void 0 || onKeyDown(event, preventDefault);
  465. };
  466. // ======================= Context ========================
  467. var context = React.useMemo(function () {
  468. return {
  469. prefixCls: prefixCls,
  470. locale: locale,
  471. generateConfig: generateConfig,
  472. button: components.button,
  473. input: components.input
  474. };
  475. }, [prefixCls, locale, generateConfig, components.button, components.input]);
  476. // ======================== Effect ========================
  477. // >>> Mode
  478. // Reset for every active
  479. useLayoutEffect(function () {
  480. if (mergedOpen && activeIndex !== undefined) {
  481. // Legacy compatible. This effect update should not trigger `onPanelChange`
  482. triggerModeChange(null, picker, false);
  483. }
  484. }, [mergedOpen, activeIndex, picker]);
  485. // >>> For complex picker, we need check if need to focus next one
  486. useLayoutEffect(function () {
  487. var lastOp = lastOperation();
  488. // Trade as confirm on field leave
  489. if (!mergedOpen && lastOp === 'input') {
  490. triggerOpen(false);
  491. triggerPartConfirm(null, true);
  492. }
  493. // Submit with complex picker
  494. if (!mergedOpen && complexPicker && !needConfirm && lastOp === 'panel') {
  495. triggerOpen(true);
  496. triggerPartConfirm();
  497. }
  498. }, [mergedOpen]);
  499. // ====================== DevWarning ======================
  500. if (process.env.NODE_ENV !== 'production') {
  501. var isIndexEmpty = function isIndexEmpty(index) {
  502. return (
  503. // Value is empty
  504. !(value !== null && value !== void 0 && value[index]) &&
  505. // DefaultValue is empty
  506. !(defaultValue !== null && defaultValue !== void 0 && defaultValue[index])
  507. );
  508. };
  509. if (disabled.some(function (fieldDisabled, index) {
  510. return fieldDisabled && isIndexEmpty(index) && !allowEmpty[index];
  511. })) {
  512. warning(false, '`disabled` should not set with empty `value`. You should set `allowEmpty` or `value` instead.');
  513. }
  514. }
  515. // ======================== Render ========================
  516. return /*#__PURE__*/React.createElement(PickerContext.Provider, {
  517. value: context
  518. }, /*#__PURE__*/React.createElement(PickerTrigger, _extends({}, pickTriggerProps(filledProps), {
  519. popupElement: panel,
  520. popupStyle: styles.popup,
  521. popupClassName: classNames.popup
  522. // Visible
  523. ,
  524. visible: mergedOpen,
  525. onClose: onPopupClose
  526. // Range
  527. ,
  528. range: true
  529. }), /*#__PURE__*/React.createElement(RangeSelector
  530. // Shared
  531. , _extends({}, filledProps, {
  532. // Ref
  533. ref: selectorRef
  534. // Icon
  535. ,
  536. suffixIcon: suffixIcon
  537. // Active
  538. ,
  539. activeIndex: focused || mergedOpen ? activeIndex : null,
  540. activeHelp: !!internalHoverValues,
  541. allHelp: !!internalHoverValues && hoverSource === 'preset',
  542. focused: focused,
  543. onFocus: onSelectorFocus,
  544. onBlur: onSelectorBlur,
  545. onKeyDown: onSelectorKeyDown,
  546. onSubmit: triggerPartConfirm
  547. // Change
  548. ,
  549. value: hoverValues,
  550. maskFormat: maskFormat,
  551. onChange: onSelectorChange,
  552. onInputChange: onSelectorInputChange
  553. // Format
  554. ,
  555. format: formatList,
  556. inputReadOnly: inputReadOnly
  557. // Disabled
  558. ,
  559. disabled: disabled
  560. // Open
  561. ,
  562. open: mergedOpen,
  563. onOpenChange: triggerOpen
  564. // Click
  565. ,
  566. onClick: onSelectorClick,
  567. onClear: onSelectorClear
  568. // Invalid
  569. ,
  570. invalid: submitInvalidates,
  571. onInvalid: onSelectorInvalid
  572. // Offset
  573. ,
  574. onActiveInfo: setActiveInfo
  575. }))));
  576. }
  577. var RefRangePicker = /*#__PURE__*/React.forwardRef(RangePicker);
  578. if (process.env.NODE_ENV !== 'production') {
  579. RefRangePicker.displayName = 'RefRangePicker';
  580. }
  581. export default RefRangePicker;