rsuite 5.44.0 → 5.46.0

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 (81) hide show
  1. package/Button/styles/index.less +1 -1
  2. package/CHANGELOG.md +25 -0
  3. package/DatePicker/styles/index.less +15 -0
  4. package/Drawer/styles/index.less +1 -1
  5. package/Modal/styles/index.less +24 -2
  6. package/cjs/Calendar/MonthDropdown.js +1 -2
  7. package/cjs/Calendar/MonthDropdownItem.js +26 -13
  8. package/cjs/Calendar/TableCell.d.ts +14 -0
  9. package/cjs/Calendar/TableCell.js +72 -0
  10. package/cjs/Calendar/TableHeaderRow.js +3 -1
  11. package/cjs/Calendar/TableRow.js +22 -46
  12. package/cjs/Calendar/useCalendarDate.d.ts +1 -1
  13. package/cjs/Calendar/utils.d.ts +7 -0
  14. package/cjs/Calendar/utils.js +15 -0
  15. package/cjs/Cascader/Cascader.js +13 -3
  16. package/cjs/DatePicker/DatePicker.js +145 -38
  17. package/cjs/Drawer/Drawer.d.ts +2 -0
  18. package/cjs/Drawer/Drawer.js +16 -5
  19. package/cjs/Drawer/DrawerContext.d.ts +9 -0
  20. package/cjs/Drawer/DrawerContext.js +10 -0
  21. package/cjs/FormControl/FormControl.js +1 -1
  22. package/cjs/InputPicker/InputPicker.js +7 -4
  23. package/cjs/Modal/Modal.d.ts +2 -4
  24. package/cjs/Modal/Modal.js +24 -13
  25. package/cjs/Modal/ModalBody.js +14 -8
  26. package/cjs/Modal/ModalContext.d.ts +1 -3
  27. package/cjs/Modal/ModalHeader.js +9 -6
  28. package/cjs/Modal/index.d.ts +1 -0
  29. package/cjs/Modal/utils.d.ts +4 -1
  30. package/cjs/Modal/utils.js +9 -4
  31. package/cjs/Picker/PickerToggle.js +3 -0
  32. package/cjs/Picker/utils.js +21 -12
  33. package/cjs/Table/Table.d.ts +7 -7
  34. package/dist/rsuite-no-reset-rtl.css +141 -64
  35. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  36. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  37. package/dist/rsuite-no-reset.css +141 -64
  38. package/dist/rsuite-no-reset.min.css +1 -1
  39. package/dist/rsuite-no-reset.min.css.map +1 -1
  40. package/dist/rsuite-rtl.css +141 -64
  41. package/dist/rsuite-rtl.min.css +1 -1
  42. package/dist/rsuite-rtl.min.css.map +1 -1
  43. package/dist/rsuite.css +141 -64
  44. package/dist/rsuite.js +73 -19
  45. package/dist/rsuite.js.map +1 -1
  46. package/dist/rsuite.min.css +1 -1
  47. package/dist/rsuite.min.css.map +1 -1
  48. package/dist/rsuite.min.js +1 -1
  49. package/dist/rsuite.min.js.map +1 -1
  50. package/esm/Calendar/MonthDropdown.js +1 -2
  51. package/esm/Calendar/MonthDropdownItem.js +28 -15
  52. package/esm/Calendar/TableCell.d.ts +14 -0
  53. package/esm/Calendar/TableCell.js +66 -0
  54. package/esm/Calendar/TableHeaderRow.js +3 -1
  55. package/esm/Calendar/TableRow.js +23 -47
  56. package/esm/Calendar/useCalendarDate.d.ts +1 -1
  57. package/esm/Calendar/utils.d.ts +7 -0
  58. package/esm/Calendar/utils.js +12 -0
  59. package/esm/Cascader/Cascader.js +13 -3
  60. package/esm/DatePicker/DatePicker.js +147 -40
  61. package/esm/Drawer/Drawer.d.ts +2 -0
  62. package/esm/Drawer/Drawer.js +15 -5
  63. package/esm/Drawer/DrawerContext.d.ts +9 -0
  64. package/esm/Drawer/DrawerContext.js +4 -0
  65. package/esm/FormControl/FormControl.js +1 -1
  66. package/esm/InputPicker/InputPicker.js +7 -4
  67. package/esm/Modal/Modal.d.ts +2 -4
  68. package/esm/Modal/Modal.js +25 -14
  69. package/esm/Modal/ModalBody.js +14 -8
  70. package/esm/Modal/ModalContext.d.ts +1 -3
  71. package/esm/Modal/ModalHeader.js +9 -6
  72. package/esm/Modal/index.d.ts +1 -0
  73. package/esm/Modal/utils.d.ts +4 -1
  74. package/esm/Modal/utils.js +9 -4
  75. package/esm/Picker/PickerToggle.js +3 -0
  76. package/esm/Picker/utils.js +21 -12
  77. package/esm/Table/Table.d.ts +7 -7
  78. package/package.json +2 -2
  79. package/styles/color-modes/dark.less +0 -40
  80. package/styles/color-modes/high-contrast.less +0 -35
  81. package/styles/color-modes/light.less +0 -46
@@ -12,6 +12,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _mapValues = _interopRequireDefault(require("lodash/mapValues"));
13
13
  var _pick = _interopRequireDefault(require("lodash/pick"));
14
14
  var _omit = _interopRequireDefault(require("lodash/omit"));
15
+ var _delay = _interopRequireDefault(require("lodash/delay"));
15
16
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
16
17
  var _Calendar = _interopRequireDefault(require("@rsuite/icons/legacy/Calendar"));
17
18
  var _ClockO = _interopRequireDefault(require("@rsuite/icons/legacy/ClockO"));
@@ -22,9 +23,11 @@ var _Toolbar = _interopRequireDefault(require("./Toolbar"));
22
23
  var _Stack = _interopRequireDefault(require("../Stack"));
23
24
  var _PredefinedRanges = _interopRequireDefault(require("./PredefinedRanges"));
24
25
  var _utils = require("../utils");
26
+ var _dateUtils = require("../utils/dateUtils");
25
27
  var _Picker = require("../Picker");
26
28
  var _OverlayTrigger = require("../Overlay/OverlayTrigger");
27
29
  var _deprecatePropType = require("../utils/deprecatePropType");
30
+ var _utils2 = require("../Calendar/utils");
28
31
  var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
29
32
  var _props$as = props.as,
30
33
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -98,12 +101,17 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
98
101
  calendarDate = _useCalendarDate.calendarDate,
99
102
  setCalendarDate = _useCalendarDate.setCalendarDate,
100
103
  resetCalendarDate = _useCalendarDate.resetCalendarDate;
101
- var _useState = (0, _react.useState)(),
102
- inputState = _useState[0],
103
- setInputState = _useState[1];
104
- var _useState2 = (0, _react.useState)(false),
105
- active = _useState2[0],
106
- setActive = _useState2[1];
104
+ var _useState = (0, _react.useState)(false),
105
+ showMonthDropdown = _useState[0],
106
+ setShowMonthDropdown = _useState[1]; // Show only the calendar month panel. formatStr = 'yyyy-MM'
107
+ var onlyShowMonth = (0, _dateUtils.shouldRenderMonth)(formatStr) && !(0, _dateUtils.shouldRenderDate)(formatStr);
108
+ var showMonth = onlyShowMonth || showMonthDropdown;
109
+ var _useState2 = (0, _react.useState)(),
110
+ inputState = _useState2[0],
111
+ setInputState = _useState2[1];
112
+ var _useState3 = (0, _react.useState)(false),
113
+ active = _useState3[0],
114
+ setActive = _useState3[1];
107
115
  var triggerRef = (0, _react.useRef)(null);
108
116
  var rootRef = (0, _react.useRef)(null);
109
117
  var targetRef = (0, _react.useRef)(null);
@@ -157,9 +165,9 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
157
165
  * The callback triggered when PM/AM is switched.
158
166
  */
159
167
  var handleToggleMeridian = (0, _react.useCallback)(function () {
160
- var hours = _utils.DateUtils.getHours(calendarDate);
168
+ var hours = (0, _dateUtils.getHours)(calendarDate);
161
169
  var nextHours = hours >= 12 ? hours - 12 : hours + 12;
162
- var nextDate = _utils.DateUtils.setHours(calendarDate, nextHours);
170
+ var nextDate = (0, _dateUtils.setHours)(calendarDate, nextHours);
163
171
  handleChangeTime(nextDate);
164
172
  }, [calendarDate, handleChangeTime]);
165
173
  var updateValue = (0, _react.useCallback)(function (event, nextPageDate, closeOverlay) {
@@ -189,13 +197,57 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
189
197
  onShortcutClick === null || onShortcutClick === void 0 ? void 0 : onShortcutClick(range, event);
190
198
  }, [handleDateChange, onShortcutClick, updateValue]);
191
199
 
200
+ /**
201
+ * Get the corresponding container based on date selection and month selection
202
+ */
203
+ var getOverlayContainer = (0, _react.useCallback)(function () {
204
+ var _overlayRef$current;
205
+ return (_overlayRef$current = overlayRef.current) === null || _overlayRef$current === void 0 ? void 0 : _overlayRef$current.querySelector(showMonth ? '[role="menu"]' : '[role="grid"]');
206
+ }, [showMonth]);
207
+
208
+ /**
209
+ * Check whether the date is focusable
210
+ */
211
+ var checkFocusable = (0, _react.useCallback)(function (date) {
212
+ var formatStr = showMonth ? locale.formattedMonthPattern : locale.formattedDayPattern;
213
+ var ariaLabel = (0, _utils2.getAriaLabel)(date, formatStr, formatDate);
214
+ var container = getOverlayContainer();
215
+ var dateElement = container.querySelector("[aria-label=\"" + ariaLabel + "\"]");
216
+ if (dateElement !== null && dateElement !== void 0 && dateElement.hasAttribute('aria-disabled')) {
217
+ return false;
218
+ }
219
+ return true;
220
+ }, [formatDate, getOverlayContainer, locale, showMonth]);
221
+
222
+ /**
223
+ * Focus on the currently selected date element
224
+ */
225
+ var focusSelectedDate = (0, _react.useCallback)(function () {
226
+ (0, _delay.default)(function () {
227
+ var container = getOverlayContainer();
228
+ var selectedElement = container === null || container === void 0 ? void 0 : container.querySelector('[aria-selected="true"]');
229
+ selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.focus();
230
+ }, 1);
231
+ }, [getOverlayContainer]);
232
+
233
+ /**
234
+ * Focus on the input element
235
+ */
236
+ var focusTargetButton = (0, _react.useCallback)(function () {
237
+ (0, _delay.default)(function () {
238
+ var _targetRef$current, _targetRef$current$qu;
239
+ (_targetRef$current = targetRef.current) === null || _targetRef$current === void 0 ? void 0 : (_targetRef$current$qu = _targetRef$current.querySelector('input')) === null || _targetRef$current$qu === void 0 ? void 0 : _targetRef$current$qu.focus();
240
+ }, 100);
241
+ }, []);
242
+
192
243
  /**
193
244
  * The callback triggered after clicking the OK button.
194
245
  */
195
246
  var handleOK = (0, _react.useCallback)(function (event) {
196
247
  updateValue(event);
197
248
  onOk === null || onOk === void 0 ? void 0 : onOk(calendarDate, event);
198
- }, [updateValue, onOk, calendarDate]);
249
+ focusTargetButton();
250
+ }, [updateValue, onOk, calendarDate, focusTargetButton]);
199
251
 
200
252
  /**
201
253
  * Callback after clicking the clear button.
@@ -204,6 +256,54 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
204
256
  updateValue(event, null);
205
257
  resetCalendarDate(null);
206
258
  }, [resetCalendarDate, updateValue]);
259
+ var handlePickerToggleKeyDown = (0, _react.useCallback)(function (event) {
260
+ var _event$target;
261
+ var tagName = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.tagName;
262
+ if (tagName === 'INPUT') {
263
+ if (event.key === 'ArrowDown') {
264
+ event.preventDefault();
265
+ focusSelectedDate();
266
+ } else if (event.key === 'Enter') {
267
+ var _triggerRef$current2, _triggerRef$current2$;
268
+ (_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : (_triggerRef$current2$ = _triggerRef$current2.open) === null || _triggerRef$current2$ === void 0 ? void 0 : _triggerRef$current2$.call(_triggerRef$current2);
269
+ }
270
+ }
271
+ }, [focusSelectedDate]);
272
+ var handlePickerOverlayKeyDown = (0, _react.useCallback)(function (event) {
273
+ var delta = 0;
274
+ var step = showMonth ? 6 : 7;
275
+ var changeDateFunc = showMonth ? _dateUtils.addMonths : _dateUtils.addDays;
276
+ (0, _Picker.onMenuKeyDown)(event, {
277
+ down: function down() {
278
+ delta = step;
279
+ },
280
+ up: function up() {
281
+ delta = -step;
282
+ },
283
+ right: function right() {
284
+ delta = 1;
285
+ },
286
+ left: function left() {
287
+ delta = -1;
288
+ },
289
+ enter: function enter() {
290
+ handleOK(event);
291
+ }
292
+ });
293
+ var nextDate = changeDateFunc(calendarDate, delta);
294
+ if (checkFocusable(nextDate)) {
295
+ setCalendarDate(nextDate);
296
+ focusSelectedDate();
297
+ }
298
+ }, [showMonth, calendarDate, checkFocusable, handleOK, setCalendarDate, focusSelectedDate]);
299
+
300
+ /**
301
+ * The callback triggered after the month selection box is opened or closed.
302
+ */
303
+ var handleToggleMonthDropdown = (0, _react.useCallback)(function (toggle) {
304
+ onToggleMonthDropdown === null || onToggleMonthDropdown === void 0 ? void 0 : onToggleMonthDropdown(toggle);
305
+ setShowMonthDropdown(toggle);
306
+ }, [onToggleMonthDropdown]);
207
307
 
208
308
  /**
209
309
  * Handle keyboard events.
@@ -211,8 +311,10 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
211
311
  var onPickerKeyDown = (0, _Picker.useToggleKeyDownEvent)((0, _extends2.default)({
212
312
  triggerRef: triggerRef,
213
313
  targetRef: targetRef,
314
+ overlayRef: overlayRef,
214
315
  active: active,
215
- onExit: handleClean
316
+ onExit: handleClean,
317
+ onKeyDown: handlePickerToggleKeyDown
216
318
  }, rest));
217
319
 
218
320
  /**
@@ -224,18 +326,18 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
224
326
  }
225
327
  setCalendarDate(
226
328
  // Determine whether the current value contains time, if not, use calendarDate.
227
- _utils.DateUtils.shouldRenderTime(formatStr) ? nextValue : (0, _utils.composeFunctions)(function (d) {
228
- return _utils.DateUtils.setHours(d, _utils.DateUtils.getHours(calendarDate));
329
+ (0, _dateUtils.shouldRenderTime)(formatStr) ? nextValue : (0, _utils.composeFunctions)(function (d) {
330
+ return (0, _dateUtils.setHours)(d, (0, _dateUtils.getHours)(calendarDate));
229
331
  }, function (d) {
230
- return _utils.DateUtils.setMinutes(d, _utils.DateUtils.getMinutes(calendarDate));
332
+ return (0, _dateUtils.setMinutes)(d, (0, _dateUtils.getMinutes)(calendarDate));
231
333
  }, function (d) {
232
- return _utils.DateUtils.setSeconds(d, _utils.DateUtils.getSeconds(calendarDate));
334
+ return (0, _dateUtils.setSeconds)(d, (0, _dateUtils.getSeconds)(calendarDate));
233
335
  })(nextValue));
234
336
  handleDateChange(nextValue);
235
337
  if (oneTap && updatableValue) {
236
338
  updateValue(event, nextValue);
237
339
  }
238
- }, [formatStr, handleDateChange, oneTap, calendarDate, setCalendarDate, updateValue]);
340
+ }, [setCalendarDate, formatStr, handleDateChange, oneTap, calendarDate, updateValue]);
239
341
 
240
342
  /**
241
343
  * A callback triggered when the date on the calendar changes.
@@ -243,13 +345,11 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
243
345
  var handleChangeMonth = (0, _react.useCallback)(function (nextPageDate, event) {
244
346
  setCalendarDate(nextPageDate);
245
347
  handleDateChange(nextPageDate);
246
-
247
- // Show only the calendar month panel. formatStr = 'yyyy-MM'
248
- var onlyShowMonth = _utils.DateUtils.shouldRenderMonth(formatStr) && !_utils.DateUtils.shouldRenderDate(formatStr);
348
+ focusSelectedDate();
249
349
  if (oneTap && onlyShowMonth) {
250
350
  updateValue(event, nextPageDate);
251
351
  }
252
- }, [formatStr, handleDateChange, oneTap, setCalendarDate, updateValue]);
352
+ }, [focusSelectedDate, handleDateChange, oneTap, onlyShowMonth, setCalendarDate, updateValue]);
253
353
  var isDateDisabled = (0, _react.useCallback)(function (date) {
254
354
  if (typeof shouldDisableDate === 'function') {
255
355
  return shouldDisableDate(date);
@@ -268,7 +368,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
268
368
 
269
369
  // isMatch('01/11/2020', 'MM/dd/yyyy') ==> true
270
370
  // isMatch('2020-11-01', 'MM/dd/yyyy') ==> false
271
- if (!_utils.DateUtils.isMatch(value, formatStr, {
371
+ if (!(0, _dateUtils.isMatch)(value, formatStr, {
272
372
  locale: locale.dateLocale
273
373
  })) {
274
374
  setInputState('Error');
@@ -277,10 +377,10 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
277
377
  var date = parseDate(value, formatStr);
278
378
 
279
379
  // If only the time is included in the characters, it will default to today.
280
- if (_utils.DateUtils.shouldOnlyRenderTime(formatStr)) {
281
- date = new Date(_utils.DateUtils.format(new Date(), 'yyyy-MM-dd') + " " + value);
380
+ if ((0, _dateUtils.shouldOnlyRenderTime)(formatStr)) {
381
+ date = new Date((0, _dateUtils.format)(new Date(), 'yyyy-MM-dd') + " " + value);
282
382
  }
283
- if (!_utils.DateUtils.isValid(date)) {
383
+ if (!(0, _dateUtils.isValid)(date)) {
284
384
  setInputState('Error');
285
385
  return;
286
386
  }
@@ -321,7 +421,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
321
421
  var disabledToolbarHandle = (0, _react.useCallback)(function (date) {
322
422
  var _DEPRECATED_disabledD;
323
423
  var allowDate = (_DEPRECATED_disabledD = DEPRECATED_disabledDate === null || DEPRECATED_disabledDate === void 0 ? void 0 : DEPRECATED_disabledDate(date)) !== null && _DEPRECATED_disabledD !== void 0 ? _DEPRECATED_disabledD : false;
324
- var allowTime = _utils.DateUtils.disabledTime(props, date);
424
+ var allowTime = (0, _dateUtils.disabledTime)(props, date);
325
425
  return allowDate || allowTime;
326
426
  }, [DEPRECATED_disabledDate, props]);
327
427
 
@@ -332,13 +432,13 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
332
432
  * - If format is month, disable ok button if all dates in the month of selected date are disabled
333
433
  */
334
434
  var isOKButtonDisabled = (0, _react.useCallback)(function (selectedDate) {
335
- if (_utils.DateUtils.shouldRenderMonth(formatStr) && !_utils.DateUtils.shouldRenderDate(formatStr)) {
435
+ if ((0, _dateUtils.shouldRenderMonth)(formatStr) && !(0, _dateUtils.shouldRenderDate)(formatStr)) {
336
436
  return (0, _MonthDropdown.isEveryDateInMonth)(selectedDate.getFullYear(), selectedDate.getMonth(), disabledToolbarHandle);
337
437
  }
338
438
  return disabledToolbarHandle(selectedDate);
339
439
  }, [disabledToolbarHandle, formatStr]);
340
440
  var calendarProps = (0, _react.useMemo)(function () {
341
- return (0, _mapValues.default)((0, _pick.default)(props, _utils.DateUtils.calendarOnlyProps), function (disabledOrHiddenTimeFunc) {
441
+ return (0, _mapValues.default)((0, _pick.default)(props, _dateUtils.calendarOnlyProps), function (disabledOrHiddenTimeFunc) {
342
442
  return function (next, date) {
343
443
  var _disabledOrHiddenTime;
344
444
  return (_disabledOrHiddenTime = disabledOrHiddenTimeFunc === null || disabledOrHiddenTimeFunc === void 0 ? void 0 : disabledOrHiddenTimeFunc(next, date)) !== null && _disabledOrHiddenTime !== void 0 ? _disabledOrHiddenTime : false;
@@ -361,15 +461,19 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
361
461
  onMoveForward: handleMoveForward,
362
462
  onMoveBackward: handleMoveBackward,
363
463
  onSelect: handleSelect,
364
- onToggleMonthDropdown: onToggleMonthDropdown,
464
+ onToggleMonthDropdown: handleToggleMonthDropdown,
365
465
  onToggleTimeDropdown: onToggleTimeDropdown,
366
466
  onChangeMonth: handleChangeMonth,
367
467
  onChangeTime: handleChangeTime,
368
468
  onToggleMeridian: handleToggleMeridian
369
469
  }));
470
+
471
+ // The shortcut option on the left side of the calendar panel
370
472
  var sideRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
371
473
  return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
372
474
  })) || [];
475
+
476
+ // The shortcut option on the bottom of the calendar panel
373
477
  var bottomRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
374
478
  return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
375
479
  })) || [];
@@ -387,7 +491,8 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
387
491
  className: classes,
388
492
  ref: (0, _utils.mergeRefs)(overlayRef, speakerRef),
389
493
  style: styles,
390
- target: triggerRef
494
+ target: triggerRef,
495
+ onKeyDown: handlePickerOverlayKeyDown
391
496
  }, /*#__PURE__*/_react.default.createElement(_Stack.default, {
392
497
  alignItems: "flex-start"
393
498
  }, sideRanges.length > 0 && /*#__PURE__*/_react.default.createElement(_PredefinedRanges.default, {
@@ -428,20 +533,22 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
428
533
  return (_renderValue = renderValue === null || renderValue === void 0 ? void 0 : renderValue(value, formatStr)) !== null && _renderValue !== void 0 ? _renderValue : formatDate(value, formatStr);
429
534
  }, [formatStr, formatDate, placeholder, renderValue, value]);
430
535
  var caretAs = (0, _react.useMemo)(function () {
431
- return caretAsProp || (_utils.DateUtils.shouldOnlyRenderTime(formatStr) ? _ClockO.default : _Calendar.default);
536
+ return caretAsProp || ((0, _dateUtils.shouldOnlyRenderTime)(formatStr) ? _ClockO.default : _Calendar.default);
432
537
  }, [caretAsProp, formatStr]);
538
+ var handleTriggerClose = (0, _react.useCallback)(function (cause) {
539
+ // Unless overlay is closing on user clicking "OK" button,
540
+ // reset the selected date on calendar panel
541
+ if (cause !== _OverlayTrigger.OverlayCloseCause.ImperativeHandle) {
542
+ resetCalendarDate();
543
+ }
544
+ setShowMonthDropdown(false);
545
+ }, [resetCalendarDate]);
433
546
  return /*#__PURE__*/_react.default.createElement(_Picker.PickerToggleTrigger, {
434
547
  trigger: "active",
435
548
  pickerProps: (0, _pick.default)(props, _Picker.pickTriggerPropKeys),
436
549
  ref: triggerRef,
437
550
  placement: placement,
438
- onClose: function onClose(cause) {
439
- // Unless overlay is closing on user clicking "OK" button,
440
- // reset the selected date on calendar panel
441
- if (cause !== _OverlayTrigger.OverlayCloseCause.ImperativeHandle) {
442
- resetCalendarDate();
443
- }
444
- },
551
+ onClose: handleTriggerClose,
445
552
  onEntered: (0, _utils.createChainedFunction)(handleEntered, onEntered),
446
553
  onExited: (0, _utils.createChainedFunction)(handleExited, onExited),
447
554
  speaker: renderDropdownMenu
@@ -449,7 +556,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
449
556
  className: merge(className, classes),
450
557
  style: style,
451
558
  ref: rootRef
452
- }, /*#__PURE__*/_react.default.createElement(_Picker.PickerToggle, (0, _extends2.default)({}, (0, _omit.default)(rest, [].concat(_Picker.omitTriggerPropKeys, usedClassNamePropKeys, _utils.DateUtils.calendarOnlyProps)), {
559
+ }, /*#__PURE__*/_react.default.createElement(_Picker.PickerToggle, (0, _extends2.default)({}, (0, _omit.default)(rest, [].concat(_Picker.omitTriggerPropKeys, usedClassNamePropKeys, _dateUtils.calendarOnlyProps)), {
453
560
  className: prefix({
454
561
  error: inputState === 'Error'
455
562
  }),
@@ -459,7 +566,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
459
566
  editable: editable,
460
567
  inputValue: value ? formatDate(value, formatStr) : '',
461
568
  inputPlaceholder: typeof placeholder === 'string' && placeholder ? placeholder : formatStr,
462
- inputMask: _utils.DateUtils.getDateMask(formatStr),
569
+ inputMask: (0, _dateUtils.getDateMask)(formatStr),
463
570
  onInputChange: handleInputChange,
464
571
  onInputBlur: handleInputPressEnd,
465
572
  onInputPressEnter: handleInputPressEnd,
@@ -4,6 +4,8 @@ import { TypeAttributes, RsRefForwardingComponent } from '../@types/common';
4
4
  export interface DrawerProps extends ModalProps {
5
5
  /** The placement of Drawer */
6
6
  placement?: TypeAttributes.Placement4;
7
+ /** Custom close button */
8
+ closeButton?: React.ReactNode | boolean;
7
9
  }
8
10
  declare const DrawerBody: RsRefForwardingComponent<'div', ModalBodyProps>;
9
11
  declare const DrawerHeader: RsRefForwardingComponent<'div', ModalHeaderProps>;
@@ -1,17 +1,19 @@
1
1
  'use client';
2
2
  "use strict";
3
3
 
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
6
  exports.__esModule = true;
6
7
  exports.default = void 0;
7
8
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
8
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _react = _interopRequireDefault(require("react"));
10
+ var _react = _interopRequireWildcard(require("react"));
10
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
12
  var _Slide = _interopRequireDefault(require("../Animation/Slide"));
12
13
  var _Modal = _interopRequireDefault(require("../Modal"));
13
14
  var _utils = require("../utils");
14
15
  var _deprecateComponent = _interopRequireDefault(require("../utils/deprecateComponent"));
16
+ var _DrawerContext = _interopRequireDefault(require("./DrawerContext"));
15
17
  var DrawerBody = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
16
18
  return /*#__PURE__*/_react.default.createElement(_Modal.default.Body, (0, _extends2.default)({
17
19
  classPrefix: "drawer-body"
@@ -55,7 +57,9 @@ var Drawer = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
55
57
  classPrefix = _props$classPrefix === void 0 ? 'drawer' : _props$classPrefix,
56
58
  _props$animation = props.animation,
57
59
  animation = _props$animation === void 0 ? _Slide.default : _props$animation,
58
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["className", "placement", "classPrefix", "animation"]);
60
+ _props$closeButton = props.closeButton,
61
+ closeButton = _props$closeButton === void 0 ? true : _props$closeButton,
62
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["className", "placement", "classPrefix", "animation", "closeButton"]);
59
63
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
60
64
  merge = _useClassNames.merge,
61
65
  prefix = _useClassNames.prefix;
@@ -63,14 +67,21 @@ var Drawer = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
63
67
  var animationProps = {
64
68
  placement: placement
65
69
  };
66
- return /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, rest, {
70
+ var contextValue = (0, _react.useMemo)(function () {
71
+ return {
72
+ closeButton: closeButton,
73
+ isDrawer: true
74
+ };
75
+ }, [closeButton]);
76
+ return /*#__PURE__*/_react.default.createElement(_DrawerContext.default.Provider, {
77
+ value: contextValue
78
+ }, /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, rest, {
67
79
  ref: ref,
68
- drawer: true,
69
80
  classPrefix: classPrefix,
70
81
  className: classes,
71
82
  animation: animation,
72
83
  animationProps: animationProps
73
- }));
84
+ })));
74
85
  });
75
86
  DrawerBody.displayName = 'DrawerBody';
76
87
  DrawerHeader.displayName = 'DrawerHeader';
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface DrawerContextProps {
3
+ /** Custom close button */
4
+ closeButton?: React.ReactNode | boolean;
5
+ /** Render Modal as Drawer */
6
+ isDrawer: boolean;
7
+ }
8
+ declare const DrawerContext: React.Context<DrawerContextProps | null>;
9
+ export default DrawerContext;
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ exports.__esModule = true;
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var DrawerContext = /*#__PURE__*/_react.default.createContext(null);
9
+ var _default = DrawerContext;
10
+ exports.default = _default;
@@ -134,7 +134,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
134
134
  if (AccepterComponent === _Toggle.default) {
135
135
  valueKey = 'checked';
136
136
  }
137
- var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = val !== null && val !== void 0 ? val : defaultValue, _accepterProps);
137
+ var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = val === undefined ? defaultValue : val, _accepterProps);
138
138
  return /*#__PURE__*/_react.default.createElement(Component, {
139
139
  className: classes,
140
140
  ref: ref
@@ -150,9 +150,12 @@ var InputPicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
150
150
  return multi ? (0, _clone.default)(value) || [] : value;
151
151
  }, [multi, value]);
152
152
  var handleClose = (0, _react.useCallback)(function () {
153
- var _triggerRef$current;
153
+ var _triggerRef$current, _targetRef$current, _targetRef$current$fo;
154
154
  triggerRef === null || triggerRef === void 0 ? void 0 : (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.close();
155
- }, [triggerRef]);
155
+
156
+ // The focus is on the trigger button after closing
157
+ (_targetRef$current = targetRef.current) === null || _targetRef$current === void 0 ? void 0 : (_targetRef$current$fo = _targetRef$current.focus) === null || _targetRef$current$fo === void 0 ? void 0 : _targetRef$current$fo.call(_targetRef$current);
158
+ }, []);
156
159
 
157
160
  // Used to hover the focuse item when trigger `onKeydown`
158
161
  var _useFocusItemValue = (0, _Picker.useFocusItemValue)(multi ? value === null || value === void 0 ? void 0 : value[0] : value, {
@@ -658,7 +661,7 @@ var InputPicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
658
661
  plaintext: plaintext,
659
662
  ref: targetRef,
660
663
  as: toggleAs,
661
- tabIndex: undefined,
664
+ tabIndex: tabIndex,
662
665
  onClean: handleClean,
663
666
  cleanable: cleanable && !disabled,
664
667
  hasValue: hasValue,
@@ -670,7 +673,7 @@ var InputPicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
670
673
  }), searching || multi && hasValue ? null : itemNode || placeholderNode), !(!multi && disabled) && /*#__PURE__*/_react.default.createElement("div", {
671
674
  className: prefix(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteralLoose2.default)(["tag-wrapper"])))
672
675
  }, tagElements, displaySearchInput && /*#__PURE__*/_react.default.createElement(_InputSearch.default, (0, _extends2.default)({}, inputProps, {
673
- tabIndex: tabIndex,
676
+ tabIndex: -1,
674
677
  readOnly: readOnly,
675
678
  onBlur: onBlur,
676
679
  onFocus: (0, _utils.createChainedFunction)(handleFocus, onFocus),
@@ -5,8 +5,8 @@ import ModalBody from './ModalBody';
5
5
  import ModalHeader from './ModalHeader';
6
6
  import ModalTitle from './ModalTitle';
7
7
  import ModalFooter from './ModalFooter';
8
- import { TypeAttributes, RsRefForwardingComponent } from '../@types/common';
9
- export declare type ModalSize = TypeAttributes.Size | 'full';
8
+ import { ModalSize } from './utils';
9
+ import { RsRefForwardingComponent } from '../@types/common';
10
10
  export interface ModalProps extends BaseModalProps, Pick<React.HTMLAttributes<HTMLElement>, 'role' | 'id' | 'aria-labelledby' | 'aria-describedby'> {
11
11
  /** A modal can have different sizes */
12
12
  size?: ModalSize;
@@ -27,8 +27,6 @@ export interface ModalProps extends BaseModalProps, Pick<React.HTMLAttributes<HT
27
27
  dialogAs?: React.ElementType;
28
28
  /** Automatically sets the height when the body content is too long. */
29
29
  overflow?: boolean;
30
- /** Render Modal as Drawer */
31
- drawer?: boolean;
32
30
  }
33
31
  interface ModalComponent extends RsRefForwardingComponent<'div', ModalProps> {
34
32
  Body: typeof ModalBody;
@@ -25,9 +25,11 @@ var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
25
25
  var _utils2 = require("./utils");
26
26
  var _useUniqueId = _interopRequireDefault(require("../utils/useUniqueId"));
27
27
  var _deprecatePropType = _interopRequireDefault(require("../utils/deprecatePropType"));
28
+ var _DrawerContext = _interopRequireDefault(require("../Drawer/DrawerContext"));
28
29
  var _templateObject, _templateObject2;
29
30
  var modalSizes = ['xs', 'sm', 'md', 'lg', 'full'];
30
31
  var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
32
+ var _prefix;
31
33
  var className = props.className,
32
34
  children = props.children,
33
35
  _props$classPrefix = props.classPrefix,
@@ -50,8 +52,6 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
50
52
  animationTimeout = _props$animationTimeo === void 0 ? 300 : _props$animationTimeo,
51
53
  _props$overflow = props.overflow,
52
54
  overflow = _props$overflow === void 0 ? true : _props$overflow,
53
- _props$drawer = props.drawer,
54
- drawer = _props$drawer === void 0 ? false : _props$drawer,
55
55
  onClose = props.onClose,
56
56
  onEntered = props.onEntered,
57
57
  onEntering = props.onEntering,
@@ -61,7 +61,7 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
61
61
  idProp = props.id,
62
62
  ariaLabelledby = props['aria-labelledby'],
63
63
  ariaDescribedby = props['aria-describedby'],
64
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["className", "children", "classPrefix", "dialogClassName", "backdropClassName", "backdrop", "dialogStyle", "animation", "open", "size", "full", "dialogAs", "animationProps", "animationTimeout", "overflow", "drawer", "onClose", "onEntered", "onEntering", "onExited", "role", "id", "aria-labelledby", "aria-describedby"]);
64
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["className", "children", "classPrefix", "dialogClassName", "backdropClassName", "backdrop", "dialogStyle", "animation", "open", "size", "full", "dialogAs", "animationProps", "animationTimeout", "overflow", "onClose", "onEntered", "onEntering", "onExited", "role", "id", "aria-labelledby", "aria-describedby"]);
65
65
  var inClass = {
66
66
  in: open && !animation
67
67
  };
@@ -71,17 +71,21 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
71
71
  var _useState = (0, _react.useState)(false),
72
72
  shake = _useState[0],
73
73
  setShake = _useState[1];
74
- var classes = merge(className, prefix(size, {
74
+ var classes = merge(className, prefix((_prefix = {
75
75
  full: full
76
- }));
76
+ }, _prefix[size] = modalSizes.includes(size), _prefix)));
77
77
  var dialogRef = (0, _react.useRef)(null);
78
78
  var transitionEndListener = (0, _react.useRef)();
79
79
 
80
- // The style of the Modal body will be updated with the size of the window or container.
80
+ // Render Modal as Drawer
81
+ var _ref = (0, _react.useContext)(_DrawerContext.default) || {},
82
+ _ref$isDrawer = _ref.isDrawer,
83
+ isDrawer = _ref$isDrawer === void 0 ? false : _ref$isDrawer; // The style of the Modal body will be updated with the size of the window or container.
81
84
  var _useBodyStyles = (0, _utils2.useBodyStyles)(dialogRef, {
82
85
  overflow: overflow,
83
- drawer: drawer,
84
- prefix: prefix
86
+ drawer: isDrawer,
87
+ prefix: prefix,
88
+ size: size
85
89
  }),
86
90
  bodyStyles = _useBodyStyles[0],
87
91
  onChangeBodyStyles = _useBodyStyles[1],
@@ -93,10 +97,9 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
93
97
  onModalClose: onClose,
94
98
  getBodyStyles: function getBodyStyles() {
95
99
  return bodyStyles;
96
- },
97
- isDrawer: drawer
100
+ }
98
101
  };
99
- }, [dialogId, onClose, bodyStyles, drawer]);
102
+ }, [dialogId, onClose, bodyStyles]);
100
103
  var handleExited = (0, _react.useCallback)(function (node) {
101
104
  var _transitionEndListene;
102
105
  onExited === null || onExited === void 0 ? void 0 : onExited(node);
@@ -150,6 +153,12 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
150
153
  var _transitionEndListene2;
151
154
  (_transitionEndListene2 = transitionEndListener.current) === null || _transitionEndListene2 === void 0 ? void 0 : _transitionEndListene2.off();
152
155
  });
156
+ var sizeKey = 'width';
157
+ if (isDrawer) {
158
+ var _ref2 = animationProps || {},
159
+ placement = _ref2.placement; // The width or height of the drawer depends on the placement.
160
+ sizeKey = placement === 'top' || placement === 'bottom' ? 'height' : 'width';
161
+ }
153
162
  return /*#__PURE__*/_react.default.createElement(_ModalContext.ModalContext.Provider, {
154
163
  value: modalContextValue
155
164
  }, /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, rest, {
@@ -173,13 +182,15 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
173
182
  onClick: backdrop ? handleBackdropClick : undefined,
174
183
  onMouseDown: handleMouseDown
175
184
  }), function (transitionProps, transitionRef) {
185
+ var _ref3;
176
186
  var transitionClassName = transitionProps.className,
177
187
  transitionRest = (0, _objectWithoutPropertiesLoose2.default)(transitionProps, ["className"]);
178
188
  return /*#__PURE__*/_react.default.createElement(Dialog, (0, _extends2.default)({
179
189
  role: role,
180
190
  id: dialogId,
181
191
  "aria-labelledby": ariaLabelledby !== null && ariaLabelledby !== void 0 ? ariaLabelledby : dialogId + "-title",
182
- "aria-describedby": ariaDescribedby
192
+ "aria-describedby": ariaDescribedby,
193
+ style: (_ref3 = {}, _ref3[sizeKey] = modalSizes.includes(size) ? undefined : size, _ref3)
183
194
  }, transitionRest, (0, _pick.default)(rest, Object.keys(_ModalDialog.modalDialogPropTypes)), {
184
195
  ref: (0, _utils.mergeRefs)(dialogRef, transitionRef),
185
196
  classPrefix: classPrefix,
@@ -202,7 +213,7 @@ Modal.propTypes = (0, _extends2.default)({}, _Modal.modalPropTypes, {
202
213
  animationTimeout: _propTypes.default.number,
203
214
  classPrefix: _propTypes.default.string,
204
215
  dialogClassName: _propTypes.default.string,
205
- size: _propTypes.default.oneOf(modalSizes),
216
+ size: _propTypes.default.oneOfType([_propTypes.default.oneOf(modalSizes), _propTypes.default.number, _propTypes.default.string]),
206
217
  dialogStyle: _propTypes.default.object,
207
218
  dialogAs: _propTypes.default.elementType,
208
219
  full: (0, _deprecatePropType.default)(_propTypes.default.bool, 'Use size="full" instead.'),
@@ -13,8 +13,9 @@ var _utils = require("../utils");
13
13
  var _ModalContext = require("./ModalContext");
14
14
  var _IconButton = _interopRequireDefault(require("../IconButton"));
15
15
  var _Close = _interopRequireDefault(require("@rsuite/icons/Close"));
16
+ var _DrawerContext = _interopRequireDefault(require("../Drawer/DrawerContext"));
16
17
  var ModalBody = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
17
- var _context$getBodyStyle;
18
+ var _context$getBodyStyle, _useContext;
18
19
  var _props$as = props.as,
19
20
  Component = _props$as === void 0 ? 'div' : _props$as,
20
21
  _props$classPrefix = props.classPrefix,
@@ -30,17 +31,22 @@ var ModalBody = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
30
31
  var classes = merge(className, withClassPrefix());
31
32
  var context = (0, _react.useContext)(_ModalContext.ModalContext);
32
33
  var bodyStyles = context === null || context === void 0 ? void 0 : (_context$getBodyStyle = context.getBodyStyles) === null || _context$getBodyStyle === void 0 ? void 0 : _context$getBodyStyle.call(context);
34
+ var closeButton = (_useContext = (0, _react.useContext)(_DrawerContext.default)) === null || _useContext === void 0 ? void 0 : _useContext.closeButton;
35
+ var buttonElement = null;
36
+ if (closeButton) {
37
+ buttonElement = typeof closeButton === 'boolean' ? /*#__PURE__*/_react.default.createElement(_IconButton.default, {
38
+ icon: /*#__PURE__*/_react.default.createElement(_Close.default, null),
39
+ appearance: "subtle",
40
+ size: "sm",
41
+ className: prefix('close'),
42
+ onClick: context === null || context === void 0 ? void 0 : context.onModalClose
43
+ }) : closeButton;
44
+ }
33
45
  return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, {
34
46
  ref: ref,
35
47
  style: (0, _extends2.default)({}, bodyStyles, style),
36
48
  className: classes
37
- }), (context === null || context === void 0 ? void 0 : context.isDrawer) && /*#__PURE__*/_react.default.createElement(_IconButton.default, {
38
- icon: /*#__PURE__*/_react.default.createElement(_Close.default, null),
39
- appearance: "subtle",
40
- size: "sm",
41
- className: prefix('close'),
42
- onClick: context === null || context === void 0 ? void 0 : context.onModalClose
43
- }), children);
49
+ }), buttonElement, children);
44
50
  });
45
51
  ModalBody.displayName = 'ModalBody';
46
52
  ModalBody.propTypes = {