RangePicker.js 23 KB

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