@douyinfe/semi-ui 2.10.1 → 2.11.0-beta.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 (55) hide show
  1. package/checkbox/checkbox.tsx +17 -9
  2. package/checkbox/checkboxInner.tsx +19 -14
  3. package/datePicker/_story/datePicker.stories.js +48 -1
  4. package/datePicker/_story/v2/AutoFillTime.jsx +37 -0
  5. package/datePicker/_story/v2/InputFormat.jsx +29 -0
  6. package/datePicker/_story/v2/InputFormatConfirm.jsx +44 -0
  7. package/datePicker/_story/v2/InputFormatDisabled.jsx +27 -0
  8. package/datePicker/_story/v2/index.js +4 -0
  9. package/datePicker/dateInput.tsx +7 -0
  10. package/datePicker/datePicker.tsx +7 -11
  11. package/datePicker/monthsGrid.tsx +2 -1
  12. package/dist/umd/semi-ui.js +570 -216
  13. package/dist/umd/semi-ui.js.map +1 -1
  14. package/dist/umd/semi-ui.min.js +1 -1
  15. package/dist/umd/semi-ui.min.js.map +1 -1
  16. package/form/baseForm.tsx +0 -1
  17. package/lib/cjs/checkbox/checkbox.d.ts +4 -0
  18. package/lib/cjs/checkbox/checkbox.js +24 -13
  19. package/lib/cjs/checkbox/checkboxInner.js +21 -17
  20. package/lib/cjs/datePicker/dateInput.d.ts +1 -0
  21. package/lib/cjs/datePicker/dateInput.js +5 -3
  22. package/lib/cjs/datePicker/datePicker.js +9 -12
  23. package/lib/cjs/datePicker/monthsGrid.js +2 -1
  24. package/lib/cjs/form/baseForm.js +0 -1
  25. package/lib/cjs/radio/radio.d.ts +4 -0
  26. package/lib/cjs/radio/radio.js +26 -12
  27. package/lib/cjs/table/Body/BaseRow.d.ts +1 -0
  28. package/lib/cjs/table/Body/BaseRow.js +22 -0
  29. package/lib/cjs/tag/group.d.ts +3 -3
  30. package/lib/cjs/tooltip/index.d.ts +1 -0
  31. package/lib/cjs/tooltip/index.js +6 -1
  32. package/lib/es/checkbox/checkbox.d.ts +4 -0
  33. package/lib/es/checkbox/checkbox.js +24 -13
  34. package/lib/es/checkbox/checkboxInner.js +20 -17
  35. package/lib/es/datePicker/dateInput.d.ts +1 -0
  36. package/lib/es/datePicker/dateInput.js +5 -3
  37. package/lib/es/datePicker/datePicker.js +9 -12
  38. package/lib/es/datePicker/monthsGrid.js +2 -1
  39. package/lib/es/form/baseForm.js +0 -1
  40. package/lib/es/radio/radio.d.ts +4 -0
  41. package/lib/es/radio/radio.js +26 -12
  42. package/lib/es/table/Body/BaseRow.d.ts +1 -0
  43. package/lib/es/table/Body/BaseRow.js +22 -0
  44. package/lib/es/tag/group.d.ts +3 -3
  45. package/lib/es/tooltip/index.d.ts +1 -0
  46. package/lib/es/tooltip/index.js +6 -1
  47. package/package.json +9 -9
  48. package/radio/radio.tsx +17 -7
  49. package/scrollList/_story/ScrollList/index.js +1 -1
  50. package/select/index.tsx +7 -7
  51. package/table/Body/BaseRow.tsx +15 -0
  52. package/tag/group.tsx +4 -4
  53. package/tooltip/index.tsx +5 -1
  54. package/treeSelect/index.tsx +1 -1
  55. package/upload/_story/upload.stories.js +1 -0
@@ -151,7 +151,8 @@ export default class DatePicker extends BaseComponent {
151
151
  insetInput,
152
152
  type,
153
153
  format,
154
- rangeSeparator
154
+ rangeSeparator,
155
+ defaultPickerValue
155
156
  } = this.props;
156
157
  const {
157
158
  insetInputValue,
@@ -173,7 +174,8 @@ export default class DatePicker extends BaseComponent {
173
174
  onInsetInputChange: this.handleInsetInputChange,
174
175
  rangeInputStartRef: this.rangeInputStartRef,
175
176
  rangeInputEndRef: this.rangeInputEndRef,
176
- density
177
+ density,
178
+ defaultPickerValue
177
179
  };
178
180
  return /*#__PURE__*/React.createElement("div", {
179
181
  ref: this.panelRef,
@@ -544,18 +546,11 @@ export default class DatePicker extends BaseComponent {
544
546
  insetInput
545
547
  } = this.props;
546
548
  const {
547
- value,
548
549
  cachedSelectedValue,
549
550
  motionEnd,
550
551
  rangeInputFocus
551
- } = this.state; // const cachedSelectedValue = this.adapter.getCache('cachedSelectedValue');
552
-
553
- let defaultValue = value;
554
-
555
- if (this.adapter.needConfirm()) {
556
- defaultValue = cachedSelectedValue;
557
- }
558
-
552
+ } = this.state;
553
+ const defaultValue = cachedSelectedValue;
559
554
  return /*#__PURE__*/React.createElement(MonthsGrid, {
560
555
  ref: this.monthGrid,
561
556
  locale: locale,
@@ -627,7 +622,8 @@ export default class DatePicker extends BaseComponent {
627
622
  size,
628
623
  inputReadOnly,
629
624
  rangeSeparator,
630
- insetInput
625
+ insetInput,
626
+ defaultPickerValue
631
627
  } = this.props;
632
628
  const {
633
629
  value,
@@ -653,6 +649,7 @@ export default class DatePicker extends BaseComponent {
653
649
  disabled: inputDisabled,
654
650
  inputValue,
655
651
  value: value,
652
+ defaultPickerValue,
656
653
  onChange: this.handleInputChange,
657
654
  onEnterPress: this.handleInputComplete,
658
655
  // TODO: remove in next major version
@@ -230,7 +230,8 @@ export default class MonthsGrid extends BaseComponent {
230
230
  } = this.props;
231
231
 
232
232
  if (prevProps.defaultValue !== defaultValue) {
233
- this.foundation.updateSelectedFromProps(defaultValue, false);
233
+ // we should always update panel state when value changes
234
+ this.foundation.updateSelectedFromProps(defaultValue);
234
235
  }
235
236
 
236
237
  if (prevProps.defaultPickerValue !== defaultPickerValue) {
@@ -68,7 +68,6 @@ class Form extends BaseComponent {
68
68
 
69
69
  componentWillUnmount() {
70
70
  this.foundation.destroy();
71
- this.foundation = null;
72
71
  this.formApi = null;
73
72
  }
74
73
 
@@ -29,9 +29,13 @@ export declare type RadioProps = {
29
29
  addonClassName?: string;
30
30
  type?: RadioType;
31
31
  'aria-label'?: React.AriaAttributes['aria-label'];
32
+ addonId?: string;
33
+ extraId?: string;
32
34
  };
33
35
  export interface RadioState {
34
36
  hover?: boolean;
37
+ addonId?: string;
38
+ extraId?: string;
35
39
  }
36
40
  export { RadioChangeEvent };
37
41
  declare class Radio extends BaseComponent<RadioProps, RadioState> {
@@ -44,16 +44,12 @@ class Radio extends BaseComponent {
44
44
  };
45
45
 
46
46
  this.state = {
47
- hover: false
47
+ hover: false,
48
+ addonId: props.addonId,
49
+ extraId: props.extraId
48
50
  };
49
51
  this.foundation = new RadioFoundation(this.adapter);
50
52
  this.radioEntity = null;
51
- this.addonId = getUuidShort({
52
- prefix: 'addon'
53
- });
54
- this.extraId = getUuidShort({
55
- prefix: 'extra'
56
- });
57
53
  }
58
54
 
59
55
  get adapter() {
@@ -62,6 +58,20 @@ class Radio extends BaseComponent {
62
58
  this.setState({
63
59
  hover
64
60
  });
61
+ },
62
+ setAddonId: () => {
63
+ this.setState({
64
+ addonId: getUuidShort({
65
+ prefix: 'addon'
66
+ })
67
+ });
68
+ },
69
+ setExtraId: () => {
70
+ this.setState({
71
+ extraId: getUuidShort({
72
+ prefix: 'extra'
73
+ })
74
+ });
65
75
  }
66
76
  });
67
77
  }
@@ -98,7 +108,11 @@ class Radio extends BaseComponent {
98
108
  value: propValue
99
109
  } = this.props;
100
110
  let realChecked, isDisabled, realMode, isButtonRadioGroup, isCardRadioGroup, isPureCardRadioGroup, isButtonRadioComponent, buttonSize, realPrefixCls;
101
- const isHover = this.state.hover;
111
+ const {
112
+ hover: isHover,
113
+ addonId,
114
+ extraId
115
+ } = this.state;
102
116
  let props = {};
103
117
 
104
118
  if (this.isInGroup()) {
@@ -151,10 +165,10 @@ class Radio extends BaseComponent {
151
165
  const renderContent = () => /*#__PURE__*/React.createElement(React.Fragment, null, children ? /*#__PURE__*/React.createElement("span", {
152
166
  className: addonCls,
153
167
  style: addonStyle,
154
- id: this.addonId
168
+ id: addonId
155
169
  }, children) : null, extra && !isButtonRadio ? /*#__PURE__*/React.createElement("div", {
156
170
  className: "".concat(prefix, "-extra"),
157
- id: this.extraId
171
+ id: extraId
158
172
  }, extra) : null);
159
173
 
160
174
  return /*#__PURE__*/React.createElement("label", {
@@ -171,8 +185,8 @@ class Radio extends BaseComponent {
171
185
  ref: ref => {
172
186
  this.radioEntity = ref;
173
187
  },
174
- addonId: children && this.addonId,
175
- extraId: extra && this.extraId
188
+ addonId: children && addonId,
189
+ extraId: extra && extraId
176
190
  })), isCardRadioGroup ? /*#__PURE__*/React.createElement("div", {
177
191
  className: "".concat(prefix, "-isCardRadioGroup_content")
178
192
  }, renderContent()) : renderContent());
@@ -113,6 +113,7 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
113
113
  get adapter(): TableRowAdapter<BaseRowProps>;
114
114
  ref: React.MutableRefObject<any>;
115
115
  constructor(props: BaseRowProps);
116
+ componentDidMount(): void;
116
117
  shouldComponentUpdate(nextProps: BaseRowProps): boolean;
117
118
  _cacheNode: (node: any) => void;
118
119
  renderExpandIcon: (record: Record<string, any>) => React.ReactNode;
@@ -103,6 +103,28 @@ export default class TableRow extends BaseComponent {
103
103
  });
104
104
  }
105
105
 
106
+ componentDidMount() {
107
+ // fix #745
108
+ // didmount/willUnmount may be called twice when React.StrictMode is true in React 18, we need to ensure that this.cache.customRowProps is correct
109
+ const {
110
+ onRow,
111
+ index,
112
+ record
113
+ } = this.props;
114
+ const customRowProps = this.adapter.getCache('customRowProps');
115
+
116
+ if (typeof customRowProps === 'undefined') {
117
+ const _a = onRow(record, index) || {},
118
+ {
119
+ className: customClassName,
120
+ style: customStyle
121
+ } = _a,
122
+ rowProps = __rest(_a, ["className", "style"]);
123
+
124
+ this.adapter.setCache('customRowProps', _Object$assign({}, rowProps));
125
+ }
126
+ }
127
+
106
128
  shouldComponentUpdate(nextProps) {
107
129
  /**
108
130
  * Shallow comparison of incoming props to simulate PureComponent
@@ -3,19 +3,19 @@ import PropTypes from 'prop-types';
3
3
  import Tag from './index';
4
4
  import { PopoverProps } from '../popover/index';
5
5
  import { AvatarShape, TagProps } from './interface';
6
- export interface TagGroupProps {
6
+ export interface TagGroupProps<T> {
7
7
  style?: React.CSSProperties;
8
8
  className?: string;
9
9
  maxTagCount?: number;
10
10
  restCount?: number;
11
- tagList?: (TagProps | React.ReactNode)[];
11
+ tagList?: (T extends 'custom' ? React.ReactNode : TagProps)[];
12
12
  size?: 'small' | 'large';
13
13
  showPopover?: boolean;
14
14
  popoverProps?: PopoverProps;
15
15
  avatarShape?: AvatarShape;
16
16
  mode?: string;
17
17
  }
18
- export default class TagGroup extends PureComponent<TagGroupProps> {
18
+ export default class TagGroup<T> extends PureComponent<TagGroupProps<T>> {
19
19
  static defaultProps: {
20
20
  style: {};
21
21
  className: string;
@@ -53,6 +53,7 @@ export interface TooltipProps extends BaseProps {
53
53
  guardFocus?: boolean;
54
54
  returnFocusOnClose?: boolean;
55
55
  onEscKeyDown?: (e: React.KeyboardEvent) => void;
56
+ wrapperId?: string;
56
57
  }
57
58
  interface TooltipState {
58
59
  visible: boolean;
@@ -293,7 +293,7 @@ export default class Tooltip extends BaseComponent {
293
293
  placement: props.position || 'top',
294
294
  transitionStyle: {},
295
295
  isPositionUpdated: false,
296
- id: getUuidShort() // auto generate id, will be used by children.aria-describedby & content.id, improve a11y
296
+ id: props.wrapperId // auto generate id, will be used by children.aria-describedby & content.id, improve a11y
297
297
 
298
298
  };
299
299
  this.foundation = new TooltipFoundation(this.adapter);
@@ -562,6 +562,11 @@ export default class Tooltip extends BaseComponent {
562
562
  },
563
563
  notifyEscKeydown: event => {
564
564
  this.props.onEscKeyDown(event);
565
+ },
566
+ setId: () => {
567
+ this.setState({
568
+ id: getUuidShort()
569
+ });
565
570
  }
566
571
  });
567
572
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-ui",
3
- "version": "2.10.1",
3
+ "version": "2.11.0-beta.0",
4
4
  "description": "",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/es/index.js",
@@ -14,12 +14,12 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@babel/runtime-corejs3": "^7.15.4",
17
- "@douyinfe/semi-animation": "2.10.1",
18
- "@douyinfe/semi-animation-react": "2.10.1",
19
- "@douyinfe/semi-foundation": "2.10.1",
20
- "@douyinfe/semi-icons": "2.10.1",
21
- "@douyinfe/semi-illustrations": "2.10.1",
22
- "@douyinfe/semi-theme-default": "2.10.1",
17
+ "@douyinfe/semi-animation": "2.11.0-beta.0",
18
+ "@douyinfe/semi-animation-react": "2.11.0-beta.0",
19
+ "@douyinfe/semi-foundation": "2.11.0-beta.0",
20
+ "@douyinfe/semi-icons": "2.11.0-beta.0",
21
+ "@douyinfe/semi-illustrations": "2.11.0-beta.0",
22
+ "@douyinfe/semi-theme-default": "2.11.0-beta.0",
23
23
  "@types/react-window": "^1.8.2",
24
24
  "async-validator": "^3.5.0",
25
25
  "classnames": "^2.2.6",
@@ -69,13 +69,13 @@
69
69
  ],
70
70
  "author": "",
71
71
  "license": "MIT",
72
- "gitHead": "1c84b585ff43db35b286e8c24f8333e4170d015c",
72
+ "gitHead": "252c53310656cdc47124d257b878c131d8a74ef2",
73
73
  "devDependencies": {
74
74
  "@babel/plugin-proposal-decorators": "^7.15.8",
75
75
  "@babel/plugin-transform-runtime": "^7.15.8",
76
76
  "@babel/preset-env": "^7.15.8",
77
77
  "@babel/preset-react": "^7.14.5",
78
- "@douyinfe/semi-scss-compile": "2.10.1",
78
+ "@douyinfe/semi-scss-compile": "2.11.0-beta.0",
79
79
  "@storybook/addon-knobs": "^6.3.1",
80
80
  "@types/lodash": "^4.14.176",
81
81
  "babel-loader": "^8.2.2",
package/radio/radio.tsx CHANGED
@@ -41,10 +41,14 @@ export type RadioProps = {
41
41
  addonClassName?: string;
42
42
  type?: RadioType;
43
43
  'aria-label'?: React.AriaAttributes['aria-label'];
44
+ addonId?: string;
45
+ extraId?: string;
44
46
  };
45
47
 
46
48
  export interface RadioState {
47
49
  hover?: boolean;
50
+ addonId?: string;
51
+ extraId?: string;
48
52
  }
49
53
 
50
54
  export { RadioChangeEvent };
@@ -94,11 +98,11 @@ class Radio extends BaseComponent<RadioProps, RadioState> {
94
98
  super(props);
95
99
  this.state = {
96
100
  hover: false,
101
+ addonId: props.addonId,
102
+ extraId: props.extraId,
97
103
  };
98
104
  this.foundation = new RadioFoundation(this.adapter);
99
105
  this.radioEntity = null;
100
- this.addonId = getUuidShort({ prefix: 'addon' });
101
- this.extraId = getUuidShort({ prefix: 'extra' });
102
106
  }
103
107
 
104
108
  get adapter(): RadioAdapter {
@@ -106,6 +110,12 @@ class Radio extends BaseComponent<RadioProps, RadioState> {
106
110
  ...super.adapter,
107
111
  setHover: (hover: boolean) => {
108
112
  this.setState({ hover });
113
+ },
114
+ setAddonId: () => {
115
+ this.setState({ addonId: getUuidShort({ prefix: 'addon' }) });
116
+ },
117
+ setExtraId: () => {
118
+ this.setState({ extraId: getUuidShort({ prefix: 'extra' }) });
109
119
  }
110
120
  };
111
121
  }
@@ -168,7 +178,7 @@ class Radio extends BaseComponent<RadioProps, RadioState> {
168
178
  isButtonRadioComponent,
169
179
  buttonSize,
170
180
  realPrefixCls;
171
- const isHover = this.state.hover;
181
+ const { hover: isHover, addonId, extraId } = this.state;
172
182
  let props = {};
173
183
 
174
184
  if (this.isInGroup()) {
@@ -218,8 +228,8 @@ class Radio extends BaseComponent<RadioProps, RadioState> {
218
228
  }, addonClassName);
219
229
  const renderContent = () => (
220
230
  <>
221
- {children ? <span className={addonCls} style={addonStyle} id={this.addonId}>{children}</span> : null}
222
- {extra && !isButtonRadio ? <div className={`${prefix}-extra`} id={this.extraId}>{extra}</div> : null}
231
+ {children ? <span className={addonCls} style={addonStyle} id={addonId}>{children}</span> : null}
232
+ {extra && !isButtonRadio ? <div className={`${prefix}-extra`} id={extraId}>{extra}</div> : null}
223
233
  </>
224
234
  );
225
235
  return (
@@ -240,8 +250,8 @@ class Radio extends BaseComponent<RadioProps, RadioState> {
240
250
  ref={(ref: RadioInner) => {
241
251
  this.radioEntity = ref;
242
252
  }}
243
- addonId={children && this.addonId}
244
- extraId={extra && this.extraId}
253
+ addonId={children && addonId}
254
+ extraId={extra && extraId}
245
255
  />
246
256
  {
247
257
  isCardRadioGroup ?
@@ -11,7 +11,7 @@ class ScrollListDemo extends React.Component {
11
11
  };
12
12
 
13
13
  this.list = new Array(20).fill(0).map((itm, index) => {
14
- return { value: index, disabled: Math.random() + 0.2 > 1 };
14
+ return { value: index };
15
15
  });
16
16
  }
17
17
 
package/select/index.tsx CHANGED
@@ -446,11 +446,11 @@ class Select extends BaseComponent<SelectProps, SelectState> {
446
446
  let options = [];
447
447
  const { optionList } = this.props;
448
448
  if (optionList && optionList.length) {
449
- options = optionList.map((itemOpt, index) => ({
450
- _show: true,
451
- _selected: false,
449
+ options = optionList.map((itemOpt, index) => ({
450
+ _show: true,
451
+ _selected: false,
452
452
  _scrollIndex: index,
453
- ...itemOpt
453
+ ...itemOpt
454
454
  }));
455
455
  optionGroups[0] = { children: options, label: '' };
456
456
  } else {
@@ -771,7 +771,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
771
771
  const groupContent = <OptionGroup {...parentGroup} key={parentGroup.label} />;
772
772
  groupStatus.set(parentGroup.label, true);
773
773
  content.push(groupContent);
774
- }
774
+ }
775
775
  content.push(optionContent);
776
776
  });
777
777
 
@@ -899,7 +899,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
899
899
  content: optionNode.label,
900
900
  });
901
901
  }
902
-
902
+
903
903
  const mapItems = maxTagCount ? selectedItems.slice(0, maxTagCount) : selectedItems; // no need to render rest tag when maxTagCount is setting
904
904
 
905
905
  const tags = mapItems.map((item, i) => {
@@ -946,7 +946,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
946
946
 
947
947
  const NotOneLine = !maxTagCount; // Multiple lines (that is, do not set maxTagCount), do not use TagGroup, directly traverse with Tag, otherwise Input cannot follow the correct position
948
948
 
949
- const tagContent = NotOneLine ? tags : <TagGroup tagList={tags} maxTagCount={n} restCount={maxTagCount ? selectedItems.length - maxTagCount : undefined} size="large" mode="custom" />;
949
+ const tagContent = NotOneLine ? tags : <TagGroup<"custom"> tagList={tags} maxTagCount={n} restCount={maxTagCount ? selectedItems.length - maxTagCount : undefined} size="large" mode="custom" />;
950
950
 
951
951
  return (
952
952
  <>
@@ -153,6 +153,21 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
153
153
  this.foundation = new TableRowFoundation(this.adapter);
154
154
  }
155
155
 
156
+ componentDidMount() {
157
+ // fix #745
158
+ // didmount/willUnmount may be called twice when React.StrictMode is true in React 18, we need to ensure that this.cache.customRowProps is correct
159
+ const {
160
+ onRow,
161
+ index,
162
+ record,
163
+ } = this.props;
164
+ const customRowProps = this.adapter.getCache('customRowProps');
165
+ if (typeof customRowProps === 'undefined') {
166
+ const { className: customClassName, style: customStyle, ...rowProps } = onRow(record, index) || {};
167
+ this.adapter.setCache('customRowProps', { ...rowProps });
168
+ }
169
+ }
170
+
156
171
  shouldComponentUpdate(nextProps: BaseRowProps) {
157
172
  /**
158
173
  * Shallow comparison of incoming props to simulate PureComponent
package/tag/group.tsx CHANGED
@@ -10,12 +10,12 @@ const prefixCls = cssClasses.PREFIX;
10
10
  const tagSize = strings.TAG_SIZE;
11
11
  const avatarShapeSet = strings.AVATAR_SHAPE;
12
12
 
13
- export interface TagGroupProps {
13
+ export interface TagGroupProps<T> {
14
14
  style?: React.CSSProperties;
15
15
  className?: string;
16
16
  maxTagCount?: number;
17
17
  restCount?: number;
18
- tagList?: (TagProps | React.ReactNode)[];
18
+ tagList?: (T extends 'custom' ? React.ReactNode : TagProps)[];
19
19
  size?: 'small' | 'large';
20
20
  showPopover?: boolean;
21
21
  popoverProps?: PopoverProps;
@@ -23,7 +23,7 @@ export interface TagGroupProps {
23
23
  mode?: string;
24
24
  }
25
25
 
26
- export default class TagGroup extends PureComponent<TagGroupProps> {
26
+ export default class TagGroup<T> extends PureComponent<TagGroupProps<T>> {
27
27
  static defaultProps = {
28
28
  style: {},
29
29
  className: '',
@@ -84,7 +84,7 @@ export default class TagGroup extends PureComponent<TagGroupProps> {
84
84
  let renderTags: (Tag | React.ReactNode)[] = tags;
85
85
 
86
86
  const normalTags: (Tag | React.ReactNode)[] = tags.slice(0, maxTagCount);
87
- const restTags = tags.slice(maxTagCount) as React.ReactNode;
87
+ const restTags = tags.slice(maxTagCount) as React.ReactNode;
88
88
  let nTag = null;
89
89
  if (n > 0) {
90
90
  nTag = this.renderNTag(n, restTags);
package/tooltip/index.tsx CHANGED
@@ -75,6 +75,7 @@ export interface TooltipProps extends BaseProps {
75
75
  guardFocus?: boolean;
76
76
  returnFocusOnClose?: boolean;
77
77
  onEscKeyDown?: (e: React.KeyboardEvent) => void;
78
+ wrapperId?: string;
78
79
  }
79
80
  interface TooltipState {
80
81
  visible: boolean;
@@ -193,7 +194,7 @@ export default class Tooltip extends BaseComponent<TooltipProps, TooltipState> {
193
194
  placement: props.position || 'top',
194
195
  transitionStyle: {},
195
196
  isPositionUpdated: false,
196
- id: getUuidShort(), // auto generate id, will be used by children.aria-describedby & content.id, improve a11y
197
+ id: props.wrapperId, // auto generate id, will be used by children.aria-describedby & content.id, improve a11y
197
198
  };
198
199
  this.foundation = new TooltipFoundation(this.adapter);
199
200
  this.eventManager = new Event();
@@ -428,6 +429,9 @@ export default class Tooltip extends BaseComponent<TooltipProps, TooltipState> {
428
429
  },
429
430
  notifyEscKeydown: (event: React.KeyboardEvent) => {
430
431
  this.props.onEscKeyDown(event);
432
+ },
433
+ setId: () => {
434
+ this.setState({ id: getUuidShort() });
431
435
  }
432
436
  };
433
437
  }
@@ -826,7 +826,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
826
826
  const tagList = this.renderTagList();
827
827
  // mode=custom to return tagList directly
828
828
  return (
829
- <TagGroup
829
+ <TagGroup<'custom'>
830
830
  maxTagCount={maxTagCount}
831
831
  tagList={tagList}
832
832
  size="large"
@@ -581,6 +581,7 @@ export const Draggable = () => (
581
581
  <Upload
582
582
  {...commonProps}
583
583
  style={{ marginTop: 10, height: 300 }}
584
+ // directory
584
585
  draggable={true}
585
586
  dragMainText={'点击上传文件或拖拽文件到这里'}
586
587
  ></Upload>