rsuite 5.4.4 → 5.5.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 (37) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/CheckTreePicker/styles/index.less +48 -47
  3. package/Picker/styles/mixin.less +3 -2
  4. package/Sidenav/styles/index.less +52 -57
  5. package/TreePicker/styles/index.less +3 -3
  6. package/cjs/Dropdown/Dropdown.d.ts +5 -0
  7. package/cjs/Dropdown/test/Dropdown.test.d.ts +1 -0
  8. package/cjs/Dropdown/test/Dropdown.test.js +30 -0
  9. package/cjs/InputNumber/InputNumber.d.ts +1 -1
  10. package/cjs/InputNumber/InputNumber.js +36 -6
  11. package/cjs/InputNumber/test/InputNumber.test.d.ts +1 -0
  12. package/cjs/InputNumber/test/InputNumber.test.js +14 -0
  13. package/cjs/MultiCascader/MultiCascader.js +1 -0
  14. package/cjs/RangeSlider/RangeSlider.d.ts +12 -2
  15. package/cjs/RangeSlider/RangeSlider.js +35 -12
  16. package/cjs/utils/treeUtils.js +4 -3
  17. package/dist/rsuite-rtl.css +91 -107
  18. package/dist/rsuite-rtl.min.css +1 -1
  19. package/dist/rsuite-rtl.min.css.map +1 -1
  20. package/dist/rsuite.css +91 -107
  21. package/dist/rsuite.js +6 -6
  22. package/dist/rsuite.min.css +1 -1
  23. package/dist/rsuite.min.css.map +1 -1
  24. package/dist/rsuite.min.js +1 -1
  25. package/dist/rsuite.min.js.map +1 -1
  26. package/esm/Dropdown/Dropdown.d.ts +5 -0
  27. package/esm/Dropdown/test/Dropdown.test.d.ts +1 -0
  28. package/esm/Dropdown/test/Dropdown.test.js +22 -0
  29. package/esm/InputNumber/InputNumber.d.ts +1 -1
  30. package/esm/InputNumber/InputNumber.js +38 -7
  31. package/esm/InputNumber/test/InputNumber.test.d.ts +1 -0
  32. package/esm/InputNumber/test/InputNumber.test.js +7 -0
  33. package/esm/MultiCascader/MultiCascader.js +1 -0
  34. package/esm/RangeSlider/RangeSlider.d.ts +12 -2
  35. package/esm/RangeSlider/RangeSlider.js +35 -12
  36. package/esm/utils/treeUtils.js +6 -3
  37. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ # [5.5.0](https://github.com/rsuite/rsuite/compare/v5.4.4...v5.5.0) (2022-01-13)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **Dropdown:** infer toggleAs component props ([#2299](https://github.com/rsuite/rsuite/issues/2299)) ([84611cc](https://github.com/rsuite/rsuite/commit/84611cc6f88e1d9cd712bc3f08be559d0a146ba0))
6
+ - **InputNumber:** inherit html input attributes ([#2298](https://github.com/rsuite/rsuite/issues/2298)) ([d7622ee](https://github.com/rsuite/rsuite/commit/d7622eed72b36ed15e91f606027d2e540391bdc7))
7
+ - **MultiCascader:** fix not rendering the count of selected values ([#2289](https://github.com/rsuite/rsuite/issues/2289)) ([324e90c](https://github.com/rsuite/rsuite/commit/324e90c8499adf58cb25083fd5c99fe98eb9ecba))
8
+ - **Tree:** fix dragNode has cyclic object ([#2281](https://github.com/rsuite/rsuite/issues/2281)) ([26cbaf2](https://github.com/rsuite/rsuite/commit/26cbaf2fd92ab562174e19cf55388c01fe22143a)), closes [#2268](https://github.com/rsuite/rsuite/issues/2268)
9
+
10
+ ### Features
11
+
12
+ - **InputNumber:** support keyboard interaction ([#2294](https://github.com/rsuite/rsuite/issues/2294)) ([46993e2](https://github.com/rsuite/rsuite/commit/46993e235ca3d3ee8b6faa16a5fa11a8ed544e3b))
13
+ - **RangeSlider:** add `constraint` prop ([#2291](https://github.com/rsuite/rsuite/issues/2291)) ([a2d38a8](https://github.com/rsuite/rsuite/commit/a2d38a8efe4f85c28ce1f4ee79a89eda1e1cf7b0))
14
+
15
+ ### Performance Improvements
16
+
17
+ - **styles:** simplify compound selectors over 4 levels ([#2282](https://github.com/rsuite/rsuite/issues/2282)) ([304e8da](https://github.com/rsuite/rsuite/commit/304e8da0c2057d148bbad36674aba33382439949))
18
+
1
19
  ## [5.4.4](https://github.com/rsuite/rsuite/compare/v5.4.3...v5.4.4) (2022-01-06)
2
20
 
3
21
  ### Bug Fixes
@@ -1,6 +1,7 @@
1
1
  @import '../../styles/common';
2
- @import '../../Picker/styles/mixin';
2
+ @import '../../Picker/styles/index';
3
3
  @import '../../TreePicker/styles/mixin';
4
+ @import '../../Checkbox/styles/index';
4
5
 
5
6
  // **Check Tree Picker
6
7
  // **----------------------
@@ -23,31 +24,9 @@
23
24
  }
24
25
  }
25
26
  }
26
- }
27
-
28
- .rs-check-tree-node {
29
- position: relative;
30
- font-size: @picker-tree-node-font-size;
31
- line-height: @picker-tree-node-line-height;
32
-
33
- &-label {
34
- .rs-check-item {
35
- display: inline-block;
36
-
37
- .rs-picker-menu & {
38
- display: block;
39
- }
40
- }
41
27
 
42
- &:focus .rs-check-item .rs-checkbox-checker > label {
43
- .picker-item-hover();
44
- }
45
-
46
- .rs-check-item.rs-checkbox-checked .rs-checkbox-checker > label {
47
- .picker-item-active();
48
- }
49
-
50
- .rs-check-item .rs-checkbox-checker > label {
28
+ .rs-check-item .rs-checkbox-checker {
29
+ > label {
51
30
  text-align: left;
52
31
  position: relative;
53
32
  margin: 0;
@@ -67,37 +46,59 @@
67
46
  top: 0;
68
47
  margin-left: -58px; // 10px + 36px + 12px
69
48
  }
49
+ }
70
50
 
71
- .rs-checkbox-wrapper {
72
- left: (@checkbox-sense-width + 10px);
73
- }
51
+ .rs-checkbox-wrapper {
52
+ left: (@checkbox-sense-width + 10px);
53
+ }
54
+ }
55
+ }
74
56
 
75
- // Only has the first level
76
- .rs-check-tree-without-children & {
77
- padding-left: 34px; //text gap + checkbox space
57
+ // Only has the first level
58
+ .rs-check-tree-without-children .rs-check-item .rs-checkbox-checker {
59
+ > label {
60
+ padding-left: 34px; //text gap + checkbox space
78
61
 
79
- &::before {
80
- width: 28px;
81
- margin-left: -36px;
82
- }
62
+ &::before {
63
+ width: 28px;
64
+ margin-left: -36px;
65
+ }
66
+ }
83
67
 
84
- .rs-checkbox-wrapper {
85
- left: 0;
86
- }
87
- }
68
+ .rs-checkbox-wrapper {
69
+ left: 0;
70
+ }
71
+ }
72
+
73
+ .rs-check-tree-node {
74
+ position: relative;
75
+ font-size: @picker-tree-node-font-size;
76
+ line-height: @picker-tree-node-line-height;
77
+
78
+ .rs-check-item {
79
+ display: inline-block;
80
+
81
+ .rs-picker-menu & {
82
+ display: block;
88
83
  }
89
84
  }
90
85
 
86
+ &:focus .rs-check-item .rs-checkbox-checker > label {
87
+ .picker-item-hover();
88
+ }
89
+
90
+ .rs-check-item.rs-checkbox-checked .rs-checkbox-checker > label {
91
+ .picker-item-active();
92
+ }
93
+
91
94
  // Uncheckable state
92
- &-all-uncheckable > .rs-check-tree-node-label {
93
- .rs-check-item .rs-checkbox-checker > label {
94
- padding-left: 22px; // 10px + 12px
95
+ &-all-uncheckable > .rs-check-item .rs-checkbox-checker > label {
96
+ padding-left: 22px; // 10px + 12px
95
97
 
96
- &::before {
97
- width: 14px;
98
- margin-left: 0;
99
- left: 0;
100
- }
98
+ &::before {
99
+ width: 14px;
100
+ margin-left: 0;
101
+ left: 0;
101
102
  }
102
103
  }
103
104
  }
@@ -265,7 +265,8 @@
265
265
  line-height: @line-height;
266
266
  }
267
267
 
268
- .rs-picker-input.rs-picker-tag & ~ .rs-picker-tag-wrapper {
268
+ // FIXME Bad design. Should not set search input styles in a mixin that is used in picker buttons.
269
+ .rs-picker-tag & ~ .rs-picker-tag-wrapper {
269
270
  padding-bottom: @padding-vertical - 3px;
270
271
 
271
272
  .rs-tag {
@@ -278,7 +279,7 @@
278
279
  font-size: @font-size;
279
280
  }
280
281
 
281
- .rs-picker-search-input input {
282
+ input {
282
283
  height: @line-height * @font-size - 2px;
283
284
  }
284
285
  }
@@ -37,34 +37,59 @@
37
37
  margin: 0 !important;
38
38
  }
39
39
 
40
- .high-contrast-mode({
41
- .rs-dropdown-toggle,
42
- .rs-dropdown-menu {
43
- border: none;
44
- }
45
- });
40
+ // <Dropdown> within <Sidenav>
41
+ > .rs-dropdown {
42
+ // Submenu toggle
43
+ .rs-dropdown-item-toggle {
44
+ display: block;
45
+ width: 100%;
46
+ text-align: start;
47
+ background: none;
48
+ padding-right: (@sidenav-padding-horizontal + @sidenav-dropdown-toggle-caret-width);
49
+ position: relative;
46
50
 
47
- .rs-dropdown-item-toggle {
48
- display: block;
49
- width: 100%;
50
- text-align: start;
51
- background: none;
51
+ .rs-sidenav-collapse-in & {
52
+ padding-left: @sidenav-level2-retract;
53
+ }
52
54
 
53
- &:focus {
54
- outline: 0;
55
- }
55
+ &:focus {
56
+ outline: 0;
57
+ }
56
58
 
57
- &:focus-visible {
58
- .focus-ring(inset);
59
+ &:focus-visible {
60
+ .focus-ring(inset);
59
61
 
60
- .high-contrast-mode({
61
- .focus-ring(slim-inset);
62
- });
62
+ .high-contrast-mode({
63
+ .focus-ring(slim-inset);
64
+ });
63
65
 
64
- z-index: 1;
66
+ z-index: 1;
67
+ }
68
+
69
+ // Submenu toggle icon
70
+ &-icon {
71
+ position: absolute;
72
+ right: @sidenav-padding-horizontal;
73
+ top: @sidenav-children-padding-vertical;
74
+ width: auto;
75
+ height: @sidenav-dropdown-toggle-caret-width;
76
+ transform: rotate(90deg);
77
+ }
78
+ }
79
+
80
+ // Expanded submenu toggle icon
81
+ .rs-dropdown-item-expand .rs-dropdown-item-toggle-icon {
82
+ transform: rotate(270deg);
65
83
  }
66
84
  }
67
85
 
86
+ .high-contrast-mode({
87
+ .rs-dropdown-toggle,
88
+ .rs-dropdown-menu {
89
+ border: none;
90
+ }
91
+ });
92
+
68
93
  .rs-sidenav-item:focus-visible {
69
94
  .focus-ring(inset);
70
95
 
@@ -225,32 +250,17 @@
225
250
  transform: rotate(180deg);
226
251
  }
227
252
 
228
- .rs-dropdown-item.rs-dropdown-item-expand
229
- > .rs-dropdown-item-toggle
230
- > .rs-dropdown-item-toggle-icon {
231
- transform: rotate(270deg);
232
- }
233
-
234
253
  // Dropdown menu
235
- > .rs-dropdown-menu {
254
+ .rs-dropdown-menu {
236
255
  .reset-sidenav-dropdown-menu();
256
+ }
237
257
 
238
- // Submenu
239
- .rs-dropdown-item-submenu {
240
- padding: 0;
241
-
242
- > .rs-dropdown-menu-toggle {
243
- display: block;
244
- padding-right: (@sidenav-padding-horizontal + @sidenav-dropdown-toggle-caret-width);
245
- }
246
-
247
- > .rs-dropdown-menu {
248
- .reset-sidenav-dropdown-menu();
249
- }
258
+ // Submenu
259
+ .rs-dropdown-item-submenu {
260
+ padding: 0;
250
261
 
251
- &:hover {
252
- background-color: transparent;
253
- }
262
+ &:hover {
263
+ background-color: transparent;
254
264
  }
255
265
  }
256
266
  }
@@ -283,21 +293,6 @@
283
293
  // @warn Here we can only use absolute positioning because of the limitations of using <Dropdown/> component.
284
294
 
285
295
  .rs-dropdown-item-submenu {
286
- > .rs-dropdown-item-toggle {
287
- padding-left: @sidenav-level2-retract;
288
- padding-right: (@sidenav-padding-horizontal + @sidenav-dropdown-toggle-caret-width);
289
- position: relative;
290
-
291
- > .rs-dropdown-item-toggle-icon {
292
- position: absolute;
293
- right: @sidenav-padding-horizontal;
294
- top: @sidenav-children-padding-vertical;
295
- width: auto;
296
- height: @sidenav-dropdown-toggle-caret-width;
297
- transform: rotate(90deg);
298
- }
299
- }
300
-
301
296
  > .rs-dropdown-item-menu-icon {
302
297
  padding-top: @sidenav-children-padding-vertical;
303
298
  padding-bottom: @sidenav-children-padding-vertical;
@@ -34,7 +34,7 @@
34
34
  text-align: left;
35
35
  margin: 0 0 4px 0;
36
36
 
37
- > .rs-tree-node-label {
37
+ &-label {
38
38
  position: relative;
39
39
  margin: 0;
40
40
  //text gap
@@ -44,7 +44,7 @@
44
44
  font-size: @picker-tree-node-font-size;
45
45
  line-height: @picker-tree-node-line-height;
46
46
 
47
- > .rs-tree-node-label-content {
47
+ &-content {
48
48
  padding: @custom-picker-tree-node-padding-vertical @picker-tree-node-padding-horizontal
49
49
  @custom-picker-tree-node-padding-vertical @picker-tree-arrow-down-gap;
50
50
  display: inline-block;
@@ -59,7 +59,7 @@
59
59
  }
60
60
  }
61
61
 
62
- &&-active > .rs-tree-node-label > .rs-tree-node-label-content {
62
+ &-active &-label-content {
63
63
  .picker-item-active();
64
64
 
65
65
  color: var(--rs-text-link);
@@ -3,6 +3,7 @@ import DropdownMenu from './DropdownMenu';
3
3
  import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
4
  import { IconProps } from '@rsuite/icons/lib/Icon';
5
5
  import DropdownItem from './DropdownItem';
6
+ import Button from '../Button';
6
7
  export declare type DropdownTrigger = 'click' | 'hover' | 'contextMenu';
7
8
  export interface DropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect' | 'title'> {
8
9
  /** Define the title as a submenu */
@@ -48,6 +49,10 @@ export interface DropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttr
48
49
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
49
50
  }
50
51
  export interface DropdownComponent extends RsRefForwardingComponent<'div', DropdownProps> {
52
+ <ToggleAs extends React.ElementType = typeof Button>(props: DropdownProps & {
53
+ ref?: React.Ref<any>;
54
+ toggleAs?: ToggleAs;
55
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
51
56
  Item: typeof DropdownItem;
52
57
  Menu: typeof DropdownMenu;
53
58
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _react = _interopRequireDefault(require("react"));
6
+
7
+ var _Dropdown = _interopRequireDefault(require("../Dropdown"));
8
+
9
+ var ref = /*#__PURE__*/_react.default.createRef(); // Infer `toggleAs` props (defaults to Button)
10
+
11
+
12
+ /*#__PURE__*/
13
+ _react.default.createElement(_Dropdown.default, {
14
+ ref: ref,
15
+ appearance: "subtle",
16
+ size: "sm"
17
+ });
18
+ /* eslint-disable @typescript-eslint/no-unused-vars */
19
+
20
+
21
+ var CustomToggle = function CustomToggle(_props) {
22
+ return null;
23
+ };
24
+
25
+ /*#__PURE__*/
26
+ _react.default.createElement(_Dropdown.default, {
27
+ ref: ref,
28
+ toggleAs: CustomToggle,
29
+ myProp: "myValue"
30
+ });
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { WithAsProps, TypeAttributes, FormControlBaseProps } from '../@types/common';
3
- export interface InputNumberProps<T = number | string> extends WithAsProps, FormControlBaseProps<T> {
3
+ export interface InputNumberProps<T = number | string> extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange' | 'size' | 'prefix'>, WithAsProps, FormControlBaseProps<T> {
4
4
  /** Button can have different appearances */
5
5
  buttonAppearance?: TypeAttributes.Appearance;
6
6
  /** An input can show that it is disabled */
@@ -114,15 +114,15 @@ var InputNumber = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
114
114
  step = _props$step === void 0 ? 1 : _props$step,
115
115
  _props$buttonAppearan = props.buttonAppearance,
116
116
  buttonAppearance = _props$buttonAppearan === void 0 ? 'subtle' : _props$buttonAppearan,
117
- _props$min = props.min,
118
- min = _props$min === void 0 ? -Infinity : _props$min,
119
- _props$max = props.max,
120
- max = _props$max === void 0 ? Infinity : _props$max,
117
+ minProp = props.min,
118
+ maxProp = props.max,
121
119
  _props$scrollable = props.scrollable,
122
120
  scrollable = _props$scrollable === void 0 ? true : _props$scrollable,
123
121
  onChange = props.onChange,
124
122
  onWheel = props.onWheel,
125
123
  restProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "disabled", "readOnly", "plaintext", "value", "defaultValue", "size", "prefix", "postfix", "step", "buttonAppearance", "min", "max", "scrollable", "onChange", "onWheel"]);
124
+ var min = minProp !== null && minProp !== void 0 ? minProp : -Infinity;
125
+ var max = maxProp !== null && maxProp !== void 0 ? maxProp : Infinity;
126
126
 
127
127
  var _useControlled = (0, _utils.useControlled)(valueProp, defaultValue),
128
128
  value = _useControlled[0],
@@ -187,6 +187,35 @@ var InputNumber = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
187
187
  var bit = decimals(val, step);
188
188
  handleChangeValue(getSafeValue((val - step).toFixed(bit)), event);
189
189
  }, [getSafeValue, handleChangeValue, step, value]);
190
+ var handleKeyDown = (0, _react.useCallback)(function (event) {
191
+ switch (event.key) {
192
+ case _utils.KEY_VALUES.UP:
193
+ event.preventDefault();
194
+ handlePlus(event);
195
+ break;
196
+
197
+ case _utils.KEY_VALUES.DOWN:
198
+ event.preventDefault();
199
+ handleMinus(event);
200
+ break;
201
+
202
+ case _utils.KEY_VALUES.HOME:
203
+ if (typeof minProp !== 'undefined') {
204
+ event.preventDefault();
205
+ handleChangeValue(getSafeValue(minProp), event);
206
+ }
207
+
208
+ break;
209
+
210
+ case _utils.KEY_VALUES.END:
211
+ if (typeof maxProp !== 'undefined') {
212
+ event.preventDefault();
213
+ handleChangeValue(getSafeValue(maxProp), event);
214
+ }
215
+
216
+ break;
217
+ }
218
+ }, [handlePlus, handleMinus, minProp, maxProp, handleChangeValue, getSafeValue]);
190
219
  var handleWheel = (0, _react.useCallback)(function (event) {
191
220
  if (!disabled && !readOnly && event.target === document.activeElement) {
192
221
  event.preventDefault();
@@ -233,7 +262,7 @@ var InputNumber = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
233
262
  }, [handleWheel, scrollable]);
234
263
 
235
264
  var input = /*#__PURE__*/_react.default.createElement(_Input.default, (0, _extends2.default)({}, htmlInputProps, {
236
- type: "text",
265
+ type: "number",
237
266
  autoComplete: "off",
238
267
  step: step,
239
268
  inputRef: inputRef,
@@ -243,7 +272,8 @@ var InputNumber = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
243
272
  disabled: disabled,
244
273
  readOnly: readOnly,
245
274
  plaintext: plaintext,
246
- ref: plaintext ? ref : undefined
275
+ ref: plaintext ? ref : undefined,
276
+ onKeyDown: handleKeyDown
247
277
  }));
248
278
 
249
279
  if (plaintext) {
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _react = _interopRequireDefault(require("react"));
6
+
7
+ var _InputNumber = _interopRequireDefault(require("../InputNumber"));
8
+
9
+ // Inherits <input type="number" /> attributes
10
+
11
+ /*#__PURE__*/
12
+ _react.default.createElement(_InputNumber.default, {
13
+ placeholder: "Enter number"
14
+ });
@@ -482,6 +482,7 @@ var MultiCascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
482
482
  var _usePickerClassName = (0, _Picker.usePickerClassName)((0, _extends3.default)({}, props, {
483
483
  classPrefix: classPrefix,
484
484
  hasValue: hasValue,
485
+ countable: countable,
485
486
  name: 'cascader',
486
487
  appearance: appearance,
487
488
  cleanable: cleanable
@@ -1,6 +1,16 @@
1
1
  import React from 'react';
2
2
  import { SliderProps } from '../Slider';
3
3
  export declare type Range = [number, number];
4
- export declare type RangeSliderProps = SliderProps<Range>;
5
- declare const RangeSlider: React.ForwardRefExoticComponent<RangeSliderProps & React.RefAttributes<unknown>>;
4
+ export declare type RangeSliderProps = SliderProps<Range> & {
5
+ /**
6
+ * Add constraint to validate before onChange is dispatched
7
+ */
8
+ constraint?: (range: Range) => boolean;
9
+ };
10
+ declare const RangeSlider: React.ForwardRefExoticComponent<SliderProps<Range> & {
11
+ /**
12
+ * Add constraint to validate before onChange is dispatched
13
+ */
14
+ constraint?: ((range: Range) => boolean) | undefined;
15
+ } & React.RefAttributes<unknown>>;
6
16
  export default RangeSlider;
@@ -45,6 +45,7 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
45
45
  Component = _props$as === void 0 ? 'div' : _props$as,
46
46
  barClassName = props.barClassName,
47
47
  className = props.className,
48
+ constraint = props.constraint,
48
49
  _props$defaultValue = props.defaultValue,
49
50
  defaultValue = _props$defaultValue === void 0 ? defaultDefaultValue : _props$defaultValue,
50
51
  graduated = props.graduated,
@@ -71,7 +72,7 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
71
72
  renderMark = props.renderMark,
72
73
  onChange = props.onChange,
73
74
  onChangeCommitted = props.onChangeCommitted,
74
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["aria-label", "aria-labelledby", "aria-valuetext", "as", "barClassName", "className", "defaultValue", "graduated", "progress", "vertical", "disabled", "classPrefix", "min", "max", "step", "value", "handleClassName", "handleStyle", "handleTitle", "tooltip", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted"]);
75
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["aria-label", "aria-labelledby", "aria-valuetext", "as", "barClassName", "className", "constraint", "defaultValue", "graduated", "progress", "vertical", "disabled", "classPrefix", "min", "max", "step", "value", "handleClassName", "handleStyle", "handleTitle", "tooltip", "getAriaValueText", "renderTooltip", "renderMark", "onChange", "onChangeCommitted"]);
75
76
  var barRef = (0, _react.useRef)(null); // Define the parameter position of the handle
76
77
 
77
78
  var handleIndexs = (0, _react.useRef)([0, 1]);
@@ -180,14 +181,27 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
180
181
 
181
182
  return nextValue;
182
183
  }, [getRangeValue, getValidValue]);
184
+ /**
185
+ * Whether a range is valid against given constraint (if any)
186
+ * Should check before every `setValue` calls
187
+ */
188
+
189
+ var isRangeMatchingConstraint = (0, _react.useCallback)(function (range) {
190
+ // If no constraint is defined, any range is valid
191
+ if (!constraint) return true;
192
+ return constraint(range);
193
+ }, [constraint]);
183
194
  /**
184
195
  * Callback function that is fired when the mousemove is triggered
185
196
  */
186
197
 
187
198
  var handleDragMove = (0, _utils.useEventCallback)(function (event, dataset) {
188
199
  var nextValue = getNextValue(event, dataset);
189
- setValue(nextValue);
190
- onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
200
+
201
+ if (isRangeMatchingConstraint(nextValue)) {
202
+ setValue(nextValue);
203
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
204
+ }
191
205
  });
192
206
  /**
193
207
  * Callback function that is fired when the mouseup is triggered
@@ -195,9 +209,12 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
195
209
 
196
210
  var handleChangeCommitted = (0, _react.useCallback)(function (event, dataset) {
197
211
  var nextValue = getNextValue(event, dataset);
198
- setValue(nextValue);
199
- onChangeCommitted === null || onChangeCommitted === void 0 ? void 0 : onChangeCommitted(nextValue, event);
200
- }, [getNextValue, onChangeCommitted, setValue]);
212
+
213
+ if (isRangeMatchingConstraint(nextValue)) {
214
+ setValue(nextValue);
215
+ onChangeCommitted === null || onChangeCommitted === void 0 ? void 0 : onChangeCommitted(nextValue, event);
216
+ }
217
+ }, [getNextValue, onChangeCommitted, isRangeMatchingConstraint, setValue]);
201
218
  var handleKeyDown = (0, _react.useCallback)(function (event) {
202
219
  var _event$target;
203
220
 
@@ -240,9 +257,12 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
240
257
 
241
258
 
242
259
  event.preventDefault();
243
- setValue(nextValue);
244
- onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
245
- }, [max, min, onChange, rtl, setValue, step, value]);
260
+
261
+ if (isRangeMatchingConstraint(nextValue)) {
262
+ setValue(nextValue);
263
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
264
+ }
265
+ }, [max, min, onChange, rtl, isRangeMatchingConstraint, setValue, step, value]);
246
266
  var handleClick = (0, _react.useCallback)(function (event) {
247
267
  if (disabled) {
248
268
  return;
@@ -259,9 +279,12 @@ var RangeSlider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
259
279
  }
260
280
 
261
281
  var nextValue = getValidValue([start, end].sort());
262
- setValue(nextValue);
263
- onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
264
- }, [disabled, getValidValue, getValueByPosition, onChange, setValue, value]);
282
+
283
+ if (isRangeMatchingConstraint(nextValue)) {
284
+ setValue(nextValue);
285
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
286
+ }
287
+ }, [disabled, getValidValue, getValueByPosition, isRangeMatchingConstraint, onChange, setValue, value]);
265
288
  var handleProps = (0, _react.useMemo)(function () {
266
289
  return [{
267
290
  value: value[0],
@@ -322,6 +322,7 @@ function createUpdateTreeDataFunction(params, _ref2) {
322
322
  var dragNode = params.dragNode,
323
323
  dropNode = params.dropNode,
324
324
  dropNodePosition = params.dropNodePosition;
325
+ var cloneDragNode = (0, _extends3.default)({}, dragNode);
325
326
  removeDragNode(data, params, {
326
327
  valueKey: valueKey,
327
328
  childrenKey: childrenKey
@@ -336,16 +337,16 @@ function createUpdateTreeDataFunction(params, _ref2) {
336
337
  if (dropNodePosition === _utils2.TREE_NODE_DROP_POSITION.DRAG_OVER) {
337
338
  _item2[childrenKey] = (0, _isNil2.default)(_item2[childrenKey]) ? [] : _item2[childrenKey];
338
339
 
339
- _item2[childrenKey].push(dragNode);
340
+ _item2[childrenKey].push(cloneDragNode);
340
341
 
341
342
  break;
342
343
  } else if (dropNodePosition === _utils2.TREE_NODE_DROP_POSITION.DRAG_OVER_TOP) {
343
344
  // drag to top of node
344
- items.splice(_index2, 0, dragNode);
345
+ items.splice(_index2, 0, cloneDragNode);
345
346
  break;
346
347
  } else if (dropNodePosition === _utils2.TREE_NODE_DROP_POSITION.DRAG_OVER_BOTTOM) {
347
348
  // drag to bottom of node
348
- items.splice(_index2 + 1, 0, dragNode);
349
+ items.splice(_index2 + 1, 0, cloneDragNode);
349
350
  break;
350
351
  }
351
352
  }