index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 = TimePanelBody;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  10. var React = _interopRequireWildcard(require("react"));
  11. var _useTimeInfo3 = _interopRequireDefault(require("../../../hooks/useTimeInfo"));
  12. var _dateUtil = require("../../../utils/dateUtil");
  13. var _context = require("../../context");
  14. var _TimeColumn = _interopRequireDefault(require("./TimeColumn"));
  15. function isAM(hour) {
  16. return hour < 12;
  17. }
  18. function TimePanelBody(props) {
  19. var showHour = props.showHour,
  20. showMinute = props.showMinute,
  21. showSecond = props.showSecond,
  22. showMillisecond = props.showMillisecond,
  23. showMeridiem = props.use12Hours,
  24. changeOnScroll = props.changeOnScroll;
  25. var _usePanelContext = (0, _context.usePanelContext)(),
  26. prefixCls = _usePanelContext.prefixCls,
  27. values = _usePanelContext.values,
  28. generateConfig = _usePanelContext.generateConfig,
  29. locale = _usePanelContext.locale,
  30. onSelect = _usePanelContext.onSelect,
  31. _usePanelContext$onHo = _usePanelContext.onHover,
  32. onHover = _usePanelContext$onHo === void 0 ? function () {} : _usePanelContext$onHo,
  33. pickerValue = _usePanelContext.pickerValue;
  34. var value = (values === null || values === void 0 ? void 0 : values[0]) || null;
  35. var _React$useContext = React.useContext(_context.PickerHackContext),
  36. onCellDblClick = _React$useContext.onCellDblClick;
  37. // ========================== Info ==========================
  38. var _useTimeInfo = (0, _useTimeInfo3.default)(generateConfig, props, value),
  39. _useTimeInfo2 = (0, _slicedToArray2.default)(_useTimeInfo, 5),
  40. getValidTime = _useTimeInfo2[0],
  41. rowHourUnits = _useTimeInfo2[1],
  42. getMinuteUnits = _useTimeInfo2[2],
  43. getSecondUnits = _useTimeInfo2[3],
  44. getMillisecondUnits = _useTimeInfo2[4];
  45. // ========================= Value ==========================
  46. // PickerValue will tell which one to align on the top
  47. var getUnitValue = function getUnitValue(func) {
  48. var valueUnitVal = value && generateConfig[func](value);
  49. var pickerUnitValue = pickerValue && generateConfig[func](pickerValue);
  50. return [valueUnitVal, pickerUnitValue];
  51. };
  52. var _getUnitValue = getUnitValue('getHour'),
  53. _getUnitValue2 = (0, _slicedToArray2.default)(_getUnitValue, 2),
  54. hour = _getUnitValue2[0],
  55. pickerHour = _getUnitValue2[1];
  56. var _getUnitValue3 = getUnitValue('getMinute'),
  57. _getUnitValue4 = (0, _slicedToArray2.default)(_getUnitValue3, 2),
  58. minute = _getUnitValue4[0],
  59. pickerMinute = _getUnitValue4[1];
  60. var _getUnitValue5 = getUnitValue('getSecond'),
  61. _getUnitValue6 = (0, _slicedToArray2.default)(_getUnitValue5, 2),
  62. second = _getUnitValue6[0],
  63. pickerSecond = _getUnitValue6[1];
  64. var _getUnitValue7 = getUnitValue('getMillisecond'),
  65. _getUnitValue8 = (0, _slicedToArray2.default)(_getUnitValue7, 2),
  66. millisecond = _getUnitValue8[0],
  67. pickerMillisecond = _getUnitValue8[1];
  68. var meridiem = hour === null ? null : isAM(hour) ? 'am' : 'pm';
  69. // ========================= Column =========================
  70. // Hours
  71. var hourUnits = React.useMemo(function () {
  72. if (!showMeridiem) {
  73. return rowHourUnits;
  74. }
  75. return isAM(hour) ? rowHourUnits.filter(function (h) {
  76. return isAM(h.value);
  77. }) : rowHourUnits.filter(function (h) {
  78. return !isAM(h.value);
  79. });
  80. }, [hour, rowHourUnits, showMeridiem]);
  81. // >>> Pick Fallback
  82. var getEnabled = function getEnabled(units, val) {
  83. var _enabledUnits$;
  84. var enabledUnits = units.filter(function (unit) {
  85. return !unit.disabled;
  86. });
  87. return val !== null && val !== void 0 ? val : // Fallback to enabled value
  88. enabledUnits === null || enabledUnits === void 0 || (_enabledUnits$ = enabledUnits[0]) === null || _enabledUnits$ === void 0 ? void 0 : _enabledUnits$.value;
  89. };
  90. // >>> Minutes
  91. var validHour = getEnabled(rowHourUnits, hour);
  92. var minuteUnits = React.useMemo(function () {
  93. return getMinuteUnits(validHour);
  94. }, [getMinuteUnits, validHour]);
  95. // >>> Seconds
  96. var validMinute = getEnabled(minuteUnits, minute);
  97. var secondUnits = React.useMemo(function () {
  98. return getSecondUnits(validHour, validMinute);
  99. }, [getSecondUnits, validHour, validMinute]);
  100. // >>> Milliseconds
  101. var validSecond = getEnabled(secondUnits, second);
  102. var millisecondUnits = React.useMemo(function () {
  103. return getMillisecondUnits(validHour, validMinute, validSecond);
  104. }, [getMillisecondUnits, validHour, validMinute, validSecond]);
  105. var validMillisecond = getEnabled(millisecondUnits, millisecond);
  106. // Meridiem
  107. var meridiemUnits = React.useMemo(function () {
  108. if (!showMeridiem) {
  109. return [];
  110. }
  111. var base = generateConfig.getNow();
  112. var amDate = generateConfig.setHour(base, 6);
  113. var pmDate = generateConfig.setHour(base, 18);
  114. var formatMeridiem = function formatMeridiem(date, defaultLabel) {
  115. var cellMeridiemFormat = locale.cellMeridiemFormat;
  116. return cellMeridiemFormat ? (0, _dateUtil.formatValue)(date, {
  117. generateConfig: generateConfig,
  118. locale: locale,
  119. format: cellMeridiemFormat
  120. }) : defaultLabel;
  121. };
  122. return [{
  123. label: formatMeridiem(amDate, 'AM'),
  124. value: 'am',
  125. disabled: rowHourUnits.every(function (h) {
  126. return h.disabled || !isAM(h.value);
  127. })
  128. }, {
  129. label: formatMeridiem(pmDate, 'PM'),
  130. value: 'pm',
  131. disabled: rowHourUnits.every(function (h) {
  132. return h.disabled || isAM(h.value);
  133. })
  134. }];
  135. }, [rowHourUnits, showMeridiem, generateConfig, locale]);
  136. // ========================= Change =========================
  137. /**
  138. * Check if time is validate or will match to validate one
  139. */
  140. var triggerChange = function triggerChange(nextDate) {
  141. var validateDate = getValidTime(nextDate);
  142. onSelect(validateDate);
  143. };
  144. // ========================= Column =========================
  145. // Create a template date for the trigger change event
  146. var triggerDateTmpl = React.useMemo(function () {
  147. var tmpl = value || pickerValue || generateConfig.getNow();
  148. var isNotNull = function isNotNull(num) {
  149. return num !== null && num !== undefined;
  150. };
  151. if (isNotNull(hour)) {
  152. tmpl = generateConfig.setHour(tmpl, hour);
  153. tmpl = generateConfig.setMinute(tmpl, minute);
  154. tmpl = generateConfig.setSecond(tmpl, second);
  155. tmpl = generateConfig.setMillisecond(tmpl, millisecond);
  156. } else if (isNotNull(pickerHour)) {
  157. tmpl = generateConfig.setHour(tmpl, pickerHour);
  158. tmpl = generateConfig.setMinute(tmpl, pickerMinute);
  159. tmpl = generateConfig.setSecond(tmpl, pickerSecond);
  160. tmpl = generateConfig.setMillisecond(tmpl, pickerMillisecond);
  161. } else if (isNotNull(validHour)) {
  162. tmpl = generateConfig.setHour(tmpl, validHour);
  163. tmpl = generateConfig.setMinute(tmpl, validMinute);
  164. tmpl = generateConfig.setSecond(tmpl, validSecond);
  165. tmpl = generateConfig.setMillisecond(tmpl, validMillisecond);
  166. }
  167. return tmpl;
  168. }, [value, pickerValue, hour, minute, second, millisecond, validHour, validMinute, validSecond, validMillisecond, pickerHour, pickerMinute, pickerSecond, pickerMillisecond, generateConfig]);
  169. // ===================== Columns Change =====================
  170. var fillColumnValue = function fillColumnValue(val, func) {
  171. if (val === null) {
  172. return null;
  173. }
  174. return generateConfig[func](triggerDateTmpl, val);
  175. };
  176. var getNextHourTime = function getNextHourTime(val) {
  177. return fillColumnValue(val, 'setHour');
  178. };
  179. var getNextMinuteTime = function getNextMinuteTime(val) {
  180. return fillColumnValue(val, 'setMinute');
  181. };
  182. var getNextSecondTime = function getNextSecondTime(val) {
  183. return fillColumnValue(val, 'setSecond');
  184. };
  185. var getNextMillisecondTime = function getNextMillisecondTime(val) {
  186. return fillColumnValue(val, 'setMillisecond');
  187. };
  188. var getMeridiemTime = function getMeridiemTime(val) {
  189. if (val === null) {
  190. return null;
  191. }
  192. if (val === 'am' && !isAM(hour)) {
  193. return generateConfig.setHour(triggerDateTmpl, hour - 12);
  194. } else if (val === 'pm' && isAM(hour)) {
  195. return generateConfig.setHour(triggerDateTmpl, hour + 12);
  196. }
  197. return triggerDateTmpl;
  198. };
  199. var onHourChange = function onHourChange(val) {
  200. triggerChange(getNextHourTime(val));
  201. };
  202. var onMinuteChange = function onMinuteChange(val) {
  203. triggerChange(getNextMinuteTime(val));
  204. };
  205. var onSecondChange = function onSecondChange(val) {
  206. triggerChange(getNextSecondTime(val));
  207. };
  208. var onMillisecondChange = function onMillisecondChange(val) {
  209. triggerChange(getNextMillisecondTime(val));
  210. };
  211. var onMeridiemChange = function onMeridiemChange(val) {
  212. triggerChange(getMeridiemTime(val));
  213. };
  214. // ====================== Column Hover ======================
  215. var onHourHover = function onHourHover(val) {
  216. onHover(getNextHourTime(val));
  217. };
  218. var onMinuteHover = function onMinuteHover(val) {
  219. onHover(getNextMinuteTime(val));
  220. };
  221. var onSecondHover = function onSecondHover(val) {
  222. onHover(getNextSecondTime(val));
  223. };
  224. var onMillisecondHover = function onMillisecondHover(val) {
  225. onHover(getNextMillisecondTime(val));
  226. };
  227. var onMeridiemHover = function onMeridiemHover(val) {
  228. onHover(getMeridiemTime(val));
  229. };
  230. // ========================= Render =========================
  231. var sharedColumnProps = {
  232. onDblClick: onCellDblClick,
  233. changeOnScroll: changeOnScroll
  234. };
  235. return /*#__PURE__*/React.createElement("div", {
  236. className: "".concat(prefixCls, "-content")
  237. }, showHour && /*#__PURE__*/React.createElement(_TimeColumn.default, (0, _extends2.default)({
  238. units: hourUnits,
  239. value: hour,
  240. optionalValue: pickerHour,
  241. type: "hour",
  242. onChange: onHourChange,
  243. onHover: onHourHover
  244. }, sharedColumnProps)), showMinute && /*#__PURE__*/React.createElement(_TimeColumn.default, (0, _extends2.default)({
  245. units: minuteUnits,
  246. value: minute,
  247. optionalValue: pickerMinute,
  248. type: "minute",
  249. onChange: onMinuteChange,
  250. onHover: onMinuteHover
  251. }, sharedColumnProps)), showSecond && /*#__PURE__*/React.createElement(_TimeColumn.default, (0, _extends2.default)({
  252. units: secondUnits,
  253. value: second,
  254. optionalValue: pickerSecond,
  255. type: "second",
  256. onChange: onSecondChange,
  257. onHover: onSecondHover
  258. }, sharedColumnProps)), showMillisecond && /*#__PURE__*/React.createElement(_TimeColumn.default, (0, _extends2.default)({
  259. units: millisecondUnits,
  260. value: millisecond,
  261. optionalValue: pickerMillisecond,
  262. type: "millisecond",
  263. onChange: onMillisecondChange,
  264. onHover: onMillisecondHover
  265. }, sharedColumnProps)), showMeridiem && /*#__PURE__*/React.createElement(_TimeColumn.default, (0, _extends2.default)({
  266. units: meridiemUnits,
  267. value: meridiem,
  268. type: "meridiem",
  269. onChange: onMeridiemChange,
  270. onHover: onMeridiemHover
  271. }, sharedColumnProps)));
  272. }