index.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  11. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  12. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  13. var _classnames = _interopRequireDefault(require("classnames"));
  14. var _rcUtil = require("rc-util");
  15. var React = _interopRequireWildcard(require("react"));
  16. var _useLocale = _interopRequireDefault(require("../hooks/useLocale"));
  17. var _useTimeConfig = require("../hooks/useTimeConfig");
  18. var _useToggleDates = _interopRequireDefault(require("../hooks/useToggleDates"));
  19. var _context = _interopRequireDefault(require("../PickerInput/context"));
  20. var _useCellRender = _interopRequireDefault(require("../PickerInput/hooks/useCellRender"));
  21. var _dateUtil = require("../utils/dateUtil");
  22. var _miscUtil = require("../utils/miscUtil");
  23. var _context2 = require("./context");
  24. var _DatePanel = _interopRequireDefault(require("./DatePanel"));
  25. var _DateTimePanel = _interopRequireDefault(require("./DateTimePanel"));
  26. var _DecadePanel = _interopRequireDefault(require("./DecadePanel"));
  27. var _MonthPanel = _interopRequireDefault(require("./MonthPanel"));
  28. var _QuarterPanel = _interopRequireDefault(require("./QuarterPanel"));
  29. var _TimePanel = _interopRequireDefault(require("./TimePanel"));
  30. var _WeekPanel = _interopRequireDefault(require("./WeekPanel"));
  31. var _YearPanel = _interopRequireDefault(require("./YearPanel"));
  32. var DefaultComponents = {
  33. date: _DatePanel.default,
  34. datetime: _DateTimePanel.default,
  35. week: _WeekPanel.default,
  36. month: _MonthPanel.default,
  37. quarter: _QuarterPanel.default,
  38. year: _YearPanel.default,
  39. decade: _DecadePanel.default,
  40. time: _TimePanel.default
  41. };
  42. function PickerPanel(props, ref) {
  43. var _React$useContext;
  44. var locale = props.locale,
  45. generateConfig = props.generateConfig,
  46. direction = props.direction,
  47. prefixCls = props.prefixCls,
  48. _props$tabIndex = props.tabIndex,
  49. tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
  50. multiple = props.multiple,
  51. defaultValue = props.defaultValue,
  52. value = props.value,
  53. onChange = props.onChange,
  54. onSelect = props.onSelect,
  55. defaultPickerValue = props.defaultPickerValue,
  56. pickerValue = props.pickerValue,
  57. onPickerValueChange = props.onPickerValueChange,
  58. mode = props.mode,
  59. onPanelChange = props.onPanelChange,
  60. _props$picker = props.picker,
  61. picker = _props$picker === void 0 ? 'date' : _props$picker,
  62. showTime = props.showTime,
  63. hoverValue = props.hoverValue,
  64. hoverRangeValue = props.hoverRangeValue,
  65. cellRender = props.cellRender,
  66. dateRender = props.dateRender,
  67. monthCellRender = props.monthCellRender,
  68. _props$components = props.components,
  69. components = _props$components === void 0 ? {} : _props$components,
  70. hideHeader = props.hideHeader;
  71. var mergedPrefixCls = ((_React$useContext = React.useContext(_context.default)) === null || _React$useContext === void 0 ? void 0 : _React$useContext.prefixCls) || prefixCls || 'rc-picker';
  72. // ========================== Refs ==========================
  73. var rootRef = React.useRef();
  74. React.useImperativeHandle(ref, function () {
  75. return {
  76. nativeElement: rootRef.current
  77. };
  78. });
  79. // ========================== Time ==========================
  80. // Auto `format` need to check `showTime.showXXX` first.
  81. // And then merge the `locale` into `mergedShowTime`.
  82. var _getTimeProps = (0, _useTimeConfig.getTimeProps)(props),
  83. _getTimeProps2 = (0, _slicedToArray2.default)(_getTimeProps, 4),
  84. timeProps = _getTimeProps2[0],
  85. localeTimeProps = _getTimeProps2[1],
  86. showTimeFormat = _getTimeProps2[2],
  87. propFormat = _getTimeProps2[3];
  88. // ========================= Locale =========================
  89. var filledLocale = (0, _useLocale.default)(locale, localeTimeProps);
  90. // ========================= Picker =========================
  91. var internalPicker = picker === 'date' && showTime ? 'datetime' : picker;
  92. // ======================== ShowTime ========================
  93. var mergedShowTime = React.useMemo(function () {
  94. return (0, _useTimeConfig.fillShowTimeConfig)(internalPicker, showTimeFormat, propFormat, timeProps, filledLocale);
  95. }, [internalPicker, showTimeFormat, propFormat, timeProps, filledLocale]);
  96. // ========================== Now ===========================
  97. var now = generateConfig.getNow();
  98. // ========================== Mode ==========================
  99. var _useMergedState = (0, _rcUtil.useMergedState)(picker, {
  100. value: mode,
  101. postState: function postState(val) {
  102. return val || 'date';
  103. }
  104. }),
  105. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  106. mergedMode = _useMergedState2[0],
  107. setMergedMode = _useMergedState2[1];
  108. var internalMode = mergedMode === 'date' && mergedShowTime ? 'datetime' : mergedMode;
  109. // ========================= Toggle =========================
  110. var toggleDates = (0, _useToggleDates.default)(generateConfig, locale, internalPicker);
  111. // ========================= Value ==========================
  112. // >>> Real value
  113. // Interactive with `onChange` event which only trigger when the `mode` is `picker`
  114. var _useMergedState3 = (0, _rcUtil.useMergedState)(defaultValue, {
  115. value: value
  116. }),
  117. _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
  118. innerValue = _useMergedState4[0],
  119. setMergedValue = _useMergedState4[1];
  120. var mergedValue = React.useMemo(function () {
  121. // Clean up `[null]`
  122. var values = (0, _miscUtil.toArray)(innerValue).filter(function (val) {
  123. return val;
  124. });
  125. return multiple ? values : values.slice(0, 1);
  126. }, [innerValue, multiple]);
  127. // Sync value and only trigger onChange event when changed
  128. var triggerChange = (0, _rcUtil.useEvent)(function (nextValue) {
  129. setMergedValue(nextValue);
  130. if (onChange && (nextValue === null || mergedValue.length !== nextValue.length || mergedValue.some(function (ori, index) {
  131. return !(0, _dateUtil.isSame)(generateConfig, locale, ori, nextValue[index], internalPicker);
  132. }))) {
  133. onChange === null || onChange === void 0 || onChange(multiple ? nextValue : nextValue[0]);
  134. }
  135. });
  136. // >>> CalendarValue
  137. // CalendarValue is a temp value for user operation
  138. // which will only trigger `onCalendarChange` but not `onChange`
  139. var onInternalSelect = (0, _rcUtil.useEvent)(function (newDate) {
  140. onSelect === null || onSelect === void 0 || onSelect(newDate);
  141. if (mergedMode === picker) {
  142. var nextValues = multiple ? toggleDates(mergedValue, newDate) : [newDate];
  143. triggerChange(nextValues);
  144. }
  145. });
  146. // >>> PickerValue
  147. // PickerValue is used to control the current displaying panel
  148. var _useMergedState5 = (0, _rcUtil.useMergedState)(defaultPickerValue || mergedValue[0] || now, {
  149. value: pickerValue
  150. }),
  151. _useMergedState6 = (0, _slicedToArray2.default)(_useMergedState5, 2),
  152. mergedPickerValue = _useMergedState6[0],
  153. setInternalPickerValue = _useMergedState6[1];
  154. React.useEffect(function () {
  155. if (mergedValue[0] && !pickerValue) {
  156. setInternalPickerValue(mergedValue[0]);
  157. }
  158. }, [mergedValue[0]]);
  159. // Both trigger when manually pickerValue or mode change
  160. var triggerPanelChange = function triggerPanelChange(viewDate, nextMode) {
  161. onPanelChange === null || onPanelChange === void 0 || onPanelChange(viewDate || pickerValue, nextMode || mergedMode);
  162. };
  163. var setPickerValue = function setPickerValue(nextPickerValue) {
  164. var triggerPanelEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  165. setInternalPickerValue(nextPickerValue);
  166. onPickerValueChange === null || onPickerValueChange === void 0 || onPickerValueChange(nextPickerValue);
  167. if (triggerPanelEvent) {
  168. triggerPanelChange(nextPickerValue);
  169. }
  170. };
  171. var triggerModeChange = function triggerModeChange(nextMode, viewDate) {
  172. setMergedMode(nextMode);
  173. if (viewDate) {
  174. setPickerValue(viewDate);
  175. }
  176. triggerPanelChange(viewDate, nextMode);
  177. };
  178. var onPanelValueSelect = function onPanelValueSelect(nextValue) {
  179. onInternalSelect(nextValue);
  180. setPickerValue(nextValue);
  181. // Update mode if needed
  182. if (mergedMode !== picker) {
  183. var decadeYearQueue = ['decade', 'year'];
  184. var decadeYearMonthQueue = [].concat(decadeYearQueue, ['month']);
  185. var pickerQueue = {
  186. quarter: [].concat(decadeYearQueue, ['quarter']),
  187. week: [].concat((0, _toConsumableArray2.default)(decadeYearMonthQueue), ['week']),
  188. date: [].concat((0, _toConsumableArray2.default)(decadeYearMonthQueue), ['date'])
  189. };
  190. var queue = pickerQueue[picker] || decadeYearMonthQueue;
  191. var index = queue.indexOf(mergedMode);
  192. var nextMode = queue[index + 1];
  193. if (nextMode) {
  194. triggerModeChange(nextMode, nextValue);
  195. }
  196. }
  197. };
  198. // ======================= Hover Date =======================
  199. var hoverRangeDate = React.useMemo(function () {
  200. var start;
  201. var end;
  202. if (Array.isArray(hoverRangeValue)) {
  203. var _hoverRangeValue = (0, _slicedToArray2.default)(hoverRangeValue, 2);
  204. start = _hoverRangeValue[0];
  205. end = _hoverRangeValue[1];
  206. } else {
  207. start = hoverRangeValue;
  208. }
  209. // Return for not exist
  210. if (!start && !end) {
  211. return null;
  212. }
  213. // Fill if has empty
  214. start = start || end;
  215. end = end || start;
  216. return generateConfig.isAfter(start, end) ? [end, start] : [start, end];
  217. }, [hoverRangeValue, generateConfig]);
  218. // ======================= Components =======================
  219. // >>> cellRender
  220. var onInternalCellRender = (0, _useCellRender.default)(cellRender, dateRender, monthCellRender);
  221. // ======================= Components =======================
  222. var PanelComponent = components[internalMode] || DefaultComponents[internalMode] || _DatePanel.default;
  223. // ======================== Context =========================
  224. var parentHackContext = React.useContext(_context2.PickerHackContext);
  225. var pickerPanelContext = React.useMemo(function () {
  226. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, parentHackContext), {}, {
  227. hideHeader: hideHeader
  228. });
  229. }, [parentHackContext, hideHeader]);
  230. // ======================== Warnings ========================
  231. if (process.env.NODE_ENV !== 'production') {
  232. (0, _rcUtil.warning)(!mergedValue || mergedValue.every(function (val) {
  233. return generateConfig.isValidate(val);
  234. }), 'Invalidate date pass to `value` or `defaultValue`.');
  235. }
  236. // ========================= Render =========================
  237. var panelCls = "".concat(mergedPrefixCls, "-panel");
  238. var panelProps = (0, _miscUtil.pickProps)(props, [
  239. // Week
  240. 'showWeek',
  241. // Icons
  242. 'prevIcon', 'nextIcon', 'superPrevIcon', 'superNextIcon',
  243. // Disabled
  244. 'disabledDate', 'minDate', 'maxDate',
  245. // Hover
  246. 'onHover']);
  247. return /*#__PURE__*/React.createElement(_context2.PickerHackContext.Provider, {
  248. value: pickerPanelContext
  249. }, /*#__PURE__*/React.createElement("div", {
  250. ref: rootRef,
  251. tabIndex: tabIndex,
  252. className: (0, _classnames.default)(panelCls, (0, _defineProperty2.default)({}, "".concat(panelCls, "-rtl"), direction === 'rtl'))
  253. }, /*#__PURE__*/React.createElement(PanelComponent, (0, _extends2.default)({}, panelProps, {
  254. // Time
  255. showTime: mergedShowTime
  256. // MISC
  257. ,
  258. prefixCls: mergedPrefixCls,
  259. locale: filledLocale,
  260. generateConfig: generateConfig
  261. // Mode
  262. ,
  263. onModeChange: triggerModeChange
  264. // Value
  265. ,
  266. pickerValue: mergedPickerValue,
  267. onPickerValueChange: function onPickerValueChange(nextPickerValue) {
  268. setPickerValue(nextPickerValue, true);
  269. },
  270. value: mergedValue[0],
  271. onSelect: onPanelValueSelect,
  272. values: mergedValue
  273. // Render
  274. ,
  275. cellRender: onInternalCellRender
  276. // Hover
  277. ,
  278. hoverRangeValue: hoverRangeDate,
  279. hoverValue: hoverValue
  280. }))));
  281. }
  282. var RefPanelPicker = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(PickerPanel));
  283. if (process.env.NODE_ENV !== 'production') {
  284. RefPanelPicker.displayName = 'PanelPicker';
  285. }
  286. // Make support generic
  287. var _default = exports.default = RefPanelPicker;