@douyinfe/semi-ui 2.51.4 → 2.52.0-beta.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/dist/css/semi.css +285 -0
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +488 -214
- package/dist/umd/semi-ui.js.map +1 -1
- package/dist/umd/semi-ui.min.js +1 -1
- package/dist/umd/semi-ui.min.js.map +1 -1
- package/lib/cjs/_utils/index.d.ts +2 -1
- package/lib/cjs/_utils/index.js +0 -5
- package/lib/cjs/avatar/TopSlotSvg.d.ts +5 -0
- package/lib/cjs/avatar/TopSlotSvg.js +74 -0
- package/lib/cjs/avatar/index.d.ts +25 -0
- package/lib/cjs/avatar/index.js +126 -8
- package/lib/cjs/avatar/interface.d.ts +24 -1
- package/lib/cjs/cascader/index.d.ts +2 -3
- package/lib/cjs/cascader/index.js +19 -28
- package/lib/cjs/datePicker/datePicker.js +1 -1
- package/lib/cjs/datePicker/yearAndMonth.js +16 -20
- package/lib/cjs/dropdown/dropdownItem.js +2 -1
- package/lib/cjs/form/hoc/withField.d.ts +3 -3
- package/lib/cjs/input/index.d.ts +1 -0
- package/lib/cjs/input/index.js +12 -4
- package/lib/cjs/modal/Modal.d.ts +1 -0
- package/lib/cjs/modal/Modal.js +13 -5
- package/lib/cjs/modal/confirm.d.ts +5 -0
- package/lib/cjs/select/option.js +1 -2
- package/lib/cjs/slider/index.js +33 -1
- package/lib/cjs/table/ColumnFilter.d.ts +34 -18
- package/lib/cjs/table/ColumnFilter.js +134 -73
- package/lib/cjs/table/ResizableTable.js +1 -1
- package/lib/cjs/table/Table.d.ts +5 -5
- package/lib/cjs/table/Table.js +38 -13
- package/lib/cjs/table/index.d.ts +1 -1
- package/lib/cjs/table/interface.d.ts +30 -10
- package/lib/cjs/treeSelect/index.d.ts +2 -0
- package/lib/cjs/treeSelect/index.js +4 -0
- package/lib/es/_utils/index.d.ts +2 -1
- package/lib/es/_utils/index.js +0 -5
- package/lib/es/avatar/TopSlotSvg.d.ts +5 -0
- package/lib/es/avatar/TopSlotSvg.js +66 -0
- package/lib/es/avatar/index.d.ts +25 -0
- package/lib/es/avatar/index.js +126 -8
- package/lib/es/avatar/interface.d.ts +24 -1
- package/lib/es/cascader/index.d.ts +2 -3
- package/lib/es/cascader/index.js +19 -28
- package/lib/es/datePicker/datePicker.js +1 -1
- package/lib/es/datePicker/yearAndMonth.js +16 -20
- package/lib/es/dropdown/dropdownItem.js +2 -1
- package/lib/es/form/hoc/withField.d.ts +3 -3
- package/lib/es/input/index.d.ts +1 -0
- package/lib/es/input/index.js +12 -4
- package/lib/es/modal/Modal.d.ts +1 -0
- package/lib/es/modal/Modal.js +13 -5
- package/lib/es/modal/confirm.d.ts +5 -0
- package/lib/es/select/option.js +1 -2
- package/lib/es/slider/index.js +33 -1
- package/lib/es/table/ColumnFilter.d.ts +34 -18
- package/lib/es/table/ColumnFilter.js +135 -74
- package/lib/es/table/ResizableTable.js +1 -1
- package/lib/es/table/Table.d.ts +5 -5
- package/lib/es/table/Table.js +38 -13
- package/lib/es/table/index.d.ts +1 -1
- package/lib/es/table/interface.d.ts +30 -10
- package/lib/es/treeSelect/index.d.ts +2 -0
- package/lib/es/treeSelect/index.js +4 -0
- package/package.json +8 -8
|
@@ -37,7 +37,8 @@ class DropdownItem extends BaseComponent {
|
|
|
37
37
|
const events = {};
|
|
38
38
|
if (!disabled) {
|
|
39
39
|
['onClick', 'onMouseEnter', 'onMouseLeave', 'onContextMenu'].forEach(eventName => {
|
|
40
|
-
|
|
40
|
+
const isInAnotherDropdown = this.context.level !== 1;
|
|
41
|
+
if (isInAnotherDropdown && eventName === "onClick") {
|
|
41
42
|
events["onMouseDown"] = e => {
|
|
42
43
|
var _a, _b;
|
|
43
44
|
if (e.button === 0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
2
|
+
import { WithFieldOption } from '@douyinfe/semi-foundation/lib/es/form/interface';
|
|
3
|
+
import { CommonFieldProps, CommonexcludeType } from '../interface';
|
|
4
|
+
import { Subtract } from 'utility-types';
|
|
5
5
|
/**
|
|
6
6
|
* withFiled is used to inject components
|
|
7
7
|
* 1. Takes over the value and onChange of the component and synchronizes them to Form Foundation
|
package/lib/es/input/index.d.ts
CHANGED
|
@@ -51,6 +51,7 @@ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
|
|
|
51
51
|
preventScroll?: boolean;
|
|
52
52
|
/** internal prop, DatePicker use it */
|
|
53
53
|
showClearIgnoreDisabled?: boolean;
|
|
54
|
+
onlyBorder?: number;
|
|
54
55
|
}
|
|
55
56
|
export interface InputState {
|
|
56
57
|
value: React.ReactText;
|
package/lib/es/input/index.js
CHANGED
|
@@ -333,9 +333,10 @@ class Input extends BaseComponent {
|
|
|
333
333
|
getValueLength,
|
|
334
334
|
preventScroll,
|
|
335
335
|
borderless,
|
|
336
|
-
showClearIgnoreDisabled
|
|
336
|
+
showClearIgnoreDisabled,
|
|
337
|
+
onlyBorder
|
|
337
338
|
} = _a,
|
|
338
|
-
rest = __rest(_a, ["addonAfter", "addonBefore", "autoFocus", "clearIcon", "className", "disabled", "defaultValue", "placeholder", "prefix", "mode", "insetLabel", "insetLabelId", "validateStatus", "type", "readonly", "size", "suffix", "style", "showClear", "onEnterPress", "onClear", "hideSuffix", "inputStyle", "forwardRef", "maxLength", "getValueLength", "preventScroll", "borderless", "showClearIgnoreDisabled"]);
|
|
339
|
+
rest = __rest(_a, ["addonAfter", "addonBefore", "autoFocus", "clearIcon", "className", "disabled", "defaultValue", "placeholder", "prefix", "mode", "insetLabel", "insetLabelId", "validateStatus", "type", "readonly", "size", "suffix", "style", "showClear", "onEnterPress", "onClear", "hideSuffix", "inputStyle", "forwardRef", "maxLength", "getValueLength", "preventScroll", "borderless", "showClearIgnoreDisabled", "onlyBorder"]);
|
|
339
340
|
const {
|
|
340
341
|
value,
|
|
341
342
|
isFocus,
|
|
@@ -363,7 +364,8 @@ class Input extends BaseComponent {
|
|
|
363
364
|
[`${wrapperPrefix}-modebtn`]: mode === 'password',
|
|
364
365
|
[`${wrapperPrefix}-hidden`]: type === 'hidden',
|
|
365
366
|
[`${wrapperPrefix}-${size}`]: size,
|
|
366
|
-
[`${prefixCls}-borderless`]: borderless
|
|
367
|
+
[`${prefixCls}-borderless`]: borderless,
|
|
368
|
+
[`${prefixCls}-only_border`]: onlyBorder !== undefined && onlyBorder !== null
|
|
367
369
|
});
|
|
368
370
|
const inputCls = cls(prefixCls, {
|
|
369
371
|
[`${prefixCls}-${size}`]: size,
|
|
@@ -397,12 +399,18 @@ class Input extends BaseComponent {
|
|
|
397
399
|
if (validateStatus === 'error') {
|
|
398
400
|
inputProps['aria-invalid'] = 'true';
|
|
399
401
|
}
|
|
402
|
+
let wrapperStyle = Object.assign({}, style);
|
|
403
|
+
if (onlyBorder !== undefined) {
|
|
404
|
+
wrapperStyle = Object.assign({
|
|
405
|
+
borderWidth: onlyBorder
|
|
406
|
+
}, style);
|
|
407
|
+
}
|
|
400
408
|
return (
|
|
401
409
|
/*#__PURE__*/
|
|
402
410
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
|
|
403
411
|
React.createElement("div", {
|
|
404
412
|
className: wrapperCls,
|
|
405
|
-
style:
|
|
413
|
+
style: wrapperStyle,
|
|
406
414
|
onMouseEnter: e => this.handleMouseOver(e),
|
|
407
415
|
onMouseLeave: e => this.handleMouseLeave(e),
|
|
408
416
|
onClick: e => this.handleClick(e)
|
package/lib/es/modal/Modal.d.ts
CHANGED
|
@@ -66,6 +66,7 @@ declare class Modal extends BaseComponent<ModalReactProps, ModalState> {
|
|
|
66
66
|
lazyRender: PropTypes.Requireable<boolean>;
|
|
67
67
|
direction: PropTypes.Requireable<string>;
|
|
68
68
|
fullScreen: PropTypes.Requireable<boolean>;
|
|
69
|
+
footerFill: PropTypes.Requireable<boolean>;
|
|
69
70
|
};
|
|
70
71
|
static defaultProps: {
|
|
71
72
|
zIndex: number;
|
package/lib/es/modal/Modal.js
CHANGED
|
@@ -26,7 +26,6 @@ export const destroyFns = [];
|
|
|
26
26
|
class Modal extends BaseComponent {
|
|
27
27
|
constructor(props) {
|
|
28
28
|
super(props);
|
|
29
|
-
this.bodyOverflow = null;
|
|
30
29
|
this.handleCancel = e => {
|
|
31
30
|
this.foundation.handleCancel(e);
|
|
32
31
|
};
|
|
@@ -46,7 +45,8 @@ class Modal extends BaseComponent {
|
|
|
46
45
|
cancelText,
|
|
47
46
|
confirmLoading,
|
|
48
47
|
cancelLoading,
|
|
49
|
-
hasCancel
|
|
48
|
+
hasCancel,
|
|
49
|
+
footerFill
|
|
50
50
|
} = this.props;
|
|
51
51
|
const getCancelButton = locale => {
|
|
52
52
|
if (!hasCancel) {
|
|
@@ -57,6 +57,7 @@ class Modal extends BaseComponent {
|
|
|
57
57
|
onClick: this.handleCancel,
|
|
58
58
|
loading: cancelLoading === undefined ? this.state.onCancelReturnPromiseStatus === "pending" : cancelLoading,
|
|
59
59
|
type: "tertiary",
|
|
60
|
+
block: footerFill,
|
|
60
61
|
autoFocus: true
|
|
61
62
|
}, this.props.cancelButtonProps, {
|
|
62
63
|
"x-semi-children-alias": "cancelText"
|
|
@@ -65,10 +66,15 @@ class Modal extends BaseComponent {
|
|
|
65
66
|
};
|
|
66
67
|
return /*#__PURE__*/React.createElement(LocaleConsumer, {
|
|
67
68
|
componentName: "Modal"
|
|
68
|
-
}, (locale, localeCode) => /*#__PURE__*/React.createElement("div",
|
|
69
|
+
}, (locale, localeCode) => /*#__PURE__*/React.createElement("div", {
|
|
70
|
+
className: cls({
|
|
71
|
+
[`${cssClasses.DIALOG}-footerfill`]: footerFill
|
|
72
|
+
})
|
|
73
|
+
}, getCancelButton(locale), /*#__PURE__*/React.createElement(Button, Object.assign({
|
|
69
74
|
"aria-label": "confirm",
|
|
70
75
|
type: okType,
|
|
71
76
|
theme: "solid",
|
|
77
|
+
block: footerFill,
|
|
72
78
|
loading: confirmLoading === undefined ? this.state.onOKReturnPromiseStatus === "pending" : confirmLoading,
|
|
73
79
|
onClick: this.handleOk
|
|
74
80
|
}, this.props.okButtonProps, {
|
|
@@ -166,6 +172,7 @@ class Modal extends BaseComponent {
|
|
|
166
172
|
};
|
|
167
173
|
this.foundation = new ModalFoundation(this.adapter);
|
|
168
174
|
this.modalRef = /*#__PURE__*/React.createRef();
|
|
175
|
+
this.bodyOverflow = '';
|
|
169
176
|
this.scrollBarWidth = 0;
|
|
170
177
|
this.originBodyWidth = '100%';
|
|
171
178
|
}
|
|
@@ -186,7 +193,7 @@ class Modal extends BaseComponent {
|
|
|
186
193
|
const {
|
|
187
194
|
getPopupContainer
|
|
188
195
|
} = this.props;
|
|
189
|
-
if (!getPopupContainer && this.bodyOverflow !==
|
|
196
|
+
if (!getPopupContainer && this.bodyOverflow !== 'hidden') {
|
|
190
197
|
document.body.style.overflow = this.bodyOverflow;
|
|
191
198
|
document.body.style.width = this.originBodyWidth;
|
|
192
199
|
}
|
|
@@ -301,7 +308,8 @@ Modal.propTypes = {
|
|
|
301
308
|
keepDOM: PropTypes.bool,
|
|
302
309
|
lazyRender: PropTypes.bool,
|
|
303
310
|
direction: PropTypes.oneOf(strings.directions),
|
|
304
|
-
fullScreen: PropTypes.bool
|
|
311
|
+
fullScreen: PropTypes.bool,
|
|
312
|
+
footerFill: PropTypes.bool
|
|
305
313
|
};
|
|
306
314
|
Modal.defaultProps = {
|
|
307
315
|
zIndex: 1000,
|
|
@@ -51,6 +51,7 @@ export declare function withInfo(props: ModalReactProps): {
|
|
|
51
51
|
direction?: any;
|
|
52
52
|
fullScreen?: boolean;
|
|
53
53
|
preventScroll?: boolean;
|
|
54
|
+
footerFill?: boolean;
|
|
54
55
|
type: "info";
|
|
55
56
|
};
|
|
56
57
|
export declare function withSuccess(props: ModalReactProps): {
|
|
@@ -94,6 +95,7 @@ export declare function withSuccess(props: ModalReactProps): {
|
|
|
94
95
|
direction?: any;
|
|
95
96
|
fullScreen?: boolean;
|
|
96
97
|
preventScroll?: boolean;
|
|
98
|
+
footerFill?: boolean;
|
|
97
99
|
type: "success";
|
|
98
100
|
};
|
|
99
101
|
export declare function withWarning(props: ModalReactProps): {
|
|
@@ -137,6 +139,7 @@ export declare function withWarning(props: ModalReactProps): {
|
|
|
137
139
|
direction?: any;
|
|
138
140
|
fullScreen?: boolean;
|
|
139
141
|
preventScroll?: boolean;
|
|
142
|
+
footerFill?: boolean;
|
|
140
143
|
type: "warning";
|
|
141
144
|
};
|
|
142
145
|
export declare function withError(props: ModalReactProps): {
|
|
@@ -179,6 +182,7 @@ export declare function withError(props: ModalReactProps): {
|
|
|
179
182
|
onOk?: (e: React.MouseEvent<Element, MouseEvent>) => void | Promise<any>;
|
|
180
183
|
lazyRender?: boolean;
|
|
181
184
|
fullScreen?: boolean;
|
|
185
|
+
footerFill?: boolean;
|
|
182
186
|
type: "error";
|
|
183
187
|
okButtonProps: {
|
|
184
188
|
id?: string;
|
|
@@ -506,5 +510,6 @@ export declare function withConfirm(props: ModalReactProps): {
|
|
|
506
510
|
direction?: any;
|
|
507
511
|
fullScreen?: boolean;
|
|
508
512
|
preventScroll?: boolean;
|
|
513
|
+
footerFill?: boolean;
|
|
509
514
|
type: "confirm";
|
|
510
515
|
};
|
package/lib/es/select/option.js
CHANGED
package/lib/es/slider/index.js
CHANGED
|
@@ -28,6 +28,7 @@ export default class Slider extends BaseComponent {
|
|
|
28
28
|
constructor(props) {
|
|
29
29
|
super(props);
|
|
30
30
|
this.renderHandle = () => {
|
|
31
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
31
32
|
const {
|
|
32
33
|
vertical,
|
|
33
34
|
range,
|
|
@@ -126,6 +127,14 @@ export default class Slider extends BaseComponent {
|
|
|
126
127
|
"aria-valuenow": currentValue,
|
|
127
128
|
"aria-valuemax": max,
|
|
128
129
|
"aria-valuemin": min
|
|
130
|
+
}), this.props.handleDot && /*#__PURE__*/React.createElement("div", {
|
|
131
|
+
className: cssClasses.HANDLE_DOT,
|
|
132
|
+
style: Object.assign(Object.assign({}, ((_a = this.props.handleDot) === null || _a === void 0 ? void 0 : _a.size) ? {
|
|
133
|
+
width: this.props.handleDot.size,
|
|
134
|
+
height: this.props.handleDot.size
|
|
135
|
+
} : {}), ((_b = this.props.handleDot) === null || _b === void 0 ? void 0 : _b.color) ? {
|
|
136
|
+
backgroundColor: this.props.handleDot.color
|
|
137
|
+
} : {})
|
|
129
138
|
}))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
|
|
130
139
|
content: tipChildren.min,
|
|
131
140
|
position: "top",
|
|
@@ -177,6 +186,14 @@ export default class Slider extends BaseComponent {
|
|
|
177
186
|
"aria-valuenow": currentValue[0],
|
|
178
187
|
"aria-valuemax": currentValue[1],
|
|
179
188
|
"aria-valuemin": min
|
|
189
|
+
}), ((_c = this.props.handleDot) === null || _c === void 0 ? void 0 : _c[0]) && /*#__PURE__*/React.createElement("div", {
|
|
190
|
+
className: cssClasses.HANDLE_DOT,
|
|
191
|
+
style: Object.assign(Object.assign({}, ((_d = this.props.handleDot[0]) === null || _d === void 0 ? void 0 : _d.size) ? {
|
|
192
|
+
width: this.props.handleDot[0].size,
|
|
193
|
+
height: this.props.handleDot[0].size
|
|
194
|
+
} : {}), ((_e = this.props.handleDot[0]) === null || _e === void 0 ? void 0 : _e.color) ? {
|
|
195
|
+
backgroundColor: this.props.handleDot[0].color
|
|
196
|
+
} : {})
|
|
180
197
|
}))), /*#__PURE__*/React.createElement(Tooltip, {
|
|
181
198
|
content: tipChildren.max,
|
|
182
199
|
position: "top",
|
|
@@ -228,6 +245,14 @@ export default class Slider extends BaseComponent {
|
|
|
228
245
|
"aria-valuenow": currentValue[1],
|
|
229
246
|
"aria-valuemax": max,
|
|
230
247
|
"aria-valuemin": currentValue[0]
|
|
248
|
+
}), ((_f = this.props.handleDot) === null || _f === void 0 ? void 0 : _f[1]) && /*#__PURE__*/React.createElement("div", {
|
|
249
|
+
className: cssClasses.HANDLE_DOT,
|
|
250
|
+
style: Object.assign(Object.assign({}, ((_g = this.props.handleDot[1]) === null || _g === void 0 ? void 0 : _g.size) ? {
|
|
251
|
+
width: this.props.handleDot[1].size,
|
|
252
|
+
height: this.props.handleDot[1].size
|
|
253
|
+
} : {}), ((_h = this.props.handleDot[1]) === null || _h === void 0 ? void 0 : _h.color) ? {
|
|
254
|
+
backgroundColor: this.props.handleDot[1].color
|
|
255
|
+
} : {})
|
|
231
256
|
}))));
|
|
232
257
|
return handleContents;
|
|
233
258
|
};
|
|
@@ -644,7 +669,14 @@ Slider.propTypes = {
|
|
|
644
669
|
showBoundary: PropTypes.bool,
|
|
645
670
|
railStyle: PropTypes.object,
|
|
646
671
|
verticalReverse: PropTypes.bool,
|
|
647
|
-
getAriaValueText: PropTypes.func
|
|
672
|
+
getAriaValueText: PropTypes.func,
|
|
673
|
+
handleDot: PropTypes.oneOfType([PropTypes.shape({
|
|
674
|
+
size: PropTypes.string,
|
|
675
|
+
color: PropTypes.string
|
|
676
|
+
}), PropTypes.arrayOf(PropTypes.shape({
|
|
677
|
+
size: PropTypes.string,
|
|
678
|
+
color: PropTypes.string
|
|
679
|
+
}))])
|
|
648
680
|
};
|
|
649
681
|
Slider.defaultProps = {
|
|
650
682
|
// allowClear: false,
|
|
@@ -1,34 +1,50 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { DropdownProps } from '../dropdown';
|
|
3
|
-
import { Trigger, Position } from '../tooltip';
|
|
4
3
|
import { FilterIcon, Filter, OnFilterDropdownVisibleChange, RenderFilterDropdownItem } from './interface';
|
|
5
|
-
export
|
|
4
|
+
export default function ColumnFilter(props?: ColumnFilterProps): React.ReactElement;
|
|
5
|
+
export interface ColumnFilterProps extends Omit<RenderDropdownProps, keyof RenderFilterDropdownProps> {
|
|
6
6
|
prefixCls?: string;
|
|
7
7
|
filteredValue?: any[];
|
|
8
8
|
filterIcon?: FilterIcon;
|
|
9
9
|
filterDropdown?: React.ReactElement;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}) => React.ReactElement;
|
|
13
|
-
filterDropdownProps?: DropdownProps;
|
|
14
|
-
onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
|
|
15
|
-
onSelect?: (data: OnSelectData) => void;
|
|
16
|
-
}
|
|
17
|
-
export default function ColumnFilter(props?: ColumnFilterProps): React.ReactElement;
|
|
18
|
-
export interface OnSelectData {
|
|
19
|
-
value: any;
|
|
20
|
-
filteredValue: any;
|
|
21
|
-
included: boolean;
|
|
22
|
-
domEvent: React.MouseEvent<HTMLElement>;
|
|
10
|
+
filterDropdownProps?: FilterDropdownProps;
|
|
11
|
+
filters?: Filter[];
|
|
23
12
|
}
|
|
24
|
-
export interface RenderDropdownProps {
|
|
13
|
+
export interface RenderDropdownProps extends FilterDropdownProps, RenderFilterDropdownProps {
|
|
25
14
|
filterMultiple?: boolean;
|
|
26
15
|
filters?: Filter[];
|
|
27
16
|
filteredValue?: any[];
|
|
28
17
|
filterDropdownVisible?: boolean;
|
|
29
18
|
onSelect?: (data: OnSelectData) => void;
|
|
30
19
|
onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
|
|
31
|
-
|
|
32
|
-
position?: Position;
|
|
20
|
+
renderFilterDropdown?: (props?: RenderFilterDropdownProps) => React.ReactNode;
|
|
33
21
|
renderFilterDropdownItem?: RenderFilterDropdownItem;
|
|
34
22
|
}
|
|
23
|
+
export interface FilterDropdownProps extends Omit<DropdownProps, 'render' | 'onVisibleChange'> {
|
|
24
|
+
}
|
|
25
|
+
export interface OnSelectData {
|
|
26
|
+
value?: any;
|
|
27
|
+
/** only this value is used now */
|
|
28
|
+
filteredValue: any;
|
|
29
|
+
included?: boolean;
|
|
30
|
+
domEvent?: React.MouseEvent<HTMLElement>;
|
|
31
|
+
}
|
|
32
|
+
export interface RenderFilterDropdownProps {
|
|
33
|
+
/** temporary filteredValue */
|
|
34
|
+
tempFilteredValue: any[];
|
|
35
|
+
/** set temporary filteredValue */
|
|
36
|
+
setTempFilteredValue: (tempFilteredValue: any[]) => void;
|
|
37
|
+
/** set tempFilteredValue to filteredValue. You can also pass filteredValue to directly set the filteredValue */
|
|
38
|
+
confirm: (props?: {
|
|
39
|
+
closeDropdown?: boolean;
|
|
40
|
+
filteredValue?: any[];
|
|
41
|
+
}) => void;
|
|
42
|
+
/** clear tempFilteredValue and filteredValue */
|
|
43
|
+
clear: (props?: {
|
|
44
|
+
closeDropdown?: boolean;
|
|
45
|
+
}) => void;
|
|
46
|
+
/** close dropdown */
|
|
47
|
+
close: () => void;
|
|
48
|
+
/** column filters */
|
|
49
|
+
filters?: RenderDropdownProps['filters'];
|
|
50
|
+
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import _pick from "lodash/pick";
|
|
1
2
|
import _noop from "lodash/noop";
|
|
2
|
-
import
|
|
3
|
+
import _isEqual from "lodash/isEqual";
|
|
4
|
+
import React, { isValidElement, useEffect, useState } from 'react';
|
|
3
5
|
import cls from 'classnames';
|
|
4
6
|
import { IconFilter } from '@douyinfe/semi-icons';
|
|
5
7
|
import { cssClasses } from '@douyinfe/semi-foundation/lib/es/table/constants';
|
|
6
8
|
import Dropdown from '../dropdown';
|
|
7
9
|
import { Radio } from '../radio';
|
|
8
10
|
import { Checkbox } from '../checkbox';
|
|
9
|
-
function renderDropdown() {
|
|
10
|
-
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
11
|
+
function renderDropdown(props) {
|
|
11
12
|
let nestedElem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
12
13
|
let level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
13
14
|
const {
|
|
@@ -19,77 +20,80 @@ function renderDropdown() {
|
|
|
19
20
|
onFilterDropdownVisibleChange = _noop,
|
|
20
21
|
trigger = 'click',
|
|
21
22
|
position = 'bottom',
|
|
23
|
+
renderFilterDropdown,
|
|
22
24
|
renderFilterDropdownItem
|
|
23
|
-
} = props;
|
|
25
|
+
} = props !== null && props !== void 0 ? props : {};
|
|
26
|
+
const renderFilterDropdownProps = _pick(props, ['tempFilteredValue', 'setTempFilteredValue', 'confirm', 'clear', 'close', 'filters']);
|
|
27
|
+
const render = typeof renderFilterDropdown === 'function' ? renderFilterDropdown(renderFilterDropdownProps) : /*#__PURE__*/React.createElement(Dropdown.Menu, null, Array.isArray(filters) && filters.map((filter, index) => {
|
|
28
|
+
const changeFn = e => {
|
|
29
|
+
const domEvent = e && e.nativeEvent;
|
|
30
|
+
if (domEvent) {
|
|
31
|
+
// Block this event to prevent the pop-up layer from closing
|
|
32
|
+
domEvent.stopImmediatePropagation();
|
|
33
|
+
// Prevent bubbling and default events to prevent label click events from triggering twice
|
|
34
|
+
domEvent.stopPropagation();
|
|
35
|
+
domEvent.preventDefault();
|
|
36
|
+
}
|
|
37
|
+
let values = [...filteredValue];
|
|
38
|
+
const included = values.includes(filter.value);
|
|
39
|
+
const idx = values.indexOf(filter.value);
|
|
40
|
+
if (idx > -1) {
|
|
41
|
+
values.splice(idx, 1);
|
|
42
|
+
} else if (filterMultiple) {
|
|
43
|
+
values.push(filter.value);
|
|
44
|
+
} else {
|
|
45
|
+
values = [filter.value];
|
|
46
|
+
}
|
|
47
|
+
return onSelect({
|
|
48
|
+
value: filter.value,
|
|
49
|
+
filteredValue: values,
|
|
50
|
+
included: !included,
|
|
51
|
+
domEvent
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const checked = filteredValue.includes(filter.value);
|
|
55
|
+
const {
|
|
56
|
+
text
|
|
57
|
+
} = filter;
|
|
58
|
+
const {
|
|
59
|
+
value
|
|
60
|
+
} = filter;
|
|
61
|
+
const key = `${level}_${index}`;
|
|
62
|
+
const dropdownItem = typeof renderFilterDropdownItem === 'function' ? renderFilterDropdownItem({
|
|
63
|
+
onChange: changeFn,
|
|
64
|
+
filterMultiple,
|
|
65
|
+
value,
|
|
66
|
+
text,
|
|
67
|
+
checked,
|
|
68
|
+
filteredValue,
|
|
69
|
+
level
|
|
70
|
+
}) : null;
|
|
71
|
+
let item = dropdownItem && /*#__PURE__*/React.isValidElement(dropdownItem) ? /*#__PURE__*/React.cloneElement(dropdownItem, {
|
|
72
|
+
key
|
|
73
|
+
}) : /*#__PURE__*/React.createElement(Dropdown.Item, {
|
|
74
|
+
key: key,
|
|
75
|
+
onClick: changeFn
|
|
76
|
+
}, filterMultiple ? /*#__PURE__*/React.createElement(Checkbox, {
|
|
77
|
+
checked: checked
|
|
78
|
+
}, text) : /*#__PURE__*/React.createElement(Radio, {
|
|
79
|
+
checked: checked
|
|
80
|
+
}, text));
|
|
81
|
+
if (Array.isArray(filter.children) && filter.children.length) {
|
|
82
|
+
const childrenDropdownProps = Object.assign(Object.assign({}, props), {
|
|
83
|
+
filters: filter.children,
|
|
84
|
+
trigger: 'hover',
|
|
85
|
+
position: 'right'
|
|
86
|
+
});
|
|
87
|
+
delete childrenDropdownProps.filterDropdownVisible;
|
|
88
|
+
item = renderDropdown(childrenDropdownProps, item, level + 1);
|
|
89
|
+
}
|
|
90
|
+
return item;
|
|
91
|
+
}));
|
|
24
92
|
const dropdownProps = Object.assign(Object.assign({}, props), {
|
|
25
93
|
onVisibleChange: visible => onFilterDropdownVisibleChange(visible),
|
|
26
94
|
trigger,
|
|
27
95
|
position,
|
|
28
|
-
render
|
|
29
|
-
const changeFn = e => {
|
|
30
|
-
const domEvent = e && e.nativeEvent;
|
|
31
|
-
if (domEvent) {
|
|
32
|
-
// Block this event to prevent the pop-up layer from closing
|
|
33
|
-
domEvent.stopImmediatePropagation();
|
|
34
|
-
// Prevent bubbling and default events to prevent label click events from triggering twice
|
|
35
|
-
domEvent.stopPropagation();
|
|
36
|
-
domEvent.preventDefault();
|
|
37
|
-
}
|
|
38
|
-
let values = [...filteredValue];
|
|
39
|
-
const included = values.includes(filter.value);
|
|
40
|
-
const idx = values.indexOf(filter.value);
|
|
41
|
-
if (idx > -1) {
|
|
42
|
-
values.splice(idx, 1);
|
|
43
|
-
} else if (filterMultiple) {
|
|
44
|
-
values.push(filter.value);
|
|
45
|
-
} else {
|
|
46
|
-
values = [filter.value];
|
|
47
|
-
}
|
|
48
|
-
return onSelect({
|
|
49
|
-
value: filter.value,
|
|
50
|
-
filteredValue: values,
|
|
51
|
-
included: !included,
|
|
52
|
-
domEvent
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
const checked = filteredValue.includes(filter.value);
|
|
56
|
-
const {
|
|
57
|
-
text
|
|
58
|
-
} = filter;
|
|
59
|
-
const {
|
|
60
|
-
value
|
|
61
|
-
} = filter;
|
|
62
|
-
const key = `${level}_${index}`;
|
|
63
|
-
const dropdownItem = typeof renderFilterDropdownItem === 'function' ? renderFilterDropdownItem({
|
|
64
|
-
onChange: changeFn,
|
|
65
|
-
filterMultiple,
|
|
66
|
-
value,
|
|
67
|
-
text,
|
|
68
|
-
checked,
|
|
69
|
-
filteredValue,
|
|
70
|
-
level
|
|
71
|
-
}) : null;
|
|
72
|
-
let item = dropdownItem && /*#__PURE__*/React.isValidElement(dropdownItem) ? /*#__PURE__*/React.cloneElement(dropdownItem, {
|
|
73
|
-
key
|
|
74
|
-
}) : /*#__PURE__*/React.createElement(Dropdown.Item, {
|
|
75
|
-
key: key,
|
|
76
|
-
onClick: changeFn
|
|
77
|
-
}, filterMultiple ? /*#__PURE__*/React.createElement(Checkbox, {
|
|
78
|
-
checked: checked
|
|
79
|
-
}, text) : /*#__PURE__*/React.createElement(Radio, {
|
|
80
|
-
checked: checked
|
|
81
|
-
}, text));
|
|
82
|
-
if (Array.isArray(filter.children) && filter.children.length) {
|
|
83
|
-
const childrenDropdownProps = Object.assign(Object.assign({}, props), {
|
|
84
|
-
filters: filter.children,
|
|
85
|
-
trigger: 'hover',
|
|
86
|
-
position: 'right'
|
|
87
|
-
});
|
|
88
|
-
delete childrenDropdownProps.filterDropdownVisible;
|
|
89
|
-
item = renderDropdown(childrenDropdownProps, item, level + 1);
|
|
90
|
-
}
|
|
91
|
-
return item;
|
|
92
|
-
}))
|
|
96
|
+
render
|
|
93
97
|
});
|
|
94
98
|
if (filterDropdownVisible != null) {
|
|
95
99
|
dropdownProps.visible = filterDropdownVisible;
|
|
@@ -105,12 +109,68 @@ export default function ColumnFilter() {
|
|
|
105
109
|
prefixCls = cssClasses.PREFIX,
|
|
106
110
|
filteredValue,
|
|
107
111
|
filterIcon = 'filter',
|
|
112
|
+
filterDropdownProps,
|
|
113
|
+
onSelect,
|
|
114
|
+
filterDropdownVisible,
|
|
108
115
|
renderFilterDropdown,
|
|
109
|
-
|
|
116
|
+
onFilterDropdownVisibleChange
|
|
110
117
|
} = props;
|
|
111
118
|
let {
|
|
112
119
|
filterDropdown = null
|
|
113
120
|
} = props;
|
|
121
|
+
// custom filter related status
|
|
122
|
+
const isFilterDropdownVisibleControlled = typeof filterDropdownVisible !== 'undefined';
|
|
123
|
+
const isCustomFilterDropdown = typeof renderFilterDropdown === 'function';
|
|
124
|
+
const isCustomDropdownVisible = !isFilterDropdownVisibleControlled && isCustomFilterDropdown;
|
|
125
|
+
const [tempFilteredValue, setTempFilteredValue] = useState(filteredValue);
|
|
126
|
+
const dropdownVisibleInitValue = isCustomDropdownVisible ? false : filterDropdownVisible;
|
|
127
|
+
const [dropdownVisible, setDropdownVisible] = useState(dropdownVisibleInitValue);
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
if (typeof filterDropdownVisible !== 'undefined') {
|
|
130
|
+
setDropdownVisible(filterDropdownVisible);
|
|
131
|
+
}
|
|
132
|
+
}, [filterDropdownVisible]);
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
setTempFilteredValue(filteredValue);
|
|
135
|
+
}, [filteredValue]);
|
|
136
|
+
const confirm = function () {
|
|
137
|
+
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
138
|
+
const newFilteredValue = (props === null || props === void 0 ? void 0 : props.filteredValue) || tempFilteredValue;
|
|
139
|
+
if (!_isEqual(newFilteredValue, filteredValue)) {
|
|
140
|
+
onSelect({
|
|
141
|
+
filteredValue: newFilteredValue
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (props.closeDropdown) {
|
|
145
|
+
setDropdownVisible(false);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const clear = function () {
|
|
149
|
+
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
150
|
+
setTempFilteredValue([]);
|
|
151
|
+
onSelect({
|
|
152
|
+
filteredValue: []
|
|
153
|
+
});
|
|
154
|
+
if (props.closeDropdown) {
|
|
155
|
+
setDropdownVisible(false);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const close = () => {
|
|
159
|
+
setDropdownVisible(false);
|
|
160
|
+
};
|
|
161
|
+
const handleFilterDropdownVisibleChange = visible => {
|
|
162
|
+
if (isCustomDropdownVisible) {
|
|
163
|
+
setDropdownVisible(visible);
|
|
164
|
+
}
|
|
165
|
+
onFilterDropdownVisibleChange(visible);
|
|
166
|
+
};
|
|
167
|
+
const renderFilterDropdownProps = {
|
|
168
|
+
tempFilteredValue,
|
|
169
|
+
setTempFilteredValue,
|
|
170
|
+
confirm,
|
|
171
|
+
clear,
|
|
172
|
+
close
|
|
173
|
+
};
|
|
114
174
|
const finalCls = cls(`${prefixCls}-column-filter`, {
|
|
115
175
|
on: Array.isArray(filteredValue) && filteredValue.length
|
|
116
176
|
});
|
|
@@ -130,9 +190,10 @@ export default function ColumnFilter() {
|
|
|
130
190
|
size: "default"
|
|
131
191
|
}));
|
|
132
192
|
}
|
|
133
|
-
const renderProps = Object.assign(Object.assign({}, props), filterDropdownProps)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
})
|
|
193
|
+
const renderProps = Object.assign(Object.assign(Object.assign(Object.assign({}, props), filterDropdownProps), renderFilterDropdownProps), {
|
|
194
|
+
filterDropdownVisible: isFilterDropdownVisibleControlled ? filterDropdownVisible : dropdownVisible,
|
|
195
|
+
onFilterDropdownVisibleChange: handleFilterDropdownVisibleChange
|
|
196
|
+
});
|
|
197
|
+
filterDropdown = /*#__PURE__*/React.isValidElement(filterDropdown) ? filterDropdown : renderDropdown(renderProps, iconElem);
|
|
137
198
|
return filterDropdown;
|
|
138
199
|
}
|
|
@@ -57,7 +57,7 @@ const ResizableTable = function () {
|
|
|
57
57
|
width: numbers.DEFAULT_WIDTH_COLUMN_EXPAND
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
if (props.rowSelection && !
|
|
60
|
+
if (props.rowSelection && !_find(rawColumns, item => item.key === strings.DEFAULT_KEY_COLUMN_SELECTION)) {
|
|
61
61
|
newColumns.unshift({
|
|
62
62
|
width: _get(props, 'rowSelection.width', numbers.DEFAULT_WIDTH_COLUMN_SELECTION),
|
|
63
63
|
key: strings.DEFAULT_KEY_COLUMN_SELECTION
|
package/lib/es/table/Table.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import Store from '@douyinfe/semi-foundation/lib/es/utils/Store';
|
|
4
|
-
import TableFoundation, { TableAdapter, BaseRowKeyType, BaseHeadWidth } from '@douyinfe/semi-foundation/lib/es/table/foundation';
|
|
4
|
+
import TableFoundation, { TableAdapter, BasePageData, BaseRowKeyType, BaseHeadWidth } from '@douyinfe/semi-foundation/lib/es/table/foundation';
|
|
5
5
|
import { TableSelectionCellEvent } from '@douyinfe/semi-foundation/lib/es/table/tableSelectionCellFoundation';
|
|
6
6
|
import { strings } from '@douyinfe/semi-foundation/lib/es/table/constants';
|
|
7
7
|
import '@douyinfe/semi-foundation/lib/es/table/table.css';
|
|
@@ -185,7 +185,7 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
|
|
|
185
185
|
_invokeRowSelection: (funcName: string, ...args: any[]) => void;
|
|
186
186
|
_invokeColumnFn: (key: string, funcName: string, ...args: any[]) => void;
|
|
187
187
|
_cacheHeaderRef: (node: HTMLDivElement) => void;
|
|
188
|
-
getCurrentPageData: () =>
|
|
188
|
+
getCurrentPageData: () => Pick<BasePageData<RecordType>, "dataSource" | "groups">;
|
|
189
189
|
getColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
|
|
190
190
|
getCellWidths: (...args: any[]) => number[];
|
|
191
191
|
setHeadWidths: (...args: any[]) => void;
|
|
@@ -200,8 +200,8 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
|
|
|
200
200
|
setScrollPosition: (position: BodyScrollPosition) => void;
|
|
201
201
|
setScrollPositionClassName: () => void;
|
|
202
202
|
syncTableWidth: () => void;
|
|
203
|
-
renderSelection: (record?: any, inHeader?: boolean) => React.ReactNode;
|
|
204
|
-
renderRowSelectionCallback: (text: string, record
|
|
203
|
+
renderSelection: (record?: any, inHeader?: boolean, index?: number) => React.ReactNode;
|
|
204
|
+
renderRowSelectionCallback: (text: string, record: RecordType, index: number) => React.ReactNode;
|
|
205
205
|
renderTitleSelectionCallback: () => React.ReactNode;
|
|
206
206
|
normalizeSelectionColumn: (props?: {
|
|
207
207
|
rowSelection?: TableStateRowSelection<RecordType>;
|
|
@@ -283,7 +283,7 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
|
|
|
283
283
|
* @param {ReactNode} children
|
|
284
284
|
* @returns {Array}
|
|
285
285
|
*/
|
|
286
|
-
normalizeColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) =>
|
|
286
|
+
normalizeColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
|
|
287
287
|
/**
|
|
288
288
|
* Combine pagination and table paging processing functions
|
|
289
289
|
*/
|