@mui/x-date-pickers-pro 6.0.0-alpha.10 → 6.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +241 -0
  2. package/DateRangeCalendar/DateRangeCalendar.d.ts +1 -1
  3. package/DateRangeCalendar/DateRangeCalendar.js +220 -108
  4. package/DateRangeCalendar/DateRangeCalendar.types.d.ts +21 -10
  5. package/DateRangeCalendar/dateRangeCalendarClasses.d.ts +3 -1
  6. package/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
  7. package/DateRangeCalendar/useDragRange.d.ts +32 -0
  8. package/DateRangeCalendar/useDragRange.js +238 -0
  9. package/DateRangePicker/DateRangePicker.d.ts +1 -1
  10. package/DateRangePicker/DateRangePicker.js +0 -1
  11. package/DateRangePicker/DateRangePickerInput.d.ts +3 -3
  12. package/DateRangePicker/DateRangePickerInput.js +16 -16
  13. package/DateRangePicker/DateRangePickerToolbar.d.ts +2 -2
  14. package/DateRangePicker/DateRangePickerToolbar.js +6 -6
  15. package/DateRangePicker/DateRangePickerView.d.ts +3 -3
  16. package/DateRangePicker/DateRangePickerView.js +16 -16
  17. package/DateRangePicker/DateRangePickerViewDesktop.d.ts +2 -2
  18. package/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
  19. package/DateRangePicker/date-range-manager.d.ts +12 -5
  20. package/DateRangePicker/date-range-manager.js +16 -7
  21. package/DateRangePicker/dateRangePickerInputClasses.d.ts +1 -1
  22. package/DateRangePicker/dateRangePickerToolbarClasses.d.ts +1 -1
  23. package/DateRangePicker/dateRangePickerViewDesktopClasses.d.ts +1 -1
  24. package/DateRangePickerDay/DateRangePickerDay.d.ts +7 -3
  25. package/DateRangePickerDay/DateRangePickerDay.js +24 -24
  26. package/DateRangePickerDay/dateRangePickerDayClasses.d.ts +3 -3
  27. package/DesktopDateRangePicker/DesktopDateRangePicker.d.ts +1 -1
  28. package/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -6
  29. package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.d.ts +1 -1
  30. package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -2
  31. package/DesktopNextDateRangePicker/DesktopNextDateRangePicker.types.d.ts +1 -1
  32. package/MobileDateRangePicker/MobileDateRangePicker.d.ts +1 -1
  33. package/MobileDateRangePicker/MobileDateRangePicker.js +5 -6
  34. package/MobileNextDateRangePicker/MobileNextDateRangePicker.d.ts +1 -1
  35. package/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -2
  36. package/MobileNextDateRangePicker/MobileNextDateRangePicker.types.d.ts +1 -1
  37. package/MultiInputDateRangeField/MultiInputDateRangeField.d.ts +1 -1
  38. package/MultiInputDateRangeField/MultiInputDateRangeField.js +10 -3
  39. package/MultiInputDateRangeField/MultiInputDateRangeField.types.d.ts +7 -4
  40. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.d.ts +1 -1
  41. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.d.ts +5 -4
  42. package/MultiInputTimeRangeField/MultiInputTimeRangeField.d.ts +1 -1
  43. package/MultiInputTimeRangeField/MultiInputTimeRangeField.types.d.ts +5 -4
  44. package/NextDateRangePicker/NextDateRangePicker.d.ts +1 -1
  45. package/NextDateRangePicker/NextDateRangePicker.js +5 -0
  46. package/NextDateRangePicker/shared.d.ts +1 -1
  47. package/SingleInputDateRangeField/SingleInputDateRangeField.d.ts +1 -1
  48. package/SingleInputDateRangeField/SingleInputDateRangeField.interfaces.d.ts +2 -2
  49. package/SingleInputDateRangeField/SingleInputDateRangeField.types.d.ts +3 -3
  50. package/SingleInputDateRangeField/useSingleInputDateRangeField.d.ts +1 -1
  51. package/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
  52. package/StaticDateRangePicker/StaticDateRangePicker.d.ts +1 -1
  53. package/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
  54. package/StaticNextDateRangePicker/StaticNextDateRangePicker.d.ts +1 -1
  55. package/StaticNextDateRangePicker/StaticNextDateRangePicker.js +8 -3
  56. package/StaticNextDateRangePicker/StaticNextDateRangePicker.types.d.ts +5 -4
  57. package/index.d.ts +1 -1
  58. package/index.js +1 -1
  59. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +19 -7
  60. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +7 -8
  61. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -7
  62. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +7 -8
  63. package/internal/hooks/useMultiInputRangeField/useMultiInputRangeField.types.d.ts +1 -1
  64. package/internal/hooks/useRangePickerInputProps.d.ts +6 -4
  65. package/internal/hooks/useRangePickerInputProps.js +17 -15
  66. package/internal/hooks/useStaticRangePicker/index.d.ts +2 -0
  67. package/internal/hooks/useStaticRangePicker/index.js +1 -0
  68. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.d.ts +10 -0
  69. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +67 -0
  70. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.d.ts +29 -0
  71. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
  72. package/internal/hooks/validation/useDateRangeValidation.d.ts +2 -3
  73. package/internal/hooks/validation/useDateRangeValidation.js +0 -1
  74. package/internal/hooks/validation/useDateTimeRangeValidation.d.ts +2 -3
  75. package/internal/hooks/validation/useDateTimeRangeValidation.js +0 -1
  76. package/internal/hooks/validation/useTimeRangeValidation.d.ts +2 -3
  77. package/internal/hooks/validation/useTimeRangeValidation.js +0 -1
  78. package/internal/models/dateRange.d.ts +2 -3
  79. package/internal/models/dateTimeRange.d.ts +2 -3
  80. package/internal/models/fields.d.ts +6 -1
  81. package/internal/models/range.d.ts +6 -9
  82. package/internal/models/timeRange.d.ts +2 -3
  83. package/internal/utils/date-fields-utils.d.ts +5 -5
  84. package/internal/utils/releaseInfo.js +1 -1
  85. package/internal/utils/valueManagers.d.ts +5 -5
  86. package/internal/utils/valueManagers.js +11 -7
  87. package/internal/utils/{views.d.ts → viewRenderers.d.ts} +1 -1
  88. package/{modern/internal/utils/views.js → internal/utils/viewRenderers.js} +10 -6
  89. package/legacy/DateRangeCalendar/DateRangeCalendar.js +188 -69
  90. package/legacy/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
  91. package/legacy/DateRangeCalendar/useDragRange.js +247 -0
  92. package/legacy/DateRangePicker/DateRangePicker.js +0 -1
  93. package/legacy/DateRangePicker/DateRangePickerInput.js +16 -16
  94. package/legacy/DateRangePicker/DateRangePickerToolbar.js +7 -7
  95. package/legacy/DateRangePicker/DateRangePickerView.js +16 -16
  96. package/legacy/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
  97. package/legacy/DateRangePicker/date-range-manager.js +17 -7
  98. package/legacy/DateRangePickerDay/DateRangePickerDay.js +23 -23
  99. package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +6 -7
  100. package/legacy/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -2
  101. package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +6 -7
  102. package/legacy/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -2
  103. package/legacy/MultiInputDateRangeField/MultiInputDateRangeField.js +9 -2
  104. package/legacy/NextDateRangePicker/NextDateRangePicker.js +5 -0
  105. package/legacy/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
  106. package/legacy/StaticDateRangePicker/StaticDateRangePicker.js +6 -6
  107. package/legacy/StaticNextDateRangePicker/StaticNextDateRangePicker.js +9 -4
  108. package/legacy/index.js +1 -1
  109. package/legacy/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +20 -8
  110. package/legacy/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +18 -8
  111. package/legacy/internal/hooks/useRangePickerInputProps.js +17 -15
  112. package/legacy/internal/hooks/useStaticRangePicker/index.js +1 -0
  113. package/legacy/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +70 -0
  114. package/legacy/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
  115. package/legacy/internal/hooks/validation/useDateRangeValidation.js +0 -3
  116. package/legacy/internal/hooks/validation/useDateTimeRangeValidation.js +0 -3
  117. package/legacy/internal/hooks/validation/useTimeRangeValidation.js +0 -3
  118. package/legacy/internal/utils/releaseInfo.js +1 -1
  119. package/legacy/internal/utils/valueManagers.js +10 -6
  120. package/legacy/internal/utils/{views.js → viewRenderers.js} +10 -6
  121. package/modern/DateRangeCalendar/DateRangeCalendar.js +218 -107
  122. package/modern/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
  123. package/modern/DateRangeCalendar/useDragRange.js +237 -0
  124. package/modern/DateRangePicker/DateRangePicker.js +0 -1
  125. package/modern/DateRangePicker/DateRangePickerInput.js +16 -16
  126. package/modern/DateRangePicker/DateRangePickerToolbar.js +6 -6
  127. package/modern/DateRangePicker/DateRangePickerView.js +16 -16
  128. package/modern/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
  129. package/modern/DateRangePicker/date-range-manager.js +16 -7
  130. package/modern/DateRangePickerDay/DateRangePickerDay.js +24 -24
  131. package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -6
  132. package/modern/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +6 -2
  133. package/modern/MobileDateRangePicker/MobileDateRangePicker.js +5 -6
  134. package/modern/MobileNextDateRangePicker/MobileNextDateRangePicker.js +6 -2
  135. package/modern/MultiInputDateRangeField/MultiInputDateRangeField.js +10 -3
  136. package/modern/NextDateRangePicker/NextDateRangePicker.js +5 -0
  137. package/modern/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
  138. package/modern/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
  139. package/modern/StaticNextDateRangePicker/StaticNextDateRangePicker.js +8 -3
  140. package/modern/index.js +1 -1
  141. package/modern/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +19 -7
  142. package/modern/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -7
  143. package/modern/internal/hooks/useRangePickerInputProps.js +16 -15
  144. package/modern/internal/hooks/useStaticRangePicker/index.js +1 -0
  145. package/modern/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +67 -0
  146. package/modern/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +1 -0
  147. package/modern/internal/hooks/validation/useDateRangeValidation.js +0 -1
  148. package/modern/internal/hooks/validation/useDateTimeRangeValidation.js +0 -1
  149. package/modern/internal/hooks/validation/useTimeRangeValidation.js +0 -1
  150. package/modern/internal/utils/releaseInfo.js +1 -1
  151. package/modern/internal/utils/valueManagers.js +11 -7
  152. package/{internal/utils/views.js → modern/internal/utils/viewRenderers.js} +10 -6
  153. package/node/DateRangeCalendar/DateRangeCalendar.js +215 -104
  154. package/node/DateRangeCalendar/dateRangeCalendarClasses.js +1 -1
  155. package/node/DateRangeCalendar/useDragRange.js +247 -0
  156. package/node/DateRangePicker/DateRangePicker.js +0 -1
  157. package/node/DateRangePicker/DateRangePickerInput.js +16 -16
  158. package/node/DateRangePicker/DateRangePickerToolbar.js +6 -6
  159. package/node/DateRangePicker/DateRangePickerView.js +16 -16
  160. package/node/DateRangePicker/DateRangePickerViewDesktop.js +3 -3
  161. package/node/DateRangePicker/date-range-manager.js +16 -7
  162. package/node/DateRangePickerDay/DateRangePickerDay.js +23 -23
  163. package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -6
  164. package/node/DesktopNextDateRangePicker/DesktopNextDateRangePicker.js +7 -3
  165. package/node/MobileDateRangePicker/MobileDateRangePicker.js +5 -6
  166. package/node/MobileNextDateRangePicker/MobileNextDateRangePicker.js +7 -3
  167. package/node/MultiInputDateRangeField/MultiInputDateRangeField.js +10 -3
  168. package/node/NextDateRangePicker/NextDateRangePicker.js +5 -0
  169. package/node/SingleInputDateRangeField/useSingleInputDateRangeField.js +1 -2
  170. package/node/StaticDateRangePicker/StaticDateRangePicker.js +5 -5
  171. package/node/StaticNextDateRangePicker/StaticNextDateRangePicker.js +9 -4
  172. package/node/index.js +1 -1
  173. package/node/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +19 -7
  174. package/node/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +17 -7
  175. package/node/internal/hooks/useRangePickerInputProps.js +16 -15
  176. package/node/internal/hooks/useStaticRangePicker/index.js +12 -0
  177. package/node/internal/hooks/useStaticRangePicker/useStaticRangePicker.js +77 -0
  178. package/node/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.js +5 -0
  179. package/node/internal/hooks/validation/useDateRangeValidation.js +1 -3
  180. package/node/internal/hooks/validation/useDateTimeRangeValidation.js +1 -3
  181. package/node/internal/hooks/validation/useTimeRangeValidation.js +1 -3
  182. package/node/internal/utils/releaseInfo.js +1 -1
  183. package/node/internal/utils/valueManagers.js +12 -8
  184. package/node/internal/utils/{views.js → viewRenderers.js} +10 -6
  185. package/package.json +4 -4
  186. package/SingleInputDateRangeField/SingleInputDateRangeField.utils.d.ts +0 -6
  187. package/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -24
  188. package/legacy/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -26
  189. package/modern/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -24
  190. package/node/SingleInputDateRangeField/SingleInputDateRangeField.utils.js +0 -33
@@ -1,6 +1,7 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["value", "defaultValue", "onChange", "className", "disableFuture", "disablePast", "minDate", "maxDate", "shouldDisableDate", "reduceAnimations", "onMonthChange", "defaultCalendarMonth", "currentDatePosition", "onCurrentDatePositionChange", "calendars", "components", "componentsProps", "loading", "renderLoading", "disableHighlightToday", "readOnly", "disabled", "showDaysOutsideCurrentMonth", "dayOfWeekFormatter", "disableAutoMonthSwitching", "autoFocus", "fixedWeekNumber"];
3
+ const _excluded = ["value", "defaultValue", "onChange", "className", "disableFuture", "disablePast", "minDate", "maxDate", "shouldDisableDate", "reduceAnimations", "onMonthChange", "defaultCalendarMonth", "rangePosition", "onRangePositionChange", "calendars", "components", "componentsProps", "loading", "renderLoading", "disableHighlightToday", "readOnly", "disabled", "showDaysOutsideCurrentMonth", "dayOfWeekFormatter", "disableAutoMonthSwitching", "autoFocus", "fixedWeekNumber", "disableDragEditing", "displayWeekNumber"],
4
+ _excluded2 = ["isDragging", "rangeDragDay", "draggingDatePosition"];
4
5
  import * as React from 'react';
5
6
  import PropTypes from 'prop-types';
6
7
  import clsx from 'clsx';
@@ -10,13 +11,14 @@ import { resolveComponentProps } from '@mui/base/utils';
10
11
  import { styled, useThemeProps } from '@mui/material/styles';
11
12
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
12
13
  import { Watermark } from '@mui/x-license-pro';
13
- import { applyDefaultDate, DAY_MARGIN, DayCalendar, defaultReduceAnimations, PickersArrowSwitcher, PickersCalendarHeader, useCalendarState, useDefaultDates, useLocaleText, useNextMonthDisabled, usePreviousMonthDisabled, useUtils, WrapperVariantContext } from '@mui/x-date-pickers/internals';
14
+ import { applyDefaultDate, DAY_MARGIN, DayCalendar, defaultReduceAnimations, PickersArrowSwitcher, PickersCalendarHeader, useCalendarState, useDefaultDates, useLocaleText, useNextMonthDisabled, usePreviousMonthDisabled, useUtils, WrapperVariantContext, useNow } from '@mui/x-date-pickers/internals';
14
15
  import { getReleaseInfo } from '../internal/utils/releaseInfo';
15
- import { getDateRangeCalendarUtilityClass } from './dateRangeCalendarClasses';
16
+ import { dateRangeCalendarClasses, getDateRangeCalendarUtilityClass } from './dateRangeCalendarClasses';
16
17
  import { isEndOfRange, isRangeValid, isStartOfRange, isWithinRange } from '../internal/utils/date-utils';
17
18
  import { calculateRangeChange, calculateRangePreview } from '../DateRangePicker/date-range-manager';
18
- import { DateRangePickerDay } from '../DateRangePickerDay';
19
+ import { DateRangePickerDay, dateRangePickerDayClasses as dayClasses } from '../DateRangePickerDay';
19
20
  import { rangeValueManager } from '../internal/utils/valueManagers';
21
+ import { useDragRange } from './useDragRange';
20
22
  import { jsx as _jsx } from "react/jsx-runtime";
21
23
  import { jsxs as _jsxs } from "react/jsx-runtime";
22
24
  const releaseInfo = getReleaseInfo();
@@ -47,12 +49,30 @@ const DateRangeCalendarArrowSwitcher = styled(PickersArrowSwitcher)({
47
49
  });
48
50
  const DAY_RANGE_SIZE = 40;
49
51
  const weeksContainerHeight = (DAY_RANGE_SIZE + DAY_MARGIN * 2) * 6;
50
- const DayCalendarForRange = styled(DayCalendar)({
52
+ const DayCalendarForRange = styled(DayCalendar)(({
53
+ theme
54
+ }) => ({
51
55
  minWidth: 312,
52
- minHeight: weeksContainerHeight
53
- });
56
+ minHeight: weeksContainerHeight,
57
+ [`&.${dateRangeCalendarClasses.dayDragging}`]: {
58
+ [`& .${dayClasses.day}`]: {
59
+ cursor: 'grabbing'
60
+ },
61
+ [`& .${dayClasses.root}:not(.${dayClasses.rangeIntervalDayHighlightStart}):not(.${dayClasses.rangeIntervalDayHighlightEnd}) .${dayClasses.day}:not(.${dayClasses.notSelectedDate})`]: {
62
+ // we can't override `PickersDay` background color here, because it's styles take precedence
63
+ opacity: 0.6
64
+ }
65
+ },
66
+ [`&:not(.${dateRangeCalendarClasses.dayDragging}) .${dayClasses.dayOutsideRangeInterval}`]: {
67
+ '@media (pointer: fine)': {
68
+ '&:hover': {
69
+ border: `1px solid ${(theme.vars || theme).palette.grey[500]}`
70
+ }
71
+ }
72
+ }
73
+ }));
54
74
  function useDateRangeCalendarDefaultizedProps(props, name) {
55
- var _themeProps$renderLoa, _themeProps$reduceAni, _props$loading, _props$disablePast, _props$disableFuture, _themeProps$calendars;
75
+ var _themeProps$renderLoa, _themeProps$reduceAni, _props$loading, _props$disablePast, _props$disableFuture, _themeProps$calendars, _themeProps$disableDr;
56
76
  const utils = useUtils();
57
77
  const defaultDates = useDefaultDates();
58
78
  const themeProps = useThemeProps({
@@ -69,25 +89,27 @@ function useDateRangeCalendarDefaultizedProps(props, name) {
69
89
  disableFuture: (_props$disableFuture = props.disableFuture) != null ? _props$disableFuture : false,
70
90
  minDate: applyDefaultDate(utils, themeProps.minDate, defaultDates.minDate),
71
91
  maxDate: applyDefaultDate(utils, themeProps.maxDate, defaultDates.maxDate),
72
- calendars: (_themeProps$calendars = themeProps.calendars) != null ? _themeProps$calendars : 2
92
+ calendars: (_themeProps$calendars = themeProps.calendars) != null ? _themeProps$calendars : 2,
93
+ disableDragEditing: (_themeProps$disableDr = themeProps.disableDragEditing) != null ? _themeProps$disableDr : false
73
94
  });
74
95
  }
75
96
  const useUtilityClasses = ownerState => {
76
97
  const {
77
- classes
98
+ classes,
99
+ isDragging
78
100
  } = ownerState;
79
101
  const slots = {
80
102
  root: ['root'],
81
- monthContainer: ['monthContainer']
103
+ monthContainer: ['monthContainer'],
104
+ dayCalendar: [isDragging && 'dayDragging']
82
105
  };
83
106
  return composeClasses(slots, getDateRangeCalendarUtilityClass, classes);
84
107
  };
85
108
  const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalendar(inProps, ref) {
86
109
  const utils = useUtils();
87
110
  const localeText = useLocaleText();
111
+ const now = useNow();
88
112
  const props = useDateRangeCalendarDefaultizedProps(inProps, 'MuiDateRangeCalendar');
89
- const ownerState = props;
90
- const classes = useUtilityClasses(ownerState);
91
113
  const isMobile = React.useContext(WrapperVariantContext) === 'mobile';
92
114
  const {
93
115
  value: valueProp,
@@ -102,8 +124,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
102
124
  reduceAnimations,
103
125
  onMonthChange,
104
126
  defaultCalendarMonth,
105
- currentDatePosition: currentDatePositionProp,
106
- onCurrentDatePositionChange,
127
+ rangePosition: rangePositionProps,
128
+ onRangePositionChange,
107
129
  calendars,
108
130
  components,
109
131
  componentsProps,
@@ -116,7 +138,9 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
116
138
  dayOfWeekFormatter,
117
139
  disableAutoMonthSwitching,
118
140
  autoFocus,
119
- fixedWeekNumber
141
+ fixedWeekNumber,
142
+ disableDragEditing,
143
+ displayWeekNumber
120
144
  } = props,
121
145
  other = _objectWithoutPropertiesLoose(props, _excluded);
122
146
  const [value, setValue] = useControlled({
@@ -125,13 +149,78 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
125
149
  name: 'DateRangeCalendar',
126
150
  state: 'value'
127
151
  });
128
- const [currentDatePosition, setCurrentDatePosition] = useControlled({
129
- controlled: currentDatePositionProp,
152
+ const [rangePosition, setRangePosition] = useControlled({
153
+ controlled: rangePositionProps,
130
154
  default: 'start',
131
155
  name: 'DateRangeCalendar',
132
- state: 'currentDatePosition'
156
+ state: 'rangePosition'
157
+ });
158
+ const handleDatePositionChange = useEventCallback(position => {
159
+ if (rangePosition !== position) {
160
+ setRangePosition(position);
161
+ }
162
+ });
163
+ const handleSelectedDayChange = useEventCallback((newDate, selectionState, allowRangeFlip = false) => {
164
+ const {
165
+ nextSelection,
166
+ newRange
167
+ } = calculateRangeChange({
168
+ newDate,
169
+ utils,
170
+ range: value,
171
+ rangePosition,
172
+ allowRangeFlip
173
+ });
174
+ setRangePosition(nextSelection);
175
+ onRangePositionChange == null ? void 0 : onRangePositionChange(nextSelection);
176
+ const isFullRangeSelected = rangePosition === 'end' && isRangeValid(utils, newRange);
177
+ setValue(newRange);
178
+ onChange == null ? void 0 : onChange(newRange, isFullRangeSelected ? 'finish' : 'partial');
179
+ });
180
+ const handleDrop = useEventCallback(newDate => {
181
+ handleSelectedDayChange(newDate, undefined, true);
182
+ });
183
+ const shouldDisableDragEditing = disableDragEditing || disabled || readOnly;
184
+
185
+ // Range going for the start of the start day to the end of the end day.
186
+ // This makes sure that `isWithinRange` works with any time in the start and end day.
187
+ const valueDayRange = React.useMemo(() => [value[0] == null || !utils.isValid(value[0]) ? value[0] : utils.startOfDay(value[0]), value[1] == null || !utils.isValid(value[1]) ? value[1] : utils.endOfDay(value[1])], [value, utils]);
188
+ const _useDragRange = useDragRange({
189
+ disableDragEditing: shouldDisableDragEditing,
190
+ onDrop: handleDrop,
191
+ onDatePositionChange: handleDatePositionChange,
192
+ utils,
193
+ dateRange: valueDayRange
194
+ }),
195
+ {
196
+ isDragging,
197
+ rangeDragDay,
198
+ draggingDatePosition
199
+ } = _useDragRange,
200
+ dragEventHandlers = _objectWithoutPropertiesLoose(_useDragRange, _excluded2);
201
+ const ownerState = _extends({}, props, {
202
+ isDragging
133
203
  });
134
- const wrappedShouldDisableDate = shouldDisableDate && (dayToTest => shouldDisableDate == null ? void 0 : shouldDisableDate(dayToTest, currentDatePosition));
204
+ const classes = useUtilityClasses(ownerState);
205
+ const draggingRange = React.useMemo(() => {
206
+ if (!valueDayRange[0] || !valueDayRange[1] || !rangeDragDay) {
207
+ return [null, null];
208
+ }
209
+ const newRange = calculateRangeChange({
210
+ utils,
211
+ range: valueDayRange,
212
+ newDate: rangeDragDay,
213
+ rangePosition,
214
+ allowRangeFlip: true
215
+ }).newRange;
216
+ return newRange[0] !== null && newRange[1] !== null ? [utils.startOfDay(newRange[0]), utils.endOfDay(newRange[1])] : newRange;
217
+ }, [rangePosition, rangeDragDay, utils, valueDayRange]);
218
+ const wrappedShouldDisableDate = React.useMemo(() => {
219
+ if (!shouldDisableDate) {
220
+ return undefined;
221
+ }
222
+ return dayToTest => shouldDisableDate(dayToTest, draggingDatePosition || rangePosition);
223
+ }, [shouldDisableDate, rangePosition, draggingDatePosition]);
135
224
  const {
136
225
  calendarState,
137
226
  changeFocusedDay,
@@ -153,14 +242,14 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
153
242
  const prevValue = React.useRef(null);
154
243
  React.useEffect(() => {
155
244
  var _prevValue$current, _prevValue$current2;
156
- const date = currentDatePosition === 'start' ? value[0] : value[1];
245
+ const date = rangePosition === 'start' ? value[0] : value[1];
157
246
  if (!date || !utils.isValid(date)) {
158
247
  return;
159
248
  }
160
- const prevDate = currentDatePosition === 'start' ? (_prevValue$current = prevValue.current) == null ? void 0 : _prevValue$current[0] : (_prevValue$current2 = prevValue.current) == null ? void 0 : _prevValue$current2[1];
249
+ const prevDate = rangePosition === 'start' ? (_prevValue$current = prevValue.current) == null ? void 0 : _prevValue$current[0] : (_prevValue$current2 = prevValue.current) == null ? void 0 : _prevValue$current2[1];
161
250
  prevValue.current = value;
162
251
 
163
- // The current date did not change, this call comes either from a `currentlySelectingRangeEnd` change or a change in the other date.
252
+ // The current date did not change, this call comes either from a `rangePosition` change or a change in the other date.
164
253
  // In both cases, we don't want to change the visible month(s).
165
254
  if (disableAutoMonthSwitching && prevDate && utils.isEqual(prevDate, date)) {
166
255
  return;
@@ -169,29 +258,13 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
169
258
  const currentMonthNumber = utils.getMonth(calendarState.currentMonth);
170
259
  const requestedMonthNumber = utils.getMonth(date);
171
260
  if (!utils.isSameYear(calendarState.currentMonth, date) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) {
172
- const newMonth = currentDatePosition === 'start' ? date :
261
+ const newMonth = rangePosition === 'start' ? date :
173
262
  // If need to focus end, scroll to the state when "end" is displaying in the last calendar
174
263
  utils.addMonths(date, -displayingMonthRange);
175
264
  changeMonth(newMonth);
176
265
  }
177
- }, [currentDatePosition, value]); // eslint-disable-line
266
+ }, [rangePosition, value]); // eslint-disable-line
178
267
 
179
- const handleSelectedDayChange = useEventCallback(newDate => {
180
- const {
181
- nextSelection,
182
- newRange
183
- } = calculateRangeChange({
184
- newDate,
185
- utils,
186
- range: value,
187
- currentlySelectingRangeEnd: currentDatePosition
188
- });
189
- setCurrentDatePosition(nextSelection);
190
- onCurrentDatePositionChange == null ? void 0 : onCurrentDatePositionChange(nextSelection);
191
- const isFullRangeSelected = currentDatePosition === 'end' && isRangeValid(utils, newRange);
192
- setValue(newRange);
193
- onChange == null ? void 0 : onChange(newRange, isFullRangeSelected ? 'finish' : 'partial');
194
- });
195
268
  const selectNextMonth = React.useCallback(() => {
196
269
  changeMonth(utils.getNextMonth(calendarState.currentMonth));
197
270
  }, [changeMonth, calendarState.currentMonth, utils]);
@@ -225,23 +298,19 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
225
298
  const CalendarTransitionProps = React.useMemo(() => ({
226
299
  onMouseLeave: () => setRangePreviewDay(null)
227
300
  }), []);
228
-
229
- // Range going for the start of the start day to the end of the end day.
230
- // This makes sure that `isWithinRange` works with any time in the start and end day.
231
- const valueDayRange = React.useMemo(() => [value[0] == null || !utils.isValid(value[0]) ? value[0] : utils.startOfDay(value[0]), value[1] == null || !utils.isValid(value[1]) ? value[1] : utils.endOfDay(value[1])], [value, utils]);
232
301
  const previewingRange = calculateRangePreview({
233
302
  utils,
234
303
  range: valueDayRange,
235
304
  newDate: rangePreviewDay,
236
- currentlySelectingRangeEnd: currentDatePosition
305
+ rangePosition
237
306
  });
238
- const handlePreviewDayChange = newPreviewRequest => {
307
+ const handleDayMouseEnter = useEventCallback((event, newPreviewRequest) => {
239
308
  if (!isWithinRange(utils, newPreviewRequest, valueDayRange)) {
240
309
  setRangePreviewDay(newPreviewRequest);
241
310
  } else {
242
311
  setRangePreviewDay(null);
243
312
  }
244
- };
313
+ });
245
314
  const componentsForDayCalendar = _extends({
246
315
  Day: DateRangePickerDay
247
316
  }, components);
@@ -251,17 +320,57 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
251
320
  const {
252
321
  day
253
322
  } = dayOwnerState;
323
+ const isSelectedStartDate = isStartOfRange(utils, day, valueDayRange);
324
+ const isSelectedEndDate = isEndOfRange(utils, day, valueDayRange);
325
+ const shouldInitDragging = !shouldDisableDragEditing && valueDayRange[0] && valueDayRange[1];
326
+ const isElementDraggable = shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
327
+ let datePosition;
328
+ if (isSelectedStartDate) {
329
+ datePosition = 'start';
330
+ } else if (isSelectedEndDate) {
331
+ datePosition = 'end';
332
+ }
333
+ const isStartOfHighlighting = isDragging ? isStartOfRange(utils, day, draggingRange) : isSelectedStartDate;
334
+ const isEndOfHighlighting = isDragging ? isEndOfRange(utils, day, draggingRange) : isSelectedEndDate;
254
335
  return _extends({
255
336
  isPreviewing: isMobile ? false : isWithinRange(utils, day, previewingRange),
256
337
  isStartOfPreviewing: isMobile ? false : isStartOfRange(utils, day, previewingRange),
257
338
  isEndOfPreviewing: isMobile ? false : isEndOfRange(utils, day, previewingRange),
258
- isHighlighting: isWithinRange(utils, day, valueDayRange),
259
- isStartOfHighlighting: isStartOfRange(utils, day, valueDayRange),
260
- isEndOfHighlighting: isEndOfRange(utils, day, valueDayRange),
261
- onMouseEnter: () => handlePreviewDayChange(day)
339
+ isHighlighting: isWithinRange(utils, day, isDragging ? draggingRange : valueDayRange),
340
+ isStartOfHighlighting,
341
+ isEndOfHighlighting: isDragging ? isEndOfRange(utils, day, draggingRange) : isSelectedEndDate,
342
+ onMouseEnter: handleDayMouseEnter,
343
+ // apply selected styling to the dragging start or end day
344
+ isVisuallySelected: dayOwnerState.selected || isDragging && (isStartOfHighlighting || isEndOfHighlighting),
345
+ 'data-position': datePosition
346
+ }, dragEventHandlers, {
347
+ draggable: isElementDraggable ? true : undefined
262
348
  }, (_resolveComponentProp = resolveComponentProps(componentsProps == null ? void 0 : componentsProps.day, dayOwnerState)) != null ? _resolveComponentProp : {});
263
349
  }
264
350
  });
351
+ const visibleMonths = React.useMemo(() => Array.from({
352
+ length: calendars
353
+ }).map((_, index) => utils.setMonth(calendarState.currentMonth, utils.getMonth(calendarState.currentMonth) + index)), [utils, calendarState.currentMonth, calendars]);
354
+ const focusedMonth = React.useMemo(() => {
355
+ var _visibleMonths$find;
356
+ if (!autoFocus) {
357
+ return null;
358
+ }
359
+
360
+ // The focus priority of the "day" view is as follows:
361
+ // 1. Month of the `start` date
362
+ // 2. Month of the `end` date
363
+ // 3. Month of the current date
364
+ // 4. First visible month
365
+
366
+ if (value[0] != null) {
367
+ return visibleMonths.find(month => utils.isSameMonth(month, value[0]));
368
+ }
369
+ if (value[1] != null) {
370
+ return visibleMonths.find(month => utils.isSameMonth(month, value[1]));
371
+ }
372
+ return (_visibleMonths$find = visibleMonths.find(month => utils.isSameMonth(month, now))) != null ? _visibleMonths$find : visibleMonths[0];
373
+ }, [utils, value, visibleMonths, autoFocus, now]);
265
374
  return /*#__PURE__*/_jsxs(DateRangeCalendarRoot, _extends({
266
375
  ref: ref,
267
376
  className: clsx(className, classes.root),
@@ -270,60 +379,58 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
270
379
  children: [/*#__PURE__*/_jsx(Watermark, {
271
380
  packageName: "x-date-pickers-pro",
272
381
  releaseInfo: releaseInfo
273
- }), Array.from({
274
- length: calendars
275
- }).map((_, index) => {
276
- const monthOnIteration = utils.setMonth(calendarState.currentMonth, utils.getMonth(calendarState.currentMonth) + index);
277
- return /*#__PURE__*/_jsxs(DateRangeCalendarMonthContainer, {
278
- className: classes.monthContainer,
279
- children: [calendars === 1 ? /*#__PURE__*/_jsx(PickersCalendarHeader, {
280
- views: ['day'],
281
- openView: 'day',
282
- currentMonth: calendarState.currentMonth,
283
- onMonthChange: (newMonth, direction) => handleChangeMonth({
284
- newMonth,
285
- direction
286
- }),
287
- minDate: minDateWithDisabled,
288
- maxDate: maxDateWithDisabled,
289
- disabled: disabled,
290
- disablePast: disablePast,
291
- disableFuture: disableFuture,
292
- reduceAnimations: reduceAnimations,
293
- components: components,
294
- componentsProps: componentsProps
295
- }) : /*#__PURE__*/_jsx(DateRangeCalendarArrowSwitcher, {
296
- onGoToPrevious: selectPreviousMonth,
297
- onGoToNext: selectNextMonth,
298
- isPreviousHidden: index !== 0,
299
- isPreviousDisabled: isPreviousMonthDisabled,
300
- previousLabel: localeText.previousMonth,
301
- isNextHidden: index !== calendars - 1,
302
- isNextDisabled: isNextMonthDisabled,
303
- nextLabel: localeText.nextMonth,
304
- components: components,
305
- componentsProps: componentsProps,
306
- children: utils.format(monthOnIteration, 'monthAndYear')
307
- }), /*#__PURE__*/_jsx(DayCalendarForRange, _extends({}, calendarState, baseDateValidationProps, commonViewProps, {
308
- onMonthSwitchingAnimationEnd: onMonthSwitchingAnimationEnd,
309
- onFocusedDayChange: changeFocusedDay,
310
- reduceAnimations: reduceAnimations,
311
- selectedDays: value,
312
- onSelectedDaysChange: handleSelectedDayChange,
313
- currentMonth: monthOnIteration,
314
- TransitionProps: CalendarTransitionProps,
315
- shouldDisableDate: wrappedShouldDisableDate,
316
- showDaysOutsideCurrentMonth: showDaysOutsideCurrentMonth,
317
- dayOfWeekFormatter: dayOfWeekFormatter,
318
- loading: loading,
319
- renderLoading: renderLoading,
320
- components: componentsForDayCalendar,
321
- componentsProps: componentsPropsForDayCalendar,
322
- autoFocus: autoFocus,
323
- fixedWeekNumber: fixedWeekNumber
324
- }), index)]
325
- }, index);
326
- })]
382
+ }), visibleMonths.map((month, index) => /*#__PURE__*/_jsxs(DateRangeCalendarMonthContainer, {
383
+ className: classes.monthContainer,
384
+ children: [calendars === 1 ? /*#__PURE__*/_jsx(PickersCalendarHeader, {
385
+ views: ['day'],
386
+ openView: 'day',
387
+ currentMonth: calendarState.currentMonth,
388
+ onMonthChange: (newMonth, direction) => handleChangeMonth({
389
+ newMonth,
390
+ direction
391
+ }),
392
+ minDate: minDateWithDisabled,
393
+ maxDate: maxDateWithDisabled,
394
+ disabled: disabled,
395
+ disablePast: disablePast,
396
+ disableFuture: disableFuture,
397
+ reduceAnimations: reduceAnimations,
398
+ components: components,
399
+ componentsProps: componentsProps
400
+ }) : /*#__PURE__*/_jsx(DateRangeCalendarArrowSwitcher, {
401
+ onGoToPrevious: selectPreviousMonth,
402
+ onGoToNext: selectNextMonth,
403
+ isPreviousHidden: index !== 0,
404
+ isPreviousDisabled: isPreviousMonthDisabled,
405
+ previousLabel: localeText.previousMonth,
406
+ isNextHidden: index !== calendars - 1,
407
+ isNextDisabled: isNextMonthDisabled,
408
+ nextLabel: localeText.nextMonth,
409
+ components: components,
410
+ componentsProps: componentsProps,
411
+ children: utils.format(month, 'monthAndYear')
412
+ }), /*#__PURE__*/_jsx(DayCalendarForRange, _extends({
413
+ className: classes.dayCalendar
414
+ }, calendarState, baseDateValidationProps, commonViewProps, {
415
+ onMonthSwitchingAnimationEnd: onMonthSwitchingAnimationEnd,
416
+ onFocusedDayChange: changeFocusedDay,
417
+ reduceAnimations: reduceAnimations,
418
+ selectedDays: value,
419
+ onSelectedDaysChange: handleSelectedDayChange,
420
+ currentMonth: month,
421
+ TransitionProps: CalendarTransitionProps,
422
+ shouldDisableDate: wrappedShouldDisableDate,
423
+ showDaysOutsideCurrentMonth: showDaysOutsideCurrentMonth,
424
+ dayOfWeekFormatter: dayOfWeekFormatter,
425
+ loading: loading,
426
+ renderLoading: renderLoading,
427
+ components: componentsForDayCalendar,
428
+ componentsProps: componentsPropsForDayCalendar,
429
+ autoFocus: month === focusedMonth,
430
+ fixedWeekNumber: fixedWeekNumber,
431
+ displayWeekNumber: displayWeekNumber
432
+ }), index)]
433
+ }, month.toString()))]
327
434
  }));
328
435
  });
329
436
  process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
@@ -349,7 +456,6 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
349
456
  * @default {}
350
457
  */
351
458
  componentsProps: PropTypes.object,
352
- currentDatePosition: PropTypes.oneOf(['end', 'start']),
353
459
  /**
354
460
  * Formats the day of week displayed in the calendar header.
355
461
  * @param {string} day The day of week provided by the adapter's method `getWeekdays`.
@@ -376,6 +482,11 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
376
482
  * @default false
377
483
  */
378
484
  disabled: PropTypes.bool,
485
+ /**
486
+ * If `true`, editing dates by dragging is disabled.
487
+ * @default false
488
+ */
489
+ disableDragEditing: PropTypes.bool,
379
490
  /**
380
491
  * If `true` disable values before the current date for date components, time for time components and both for date time components.
381
492
  * @default false
@@ -422,7 +533,6 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
422
533
  * @param {PickerSelectionState | undefined} selectionState Indicates if the date range selection is complete.
423
534
  */
424
535
  onChange: PropTypes.func,
425
- onCurrentDatePositionChange: PropTypes.func,
426
536
  /**
427
537
  * Callback firing on month change @DateIOType.
428
538
  * @template TDate
@@ -430,6 +540,8 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
430
540
  * @returns {void|Promise} -
431
541
  */
432
542
  onMonthChange: PropTypes.func,
543
+ onRangePositionChange: PropTypes.func,
544
+ rangePosition: PropTypes.oneOf(['end', 'start']),
433
545
  /**
434
546
  * Make picker read only.
435
547
  * @default false
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { SxProps } from '@mui/system';
3
+ import { SlotComponentProps } from '@mui/base';
3
4
  import { Theme } from '@mui/material/styles';
4
- import { BaseDateValidationProps, DefaultizedProps, ExportedDayCalendarProps, DayCalendarSlotsComponent, DayCalendarSlotsComponentsProps, PickersArrowSwitcherSlotsComponent, PickersArrowSwitcherSlotsComponentsProps, PickerSelectionState, PickersCalendarHeaderSlotsComponent, PickersCalendarHeaderSlotsComponentsProps } from '@mui/x-date-pickers/internals';
5
- import { DateRange, DayRangeValidationProps } from '../internal/models';
5
+ import { BaseDateValidationProps, DefaultizedProps, ExportedDayCalendarProps, DayCalendarSlotsComponent, DayCalendarSlotsComponentsProps, PickersArrowSwitcherSlotsComponent, PickersArrowSwitcherSlotsComponentsProps, PickerSelectionState, PickersCalendarHeaderSlotsComponent, PickersCalendarHeaderSlotsComponentsProps, DayCalendarProps } from '@mui/x-date-pickers/internals';
6
+ import { DateRange, RangePositionProps, DayRangeValidationProps } from '../internal/models';
6
7
  import { DateRangeCalendarClasses } from './dateRangeCalendarClasses';
7
- import { DateRangePickerDayProps } from '../DateRangePickerDay';
8
- export declare type DateRangePosition = 'start' | 'end';
8
+ import { DateRangePickerDay, DateRangePickerDayProps } from '../DateRangePickerDay';
9
+ export type DateRangePosition = 'start' | 'end';
9
10
  export interface DateRangeCalendarSlotsComponent<TDate> extends PickersArrowSwitcherSlotsComponent, Omit<DayCalendarSlotsComponent<TDate>, 'Day'>, PickersCalendarHeaderSlotsComponent {
10
11
  /**
11
12
  * Custom component for day in range pickers.
@@ -14,9 +15,13 @@ export interface DateRangeCalendarSlotsComponent<TDate> extends PickersArrowSwit
14
15
  */
15
16
  Day?: React.ElementType<DateRangePickerDayProps<TDate>>;
16
17
  }
17
- export interface DateRangeCalendarSlotsComponentsProps<TDate> extends PickersArrowSwitcherSlotsComponentsProps, Omit<DayCalendarSlotsComponentsProps<TDate>, 'Day'>, PickersCalendarHeaderSlotsComponentsProps<TDate> {
18
+ export interface DateRangeCalendarSlotsComponentsProps<TDate> extends PickersArrowSwitcherSlotsComponentsProps, Omit<DayCalendarSlotsComponentsProps<TDate>, 'day'>, PickersCalendarHeaderSlotsComponentsProps<TDate> {
19
+ day?: SlotComponentProps<typeof DateRangePickerDay, {}, DayCalendarProps<TDate> & {
20
+ day: TDate;
21
+ selected: boolean;
22
+ }>;
18
23
  }
19
- export interface DateRangeCalendarProps<TDate> extends ExportedDayCalendarProps<TDate>, BaseDateValidationProps<TDate>, DayRangeValidationProps<TDate> {
24
+ export interface DateRangeCalendarProps<TDate> extends ExportedDayCalendarProps<TDate>, BaseDateValidationProps<TDate>, DayRangeValidationProps<TDate>, Partial<RangePositionProps> {
20
25
  /**
21
26
  * The selected value.
22
27
  * Used when the component is controlled.
@@ -82,13 +87,19 @@ export interface DateRangeCalendarProps<TDate> extends ExportedDayCalendarProps<
82
87
  * @returns {void|Promise} -
83
88
  */
84
89
  onMonthChange?: (month: TDate) => void | Promise<void>;
85
- currentDatePosition?: DateRangePosition;
86
- onCurrentDatePositionChange?: (newPosition: DateRangePosition) => void;
87
90
  /**
88
91
  * The number of calendars to render.
89
92
  * @default 2
90
93
  */
91
94
  calendars?: 1 | 2 | 3;
95
+ /**
96
+ * If `true`, editing dates by dragging is disabled.
97
+ * @default false
98
+ */
99
+ disableDragEditing?: boolean;
100
+ }
101
+ export interface DateRangeCalendarOwnerState<TDate> extends DateRangeCalendarProps<TDate> {
102
+ isDragging: boolean;
92
103
  }
93
- export declare type DateRangeCalendarDefaultizedProps<TDate> = DefaultizedProps<DateRangeCalendarProps<TDate>, 'reduceAnimations' | 'calendars' | keyof BaseDateValidationProps<TDate>>;
94
- export declare type ExportedDateRangeCalendarProps<TDate> = Omit<DateRangeCalendarProps<TDate>, 'defaultValue' | 'value' | 'onChange' | 'changeView' | 'slideDirection' | 'currentMonth' | 'className' | 'classes' | 'components' | 'componentsProps' | 'currentDatePosition' | 'onCurrentDatePositionChange'>;
104
+ export type DateRangeCalendarDefaultizedProps<TDate> = DefaultizedProps<DateRangeCalendarProps<TDate>, 'reduceAnimations' | 'calendars' | 'disableDragEditing' | keyof BaseDateValidationProps<TDate>>;
105
+ export type ExportedDateRangeCalendarProps<TDate> = Omit<DateRangeCalendarProps<TDate>, 'defaultValue' | 'value' | 'onChange' | 'changeView' | 'slideDirection' | 'currentMonth' | 'className' | 'classes' | 'components' | 'componentsProps' | 'rangePosition' | 'onRangePositionChange'>;
@@ -3,7 +3,9 @@ export interface DateRangeCalendarClasses {
3
3
  root: string;
4
4
  /** Styles applied to the container of a month. */
5
5
  monthContainer: string;
6
+ /** Styles applied to the day calendar container when dragging */
7
+ dayDragging: string;
6
8
  }
7
- export declare type DateRangeCalendarClassKey = keyof DateRangeCalendarClasses;
9
+ export type DateRangeCalendarClassKey = keyof DateRangeCalendarClasses;
8
10
  export declare const getDateRangeCalendarUtilityClass: (slot: string) => string;
9
11
  export declare const dateRangeCalendarClasses: DateRangeCalendarClasses;
@@ -1,3 +1,3 @@
1
1
  import { unstable_generateUtilityClass as generateUtilityClass, unstable_generateUtilityClasses as generateUtilityClasses } from '@mui/utils';
2
2
  export const getDateRangeCalendarUtilityClass = slot => generateUtilityClass('MuiDateRangeCalendar', slot);
3
- export const dateRangeCalendarClasses = generateUtilityClasses('MuiDateRangeCalendar', ['root', 'monthContainer']);
3
+ export const dateRangeCalendarClasses = generateUtilityClasses('MuiDateRangeCalendar', ['root', 'monthContainer', 'dayDragging']);
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ import { MuiPickersAdapter } from '@mui/x-date-pickers/internals';
3
+ import { DateRangePosition } from './DateRangeCalendar.types';
4
+ import { DateRange } from '../internal/models';
5
+ interface UseDragRangeParams<TDate> {
6
+ disableDragEditing?: boolean;
7
+ utils: MuiPickersAdapter<TDate>;
8
+ setRangeDragDay: (value: TDate | null) => void;
9
+ setIsDragging: (value: boolean) => void;
10
+ isDragging: boolean;
11
+ onDatePositionChange: (position: DateRangePosition) => void;
12
+ onDrop: (newDate: TDate) => void;
13
+ dateRange: DateRange<TDate>;
14
+ }
15
+ interface UseDragRangeEvents {
16
+ onDragStart?: React.DragEventHandler<HTMLButtonElement>;
17
+ onDragEnter?: React.DragEventHandler<HTMLButtonElement>;
18
+ onDragLeave?: React.DragEventHandler<HTMLButtonElement>;
19
+ onDragOver?: React.DragEventHandler<HTMLButtonElement>;
20
+ onDragEnd?: React.DragEventHandler<HTMLButtonElement>;
21
+ onDrop?: React.DragEventHandler<HTMLButtonElement>;
22
+ onTouchStart?: React.TouchEventHandler<HTMLButtonElement>;
23
+ onTouchMove?: React.TouchEventHandler<HTMLButtonElement>;
24
+ onTouchEnd?: React.TouchEventHandler<HTMLButtonElement>;
25
+ }
26
+ interface UseDragRangeResponse<TDate> extends UseDragRangeEvents {
27
+ isDragging: boolean;
28
+ rangeDragDay: TDate | null;
29
+ draggingDatePosition: DateRangePosition | null;
30
+ }
31
+ export declare const useDragRange: <TDate>({ disableDragEditing, utils, onDatePositionChange, onDrop, dateRange, }: Omit<UseDragRangeParams<TDate>, "isDragging" | "setRangeDragDay" | "setIsDragging">) => UseDragRangeResponse<TDate>;
32
+ export {};