PickerPanel.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _TimePanel = _interopRequireDefault(require("./panels/TimePanel"));
  11. var _DatetimePanel = _interopRequireDefault(require("./panels/DatetimePanel"));
  12. var _DatePanel = _interopRequireDefault(require("./panels/DatePanel"));
  13. var _WeekPanel = _interopRequireDefault(require("./panels/WeekPanel"));
  14. var _MonthPanel = _interopRequireDefault(require("./panels/MonthPanel"));
  15. var _QuarterPanel = _interopRequireDefault(require("./panels/QuarterPanel"));
  16. var _YearPanel = _interopRequireDefault(require("./panels/YearPanel"));
  17. var _DecadePanel = _interopRequireDefault(require("./panels/DecadePanel"));
  18. var _dateUtil = require("./utils/dateUtil");
  19. var _PanelContext = require("./PanelContext");
  20. var _uiUtil = require("./utils/uiUtil");
  21. var _RangeContext = require("./RangeContext");
  22. var _getExtraFooter = _interopRequireDefault(require("./utils/getExtraFooter"));
  23. var _getRanges = _interopRequireDefault(require("./utils/getRanges"));
  24. var _timeUtil = require("./utils/timeUtil");
  25. var _useMergedState = _interopRequireDefault(require("../_util/hooks/useMergedState"));
  26. var _warning = require("../vc-util/warning");
  27. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  28. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  29. function PickerPanel() {
  30. return (0, _vue.defineComponent)({
  31. name: 'PickerPanel',
  32. inheritAttrs: false,
  33. props: {
  34. prefixCls: String,
  35. locale: Object,
  36. generateConfig: Object,
  37. value: Object,
  38. defaultValue: Object,
  39. pickerValue: Object,
  40. defaultPickerValue: Object,
  41. disabledDate: Function,
  42. mode: String,
  43. picker: {
  44. type: String,
  45. default: 'date'
  46. },
  47. tabindex: {
  48. type: [Number, String],
  49. default: 0
  50. },
  51. showNow: {
  52. type: Boolean,
  53. default: undefined
  54. },
  55. showTime: [Boolean, Object],
  56. showToday: Boolean,
  57. renderExtraFooter: Function,
  58. dateRender: Function,
  59. hideHeader: {
  60. type: Boolean,
  61. default: undefined
  62. },
  63. onSelect: Function,
  64. onChange: Function,
  65. onPanelChange: Function,
  66. onMousedown: Function,
  67. onPickerValueChange: Function,
  68. onOk: Function,
  69. components: Object,
  70. direction: String,
  71. hourStep: {
  72. type: Number,
  73. default: 1
  74. },
  75. minuteStep: {
  76. type: Number,
  77. default: 1
  78. },
  79. secondStep: {
  80. type: Number,
  81. default: 1
  82. }
  83. },
  84. setup(props, _ref) {
  85. let {
  86. attrs
  87. } = _ref;
  88. const needConfirmButton = (0, _vue.computed)(() => props.picker === 'date' && !!props.showTime || props.picker === 'time');
  89. const isHourStepValid = (0, _vue.computed)(() => 24 % props.hourStep === 0);
  90. const isMinuteStepValid = (0, _vue.computed)(() => 60 % props.minuteStep === 0);
  91. const isSecondStepValid = (0, _vue.computed)(() => 60 % props.secondStep === 0);
  92. if (process.env.NODE_ENV !== 'production') {
  93. (0, _vue.watchEffect)(() => {
  94. const {
  95. generateConfig,
  96. value,
  97. hourStep = 1,
  98. minuteStep = 1,
  99. secondStep = 1
  100. } = props;
  101. (0, _warning.warning)(!value || generateConfig.isValidate(value), 'Invalidate date pass to `value`.');
  102. (0, _warning.warning)(!value || generateConfig.isValidate(value), 'Invalidate date pass to `defaultValue`.');
  103. (0, _warning.warning)(isHourStepValid.value, `\`hourStep\` ${hourStep} is invalid. It should be a factor of 24.`);
  104. (0, _warning.warning)(isMinuteStepValid.value, `\`minuteStep\` ${minuteStep} is invalid. It should be a factor of 60.`);
  105. (0, _warning.warning)(isSecondStepValid.value, `\`secondStep\` ${secondStep} is invalid. It should be a factor of 60.`);
  106. });
  107. }
  108. const panelContext = (0, _PanelContext.useInjectPanel)();
  109. const {
  110. operationRef,
  111. onSelect: onContextSelect,
  112. hideRanges,
  113. defaultOpenValue
  114. } = panelContext;
  115. const {
  116. inRange,
  117. panelPosition,
  118. rangedValue,
  119. hoverRangedValue
  120. } = (0, _RangeContext.useInjectRange)();
  121. const panelRef = (0, _vue.ref)({});
  122. // Value
  123. const [mergedValue, setInnerValue] = (0, _useMergedState.default)(null, {
  124. value: (0, _vue.toRef)(props, 'value'),
  125. defaultValue: props.defaultValue,
  126. postState: val => {
  127. if (!val && (defaultOpenValue === null || defaultOpenValue === void 0 ? void 0 : defaultOpenValue.value) && props.picker === 'time') {
  128. return defaultOpenValue.value;
  129. }
  130. return val;
  131. }
  132. });
  133. // View date control
  134. const [viewDate, setInnerViewDate] = (0, _useMergedState.default)(null, {
  135. value: (0, _vue.toRef)(props, 'pickerValue'),
  136. defaultValue: props.defaultPickerValue || mergedValue.value,
  137. postState: date => {
  138. const {
  139. generateConfig,
  140. showTime,
  141. defaultValue
  142. } = props;
  143. const now = generateConfig.getNow();
  144. if (!date) return now;
  145. // When value is null and set showTime
  146. if (!mergedValue.value && props.showTime) {
  147. if (typeof showTime === 'object') {
  148. return (0, _timeUtil.setDateTime)(generateConfig, Array.isArray(date) ? date[0] : date, showTime.defaultValue || now);
  149. }
  150. if (defaultValue) {
  151. return (0, _timeUtil.setDateTime)(generateConfig, Array.isArray(date) ? date[0] : date, defaultValue);
  152. }
  153. return (0, _timeUtil.setDateTime)(generateConfig, Array.isArray(date) ? date[0] : date, now);
  154. }
  155. return date;
  156. }
  157. });
  158. const setViewDate = date => {
  159. setInnerViewDate(date);
  160. if (props.onPickerValueChange) {
  161. props.onPickerValueChange(date);
  162. }
  163. };
  164. // Panel control
  165. const getInternalNextMode = nextMode => {
  166. const getNextMode = _uiUtil.PickerModeMap[props.picker];
  167. if (getNextMode) {
  168. return getNextMode(nextMode);
  169. }
  170. return nextMode;
  171. };
  172. // Save panel is changed from which panel
  173. const [mergedMode, setInnerMode] = (0, _useMergedState.default)(() => {
  174. if (props.picker === 'time') {
  175. return 'time';
  176. }
  177. return getInternalNextMode('date');
  178. }, {
  179. value: (0, _vue.toRef)(props, 'mode')
  180. });
  181. (0, _vue.watch)(() => props.picker, () => {
  182. setInnerMode(props.picker);
  183. });
  184. const sourceMode = (0, _vue.ref)(mergedMode.value);
  185. const setSourceMode = val => {
  186. sourceMode.value = val;
  187. };
  188. const onInternalPanelChange = (newMode, viewValue) => {
  189. const {
  190. onPanelChange,
  191. generateConfig
  192. } = props;
  193. const nextMode = getInternalNextMode(newMode || mergedMode.value);
  194. setSourceMode(mergedMode.value);
  195. setInnerMode(nextMode);
  196. if (onPanelChange && (mergedMode.value !== nextMode || (0, _dateUtil.isEqual)(generateConfig, viewDate.value, viewDate.value))) {
  197. onPanelChange(viewValue, nextMode);
  198. }
  199. };
  200. const triggerSelect = function (date, type) {
  201. let forceTriggerSelect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  202. const {
  203. picker,
  204. generateConfig,
  205. onSelect,
  206. onChange,
  207. disabledDate
  208. } = props;
  209. if (mergedMode.value === picker || forceTriggerSelect) {
  210. setInnerValue(date);
  211. if (onSelect) {
  212. onSelect(date);
  213. }
  214. if (onContextSelect) {
  215. onContextSelect(date, type);
  216. }
  217. if (onChange && !(0, _dateUtil.isEqual)(generateConfig, date, mergedValue.value) && !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date))) {
  218. onChange(date);
  219. }
  220. }
  221. };
  222. // ========================= Interactive ==========================
  223. const onInternalKeydown = e => {
  224. if (panelRef.value && panelRef.value.onKeydown) {
  225. if ([_KeyCode.default.LEFT, _KeyCode.default.RIGHT, _KeyCode.default.UP, _KeyCode.default.DOWN, _KeyCode.default.PAGE_UP, _KeyCode.default.PAGE_DOWN, _KeyCode.default.ENTER].includes(e.which)) {
  226. e.preventDefault();
  227. }
  228. return panelRef.value.onKeydown(e);
  229. }
  230. /* istanbul ignore next */
  231. /* eslint-disable no-lone-blocks */
  232. {
  233. (0, _warning.warning)(false, 'Panel not correct handle keyDown event. Please help to fire issue about this.');
  234. return false;
  235. }
  236. /* eslint-enable no-lone-blocks */
  237. };
  238. const onInternalBlur = e => {
  239. if (panelRef.value && panelRef.value.onBlur) {
  240. panelRef.value.onBlur(e);
  241. }
  242. };
  243. const onNow = () => {
  244. const {
  245. generateConfig,
  246. hourStep,
  247. minuteStep,
  248. secondStep
  249. } = props;
  250. const now = generateConfig.getNow();
  251. const lowerBoundTime = (0, _timeUtil.getLowerBoundTime)(generateConfig.getHour(now), generateConfig.getMinute(now), generateConfig.getSecond(now), isHourStepValid.value ? hourStep : 1, isMinuteStepValid.value ? minuteStep : 1, isSecondStepValid.value ? secondStep : 1);
  252. const adjustedNow = (0, _timeUtil.setTime)(generateConfig, now, lowerBoundTime[0],
  253. // hour
  254. lowerBoundTime[1],
  255. // minute
  256. lowerBoundTime[2]);
  257. triggerSelect(adjustedNow, 'submit');
  258. };
  259. const classString = (0, _vue.computed)(() => {
  260. const {
  261. prefixCls,
  262. direction
  263. } = props;
  264. return (0, _classNames.default)(`${prefixCls}-panel`, {
  265. [`${prefixCls}-panel-has-range`]: rangedValue && rangedValue.value && rangedValue.value[0] && rangedValue.value[1],
  266. [`${prefixCls}-panel-has-range-hover`]: hoverRangedValue && hoverRangedValue.value && hoverRangedValue.value[0] && hoverRangedValue.value[1],
  267. [`${prefixCls}-panel-rtl`]: direction === 'rtl'
  268. });
  269. });
  270. (0, _PanelContext.useProvidePanel)((0, _extends2.default)((0, _extends2.default)({}, panelContext), {
  271. mode: mergedMode,
  272. hideHeader: (0, _vue.computed)(() => {
  273. var _a;
  274. return props.hideHeader !== undefined ? props.hideHeader : (_a = panelContext.hideHeader) === null || _a === void 0 ? void 0 : _a.value;
  275. }),
  276. hidePrevBtn: (0, _vue.computed)(() => inRange.value && panelPosition.value === 'right'),
  277. hideNextBtn: (0, _vue.computed)(() => inRange.value && panelPosition.value === 'left')
  278. }));
  279. (0, _vue.watch)(() => props.value, () => {
  280. if (props.value) {
  281. setInnerViewDate(props.value);
  282. }
  283. });
  284. return () => {
  285. const {
  286. prefixCls = 'ant-picker',
  287. locale,
  288. generateConfig,
  289. disabledDate,
  290. picker = 'date',
  291. tabindex = 0,
  292. showNow,
  293. showTime,
  294. showToday,
  295. renderExtraFooter,
  296. onMousedown,
  297. onOk,
  298. components
  299. } = props;
  300. if (operationRef && panelPosition.value !== 'right') {
  301. operationRef.value = {
  302. onKeydown: onInternalKeydown,
  303. onClose: () => {
  304. if (panelRef.value && panelRef.value.onClose) {
  305. panelRef.value.onClose();
  306. }
  307. }
  308. };
  309. }
  310. // ============================ Panels ============================
  311. let panelNode;
  312. const pickerProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({}, attrs), props), {
  313. operationRef: panelRef,
  314. prefixCls,
  315. viewDate: viewDate.value,
  316. value: mergedValue.value,
  317. onViewDateChange: setViewDate,
  318. sourceMode: sourceMode.value,
  319. onPanelChange: onInternalPanelChange,
  320. disabledDate
  321. });
  322. delete pickerProps.onChange;
  323. delete pickerProps.onSelect;
  324. switch (mergedMode.value) {
  325. case 'decade':
  326. panelNode = (0, _vue.createVNode)(_DecadePanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  327. "onSelect": (date, type) => {
  328. setViewDate(date);
  329. triggerSelect(date, type);
  330. }
  331. }), null);
  332. break;
  333. case 'year':
  334. panelNode = (0, _vue.createVNode)(_YearPanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  335. "onSelect": (date, type) => {
  336. setViewDate(date);
  337. triggerSelect(date, type);
  338. }
  339. }), null);
  340. break;
  341. case 'month':
  342. panelNode = (0, _vue.createVNode)(_MonthPanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  343. "onSelect": (date, type) => {
  344. setViewDate(date);
  345. triggerSelect(date, type);
  346. }
  347. }), null);
  348. break;
  349. case 'quarter':
  350. panelNode = (0, _vue.createVNode)(_QuarterPanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  351. "onSelect": (date, type) => {
  352. setViewDate(date);
  353. triggerSelect(date, type);
  354. }
  355. }), null);
  356. break;
  357. case 'week':
  358. panelNode = (0, _vue.createVNode)(_WeekPanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  359. "onSelect": (date, type) => {
  360. setViewDate(date);
  361. triggerSelect(date, type);
  362. }
  363. }), null);
  364. break;
  365. case 'time':
  366. delete pickerProps.showTime;
  367. panelNode = (0, _vue.createVNode)(_TimePanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), typeof showTime === 'object' ? showTime : null), {}, {
  368. "onSelect": (date, type) => {
  369. setViewDate(date);
  370. triggerSelect(date, type);
  371. }
  372. }), null);
  373. break;
  374. default:
  375. if (showTime) {
  376. panelNode = (0, _vue.createVNode)(_DatetimePanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  377. "onSelect": (date, type) => {
  378. setViewDate(date);
  379. triggerSelect(date, type);
  380. }
  381. }), null);
  382. } else {
  383. panelNode = (0, _vue.createVNode)(_DatePanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pickerProps), {}, {
  384. "onSelect": (date, type) => {
  385. setViewDate(date);
  386. triggerSelect(date, type);
  387. }
  388. }), null);
  389. }
  390. }
  391. // ============================ Footer ============================
  392. let extraFooter;
  393. let rangesNode;
  394. if (!(hideRanges === null || hideRanges === void 0 ? void 0 : hideRanges.value)) {
  395. extraFooter = (0, _getExtraFooter.default)(prefixCls, mergedMode.value, renderExtraFooter);
  396. rangesNode = (0, _getRanges.default)({
  397. prefixCls,
  398. components,
  399. needConfirmButton: needConfirmButton.value,
  400. okDisabled: !mergedValue.value || disabledDate && disabledDate(mergedValue.value),
  401. locale,
  402. showNow,
  403. onNow: needConfirmButton.value && onNow,
  404. onOk: () => {
  405. if (mergedValue.value) {
  406. triggerSelect(mergedValue.value, 'submit', true);
  407. if (onOk) {
  408. onOk(mergedValue.value);
  409. }
  410. }
  411. }
  412. });
  413. }
  414. let todayNode;
  415. if (showToday && mergedMode.value === 'date' && picker === 'date' && !showTime) {
  416. const now = generateConfig.getNow();
  417. const todayCls = `${prefixCls}-today-btn`;
  418. const disabled = disabledDate && disabledDate(now);
  419. todayNode = (0, _vue.createVNode)("a", {
  420. "class": (0, _classNames.default)(todayCls, disabled && `${todayCls}-disabled`),
  421. "aria-disabled": disabled,
  422. "onClick": () => {
  423. if (!disabled) {
  424. triggerSelect(now, 'mouse', true);
  425. }
  426. }
  427. }, [locale.today]);
  428. }
  429. return (0, _vue.createVNode)("div", {
  430. "tabindex": tabindex,
  431. "class": (0, _classNames.default)(classString.value, attrs.class),
  432. "style": attrs.style,
  433. "onKeydown": onInternalKeydown,
  434. "onBlur": onInternalBlur,
  435. "onMousedown": onMousedown
  436. }, [panelNode, extraFooter || rangesNode || todayNode ? (0, _vue.createVNode)("div", {
  437. "class": `${prefixCls}-footer`
  438. }, [extraFooter, rangesNode, todayNode]) : null]);
  439. };
  440. }
  441. });
  442. }
  443. const InterPickerPanel = PickerPanel();
  444. var _default = props => (0, _vue.createVNode)(InterPickerPanel, props);
  445. exports.default = _default;