rsuite 4.9.2 → 4.10.1
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 +48 -17
- package/dist/rsuite.js +1568 -299
- package/dist/rsuite.min.js +2 -2
- package/dist/rsuite.min.js.map +1 -1
- package/dist/styles/rsuite-dark-rtl.css +2 -1
- package/dist/styles/rsuite-dark-rtl.min.css +1 -1
- package/dist/styles/rsuite-dark-rtl.min.css.map +1 -1
- package/dist/styles/rsuite-dark.css +2 -1
- package/dist/styles/rsuite-dark.min.css +1 -1
- package/dist/styles/rsuite-dark.min.css.map +1 -1
- package/dist/styles/rsuite-default-rtl.css +2 -1
- package/dist/styles/rsuite-default-rtl.min.css +1 -1
- package/dist/styles/rsuite-default-rtl.min.css.map +1 -1
- package/dist/styles/rsuite-default.css +2 -1
- package/dist/styles/rsuite-default.min.css +1 -1
- package/dist/styles/rsuite-default.min.css.map +1 -1
- package/es/MultiCascader/DropdownMenu.js +1 -1
- package/es/MultiCascader/MultiCascader.d.ts +8 -0
- package/es/MultiCascader/MultiCascader.js +6 -3
- package/es/Nav/Nav.js +5 -4
- package/es/Overlay/OverlayTrigger.d.ts +1 -1
- package/es/Overlay/OverlayTrigger.js +12 -1
- package/es/Table/styles/common.less +2 -1
- package/es/Uploader/Uploader.js +2 -0
- package/lib/MultiCascader/DropdownMenu.js +1 -1
- package/lib/MultiCascader/MultiCascader.d.ts +8 -0
- package/lib/MultiCascader/MultiCascader.js +6 -3
- package/lib/Nav/Nav.js +4 -3
- package/lib/Overlay/OverlayTrigger.d.ts +1 -1
- package/lib/Overlay/OverlayTrigger.js +12 -1
- package/lib/Table/styles/common.less +2 -1
- package/lib/Uploader/Uploader.js +2 -0
- package/package.json +2 -2
- package/src/MultiCascader/DropdownMenu.tsx +1 -1
- package/src/MultiCascader/MultiCascader.d.ts +8 -0
- package/src/MultiCascader/MultiCascader.tsx +4 -2
- package/src/MultiCascader/test/DropdownMenuSpec.js +17 -0
- package/src/MultiCascader/test/MultiCascaderSpec.js +14 -1
- package/src/Nav/Nav.tsx +10 -4
- package/src/Nav/test/NavSpec.js +35 -0
- package/src/Overlay/OverlayTrigger.d.ts +1 -1
- package/src/Overlay/OverlayTrigger.tsx +22 -1
- package/src/Overlay/test/OverlayTriggerSpec.js +155 -0
- package/src/Table/styles/common.less +2 -1
- package/src/Uploader/Uploader.tsx +1 -0
|
@@ -146,7 +146,7 @@ function (_React$Component) {
|
|
|
146
146
|
className: classes,
|
|
147
147
|
componentClass: "li",
|
|
148
148
|
indeterminate: cascade && !active && this.utils.isSomeChildChecked(node, value),
|
|
149
|
-
onSelectItem: this.handleSelect.bind(this, layer
|
|
149
|
+
onSelectItem: this.handleSelect.bind(this, layer),
|
|
150
150
|
onCheck: onCheck,
|
|
151
151
|
checkable: !uncheckable
|
|
152
152
|
}, renderMenuItem ? renderMenuItem(label, node) : label, children ? React.createElement("span", {
|
|
@@ -41,6 +41,14 @@ export interface MultiCascaderProps<ValueType = any> extends FormControlPickerPr
|
|
|
41
41
|
event: React.SyntheticEvent<HTMLElement>
|
|
42
42
|
) => void;
|
|
43
43
|
|
|
44
|
+
/** Called after the checkbox state changes */
|
|
45
|
+
onCheck?: (
|
|
46
|
+
value: ValueType,
|
|
47
|
+
item: any,
|
|
48
|
+
checked: boolean,
|
|
49
|
+
event: React.SyntheticEvent<HTMLElement>
|
|
50
|
+
) => void;
|
|
51
|
+
|
|
44
52
|
/** Called when clean */
|
|
45
53
|
onClean?: (event: React.SyntheticEvent<HTMLElement>) => void;
|
|
46
54
|
|
|
@@ -37,9 +37,10 @@ function (_React$Component) {
|
|
|
37
37
|
_this.handleCheck = function (item, event, checked) {
|
|
38
38
|
var _this$props = _this.props,
|
|
39
39
|
valueKey = _this$props.valueKey,
|
|
40
|
-
onChange = _this$props.onChange,
|
|
41
40
|
cascade = _this$props.cascade,
|
|
42
|
-
uncheckableItemValues = _this$props.uncheckableItemValues
|
|
41
|
+
uncheckableItemValues = _this$props.uncheckableItemValues,
|
|
42
|
+
onChange = _this$props.onChange,
|
|
43
|
+
onCheck = _this$props.onCheck;
|
|
43
44
|
var itemValue = item[valueKey];
|
|
44
45
|
var value = [];
|
|
45
46
|
|
|
@@ -64,6 +65,7 @@ function (_React$Component) {
|
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
|
|
68
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(value, item, checked, event);
|
|
67
69
|
};
|
|
68
70
|
|
|
69
71
|
_this.handleChangeForSearchItem = function (value, checked, event) {
|
|
@@ -543,7 +545,8 @@ MultiCascader.propTypes = _extends({}, listPickerPropTypes, {
|
|
|
543
545
|
renderMenuItem: PropTypes.func,
|
|
544
546
|
renderMenu: PropTypes.func,
|
|
545
547
|
onSearch: PropTypes.func,
|
|
546
|
-
onSelect: PropTypes.func
|
|
548
|
+
onSelect: PropTypes.func,
|
|
549
|
+
onCheck: PropTypes.func
|
|
547
550
|
});
|
|
548
551
|
MultiCascader.defaultProps = _extends({}, listPickerDefaultProps, {
|
|
549
552
|
searchable: true,
|
package/es/Nav/Nav.js
CHANGED
|
@@ -7,7 +7,7 @@ import classNames from 'classnames';
|
|
|
7
7
|
import { setStatic } from 'recompose';
|
|
8
8
|
import shallowEqual from '../utils/shallowEqual';
|
|
9
9
|
import NavItem from './NavItem';
|
|
10
|
-
import { prefix, getUnhandledProps, defaultProps, ReactChildren } from '../utils';
|
|
10
|
+
import { prefix, getUnhandledProps, defaultProps, ReactChildren, createChainedFunction } from '../utils';
|
|
11
11
|
import { getClassNamePrefix } from '../utils/prefix';
|
|
12
12
|
import { NavbarContext } from '../Navbar/Navbar';
|
|
13
13
|
import { SidenavContext } from '../Sidenav/Sidenav';
|
|
@@ -54,20 +54,21 @@ function (_React$Component) {
|
|
|
54
54
|
var _item$props = item.props,
|
|
55
55
|
eventKey = _item$props.eventKey,
|
|
56
56
|
active = _item$props.active,
|
|
57
|
-
|
|
57
|
+
onSelectItem = _item$props.onSelect,
|
|
58
|
+
rest = _objectWithoutPropertiesLoose(_item$props, ["eventKey", "active", "onSelect"]);
|
|
58
59
|
|
|
59
60
|
var displayName = item === null || item === void 0 ? void 0 : (_item$type = item.type) === null || _item$type === void 0 ? void 0 : _item$type.displayName;
|
|
60
61
|
var hasTooltip = sidenav && !expanded;
|
|
61
62
|
|
|
62
63
|
if (~(displayName === null || displayName === void 0 ? void 0 : displayName.indexOf('(NavItem)'))) {
|
|
63
64
|
return _extends({}, rest, {
|
|
64
|
-
onSelect: onSelect,
|
|
65
|
+
onSelect: createChainedFunction(onSelect, onSelectItem),
|
|
65
66
|
hasTooltip: hasTooltip,
|
|
66
67
|
active: typeof activeKey === 'undefined' ? active : shallowEqual(activeKey, eventKey)
|
|
67
68
|
});
|
|
68
69
|
} else if (~(displayName === null || displayName === void 0 ? void 0 : displayName.indexOf('(Dropdown)'))) {
|
|
69
70
|
return _extends({}, rest, {
|
|
70
|
-
onSelect: onSelect,
|
|
71
|
+
onSelect: createChainedFunction(onSelect, onSelectItem),
|
|
71
72
|
activeKey: activeKey,
|
|
72
73
|
showHeader: hasTooltip,
|
|
73
74
|
componentClass: 'li'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { AnimationEventProps, StandardProps, TypeAttributes } from '../@types/common';
|
|
3
3
|
|
|
4
|
-
export type OverlayTriggerTrigger = 'click' | 'hover' | 'focus' | 'active' | 'none';
|
|
4
|
+
export type OverlayTriggerTrigger = 'click' | 'contextMenu' | 'hover' | 'focus' | 'active' | 'none';
|
|
5
5
|
|
|
6
6
|
export interface TriggerProps extends AnimationEventProps, StandardProps {
|
|
7
7
|
/** Triggering events */
|
|
@@ -49,7 +49,7 @@ function (_React$Component) {
|
|
|
49
49
|
var trigger = _this.props.trigger;
|
|
50
50
|
_this.mouseEnteredToSpeaker = false;
|
|
51
51
|
|
|
52
|
-
if (!isOneOf('click', trigger) && !isOneOf('active', trigger)) {
|
|
52
|
+
if (!isOneOf('click', trigger) && !isOneOf('active', trigger) && !isOneOf('contextMenu', trigger)) {
|
|
53
53
|
_this.hideWithCheck();
|
|
54
54
|
}
|
|
55
55
|
};
|
|
@@ -113,6 +113,10 @@ function (_React$Component) {
|
|
|
113
113
|
}
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
+
_this.preventDefault = function (event) {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
};
|
|
119
|
+
|
|
116
120
|
_this.handleDelayedShow = function () {
|
|
117
121
|
var _this$props2 = _this.props,
|
|
118
122
|
delayShow = _this$props2.delayShow,
|
|
@@ -216,6 +220,8 @@ function (_React$Component) {
|
|
|
216
220
|
|
|
217
221
|
if (isOneOf('click', trigger)) {
|
|
218
222
|
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
223
|
+
} else if (isOneOf('contextMenu', trigger)) {
|
|
224
|
+
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
219
225
|
} else if (isOneOf('active', trigger)) {
|
|
220
226
|
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
221
227
|
}
|
|
@@ -245,6 +251,7 @@ function (_React$Component) {
|
|
|
245
251
|
children = _this$props5.children,
|
|
246
252
|
speaker = _this$props5.speaker,
|
|
247
253
|
onClick = _this$props5.onClick,
|
|
254
|
+
onContextMenu = _this$props5.onContextMenu,
|
|
248
255
|
trigger = _this$props5.trigger,
|
|
249
256
|
onMouseOver = _this$props5.onMouseOver,
|
|
250
257
|
onMouseOut = _this$props5.onMouseOut,
|
|
@@ -264,6 +271,10 @@ function (_React$Component) {
|
|
|
264
271
|
props.onClick = createChainedFunction(this.toggleHideAndShow, props.onClick);
|
|
265
272
|
}
|
|
266
273
|
|
|
274
|
+
if (isOneOf('contextMenu', trigger)) {
|
|
275
|
+
props.onContextMenu = createChainedFunction(this.preventDefault, this.toggleHideAndShow, triggerProps.onContextMenu, onContextMenu);
|
|
276
|
+
}
|
|
277
|
+
|
|
267
278
|
if (isOneOf('active', trigger)) {
|
|
268
279
|
props.onClick = createChainedFunction(this.handleDelayedShow, props.onClick);
|
|
269
280
|
}
|
|
@@ -166,11 +166,12 @@
|
|
|
166
166
|
border-style: solid;
|
|
167
167
|
border-width: 0;
|
|
168
168
|
border-color: @table-border-color;
|
|
169
|
-
display: block;
|
|
170
169
|
overflow: hidden;
|
|
171
170
|
position: absolute;
|
|
172
171
|
white-space: normal;
|
|
173
172
|
background: @table-body-background;
|
|
173
|
+
display: table;
|
|
174
|
+
table-layout: fixed;
|
|
174
175
|
|
|
175
176
|
&.first {
|
|
176
177
|
border-left-width: 0;
|
package/es/Uploader/Uploader.js
CHANGED
|
@@ -48,6 +48,8 @@ function (_React$Component) {
|
|
|
48
48
|
|
|
49
49
|
(_this$props$onRemove = (_this$props = _this.props).onRemove) === null || _this$props$onRemove === void 0 ? void 0 : _this$props$onRemove.call(_this$props, file);
|
|
50
50
|
(_this$props$onChange = (_this$props2 = _this.props).onChange) === null || _this$props$onChange === void 0 ? void 0 : _this$props$onChange.call(_this$props2, nextFileList);
|
|
51
|
+
|
|
52
|
+
_this.cleanInputValue();
|
|
51
53
|
};
|
|
52
54
|
|
|
53
55
|
_this.handleUploadTriggerChange = function (event) {
|
|
@@ -168,7 +168,7 @@ function (_React$Component) {
|
|
|
168
168
|
className: classes,
|
|
169
169
|
componentClass: "li",
|
|
170
170
|
indeterminate: cascade && !active && this.utils.isSomeChildChecked(node, value),
|
|
171
|
-
onSelectItem: this.handleSelect.bind(this, layer
|
|
171
|
+
onSelectItem: this.handleSelect.bind(this, layer),
|
|
172
172
|
onCheck: onCheck,
|
|
173
173
|
checkable: !uncheckable
|
|
174
174
|
}, renderMenuItem ? renderMenuItem(label, node) : label, children ? React.createElement("span", {
|
|
@@ -41,6 +41,14 @@ export interface MultiCascaderProps<ValueType = any> extends FormControlPickerPr
|
|
|
41
41
|
event: React.SyntheticEvent<HTMLElement>
|
|
42
42
|
) => void;
|
|
43
43
|
|
|
44
|
+
/** Called after the checkbox state changes */
|
|
45
|
+
onCheck?: (
|
|
46
|
+
value: ValueType,
|
|
47
|
+
item: any,
|
|
48
|
+
checked: boolean,
|
|
49
|
+
event: React.SyntheticEvent<HTMLElement>
|
|
50
|
+
) => void;
|
|
51
|
+
|
|
44
52
|
/** Called when clean */
|
|
45
53
|
onClean?: (event: React.SyntheticEvent<HTMLElement>) => void;
|
|
46
54
|
|
|
@@ -66,9 +66,10 @@ function (_React$Component) {
|
|
|
66
66
|
_this.handleCheck = function (item, event, checked) {
|
|
67
67
|
var _this$props = _this.props,
|
|
68
68
|
valueKey = _this$props.valueKey,
|
|
69
|
-
onChange = _this$props.onChange,
|
|
70
69
|
cascade = _this$props.cascade,
|
|
71
|
-
uncheckableItemValues = _this$props.uncheckableItemValues
|
|
70
|
+
uncheckableItemValues = _this$props.uncheckableItemValues,
|
|
71
|
+
onChange = _this$props.onChange,
|
|
72
|
+
onCheck = _this$props.onCheck;
|
|
72
73
|
var itemValue = item[valueKey];
|
|
73
74
|
var value = [];
|
|
74
75
|
|
|
@@ -93,6 +94,7 @@ function (_React$Component) {
|
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
|
|
97
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(value, item, checked, event);
|
|
96
98
|
};
|
|
97
99
|
|
|
98
100
|
_this.handleChangeForSearchItem = function (value, checked, event) {
|
|
@@ -569,7 +571,8 @@ MultiCascader.propTypes = (0, _extends3.default)({}, _propTypes2.listPickerPropT
|
|
|
569
571
|
renderMenuItem: _propTypes.default.func,
|
|
570
572
|
renderMenu: _propTypes.default.func,
|
|
571
573
|
onSearch: _propTypes.default.func,
|
|
572
|
-
onSelect: _propTypes.default.func
|
|
574
|
+
onSelect: _propTypes.default.func,
|
|
575
|
+
onCheck: _propTypes.default.func
|
|
573
576
|
});
|
|
574
577
|
MultiCascader.defaultProps = (0, _extends3.default)({}, _propTypes2.listPickerDefaultProps, {
|
|
575
578
|
searchable: true,
|
package/lib/Nav/Nav.js
CHANGED
|
@@ -76,19 +76,20 @@ function (_React$Component) {
|
|
|
76
76
|
var _item$props = item.props,
|
|
77
77
|
eventKey = _item$props.eventKey,
|
|
78
78
|
active = _item$props.active,
|
|
79
|
-
|
|
79
|
+
onSelectItem = _item$props.onSelect,
|
|
80
|
+
rest = (0, _objectWithoutPropertiesLoose2.default)(_item$props, ["eventKey", "active", "onSelect"]);
|
|
80
81
|
var displayName = item === null || item === void 0 ? void 0 : (_item$type = item.type) === null || _item$type === void 0 ? void 0 : _item$type.displayName;
|
|
81
82
|
var hasTooltip = sidenav && !expanded;
|
|
82
83
|
|
|
83
84
|
if (~(displayName === null || displayName === void 0 ? void 0 : displayName.indexOf('(NavItem)'))) {
|
|
84
85
|
return (0, _extends2.default)({}, rest, {
|
|
85
|
-
onSelect: onSelect,
|
|
86
|
+
onSelect: (0, _utils.createChainedFunction)(onSelect, onSelectItem),
|
|
86
87
|
hasTooltip: hasTooltip,
|
|
87
88
|
active: typeof activeKey === 'undefined' ? active : (0, _shallowEqual.default)(activeKey, eventKey)
|
|
88
89
|
});
|
|
89
90
|
} else if (~(displayName === null || displayName === void 0 ? void 0 : displayName.indexOf('(Dropdown)'))) {
|
|
90
91
|
return (0, _extends2.default)({}, rest, {
|
|
91
|
-
onSelect: onSelect,
|
|
92
|
+
onSelect: (0, _utils.createChainedFunction)(onSelect, onSelectItem),
|
|
92
93
|
activeKey: activeKey,
|
|
93
94
|
showHeader: hasTooltip,
|
|
94
95
|
componentClass: 'li'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { AnimationEventProps, StandardProps, TypeAttributes } from '../@types/common';
|
|
3
3
|
|
|
4
|
-
export type OverlayTriggerTrigger = 'click' | 'hover' | 'focus' | 'active' | 'none';
|
|
4
|
+
export type OverlayTriggerTrigger = 'click' | 'contextMenu' | 'hover' | 'focus' | 'active' | 'none';
|
|
5
5
|
|
|
6
6
|
export interface TriggerProps extends AnimationEventProps, StandardProps {
|
|
7
7
|
/** Triggering events */
|
|
@@ -70,7 +70,7 @@ function (_React$Component) {
|
|
|
70
70
|
var trigger = _this.props.trigger;
|
|
71
71
|
_this.mouseEnteredToSpeaker = false;
|
|
72
72
|
|
|
73
|
-
if (!(0, _isOneOf.default)('click', trigger) && !(0, _isOneOf.default)('active', trigger)) {
|
|
73
|
+
if (!(0, _isOneOf.default)('click', trigger) && !(0, _isOneOf.default)('active', trigger) && !(0, _isOneOf.default)('contextMenu', trigger)) {
|
|
74
74
|
_this.hideWithCheck();
|
|
75
75
|
}
|
|
76
76
|
};
|
|
@@ -134,6 +134,10 @@ function (_React$Component) {
|
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
136
|
|
|
137
|
+
_this.preventDefault = function (event) {
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
};
|
|
140
|
+
|
|
137
141
|
_this.handleDelayedShow = function () {
|
|
138
142
|
var _this$props2 = _this.props,
|
|
139
143
|
delayShow = _this$props2.delayShow,
|
|
@@ -236,6 +240,8 @@ function (_React$Component) {
|
|
|
236
240
|
|
|
237
241
|
if ((0, _isOneOf.default)('click', trigger)) {
|
|
238
242
|
overlayProps.onHide = (0, _createChainedFunction.default)(this.hide, onHide);
|
|
243
|
+
} else if ((0, _isOneOf.default)('contextMenu', trigger)) {
|
|
244
|
+
overlayProps.onHide = (0, _createChainedFunction.default)(this.hide, onHide);
|
|
239
245
|
} else if ((0, _isOneOf.default)('active', trigger)) {
|
|
240
246
|
overlayProps.onHide = (0, _createChainedFunction.default)(this.hide, onHide);
|
|
241
247
|
}
|
|
@@ -265,6 +271,7 @@ function (_React$Component) {
|
|
|
265
271
|
children = _this$props5.children,
|
|
266
272
|
speaker = _this$props5.speaker,
|
|
267
273
|
onClick = _this$props5.onClick,
|
|
274
|
+
onContextMenu = _this$props5.onContextMenu,
|
|
268
275
|
trigger = _this$props5.trigger,
|
|
269
276
|
onMouseOver = _this$props5.onMouseOver,
|
|
270
277
|
onMouseOut = _this$props5.onMouseOut,
|
|
@@ -284,6 +291,10 @@ function (_React$Component) {
|
|
|
284
291
|
props.onClick = (0, _createChainedFunction.default)(this.toggleHideAndShow, props.onClick);
|
|
285
292
|
}
|
|
286
293
|
|
|
294
|
+
if ((0, _isOneOf.default)('contextMenu', trigger)) {
|
|
295
|
+
props.onContextMenu = (0, _createChainedFunction.default)(this.preventDefault, this.toggleHideAndShow, triggerProps.onContextMenu, onContextMenu);
|
|
296
|
+
}
|
|
297
|
+
|
|
287
298
|
if ((0, _isOneOf.default)('active', trigger)) {
|
|
288
299
|
props.onClick = (0, _createChainedFunction.default)(this.handleDelayedShow, props.onClick);
|
|
289
300
|
}
|
|
@@ -166,11 +166,12 @@
|
|
|
166
166
|
border-style: solid;
|
|
167
167
|
border-width: 0;
|
|
168
168
|
border-color: @table-border-color;
|
|
169
|
-
display: block;
|
|
170
169
|
overflow: hidden;
|
|
171
170
|
position: absolute;
|
|
172
171
|
white-space: normal;
|
|
173
172
|
background: @table-body-background;
|
|
173
|
+
display: table;
|
|
174
|
+
table-layout: fixed;
|
|
174
175
|
|
|
175
176
|
&.first {
|
|
176
177
|
border-left-width: 0;
|
package/lib/Uploader/Uploader.js
CHANGED
|
@@ -70,6 +70,8 @@ function (_React$Component) {
|
|
|
70
70
|
|
|
71
71
|
(_this$props$onRemove = (_this$props = _this.props).onRemove) === null || _this$props$onRemove === void 0 ? void 0 : _this$props$onRemove.call(_this$props, file);
|
|
72
72
|
(_this$props$onChange = (_this$props2 = _this.props).onChange) === null || _this$props$onChange === void 0 ? void 0 : _this$props$onChange.call(_this$props2, nextFileList);
|
|
73
|
+
|
|
74
|
+
_this.cleanInputValue();
|
|
73
75
|
};
|
|
74
76
|
|
|
75
77
|
_this.handleUploadTriggerChange = function (event) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rsuite",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.10.1",
|
|
4
4
|
"description": "A suite of react components",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"react-lifecycles-compat": "^3.0.4",
|
|
64
64
|
"react-virtualized": "^9.21.0",
|
|
65
65
|
"recompose": "^0.30.0",
|
|
66
|
-
"rsuite-table": "^3.
|
|
66
|
+
"rsuite-table": "^3.15.1",
|
|
67
67
|
"schema-typed": "^1.5.1"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
@@ -166,7 +166,7 @@ class DropdownMenu extends React.Component<DropdownMenuProps> {
|
|
|
166
166
|
className={classes}
|
|
167
167
|
componentClass="li"
|
|
168
168
|
indeterminate={cascade && !active && this.utils.isSomeChildChecked(node, value)}
|
|
169
|
-
onSelectItem={this.handleSelect.bind(this, layer
|
|
169
|
+
onSelectItem={this.handleSelect.bind(this, layer)}
|
|
170
170
|
onCheck={onCheck}
|
|
171
171
|
checkable={!uncheckable}
|
|
172
172
|
>
|
|
@@ -41,6 +41,14 @@ export interface MultiCascaderProps<ValueType = any> extends FormControlPickerPr
|
|
|
41
41
|
event: React.SyntheticEvent<HTMLElement>
|
|
42
42
|
) => void;
|
|
43
43
|
|
|
44
|
+
/** Called after the checkbox state changes */
|
|
45
|
+
onCheck?: (
|
|
46
|
+
value: ValueType,
|
|
47
|
+
item: any,
|
|
48
|
+
checked: boolean,
|
|
49
|
+
event: React.SyntheticEvent<HTMLElement>
|
|
50
|
+
) => void;
|
|
51
|
+
|
|
44
52
|
/** Called when clean */
|
|
45
53
|
onClean?: (event: React.SyntheticEvent<HTMLElement>) => void;
|
|
46
54
|
|
|
@@ -57,7 +57,8 @@ class MultiCascader extends React.Component<MultiCascaderProps, MultiCascaderSta
|
|
|
57
57
|
renderMenuItem: PropTypes.func,
|
|
58
58
|
renderMenu: PropTypes.func,
|
|
59
59
|
onSearch: PropTypes.func,
|
|
60
|
-
onSelect: PropTypes.func
|
|
60
|
+
onSelect: PropTypes.func,
|
|
61
|
+
onCheck: PropTypes.func
|
|
61
62
|
};
|
|
62
63
|
|
|
63
64
|
static defaultProps = {
|
|
@@ -187,7 +188,7 @@ class MultiCascader extends React.Component<MultiCascaderProps, MultiCascaderSta
|
|
|
187
188
|
}
|
|
188
189
|
|
|
189
190
|
handleCheck = (item: any, event: React.SyntheticEvent<any>, checked: boolean) => {
|
|
190
|
-
const { valueKey,
|
|
191
|
+
const { valueKey, cascade, uncheckableItemValues, onChange, onCheck } = this.props;
|
|
191
192
|
const itemValue = item[valueKey];
|
|
192
193
|
let value = [];
|
|
193
194
|
|
|
@@ -208,6 +209,7 @@ class MultiCascader extends React.Component<MultiCascaderProps, MultiCascaderSta
|
|
|
208
209
|
}
|
|
209
210
|
|
|
210
211
|
onChange?.(value, event);
|
|
212
|
+
onCheck?.(value, item, checked, event);
|
|
211
213
|
};
|
|
212
214
|
|
|
213
215
|
handleChangeForSearchItem = (value: any, checked: boolean, event: React.SyntheticEvent<any>) => {
|
|
@@ -112,6 +112,23 @@ describe('MultiCascader - DropdownMenu', () => {
|
|
|
112
112
|
}, 1);
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
+
it('Should call onSelect callback with 4 params', done => {
|
|
116
|
+
const doneOp = (node, activePaths, createConcat, event) => {
|
|
117
|
+
if (
|
|
118
|
+
typeof node === 'object' &&
|
|
119
|
+
Array.isArray(activePaths) &&
|
|
120
|
+
typeof createConcat === 'function' &&
|
|
121
|
+
event.target
|
|
122
|
+
) {
|
|
123
|
+
done();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const instance = getInstance(<Dropdown defaultOpen data={items} onSelect={doneOp} />);
|
|
128
|
+
const menuContainer = getDOMNode(instance.menuContainerRef.current);
|
|
129
|
+
ReactTestUtils.Simulate.click(menuContainer.querySelectorAll('.rs-checkbox')[1]);
|
|
130
|
+
});
|
|
131
|
+
|
|
115
132
|
it('Should not call onSelect callback on disabled item', () => {
|
|
116
133
|
const onSelectSpy = sinon.spy();
|
|
117
134
|
const instance = getInstance(
|
|
@@ -7,7 +7,6 @@ import Button from '../../Button';
|
|
|
7
7
|
|
|
8
8
|
const namespace = `${globalKey}-picker`;
|
|
9
9
|
const toggleClassName = `.${namespace}-toggle-placeholder`;
|
|
10
|
-
const activeClassName = '.rs-dropdown-menu-item-active';
|
|
11
10
|
|
|
12
11
|
const items = [
|
|
13
12
|
{
|
|
@@ -209,6 +208,20 @@ describe('MultiCascader', () => {
|
|
|
209
208
|
ReactTestUtils.Simulate.click(menu.querySelector('.rs-checkbox'));
|
|
210
209
|
});
|
|
211
210
|
|
|
211
|
+
it('Should call onCheck callback ', done => {
|
|
212
|
+
let checkbox = null;
|
|
213
|
+
const doneOp = (value, item, checked, event) => {
|
|
214
|
+
if (value[0] === 'abc' && item.value === 'abc' && checked && event.target === checkbox) {
|
|
215
|
+
done();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const instance = getInstance(<Dropdown data={items} defaultOpen onCheck={doneOp} />);
|
|
220
|
+
const menu = findDOMNode(instance.menuContainerRef.current);
|
|
221
|
+
checkbox = menu.querySelector('.rs-checkbox-wrapper');
|
|
222
|
+
ReactTestUtils.Simulate.click(checkbox);
|
|
223
|
+
});
|
|
224
|
+
|
|
212
225
|
it('Should call onChange callback ', done => {
|
|
213
226
|
const doneOp = value => {
|
|
214
227
|
if (value[0] === 'abc') {
|
package/src/Nav/Nav.tsx
CHANGED
|
@@ -5,7 +5,13 @@ import { setStatic } from 'recompose';
|
|
|
5
5
|
import shallowEqual from '../utils/shallowEqual';
|
|
6
6
|
|
|
7
7
|
import NavItem from './NavItem';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
prefix,
|
|
10
|
+
getUnhandledProps,
|
|
11
|
+
defaultProps,
|
|
12
|
+
ReactChildren,
|
|
13
|
+
createChainedFunction
|
|
14
|
+
} from '../utils';
|
|
9
15
|
import { getClassNamePrefix } from '../utils/prefix';
|
|
10
16
|
import { NavbarContext } from '../Navbar/Navbar';
|
|
11
17
|
import { SidenavContext } from '../Sidenav/Sidenav';
|
|
@@ -56,21 +62,21 @@ class Nav extends React.Component<NavProps> {
|
|
|
56
62
|
const hasWaterline = appearance !== 'default';
|
|
57
63
|
|
|
58
64
|
const items = ReactChildren.mapCloneElement(children, item => {
|
|
59
|
-
const { eventKey, active, ...rest } = item.props;
|
|
65
|
+
const { eventKey, active, onSelect: onSelectItem, ...rest } = item.props;
|
|
60
66
|
const displayName = item?.type?.displayName;
|
|
61
67
|
const hasTooltip = sidenav && !expanded;
|
|
62
68
|
|
|
63
69
|
if (~displayName?.indexOf('(NavItem)')) {
|
|
64
70
|
return {
|
|
65
71
|
...rest,
|
|
66
|
-
onSelect,
|
|
72
|
+
onSelect: createChainedFunction(onSelect, onSelectItem),
|
|
67
73
|
hasTooltip,
|
|
68
74
|
active: typeof activeKey === 'undefined' ? active : shallowEqual(activeKey, eventKey)
|
|
69
75
|
};
|
|
70
76
|
} else if (~displayName?.indexOf('(Dropdown)')) {
|
|
71
77
|
return {
|
|
72
78
|
...rest,
|
|
73
|
-
onSelect,
|
|
79
|
+
onSelect: createChainedFunction(onSelect, onSelectItem),
|
|
74
80
|
activeKey,
|
|
75
81
|
showHeader: hasTooltip,
|
|
76
82
|
componentClass: 'li'
|
package/src/Nav/test/NavSpec.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import ReactTestUtils from 'react-dom/test-utils';
|
|
2
3
|
import { innerText, getDOMNode } from '@test/testUtils';
|
|
3
4
|
|
|
4
5
|
import Nav from '../Nav';
|
|
@@ -68,4 +69,38 @@ describe('Nav', () => {
|
|
|
68
69
|
const instance = getDOMNode(<Nav classPrefix="custom-prefix" />);
|
|
69
70
|
assert.ok(instance.className.match(/\bcustom-prefix\b/));
|
|
70
71
|
});
|
|
72
|
+
|
|
73
|
+
it('Should call onSelect callback', done => {
|
|
74
|
+
const doneOp = eventKey => {
|
|
75
|
+
if (eventKey === 2) {
|
|
76
|
+
done();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const instance = getDOMNode(
|
|
80
|
+
<Nav onSelect={doneOp}>
|
|
81
|
+
<Nav.Item eventKey={1}>1</Nav.Item>
|
|
82
|
+
<Nav.Item eventKey={2}>2</Nav.Item>
|
|
83
|
+
</Nav>
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
ReactTestUtils.Simulate.click(instance.querySelectorAll('.rs-nav-item a')[1]);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('Should call onSelect callback on Nav.Item', done => {
|
|
90
|
+
const doneOp = eventKey => {
|
|
91
|
+
if (eventKey === 2) {
|
|
92
|
+
done();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const instance = getDOMNode(
|
|
96
|
+
<Nav>
|
|
97
|
+
<Nav.Item eventKey={1}>1</Nav.Item>
|
|
98
|
+
<Nav.Item eventKey={2} onSelect={doneOp}>
|
|
99
|
+
2
|
|
100
|
+
</Nav.Item>
|
|
101
|
+
</Nav>
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
ReactTestUtils.Simulate.click(instance.querySelectorAll('.rs-nav-item a')[1]);
|
|
105
|
+
});
|
|
71
106
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { AnimationEventProps, StandardProps, TypeAttributes } from '../@types/common';
|
|
3
3
|
|
|
4
|
-
export type OverlayTriggerTrigger = 'click' | 'hover' | 'focus' | 'active' | 'none';
|
|
4
|
+
export type OverlayTriggerTrigger = 'click' | 'contextMenu' | 'hover' | 'focus' | 'active' | 'none';
|
|
5
5
|
|
|
6
6
|
export interface TriggerProps extends AnimationEventProps, StandardProps {
|
|
7
7
|
/** Triggering events */
|
|
@@ -26,6 +26,7 @@ interface TriggerProps {
|
|
|
26
26
|
onMouseOut?: React.MouseEventHandler;
|
|
27
27
|
onBlur?: React.MouseEventHandler;
|
|
28
28
|
onClick?: React.MouseEventHandler;
|
|
29
|
+
onContextMenu?: React.MouseEventHandler;
|
|
29
30
|
onFocus?: React.MouseEventHandler;
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -81,7 +82,11 @@ class OverlayTrigger extends React.Component<OverlayTriggerProps, OverlayTrigger
|
|
|
81
82
|
handleSpeakerMouseLeave = () => {
|
|
82
83
|
const { trigger } = this.props;
|
|
83
84
|
this.mouseEnteredToSpeaker = false;
|
|
84
|
-
if (
|
|
85
|
+
if (
|
|
86
|
+
!isOneOf('click', trigger) &&
|
|
87
|
+
!isOneOf('active', trigger) &&
|
|
88
|
+
!isOneOf('contextMenu', trigger)
|
|
89
|
+
) {
|
|
85
90
|
this.hideWithCheck();
|
|
86
91
|
}
|
|
87
92
|
};
|
|
@@ -130,6 +135,10 @@ class OverlayTrigger extends React.Component<OverlayTriggerProps, OverlayTrigger
|
|
|
130
135
|
}
|
|
131
136
|
};
|
|
132
137
|
|
|
138
|
+
preventDefault = (event: React.MouseEvent<Element, MouseEvent>) => {
|
|
139
|
+
event.preventDefault();
|
|
140
|
+
};
|
|
141
|
+
|
|
133
142
|
handleDelayedShow = () => {
|
|
134
143
|
const { delayShow, enterable } = this.props;
|
|
135
144
|
const delay = isNil(delayShow) ? this.props.delay : delayShow;
|
|
@@ -197,6 +206,8 @@ class OverlayTrigger extends React.Component<OverlayTriggerProps, OverlayTrigger
|
|
|
197
206
|
|
|
198
207
|
if (isOneOf('click', trigger)) {
|
|
199
208
|
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
209
|
+
} else if (isOneOf('contextMenu', trigger)) {
|
|
210
|
+
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
200
211
|
} else if (isOneOf('active', trigger)) {
|
|
201
212
|
overlayProps.onHide = createChainedFunction(this.hide, onHide);
|
|
202
213
|
}
|
|
@@ -228,6 +239,7 @@ class OverlayTrigger extends React.Component<OverlayTriggerProps, OverlayTrigger
|
|
|
228
239
|
children,
|
|
229
240
|
speaker,
|
|
230
241
|
onClick,
|
|
242
|
+
onContextMenu,
|
|
231
243
|
trigger,
|
|
232
244
|
onMouseOver,
|
|
233
245
|
onMouseOut,
|
|
@@ -254,6 +266,15 @@ class OverlayTrigger extends React.Component<OverlayTriggerProps, OverlayTrigger
|
|
|
254
266
|
props.onClick = createChainedFunction(this.toggleHideAndShow, props.onClick);
|
|
255
267
|
}
|
|
256
268
|
|
|
269
|
+
if (isOneOf('contextMenu', trigger)) {
|
|
270
|
+
props.onContextMenu = createChainedFunction(
|
|
271
|
+
this.preventDefault,
|
|
272
|
+
this.toggleHideAndShow,
|
|
273
|
+
triggerProps.onContextMenu,
|
|
274
|
+
onContextMenu
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
|
|
257
278
|
if (isOneOf('active', trigger)) {
|
|
258
279
|
props.onClick = createChainedFunction(this.handleDelayedShow, props.onClick);
|
|
259
280
|
}
|