index.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. import _extends from "@babel/runtime/helpers/esm/extends";
  3. import { createVNode as _createVNode } from "vue";
  4. import DatePanel from '../DatePanel';
  5. import TimePanel from '../TimePanel';
  6. import { tuple } from '../../utils/miscUtil';
  7. import { setDateTime as setTime } from '../../utils/timeUtil';
  8. import KeyCode from '../../../_util/KeyCode';
  9. import classNames from '../../../_util/classNames';
  10. import { ref } from 'vue';
  11. import useMergeProps from '../../hooks/useMergeProps';
  12. const ACTIVE_PANEL = tuple('date', 'time');
  13. function DatetimePanel(_props) {
  14. const props = useMergeProps(_props);
  15. const {
  16. prefixCls,
  17. operationRef,
  18. generateConfig,
  19. value,
  20. defaultValue,
  21. disabledTime,
  22. showTime,
  23. onSelect
  24. } = props;
  25. const panelPrefixCls = `${prefixCls}-datetime-panel`;
  26. const activePanel = ref(null);
  27. const dateOperationRef = ref({});
  28. const timeOperationRef = ref({});
  29. const timeProps = typeof showTime === 'object' ? _extends({}, showTime) : {};
  30. // ======================= Keyboard =======================
  31. function getNextActive(offset) {
  32. const activeIndex = ACTIVE_PANEL.indexOf(activePanel.value) + offset;
  33. const nextActivePanel = ACTIVE_PANEL[activeIndex] || null;
  34. return nextActivePanel;
  35. }
  36. const onBlur = e => {
  37. if (timeOperationRef.value.onBlur) {
  38. timeOperationRef.value.onBlur(e);
  39. }
  40. activePanel.value = null;
  41. };
  42. operationRef.value = {
  43. onKeydown: event => {
  44. // Switch active panel
  45. if (event.which === KeyCode.TAB) {
  46. const nextActivePanel = getNextActive(event.shiftKey ? -1 : 1);
  47. activePanel.value = nextActivePanel;
  48. if (nextActivePanel) {
  49. event.preventDefault();
  50. }
  51. return true;
  52. }
  53. // Operate on current active panel
  54. if (activePanel.value) {
  55. const ref = activePanel.value === 'date' ? dateOperationRef : timeOperationRef;
  56. if (ref.value && ref.value.onKeydown) {
  57. ref.value.onKeydown(event);
  58. }
  59. return true;
  60. }
  61. // Switch first active panel if operate without panel
  62. if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN].includes(event.which)) {
  63. activePanel.value = 'date';
  64. return true;
  65. }
  66. return false;
  67. },
  68. onBlur,
  69. onClose: onBlur
  70. };
  71. // ======================== Events ========================
  72. const onInternalSelect = (date, source) => {
  73. let selectedDate = date;
  74. if (source === 'date' && !value && timeProps.defaultValue) {
  75. // Date with time defaultValue
  76. selectedDate = generateConfig.setHour(selectedDate, generateConfig.getHour(timeProps.defaultValue));
  77. selectedDate = generateConfig.setMinute(selectedDate, generateConfig.getMinute(timeProps.defaultValue));
  78. selectedDate = generateConfig.setSecond(selectedDate, generateConfig.getSecond(timeProps.defaultValue));
  79. } else if (source === 'time' && !value && defaultValue) {
  80. selectedDate = generateConfig.setYear(selectedDate, generateConfig.getYear(defaultValue));
  81. selectedDate = generateConfig.setMonth(selectedDate, generateConfig.getMonth(defaultValue));
  82. selectedDate = generateConfig.setDate(selectedDate, generateConfig.getDate(defaultValue));
  83. }
  84. if (onSelect) {
  85. onSelect(selectedDate, 'mouse');
  86. }
  87. };
  88. // ======================== Render ========================
  89. const disabledTimes = disabledTime ? disabledTime(value || null) : {};
  90. return _createVNode("div", {
  91. "class": classNames(panelPrefixCls, {
  92. [`${panelPrefixCls}-active`]: activePanel.value
  93. })
  94. }, [_createVNode(DatePanel, _objectSpread(_objectSpread({}, props), {}, {
  95. "operationRef": dateOperationRef,
  96. "active": activePanel.value === 'date',
  97. "onSelect": date => {
  98. onInternalSelect(setTime(generateConfig, date, !value && typeof showTime === 'object' ? showTime.defaultValue : null), 'date');
  99. }
  100. }), null), _createVNode(TimePanel, _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, props), {}, {
  101. "format": undefined
  102. }, timeProps), disabledTimes), {}, {
  103. "disabledTime": null,
  104. "defaultValue": undefined,
  105. "operationRef": timeOperationRef,
  106. "active": activePanel.value === 'time',
  107. "onSelect": date => {
  108. onInternalSelect(date, 'time');
  109. }
  110. }), null)]);
  111. }
  112. DatetimePanel.displayName = 'DatetimePanel';
  113. DatetimePanel.inheritAttrs = false;
  114. export default DatetimePanel;