@mui/x-date-pickers 7.23.2 → 7.23.3

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,54 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 7.23.3
7
+
8
+ _Dec 19, 2024_
9
+
10
+ We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨:
11
+
12
+ - 🌍 Improve Korean (ko-KR) locale on the Data Grid
13
+ - 🐞 Bugfixes
14
+
15
+ Special thanks go out to the community contributors who have helped make this release possible:
16
+ @k-rajat19, @good-jinu.
17
+ Following are all team members who have contributed to this release:
18
+ @KenanYusuf, @MBilalShafi, @arminmeh, @flaviendelangle.
19
+
20
+ <!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
21
+
22
+ ### Data Grid
23
+
24
+ #### `@mui/x-data-grid@7.23.3`
25
+
26
+ - [DataGrid] Allow passing custom props to `.main` element (#15919) @MBilalShafi
27
+ - [DataGrid] Consider `columnGroupHeaderHeight` prop in `getTotalHeaderHeight` method (#15927) @k-rajat19
28
+ - [DataGrid] Deprecate `indeterminateCheckboxAction` prop (#15862) @MBilalShafi
29
+ - [DataGrid] Fix `aria-label` value for group checkboxes (#15861) @MBilalShafi
30
+ - [DataGrid] Fix autosizing with virtualized columns (#15929) @k-rajat19
31
+ - [DataGrid] Round dimensions to avoid subpixel rendering error (#15873) @KenanYusuf
32
+ - [DataGrid] Toggle menu on click in `<GridActionsCell />` (#15871) @k-rajat19
33
+ - [DataGrid] Trigger row spanning computation on rows update (#15872) @MBilalShafi
34
+ - [l10n] Improve Korean (ko-KR) locale (#15906) @good-jinu
35
+
36
+ #### `@mui/x-data-grid-pro@7.23.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
37
+
38
+ Same changes as in `@mui/x-data-grid@7.23.3`.
39
+
40
+ #### `@mui/x-data-grid-premium@7.23.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
41
+
42
+ Same changes as in `@mui/x-data-grid-pro@7.23.3`.
43
+
44
+ ### Date and Time Pickers
45
+
46
+ #### `@mui/x-date-pickers@7.23.3`
47
+
48
+ - [pickers] Add verification to disable skipped hours in spring forward DST (#15918) @flaviendelangle
49
+
50
+ #### `@mui/x-date-pickers-pro@7.23.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
51
+
52
+ Same changes as in `@mui/x-date-pickers@7.23.3`.
53
+
6
54
  ## 7.23.2
7
55
 
8
56
  _Dec 12, 2024_
@@ -190,6 +190,9 @@ export const MultiSectionDigitalClock = /*#__PURE__*/React.forwardRef(function M
190
190
  {
191
191
  const valueWithMeridiem = convertValueToMeridiem(rawValue, meridiemMode, ampm);
192
192
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
193
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
194
+ return true;
195
+ }
193
196
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
194
197
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
195
198
  return !containsValidTime({
@@ -25,6 +25,10 @@ export interface ClockProps<TDate extends PickerValidDate> extends ReturnType<ty
25
25
  * The current full date value.
26
26
  */
27
27
  value: TDate | null;
28
+ /**
29
+ * Minimum and maximum value of the clock.
30
+ */
31
+ viewRange: [number, number];
28
32
  disabled?: boolean;
29
33
  readOnly?: boolean;
30
34
  className?: string;
@@ -180,6 +180,7 @@ export function Clock(inProps) {
180
180
  selectedId,
181
181
  type,
182
182
  viewValue,
183
+ viewRange: [minViewValue, maxViewValue],
183
184
  disabled = false,
184
185
  readOnly,
185
186
  className
@@ -252,6 +253,8 @@ export function Clock(inProps) {
252
253
  listboxRef.current.focus();
253
254
  }
254
255
  }, [autoFocus]);
256
+ const clampValue = newValue => Math.max(minViewValue, Math.min(maxViewValue, newValue));
257
+ const circleValue = newValue => (newValue + (maxViewValue + 1)) % (maxViewValue + 1);
255
258
  const handleKeyDown = event => {
256
259
  // TODO: Why this early exit?
257
260
  if (isMoving.current) {
@@ -260,27 +263,27 @@ export function Clock(inProps) {
260
263
  switch (event.key) {
261
264
  case 'Home':
262
265
  // reset both hours and minutes
263
- handleValueChange(0, 'partial');
266
+ handleValueChange(minViewValue, 'partial');
264
267
  event.preventDefault();
265
268
  break;
266
269
  case 'End':
267
- handleValueChange(type === 'minutes' ? 59 : 23, 'partial');
270
+ handleValueChange(maxViewValue, 'partial');
268
271
  event.preventDefault();
269
272
  break;
270
273
  case 'ArrowUp':
271
- handleValueChange(viewValue + keyboardControlStep, 'partial');
274
+ handleValueChange(circleValue(viewValue + keyboardControlStep), 'partial');
272
275
  event.preventDefault();
273
276
  break;
274
277
  case 'ArrowDown':
275
- handleValueChange(viewValue - keyboardControlStep, 'partial');
278
+ handleValueChange(circleValue(viewValue - keyboardControlStep), 'partial');
276
279
  event.preventDefault();
277
280
  break;
278
281
  case 'PageUp':
279
- handleValueChange(viewValue + 5, 'partial');
282
+ handleValueChange(clampValue(viewValue + 5), 'partial');
280
283
  event.preventDefault();
281
284
  break;
282
285
  case 'PageDown':
283
- handleValueChange(viewValue - 5, 'partial');
286
+ handleValueChange(clampValue(viewValue - 5), 'partial');
284
287
  event.preventDefault();
285
288
  break;
286
289
  case 'Enter':
@@ -183,6 +183,9 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
183
183
  {
184
184
  const valueWithMeridiem = convertValueToMeridiem(rawValue, meridiemMode, ampm);
185
185
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
186
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
187
+ return true;
188
+ }
186
189
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
187
190
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
188
191
  return !containsValidTime({
@@ -223,9 +226,20 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
223
226
  const valueWithMeridiem = convertValueToMeridiem(hourValue, meridiemMode, ampm);
224
227
  setValueAndGoToNextView(utils.setHours(valueOrReferenceDate, valueWithMeridiem), isFinish, 'hours');
225
228
  };
229
+ const viewValue = utils.getHours(valueOrReferenceDate);
230
+ let viewRange;
231
+ if (ampm) {
232
+ if (viewValue > 12) {
233
+ viewRange = [12, 23];
234
+ } else {
235
+ viewRange = [0, 11];
236
+ }
237
+ } else {
238
+ viewRange = [0, 23];
239
+ }
226
240
  return {
227
241
  onChange: handleHoursChange,
228
- viewValue: utils.getHours(valueOrReferenceDate),
242
+ viewValue,
229
243
  children: getHourNumbers({
230
244
  value,
231
245
  utils,
@@ -234,7 +248,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
234
248
  getClockNumberText: translations.hoursClockNumberText,
235
249
  isDisabled: hourValue => disabled || isTimeDisabled(hourValue, 'hours'),
236
250
  selectedId
237
- })
251
+ }),
252
+ viewRange
238
253
  };
239
254
  }
240
255
  case 'minutes':
@@ -253,7 +268,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
253
268
  getClockNumberText: translations.minutesClockNumberText,
254
269
  isDisabled: minuteValue => disabled || isTimeDisabled(minuteValue, 'minutes'),
255
270
  selectedId
256
- })
271
+ }),
272
+ viewRange: [0, 59]
257
273
  };
258
274
  }
259
275
  case 'seconds':
@@ -272,7 +288,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
272
288
  getClockNumberText: translations.secondsClockNumberText,
273
289
  isDisabled: secondValue => disabled || isTimeDisabled(secondValue, 'seconds'),
274
290
  selectedId
275
- })
291
+ }),
292
+ viewRange: [0, 59]
276
293
  };
277
294
  }
278
295
  default:
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v7.23.2
2
+ * @mui/x-date-pickers v7.23.3
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -190,6 +190,9 @@ export const MultiSectionDigitalClock = /*#__PURE__*/React.forwardRef(function M
190
190
  {
191
191
  const valueWithMeridiem = convertValueToMeridiem(rawValue, meridiemMode, ampm);
192
192
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
193
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
194
+ return true;
195
+ }
193
196
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
194
197
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
195
198
  return !containsValidTime({
@@ -180,6 +180,7 @@ export function Clock(inProps) {
180
180
  selectedId,
181
181
  type,
182
182
  viewValue,
183
+ viewRange: [minViewValue, maxViewValue],
183
184
  disabled = false,
184
185
  readOnly,
185
186
  className
@@ -252,6 +253,8 @@ export function Clock(inProps) {
252
253
  listboxRef.current.focus();
253
254
  }
254
255
  }, [autoFocus]);
256
+ const clampValue = newValue => Math.max(minViewValue, Math.min(maxViewValue, newValue));
257
+ const circleValue = newValue => (newValue + (maxViewValue + 1)) % (maxViewValue + 1);
255
258
  const handleKeyDown = event => {
256
259
  // TODO: Why this early exit?
257
260
  if (isMoving.current) {
@@ -260,27 +263,27 @@ export function Clock(inProps) {
260
263
  switch (event.key) {
261
264
  case 'Home':
262
265
  // reset both hours and minutes
263
- handleValueChange(0, 'partial');
266
+ handleValueChange(minViewValue, 'partial');
264
267
  event.preventDefault();
265
268
  break;
266
269
  case 'End':
267
- handleValueChange(type === 'minutes' ? 59 : 23, 'partial');
270
+ handleValueChange(maxViewValue, 'partial');
268
271
  event.preventDefault();
269
272
  break;
270
273
  case 'ArrowUp':
271
- handleValueChange(viewValue + keyboardControlStep, 'partial');
274
+ handleValueChange(circleValue(viewValue + keyboardControlStep), 'partial');
272
275
  event.preventDefault();
273
276
  break;
274
277
  case 'ArrowDown':
275
- handleValueChange(viewValue - keyboardControlStep, 'partial');
278
+ handleValueChange(circleValue(viewValue - keyboardControlStep), 'partial');
276
279
  event.preventDefault();
277
280
  break;
278
281
  case 'PageUp':
279
- handleValueChange(viewValue + 5, 'partial');
282
+ handleValueChange(clampValue(viewValue + 5), 'partial');
280
283
  event.preventDefault();
281
284
  break;
282
285
  case 'PageDown':
283
- handleValueChange(viewValue - 5, 'partial');
286
+ handleValueChange(clampValue(viewValue - 5), 'partial');
284
287
  event.preventDefault();
285
288
  break;
286
289
  case 'Enter':
@@ -183,6 +183,9 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
183
183
  {
184
184
  const valueWithMeridiem = convertValueToMeridiem(rawValue, meridiemMode, ampm);
185
185
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
186
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
187
+ return true;
188
+ }
186
189
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
187
190
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
188
191
  return !containsValidTime({
@@ -223,9 +226,20 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
223
226
  const valueWithMeridiem = convertValueToMeridiem(hourValue, meridiemMode, ampm);
224
227
  setValueAndGoToNextView(utils.setHours(valueOrReferenceDate, valueWithMeridiem), isFinish, 'hours');
225
228
  };
229
+ const viewValue = utils.getHours(valueOrReferenceDate);
230
+ let viewRange;
231
+ if (ampm) {
232
+ if (viewValue > 12) {
233
+ viewRange = [12, 23];
234
+ } else {
235
+ viewRange = [0, 11];
236
+ }
237
+ } else {
238
+ viewRange = [0, 23];
239
+ }
226
240
  return {
227
241
  onChange: handleHoursChange,
228
- viewValue: utils.getHours(valueOrReferenceDate),
242
+ viewValue,
229
243
  children: getHourNumbers({
230
244
  value,
231
245
  utils,
@@ -234,7 +248,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
234
248
  getClockNumberText: translations.hoursClockNumberText,
235
249
  isDisabled: hourValue => disabled || isTimeDisabled(hourValue, 'hours'),
236
250
  selectedId
237
- })
251
+ }),
252
+ viewRange
238
253
  };
239
254
  }
240
255
  case 'minutes':
@@ -253,7 +268,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
253
268
  getClockNumberText: translations.minutesClockNumberText,
254
269
  isDisabled: minuteValue => disabled || isTimeDisabled(minuteValue, 'minutes'),
255
270
  selectedId
256
- })
271
+ }),
272
+ viewRange: [0, 59]
257
273
  };
258
274
  }
259
275
  case 'seconds':
@@ -272,7 +288,8 @@ export const TimeClock = /*#__PURE__*/React.forwardRef(function TimeClock(inProp
272
288
  getClockNumberText: translations.secondsClockNumberText,
273
289
  isDisabled: secondValue => disabled || isTimeDisabled(secondValue, 'seconds'),
274
290
  selectedId
275
- })
291
+ }),
292
+ viewRange: [0, 59]
276
293
  };
277
294
  }
278
295
  default:
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v7.23.2
2
+ * @mui/x-date-pickers v7.23.3
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -197,6 +197,9 @@ const MultiSectionDigitalClock = exports.MultiSectionDigitalClock = /*#__PURE__*
197
197
  {
198
198
  const valueWithMeridiem = (0, _timeUtils.convertValueToMeridiem)(rawValue, meridiemMode, ampm);
199
199
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
200
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
201
+ return true;
202
+ }
200
203
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
201
204
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
202
205
  return !containsValidTime({
@@ -188,6 +188,7 @@ function Clock(inProps) {
188
188
  selectedId,
189
189
  type,
190
190
  viewValue,
191
+ viewRange: [minViewValue, maxViewValue],
191
192
  disabled = false,
192
193
  readOnly,
193
194
  className
@@ -260,6 +261,8 @@ function Clock(inProps) {
260
261
  listboxRef.current.focus();
261
262
  }
262
263
  }, [autoFocus]);
264
+ const clampValue = newValue => Math.max(minViewValue, Math.min(maxViewValue, newValue));
265
+ const circleValue = newValue => (newValue + (maxViewValue + 1)) % (maxViewValue + 1);
263
266
  const handleKeyDown = event => {
264
267
  // TODO: Why this early exit?
265
268
  if (isMoving.current) {
@@ -268,27 +271,27 @@ function Clock(inProps) {
268
271
  switch (event.key) {
269
272
  case 'Home':
270
273
  // reset both hours and minutes
271
- handleValueChange(0, 'partial');
274
+ handleValueChange(minViewValue, 'partial');
272
275
  event.preventDefault();
273
276
  break;
274
277
  case 'End':
275
- handleValueChange(type === 'minutes' ? 59 : 23, 'partial');
278
+ handleValueChange(maxViewValue, 'partial');
276
279
  event.preventDefault();
277
280
  break;
278
281
  case 'ArrowUp':
279
- handleValueChange(viewValue + keyboardControlStep, 'partial');
282
+ handleValueChange(circleValue(viewValue + keyboardControlStep), 'partial');
280
283
  event.preventDefault();
281
284
  break;
282
285
  case 'ArrowDown':
283
- handleValueChange(viewValue - keyboardControlStep, 'partial');
286
+ handleValueChange(circleValue(viewValue - keyboardControlStep), 'partial');
284
287
  event.preventDefault();
285
288
  break;
286
289
  case 'PageUp':
287
- handleValueChange(viewValue + 5, 'partial');
290
+ handleValueChange(clampValue(viewValue + 5), 'partial');
288
291
  event.preventDefault();
289
292
  break;
290
293
  case 'PageDown':
291
- handleValueChange(viewValue - 5, 'partial');
294
+ handleValueChange(clampValue(viewValue - 5), 'partial');
292
295
  event.preventDefault();
293
296
  break;
294
297
  case 'Enter':
@@ -190,6 +190,9 @@ const TimeClock = exports.TimeClock = /*#__PURE__*/React.forwardRef(function Tim
190
190
  {
191
191
  const valueWithMeridiem = (0, _timeUtils.convertValueToMeridiem)(rawValue, meridiemMode, ampm);
192
192
  const dateWithNewHours = utils.setHours(valueOrReferenceDate, valueWithMeridiem);
193
+ if (utils.getHours(dateWithNewHours) !== valueWithMeridiem) {
194
+ return true;
195
+ }
193
196
  const start = utils.setSeconds(utils.setMinutes(dateWithNewHours, 0), 0);
194
197
  const end = utils.setSeconds(utils.setMinutes(dateWithNewHours, 59), 59);
195
198
  return !containsValidTime({
@@ -230,9 +233,20 @@ const TimeClock = exports.TimeClock = /*#__PURE__*/React.forwardRef(function Tim
230
233
  const valueWithMeridiem = (0, _timeUtils.convertValueToMeridiem)(hourValue, meridiemMode, ampm);
231
234
  setValueAndGoToNextView(utils.setHours(valueOrReferenceDate, valueWithMeridiem), isFinish, 'hours');
232
235
  };
236
+ const viewValue = utils.getHours(valueOrReferenceDate);
237
+ let viewRange;
238
+ if (ampm) {
239
+ if (viewValue > 12) {
240
+ viewRange = [12, 23];
241
+ } else {
242
+ viewRange = [0, 11];
243
+ }
244
+ } else {
245
+ viewRange = [0, 23];
246
+ }
233
247
  return {
234
248
  onChange: handleHoursChange,
235
- viewValue: utils.getHours(valueOrReferenceDate),
249
+ viewValue,
236
250
  children: (0, _ClockNumbers.getHourNumbers)({
237
251
  value,
238
252
  utils,
@@ -241,7 +255,8 @@ const TimeClock = exports.TimeClock = /*#__PURE__*/React.forwardRef(function Tim
241
255
  getClockNumberText: translations.hoursClockNumberText,
242
256
  isDisabled: hourValue => disabled || isTimeDisabled(hourValue, 'hours'),
243
257
  selectedId
244
- })
258
+ }),
259
+ viewRange
245
260
  };
246
261
  }
247
262
  case 'minutes':
@@ -260,7 +275,8 @@ const TimeClock = exports.TimeClock = /*#__PURE__*/React.forwardRef(function Tim
260
275
  getClockNumberText: translations.minutesClockNumberText,
261
276
  isDisabled: minuteValue => disabled || isTimeDisabled(minuteValue, 'minutes'),
262
277
  selectedId
263
- })
278
+ }),
279
+ viewRange: [0, 59]
264
280
  };
265
281
  }
266
282
  case 'seconds':
@@ -279,7 +295,8 @@ const TimeClock = exports.TimeClock = /*#__PURE__*/React.forwardRef(function Tim
279
295
  getClockNumberText: translations.secondsClockNumberText,
280
296
  isDisabled: secondValue => disabled || isTimeDisabled(secondValue, 'seconds'),
281
297
  selectedId
282
- })
298
+ }),
299
+ viewRange: [0, 59]
283
300
  };
284
301
  }
285
302
  default:
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers v7.23.2
2
+ * @mui/x-date-pickers v7.23.3
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-date-pickers",
3
- "version": "7.23.2",
3
+ "version": "7.23.3",
4
4
  "description": "The community edition of the Date and Time Picker components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",