rsuite 5.78.1 → 5.79.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ # [5.79.0](https://github.com/rsuite/rsuite/compare/v5.78.1...v5.79.0) (2025-03-26)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **Form:** support explicit type of array type when use rule of formControl ([#4165](https://github.com/rsuite/rsuite/issues/4165)) ([55df308](https://github.com/rsuite/rsuite/commit/55df3080ebcb57ab5e3a8482e381220499600831))
7
+ * **useToaster:** fix the incorrect [@see](https://github.com/see) link in the useToaster comment ([#4200](https://github.com/rsuite/rsuite/issues/4200)) ([cd8087a](https://github.com/rsuite/rsuite/commit/cd8087a4529fad814378104a4f19c2734bcd55f2))
8
+
9
+
10
+ ### Features
11
+
12
+ * **Slider,RangeSlider:** add support for `keepTooltipOpen` prop ([#4186](https://github.com/rsuite/rsuite/issues/4186)) ([a1bdea4](https://github.com/rsuite/rsuite/commit/a1bdea4fad33feca63636631aa1cac7989c0eb87))
13
+
14
+
15
+
1
16
  ## [5.78.1](https://github.com/rsuite/rsuite/compare/v5.78.0...v5.78.1) (2025-03-14)
2
17
 
3
18
 
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  English | [中文版][readm-cn]
8
8
 
9
9
  [![npm][npm-svg]][npm-home]
10
- [![GitHub Actions][actions-svg]][actions-home]
10
+ [![GitHub Actions][nodejs-ci-svg]][nodejs-ci]
11
11
  [![npm bundle size][npm-bundle-size-img]][npm-bundle-size]
12
12
  [![codecov][codecov-img]][codecov]
13
13
  [![Discord][discord-svg]][discord-invite]
@@ -142,8 +142,8 @@ React Suite is [MIT licensed][license].
142
142
  [npm-home]: https://www.npmjs.com/package/rsuite
143
143
  [npm-bundle-size-img]: https://badgen.net/bundlephobia/minzip/rsuite?icon=npm
144
144
  [npm-bundle-size]: https://bundlephobia.com/package/rsuite
145
- [actions-svg]: https://github.com/rsuite/rsuite/workflows/Node.js%20CI/badge.svg?branch=main
146
- [actions-home]: https://github.com/rsuite/rsuite/actions?query=branch%3Amain+workflow%3A%22Node.js+CI%22
145
+ [nodejs-ci-svg]: https://github.com/rsuite/rsuite/workflows/Node.js%20CI/badge.svg
146
+ [nodejs-ci]: https://github.com/rsuite/rsuite/actions/workflows/nodejs-ci.yml?query=branch%3Amain+workflow%3A%22Node.js+CI%22
147
147
  [discord-svg]: https://img.shields.io/badge/Discord-Join%20chat%20%E2%86%92-738bd7.svg
148
148
  [discord-invite]: https://discord.gg/R8mnjwh
149
149
  [release-notes]: https://github.com/rsuite/rsuite/releases
@@ -5,58 +5,7 @@ exports.__esModule = true;
5
5
  exports.default = void 0;
6
6
  var _schemaTyped = require("schema-typed");
7
7
  var _react = require("react");
8
- /**
9
- * Convert a flat schema object to a nested schema object
10
- *
11
- * @example
12
- *
13
- * ```js
14
- * const schema = {
15
- * 'address.city': StringType().isRequired('City is required'),
16
- * 'address.street': StringType().isRequired('Street is required')
17
- * };
18
- *
19
- * const result = unflattenSchemaObject(schema);
20
- *
21
- * // result
22
- * {
23
- * address: ObjectType().shape({
24
- * city: StringType().isRequired('City is required'),
25
- * street: StringType().isRequired('Street is required')
26
- * })
27
- * }
28
- * ```
29
- */
30
- function unflattenSchemaObject(schema) {
31
- var result = {};
32
- var $type = Symbol('schema-type');
33
- Object.keys(schema).forEach(function (key) {
34
- if (key.includes('.')) {
35
- var keys = key.split('.');
36
- var lastKey = keys.pop() || '';
37
- var current = result;
38
- keys.forEach(function (subKey) {
39
- var _ref;
40
- current[subKey] = current[subKey] || (_ref = {}, _ref[$type] = 'object-type', _ref);
41
- current = current[subKey];
42
- });
43
- current[lastKey] = schema[key];
44
- } else {
45
- result[key] = schema[key];
46
- }
47
- });
48
- function convertToShape(obj) {
49
- Object.keys(obj).forEach(function (key) {
50
- var _obj$key;
51
- if (((_obj$key = obj[key]) === null || _obj$key === void 0 ? void 0 : _obj$key[$type]) === 'object-type') {
52
- delete obj[key][$type];
53
- obj[key] = (0, _schemaTyped.ObjectType)().shape(convertToShape(obj[key]));
54
- }
55
- });
56
- return obj;
57
- }
58
- return convertToShape(result);
59
- }
8
+ var _constructFlatSchema = require("../utils/constructFlatSchema");
60
9
  function useSchemaModel(formModel, nestedField) {
61
10
  var subRulesRef = (0, _react.useRef)([]);
62
11
  var pushFieldRule = (0, _react.useCallback)(function (name, fieldRule) {
@@ -80,15 +29,15 @@ function useSchemaModel(formModel, nestedField) {
80
29
  if (realSubRules.length === 0) {
81
30
  return formModel;
82
31
  }
83
- var subRuleObject = realSubRules.map(function (_ref2) {
84
- var _ref3;
85
- var name = _ref2.name,
86
- fieldRule = _ref2.fieldRule;
87
- return _ref3 = {}, _ref3[name] = fieldRule.current, _ref3;
32
+ var subRuleObject = realSubRules.map(function (_ref) {
33
+ var _ref2;
34
+ var name = _ref.name,
35
+ fieldRule = _ref.fieldRule;
36
+ return _ref2 = {}, _ref2[name] = fieldRule.current, _ref2;
88
37
  }).reduce(function (a, b) {
89
38
  return Object.assign(a, b);
90
39
  }, {});
91
- return _schemaTyped.SchemaModel.combine(formModel, (0, _schemaTyped.SchemaModel)(nestedField ? unflattenSchemaObject(subRuleObject) : subRuleObject));
40
+ return _schemaTyped.SchemaModel.combine(formModel, (0, _schemaTyped.SchemaModel)(nestedField ? (0, _constructFlatSchema.constructFlatSchema)(subRuleObject) : subRuleObject));
92
41
  }, [formModel, nestedField]);
93
42
  return {
94
43
  getCombinedModel: getCombinedModel,
@@ -0,0 +1,4 @@
1
+ /**
2
+ * combine flat schema to nested schema
3
+ */
4
+ export declare function constructFlatSchema(schema: any): any;
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ exports.__esModule = true;
6
+ exports.constructFlatSchema = constructFlatSchema;
7
+ var _schemaTyped = require("schema-typed");
8
+ var _set = _interopRequireDefault(require("lodash/set"));
9
+ /**
10
+ * combine flat schema to nested schema
11
+ */
12
+ function constructFlatSchema(schema) {
13
+ var shape = {};
14
+ Object.keys(schema).forEach(function (key) {
15
+ (0, _set.default)(shape, key, {
16
+ schema: schema[key],
17
+ primitiveType: true
18
+ });
19
+ });
20
+ function convertShapeToSchema(shape, result, internal) {
21
+ Object.keys(shape).forEach(function (key) {
22
+ var currentShape = shape[key];
23
+ if (Array.isArray(currentShape)) {
24
+ var _ArrayType;
25
+ result[key] = (_ArrayType = (0, _schemaTyped.ArrayType)()).of.apply(_ArrayType, currentShape.map(function (v) {
26
+ if (v.primitiveType) {
27
+ return v.schema;
28
+ }
29
+ return convertShapeToSchema(v, {}, true);
30
+ }));
31
+ } else {
32
+ if (currentShape.primitiveType) {
33
+ result[key] = currentShape.schema;
34
+ } else {
35
+ result[key] = convertShapeToSchema(currentShape, {}, true);
36
+ }
37
+ }
38
+ });
39
+ return internal ? (0, _schemaTyped.ObjectType)().shape(result) : result;
40
+ }
41
+ return convertShapeToSchema(shape, {});
42
+ }
@@ -19,7 +19,7 @@ var _Slider = require("../Slider/Slider");
19
19
  var _utils = require("../Slider/utils");
20
20
  var _propTypes2 = require("../internals/propTypes");
21
21
  var _CustomProvider = require("../CustomProvider");
22
- var _excluded = ["aria-label", "aria-labelledby", "aria-valuetext", "as", "barClassName", "className", "classPrefix", "constraint", "defaultValue", "disabled", "graduated", "progress", "vertical", "readOnly", "min", "max", "step", "value", "handleClassName", "handleStyle", "handleTitle", "tooltip", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted"];
22
+ var _excluded = ["aria-label", "aria-labelledby", "aria-valuetext", "as", "barClassName", "className", "classPrefix", "constraint", "defaultValue", "disabled", "graduated", "progress", "keepTooltipOpen", "vertical", "readOnly", "min", "max", "step", "value", "handleClassName", "handleStyle", "handleTitle", "tooltip", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted"];
23
23
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
25
  var defaultDefaultValue = [0, 0];
@@ -47,6 +47,8 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
47
47
  graduated = propsWithDefaults.graduated,
48
48
  _propsWithDefaults$pr = propsWithDefaults.progress,
49
49
  progress = _propsWithDefaults$pr === void 0 ? true : _propsWithDefaults$pr,
50
+ _propsWithDefaults$ke = propsWithDefaults.keepTooltipOpen,
51
+ keepTooltipOpen = _propsWithDefaults$ke === void 0 ? false : _propsWithDefaults$ke,
50
52
  vertical = propsWithDefaults.vertical,
51
53
  readOnly = propsWithDefaults.readOnly,
52
54
  _propsWithDefaults$mi = propsWithDefaults.min,
@@ -302,7 +304,8 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
302
304
  'aria-valuemax': max,
303
305
  'aria-valuemin': min,
304
306
  'aria-label': ariaLabel,
305
- 'aria-labelledby': ariaLabelledby
307
+ 'aria-labelledby': ariaLabelledby,
308
+ keepTooltipOpen: keepTooltipOpen
306
309
  };
307
310
  return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, {
308
311
  ref: ref,
@@ -13,6 +13,7 @@ export interface HandleProps extends WithAsProps, React.HTMLAttributes<HTMLDivEl
13
13
  onDragEnd?: (event: React.MouseEvent, dataset?: DOMStringMap) => void;
14
14
  'data-range'?: number[];
15
15
  'data-key'?: string;
16
+ keepTooltipOpen?: boolean;
16
17
  }
17
18
  declare const Handle: RsRefForwardingComponent<'div', HandleProps>;
18
19
  export default Handle;
@@ -13,7 +13,7 @@ var _hooks = require("../internals/hooks");
13
13
  var _utils = require("../internals/utils");
14
14
  var _Input = _interopRequireDefault(require("./Input"));
15
15
  var _useDrag2 = _interopRequireDefault(require("./useDrag"));
16
- var _excluded = ["as", "classPrefix", "className", "disabled", "style", "children", "position", "vertical", "tooltip", "rtl", "value", "role", "tabIndex", "renderTooltip", "onDragStart", "onDragMove", "onDragEnd", "onKeyDown", "data-range", "data-key"];
16
+ var _excluded = ["as", "classPrefix", "className", "disabled", "style", "children", "position", "vertical", "tooltip", "rtl", "value", "role", "tabIndex", "renderTooltip", "onDragStart", "onDragMove", "onDragEnd", "onKeyDown", "data-range", "data-key", "keepTooltipOpen"];
17
17
  var Handle = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
18
18
  var _extends2;
19
19
  var _props$as = props.as,
@@ -38,7 +38,9 @@ var Handle = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
38
38
  onKeyDown = props.onKeyDown,
39
39
  dataRange = props['data-range'],
40
40
  dateKey = props['data-key'],
41
+ keepTooltipOpen = props.keepTooltipOpen,
41
42
  rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
43
+ var actualTooltip = tooltip || keepTooltipOpen;
42
44
  var horizontalKey = rtl ? 'right' : 'left';
43
45
  var direction = vertical ? 'bottom' : horizontalKey;
44
46
  var styles = (0, _extends3.default)({}, style, (_extends2 = {}, _extends2[direction] = position + "%", _extends2));
@@ -46,11 +48,12 @@ var Handle = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
46
48
  merge = _useClassNames.merge,
47
49
  prefix = _useClassNames.prefix;
48
50
  var _useDrag = (0, _useDrag2.default)({
49
- tooltip: tooltip,
51
+ tooltip: actualTooltip,
50
52
  disabled: disabled,
51
53
  onDragStart: onDragStart,
52
54
  onDragMove: onDragMove,
53
- onDragEnd: onDragEnd
55
+ onDragEnd: onDragEnd,
56
+ keepTooltipOpen: keepTooltipOpen
54
57
  }),
55
58
  active = _useDrag.active,
56
59
  onMoveStart = _useDrag.onMoveStart,
@@ -58,7 +61,7 @@ var Handle = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
58
61
  rootRef = _useDrag.rootRef,
59
62
  tooltipRef = _useDrag.tooltipRef;
60
63
  var handleClasses = merge(className, prefix('handle'), {
61
- active: active
64
+ active: active || keepTooltipOpen
62
65
  });
63
66
  return /*#__PURE__*/_react.default.createElement(Component, {
64
67
  role: role,
@@ -73,7 +76,7 @@ var Handle = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
73
76
  "data-range": dataRange,
74
77
  "data-key": dateKey,
75
78
  "data-testid": "slider-handle"
76
- }, tooltip && /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
79
+ }, actualTooltip && /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
77
80
  "aria-hidden": "true",
78
81
  ref: tooltipRef,
79
82
  className: merge(prefix('tooltip'), 'placement-top')
@@ -52,6 +52,8 @@ export interface SliderProps<T = number> extends WithAsProps, FormControlBasePro
52
52
  getAriaValueText?: (value: number, eventKey?: 'start' | 'end') => string;
53
53
  /** Callback function that is fired when the mouseup is triggered. */
54
54
  onChangeCommitted?: (value: T, event: React.MouseEvent) => void;
55
+ /** If true, tooltip will always be visible even without hover */
56
+ keepTooltipOpen?: boolean;
55
57
  }
56
58
  export declare const sliderPropTypes: {
57
59
  min: PropTypes.Requireable<number>;
@@ -18,7 +18,7 @@ var _Plaintext = _interopRequireDefault(require("../internals/Plaintext"));
18
18
  var _hooks = require("../internals/hooks");
19
19
  var _CustomProvider = require("../CustomProvider");
20
20
  var _utils = require("./utils");
21
- var _excluded = ["aria-label", "aria-labelledby", "aria-valuetext", "as", "graduated", "className", "barClassName", "progress", "vertical", "disabled", "readOnly", "plaintext", "classPrefix", "min", "handleClassName", "handleStyle", "handleTitle", "tooltip", "step", "defaultValue", "value", "max", "placeholder", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted"];
21
+ var _excluded = ["aria-label", "aria-labelledby", "aria-valuetext", "as", "graduated", "className", "barClassName", "progress", "vertical", "disabled", "readOnly", "plaintext", "classPrefix", "min", "handleClassName", "handleStyle", "handleTitle", "tooltip", "step", "defaultValue", "value", "max", "placeholder", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted", "keepTooltipOpen"];
22
22
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
23
23
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
24
24
  var sliderPropTypes = exports.sliderPropTypes = {
@@ -90,6 +90,7 @@ var Slider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
90
90
  renderMark = propsWithDefaults.renderMark,
91
91
  onChange = propsWithDefaults.onChange,
92
92
  onChangeCommitted = propsWithDefaults.onChangeCommitted,
93
+ keepTooltipOpen = propsWithDefaults.keepTooltipOpen,
93
94
  rest = (0, _objectWithoutPropertiesLoose2.default)(propsWithDefaults, _excluded);
94
95
  var barRef = (0, _react.useRef)(null);
95
96
  var _useClassNames = (0, _hooks.useClassNames)(classPrefix),
@@ -249,6 +250,7 @@ var Slider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
249
250
  tooltip: tooltip,
250
251
  rtl: rtl,
251
252
  value: value,
253
+ keepTooltipOpen: keepTooltipOpen,
252
254
  renderTooltip: renderTooltip,
253
255
  onDragMove: handleChangeValue,
254
256
  onKeyDown: handleKeyDown,
@@ -5,6 +5,7 @@ interface DragProps {
5
5
  onDragStart?: (event: React.MouseEvent) => void;
6
6
  onDragMove?: (event: React.DragEvent, dataset?: DOMStringMap) => void;
7
7
  onDragEnd?: (event: React.MouseEvent, dataset?: DOMStringMap) => void;
8
+ keepTooltipOpen?: boolean;
8
9
  }
9
10
  declare const useDrag: (props: DragProps) => {
10
11
  active: boolean;
@@ -16,7 +16,8 @@ var useDrag = function useDrag(props) {
16
16
  disabled = props.disabled,
17
17
  onDragMove = props.onDragMove,
18
18
  onDragEnd = props.onDragEnd,
19
- onDragStart = props.onDragStart;
19
+ onDragStart = props.onDragStart,
20
+ keepTooltipOpen = props.keepTooltipOpen;
20
21
  var _useState = (0, _react.useState)(false),
21
22
  active = _useState[0],
22
23
  setActive = _useState[1];
@@ -72,10 +73,13 @@ var useDrag = function useDrag(props) {
72
73
  setTooltipPosition();
73
74
  });
74
75
  (0, _react.useEffect)(function () {
76
+ if (keepTooltipOpen) {
77
+ onMouseEnter();
78
+ }
75
79
  return function () {
76
80
  releaseMoves();
77
81
  };
78
- }, [releaseMoves]);
82
+ }, [releaseMoves, keepTooltipOpen]);
79
83
  return {
80
84
  active: active,
81
85
  rootRef: rootRef,
@@ -5,7 +5,7 @@ import { ToastContainerProps } from '../toaster/ToastContainer';
5
5
  * It is often used with the Message and Notification components.
6
6
  * @returns toaster { push, remove, clear }
7
7
  *
8
- * @see https://rsuitejs.com/components/use-toaster/
8
+ * @see https://rsuitejs.com/components/toaster/
9
9
  */
10
10
  declare const useToaster: () => {
11
11
  /**
@@ -15,7 +15,7 @@ var _CustomProvider = require("../CustomProvider/CustomProvider");
15
15
  * It is often used with the Message and Notification components.
16
16
  * @returns toaster { push, remove, clear }
17
17
  *
18
- * @see https://rsuitejs.com/components/use-toaster/
18
+ * @see https://rsuitejs.com/components/toaster/
19
19
  */
20
20
  var useToaster = function useToaster() {
21
21
  var _useContext = (0, _react.useContext)(_CustomProvider.CustomContext),