@douyinfe/semi-ui 2.13.0 → 2.14.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.
Files changed (209) hide show
  1. package/autoComplete/_story/CustomTrigger/index.jsx +1 -1
  2. package/avatar/_story/avatar.stories.js +62 -5
  3. package/avatar/avatarGroup.tsx +16 -4
  4. package/avatar/index.tsx +88 -17
  5. package/backtop/index.tsx +11 -7
  6. package/badge/index.tsx +1 -1
  7. package/banner/index.tsx +5 -5
  8. package/breadcrumb/index.tsx +5 -3
  9. package/button/Button.tsx +10 -8
  10. package/calendar/_story/calendar.stories.js +125 -1
  11. package/card/index.tsx +43 -41
  12. package/carousel/CarouselArrow.tsx +2 -0
  13. package/carousel/index.tsx +1 -0
  14. package/cascader/_story/cascader.stories.js +21 -0
  15. package/cascader/index.tsx +99 -120
  16. package/cascader/item.tsx +1 -1
  17. package/checkbox/checkbox.tsx +13 -2
  18. package/collapsible/index.tsx +8 -1
  19. package/datePicker/dateInput.tsx +1 -0
  20. package/datePicker/datePicker.tsx +13 -5
  21. package/dist/css/semi.css +51 -35
  22. package/dist/css/semi.min.css +1 -1
  23. package/dist/umd/semi-ui.js +933 -530
  24. package/dist/umd/semi-ui.js.map +1 -1
  25. package/dist/umd/semi-ui.min.js +1 -1
  26. package/dist/umd/semi-ui.min.js.map +1 -1
  27. package/divider/index.tsx +8 -4
  28. package/dropdown/index.tsx +1 -1
  29. package/empty/index.tsx +13 -5
  30. package/form/hoc/withField.tsx +1 -1
  31. package/form/label.tsx +1 -1
  32. package/grid/col.tsx +1 -1
  33. package/grid/row.tsx +1 -1
  34. package/iconButton/index.tsx +2 -1
  35. package/input/_story/input.stories.js +32 -3
  36. package/input/index.tsx +45 -23
  37. package/input/inputGroup.tsx +3 -1
  38. package/input/textarea.tsx +2 -14
  39. package/lib/cjs/_base/base.css +14 -14
  40. package/lib/cjs/avatar/avatarGroup.d.ts +1 -1
  41. package/lib/cjs/avatar/avatarGroup.js +36 -9
  42. package/lib/cjs/avatar/index.d.ts +5 -0
  43. package/lib/cjs/avatar/index.js +121 -41
  44. package/lib/cjs/backtop/index.js +2 -1
  45. package/lib/cjs/badge/index.js +2 -1
  46. package/lib/cjs/banner/index.js +9 -4
  47. package/lib/cjs/breadcrumb/index.js +4 -3
  48. package/lib/cjs/button/Button.js +13 -3
  49. package/lib/cjs/card/index.js +10 -5
  50. package/lib/cjs/carousel/CarouselArrow.js +6 -2
  51. package/lib/cjs/carousel/index.js +2 -1
  52. package/lib/cjs/cascader/index.js +11 -6
  53. package/lib/cjs/cascader/item.js +2 -1
  54. package/lib/cjs/checkbox/checkbox.js +6 -2
  55. package/lib/cjs/collapsible/index.js +2 -1
  56. package/lib/cjs/datePicker/dateInput.js +2 -1
  57. package/lib/cjs/datePicker/datePicker.js +4 -2
  58. package/lib/cjs/divider/index.js +2 -1
  59. package/lib/cjs/dropdown/index.js +2 -1
  60. package/lib/cjs/empty/index.js +8 -4
  61. package/lib/cjs/form/baseForm.d.ts +1 -1
  62. package/lib/cjs/form/field.d.ts +1 -1
  63. package/lib/cjs/form/hoc/withField.js +2 -1
  64. package/lib/cjs/form/label.js +2 -1
  65. package/lib/cjs/grid/col.js +2 -1
  66. package/lib/cjs/grid/row.js +2 -1
  67. package/lib/cjs/iconButton/index.js +3 -1
  68. package/lib/cjs/input/index.d.ts +0 -1
  69. package/lib/cjs/input/index.js +41 -36
  70. package/lib/cjs/input/inputGroup.js +2 -3
  71. package/lib/cjs/input/textarea.js +8 -15
  72. package/lib/cjs/list/index.js +6 -3
  73. package/lib/cjs/modal/ConfirmModal.js +2 -1
  74. package/lib/cjs/modal/Modal.js +6 -2
  75. package/lib/cjs/modal/ModalContent.js +13 -6
  76. package/lib/cjs/notification/notice.js +6 -3
  77. package/lib/cjs/pagination/index.js +4 -2
  78. package/lib/cjs/popconfirm/index.js +6 -3
  79. package/lib/cjs/radio/radio.d.ts +4 -0
  80. package/lib/cjs/radio/radio.js +32 -9
  81. package/lib/cjs/radio/radioInner.d.ts +6 -0
  82. package/lib/cjs/radio/radioInner.js +13 -4
  83. package/lib/cjs/rating/item.js +2 -1
  84. package/lib/cjs/scrollList/index.js +6 -3
  85. package/lib/cjs/select/index.js +10 -4
  86. package/lib/cjs/select/option.js +2 -1
  87. package/lib/cjs/sideSheet/SideSheetContent.js +6 -3
  88. package/lib/cjs/skeleton/index.js +3 -1
  89. package/lib/cjs/space/index.js +2 -1
  90. package/lib/cjs/spin/index.js +7 -3
  91. package/lib/cjs/switch/index.js +6 -4
  92. package/lib/cjs/table/Table.js +6 -3
  93. package/lib/cjs/tabs/TabBar.js +2 -1
  94. package/lib/cjs/tabs/TabPane.js +5 -2
  95. package/lib/cjs/tagInput/index.js +25 -15
  96. package/lib/cjs/timePicker/Combobox.js +3 -1
  97. package/lib/cjs/timePicker/TimePicker.js +2 -0
  98. package/lib/cjs/toast/toast.js +6 -3
  99. package/lib/cjs/tooltip/index.js +6 -1
  100. package/lib/cjs/transfer/index.js +2 -1
  101. package/lib/cjs/tree/treeNode.js +2 -1
  102. package/lib/cjs/treeSelect/index.js +10 -3
  103. package/lib/cjs/typography/base.js +2 -1
  104. package/lib/cjs/typography/title.d.ts +1 -1
  105. package/lib/cjs/upload/index.d.ts +1 -1
  106. package/lib/cjs/upload/index.js +13 -6
  107. package/lib/es/_base/base.css +14 -14
  108. package/lib/es/avatar/avatarGroup.d.ts +1 -1
  109. package/lib/es/avatar/avatarGroup.js +37 -9
  110. package/lib/es/avatar/index.d.ts +5 -0
  111. package/lib/es/avatar/index.js +119 -38
  112. package/lib/es/backtop/index.js +2 -1
  113. package/lib/es/badge/index.js +2 -1
  114. package/lib/es/banner/index.js +9 -4
  115. package/lib/es/breadcrumb/index.js +4 -3
  116. package/lib/es/button/Button.js +11 -3
  117. package/lib/es/card/index.js +10 -5
  118. package/lib/es/carousel/CarouselArrow.js +6 -2
  119. package/lib/es/carousel/index.js +2 -1
  120. package/lib/es/cascader/index.js +11 -6
  121. package/lib/es/cascader/item.js +2 -1
  122. package/lib/es/checkbox/checkbox.js +6 -2
  123. package/lib/es/collapsible/index.js +2 -1
  124. package/lib/es/datePicker/dateInput.js +2 -1
  125. package/lib/es/datePicker/datePicker.js +4 -2
  126. package/lib/es/divider/index.js +2 -1
  127. package/lib/es/dropdown/index.js +2 -1
  128. package/lib/es/empty/index.js +8 -4
  129. package/lib/es/form/baseForm.d.ts +1 -1
  130. package/lib/es/form/field.d.ts +1 -1
  131. package/lib/es/form/hoc/withField.js +2 -1
  132. package/lib/es/form/label.js +2 -1
  133. package/lib/es/grid/col.js +2 -1
  134. package/lib/es/grid/row.js +2 -1
  135. package/lib/es/iconButton/index.js +3 -1
  136. package/lib/es/input/index.d.ts +0 -1
  137. package/lib/es/input/index.js +41 -36
  138. package/lib/es/input/inputGroup.js +2 -3
  139. package/lib/es/input/textarea.js +8 -15
  140. package/lib/es/list/index.js +6 -3
  141. package/lib/es/modal/ConfirmModal.js +2 -1
  142. package/lib/es/modal/Modal.js +6 -2
  143. package/lib/es/modal/ModalContent.js +13 -6
  144. package/lib/es/notification/notice.js +6 -3
  145. package/lib/es/pagination/index.js +4 -2
  146. package/lib/es/popconfirm/index.js +6 -3
  147. package/lib/es/radio/radio.d.ts +4 -0
  148. package/lib/es/radio/radio.js +32 -9
  149. package/lib/es/radio/radioInner.d.ts +6 -0
  150. package/lib/es/radio/radioInner.js +13 -4
  151. package/lib/es/rating/item.js +2 -1
  152. package/lib/es/scrollList/index.js +6 -3
  153. package/lib/es/select/index.js +10 -4
  154. package/lib/es/select/option.js +2 -1
  155. package/lib/es/sideSheet/SideSheetContent.js +6 -3
  156. package/lib/es/skeleton/index.js +3 -1
  157. package/lib/es/space/index.js +2 -1
  158. package/lib/es/spin/index.js +7 -3
  159. package/lib/es/switch/index.js +6 -4
  160. package/lib/es/table/Table.js +6 -3
  161. package/lib/es/tabs/TabBar.js +2 -1
  162. package/lib/es/tabs/TabPane.js +5 -2
  163. package/lib/es/tagInput/index.js +25 -15
  164. package/lib/es/timePicker/Combobox.js +3 -1
  165. package/lib/es/timePicker/TimePicker.js +2 -0
  166. package/lib/es/toast/toast.js +6 -3
  167. package/lib/es/tooltip/index.js +6 -1
  168. package/lib/es/transfer/index.js +2 -1
  169. package/lib/es/tree/treeNode.js +2 -1
  170. package/lib/es/treeSelect/index.js +10 -3
  171. package/lib/es/typography/base.js +2 -1
  172. package/lib/es/typography/title.d.ts +1 -1
  173. package/lib/es/upload/index.d.ts +1 -1
  174. package/lib/es/upload/index.js +13 -6
  175. package/list/index.tsx +16 -4
  176. package/modal/ConfirmModal.tsx +1 -1
  177. package/modal/Modal.tsx +2 -0
  178. package/modal/ModalContent.tsx +27 -14
  179. package/notification/notice.tsx +16 -4
  180. package/package.json +8 -8
  181. package/pagination/index.tsx +16 -2
  182. package/popconfirm/index.tsx +11 -3
  183. package/radio/_story/radio.stories.js +9 -6
  184. package/radio/radio.tsx +37 -7
  185. package/radio/radioInner.tsx +11 -2
  186. package/rating/item.tsx +1 -1
  187. package/scrollList/index.tsx +19 -3
  188. package/select/index.tsx +13 -4
  189. package/select/option.tsx +5 -1
  190. package/sideSheet/SideSheetContent.tsx +3 -3
  191. package/skeleton/index.tsx +1 -1
  192. package/space/index.tsx +1 -1
  193. package/spin/index.tsx +15 -9
  194. package/switch/index.tsx +9 -14
  195. package/table/Table.tsx +5 -3
  196. package/tabs/TabBar.tsx +1 -1
  197. package/tabs/TabPane.tsx +9 -4
  198. package/tagInput/index.tsx +23 -4
  199. package/timePicker/Combobox.tsx +6 -1
  200. package/timePicker/TimePicker.tsx +1 -0
  201. package/toast/toast.tsx +3 -3
  202. package/tooltip/index.tsx +4 -1
  203. package/transfer/index.tsx +1 -0
  204. package/tree/treeNode.tsx +1 -1
  205. package/treeSelect/_story/treeSelect.stories.js +161 -2
  206. package/treeSelect/index.tsx +17 -3
  207. package/typography/base.tsx +1 -1
  208. package/upload/index.tsx +107 -38
  209. package/yarn-error.log +26235 -0
package/select/index.tsx CHANGED
@@ -662,6 +662,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
662
662
  this.foundation.handleClearClick(e as any);
663
663
  }
664
664
 
665
+ /* istanbul ignore next */
665
666
  onClearBtnEnterPress(e: React.KeyboardEvent) {
666
667
  this.foundation.handleClearBtnEnterPress(e as any);
667
668
  }
@@ -878,7 +879,11 @@ class Select extends BaseComponent<SelectProps, SelectState> {
878
879
  return (
879
880
  <>
880
881
  <div className={contentWrapperCls}>
881
- {<span className={spanCls}>{renderText || renderText === 0 ? renderText : placeholder}</span>}
882
+ {
883
+ <span className={spanCls} x-semi-prop="placeholder">
884
+ {renderText || renderText === 0 ? renderText : placeholder}
885
+ </span>
886
+ }
882
887
  {filterable && showInput ? this.renderInput() : null}
883
888
  </div>
884
889
  </>
@@ -1006,7 +1011,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1006
1011
  [`${prefixcls}-suffix-text`]: suffix && isString(suffix),
1007
1012
  [`${prefixcls}-suffix-icon`]: isSemiIcon(suffix),
1008
1013
  });
1009
- return <div className={suffixWrapperCls}>{suffix}</div>;
1014
+ return <div className={suffixWrapperCls} x-semi-prop="suffix">{suffix}</div>;
1010
1015
  }
1011
1016
 
1012
1017
  renderPrefix() {
@@ -1020,7 +1025,11 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1020
1025
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
1021
1026
  });
1022
1027
 
1023
- return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
1028
+ return (
1029
+ <div className={prefixWrapperCls} id={insetLabelId} x-semi-prop="prefix,insetLabel">
1030
+ {labelNode}
1031
+ </div>
1032
+ );
1024
1033
  }
1025
1034
 
1026
1035
  renderSelection() {
@@ -1067,7 +1076,7 @@ class Select extends BaseComponent<SelectProps, SelectState> {
1067
1076
  (selections.size || inputValue) && !disabled && (isHovering || isOpen);
1068
1077
 
1069
1078
  const arrowContent = showArrow ? (
1070
- <div className={`${prefixcls}-arrow`}>
1079
+ <div className={`${prefixcls}-arrow`} x-semi-prop="arrowIcon">
1071
1080
  {arrowIcon}
1072
1081
  </div>
1073
1082
  ) : (
package/select/option.tsx CHANGED
@@ -105,7 +105,11 @@ class Option extends PureComponent<OptionProps> {
105
105
  }
106
106
  return (
107
107
  <LocaleConsumer<Locale['Select']> componentName="Select">
108
- {(locale: Locale['Select']) => <div className={optionClassName}>{emptyContent || locale.emptyText}</div>}
108
+ {(locale: Locale['Select']) => (
109
+ <div className={optionClassName} x-semi-prop="emptyContent">
110
+ {emptyContent || locale.emptyText}
111
+ </div>
112
+ )}
109
113
  </LocaleConsumer>
110
114
  );
111
115
  }
@@ -88,7 +88,7 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
88
88
  let header, closer;
89
89
  if (title) {
90
90
  header = (
91
- <div className={`${prefixCls}-title`}>
91
+ <div className={`${prefixCls}-title`} x-semi-prop="title">
92
92
  {this.props.title}
93
93
  </div>
94
94
  );
@@ -140,11 +140,11 @@ export default class SideSheetContent extends React.PureComponent<SideSheetConte
140
140
  >
141
141
  <div className={`${prefixCls}-content`}>
142
142
  {header}
143
- <div className={`${prefixCls}-body`} style={props.bodyStyle}>
143
+ <div className={`${prefixCls}-body`} style={props.bodyStyle} x-semi-prop="children">
144
144
  {props.children}
145
145
  </div>
146
146
  {props.footer ? (
147
- <div className={`${prefixCls}-footer`}>
147
+ <div className={`${prefixCls}-footer`} x-semi-prop="footer">
148
148
  {props.footer}
149
149
  </div>
150
150
  ) : null}
@@ -48,7 +48,7 @@ class Skeleton extends PureComponent<SkeletonProps> {
48
48
  let content;
49
49
  if (loading) {
50
50
  content = (
51
- <div className={skCls} style={style} {...others}>
51
+ <div className={skCls} style={style} {...others} x-semi-prop="placeholder">
52
52
  {placeholder}
53
53
  </div>
54
54
  );
package/space/index.tsx CHANGED
@@ -85,7 +85,7 @@ class Space extends PureComponent<SpaceProps> {
85
85
  });
86
86
  const childrenNodes = flatten(children);
87
87
  return (
88
- <div className={classNames} style={realStyle}>
88
+ <div className={classNames} style={realStyle} x-semi-prop="children">
89
89
  {childrenNodes}
90
90
  </div>
91
91
  );
package/spin/index.tsx CHANGED
@@ -95,14 +95,18 @@ class Spin extends BaseComponent<SpinProps, SpinState> {
95
95
  [`${prefixCls}-animate`]: loading,
96
96
  });
97
97
 
98
- return (
99
- loading ? (
100
- <div className={`${prefixCls}-wrapper`}>
101
- {indicator ? <div className={spinIconCls}>{indicator}</div> : <SpinIcon />}
102
- {tip ? <div>{tip}</div> : null}
103
- </div>
104
- ) : null
105
- );
98
+ return loading ? (
99
+ <div className={`${prefixCls}-wrapper`}>
100
+ {indicator ? (
101
+ <div className={spinIconCls} x-semi-prop="indicator">
102
+ {indicator}
103
+ </div>
104
+ ) : (
105
+ <SpinIcon />
106
+ )}
107
+ {tip ? <div x-semi-prop="tip">{tip}</div> : null}
108
+ </div>
109
+ ) : null;
106
110
  }
107
111
 
108
112
  render() {
@@ -122,7 +126,9 @@ class Spin extends BaseComponent<SpinProps, SpinState> {
122
126
  return (
123
127
  <div className={spinCls} style={style}>
124
128
  {this.renderSpin()}
125
- <div className={`${prefixCls}-children`} style={childStyle}>{children}</div>
129
+ <div className={`${prefixCls}-children`} style={childStyle} x-semi-prop="children">
130
+ {children}
131
+ </div>
126
132
  </div>
127
133
  );
128
134
  }
package/switch/index.tsx CHANGED
@@ -146,23 +146,18 @@ class Switch extends BaseComponent<SwitchProps, SwitchState> {
146
146
  const showUncheckedText = uncheckedText && !nativeControlChecked && size !== 'small';
147
147
  return (
148
148
  <div className={wrapperCls} style={style} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
149
- {
150
- loading
151
- ? (
152
- <Spin
153
- wrapperClassName={cssClasses.LOADING_SPIN}
154
- size={size === 'default' ? 'middle' : size}
155
- />
156
- )
157
- : <div className={cssClasses.KNOB} aria-hidden={true} />
158
- }
149
+ {loading ? (
150
+ <Spin wrapperClassName={cssClasses.LOADING_SPIN} size={size === 'default' ? 'middle' : size} />
151
+ ) : (
152
+ <div className={cssClasses.KNOB} aria-hidden={true} />
153
+ )}
159
154
  {showCheckedText ? (
160
- <div className={cssClasses.CHECKED_TEXT}>
155
+ <div className={cssClasses.CHECKED_TEXT} x-semi-prop="checkedText">
161
156
  {checkedText}
162
157
  </div>
163
158
  ) : null}
164
159
  {showUncheckedText ? (
165
- <div className={cssClasses.UNCHECKED_TEXT}>
160
+ <div className={cssClasses.UNCHECKED_TEXT} x-semi-prop="uncheckedText">
166
161
  {uncheckedText}
167
162
  </div>
168
163
  ) : null}
@@ -170,13 +165,13 @@ class Switch extends BaseComponent<SwitchProps, SwitchState> {
170
165
  {...switchProps}
171
166
  ref={this.switchRef}
172
167
  id={id}
173
- role='switch'
168
+ role="switch"
174
169
  aria-checked={nativeControlChecked}
175
170
  aria-invalid={this.props['aria-invalid']}
176
171
  aria-errormessage={this.props['aria-errormessage']}
177
172
  aria-label={this.props['aria-label']}
178
173
  aria-labelledby={this.props['aria-labelledby']}
179
- aria-describedby={this.props["aria-describedby"]}
174
+ aria-describedby={this.props['aria-describedby']}
180
175
  aria-disabled={this.props['disabled']}
181
176
  onChange={e => this.foundation.handleChange(e.target.checked, e)}
182
177
  onFocus={e => this.handleFocusVisible(e)}
package/table/Table.tsx CHANGED
@@ -1015,7 +1015,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
1015
1015
  }
1016
1016
 
1017
1017
  return isValidElement(title) || typeof title === 'string' ? (
1018
- <div className={`${prefixCls}-title`}>{title}</div>
1018
+ <div className={`${prefixCls}-title`} x-semi-prop="title">{title}</div>
1019
1019
  ) : null;
1020
1020
  };
1021
1021
 
@@ -1032,7 +1032,9 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
1032
1032
  <LocaleConsumer componentName="Table" key={'emptyText'}>
1033
1033
  {(locale: TableLocale, localeCode: string) => (
1034
1034
  <div className={wrapCls}>
1035
- <div className={`${prefixCls}-empty`}>{empty || locale.emptyText}</div>
1035
+ <div className={`${prefixCls}-empty`} x-semi-prop="empty">
1036
+ {empty || locale.emptyText}
1037
+ </div>
1036
1038
  </div>
1037
1039
  )}
1038
1040
  </LocaleConsumer>
@@ -1048,7 +1050,7 @@ class Table<RecordType extends Record<string, any>> extends BaseComponent<Normal
1048
1050
  }
1049
1051
 
1050
1052
  return isValidElement(footer) || typeof footer === 'string' ? (
1051
- <div className={`${prefixCls}-footer`} key="footer">
1053
+ <div className={`${prefixCls}-footer`} key="footer" x-semi-prop="footer">
1052
1054
  {footer}
1053
1055
  </div>
1054
1056
  ) : null;
package/tabs/TabBar.tsx CHANGED
@@ -70,7 +70,7 @@ class TabBar extends React.Component<TabBarProps, TabBarState> {
70
70
  if (tabBarExtraContent) {
71
71
  const tabBarStyle = { ...tabBarExtraContentDefaultStyle, ...tabBarExtraContentStyle };
72
72
  return (
73
- <div className={extraCls} style={tabBarStyle}>
73
+ <div className={extraCls} style={tabBarStyle} x-semi-prop="tabBarExtraContent">
74
74
  {tabBarExtraContent}
75
75
  </div>
76
76
  );
package/tabs/TabPane.tsx CHANGED
@@ -98,6 +98,7 @@ class TabPane extends PureComponent<TabPaneProps> {
98
98
  aria-hidden={active ? 'false' : 'true'}
99
99
  tabIndex={0}
100
100
  {...getDataAttr(restProps)}
101
+ x-semi-prop="children"
101
102
  >
102
103
  {motion ? (
103
104
  <TabPaneTransition
@@ -107,14 +108,18 @@ class TabPane extends PureComponent<TabPaneProps> {
107
108
  state={active ? 'enter' : 'leave'}
108
109
  >
109
110
  {(transitionStyle): ReactNode => (
110
- <div className={`${cssClasses.TABS_PANE_MOTION_OVERLAY}`} style={{ ...transitionStyle }}>
111
+ <div
112
+ className={`${cssClasses.TABS_PANE_MOTION_OVERLAY}`}
113
+ style={{ ...transitionStyle }}
114
+ x-semi-prop="children"
115
+ >
111
116
  {shouldRender ? children : null}
112
117
  </div>
113
118
  )}
114
119
  </TabPaneTransition>
115
- ) : (
116
- shouldRender ? children : null
117
- )}
120
+ ) : shouldRender ? (
121
+ children
122
+ ) : null}
118
123
  </div>
119
124
  );
120
125
  }
@@ -238,6 +238,7 @@ class TagInput extends BaseComponent<TagInputProps, TagInputState> {
238
238
  this.foundation.handleClearBtn(e);
239
239
  };
240
240
 
241
+ /* istanbul ignore next */
241
242
  handleClearEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
242
243
  this.foundation.handleClearEnterPress(e);
243
244
  };
@@ -298,8 +299,17 @@ class TagInput extends BaseComponent<TagInputProps, TagInputState> {
298
299
  // eslint-disable-next-line max-len
299
300
  [`${prefixCls}-prefix-icon`]: isSemiIcon(labelNode),
300
301
  });
301
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events
302
- return <div className={prefixWrapperCls} onMouseDown={this.handlePreventMouseDown} onClick={this.handleClickPrefixOrSuffix} id={insetLabelId}>{labelNode}</div>;
302
+ return (
303
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events
304
+ <div
305
+ className={prefixWrapperCls}
306
+ onMouseDown={this.handlePreventMouseDown}
307
+ onClick={this.handleClickPrefixOrSuffix}
308
+ id={insetLabelId} x-semi-prop="prefix"
309
+ >
310
+ {labelNode}
311
+ </div>
312
+ );
303
313
  }
304
314
 
305
315
  renderSuffix() {
@@ -312,8 +322,17 @@ class TagInput extends BaseComponent<TagInputProps, TagInputState> {
312
322
  // eslint-disable-next-line max-len
313
323
  [`${prefixCls}-suffix-icon`]: isSemiIcon(suffix),
314
324
  });
315
- // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
316
- return <div className={suffixWrapperCls} onMouseDown={this.handlePreventMouseDown} onClick={this.handleClickPrefixOrSuffix}>{suffix}</div>;
325
+ return (
326
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
327
+ <div
328
+ className={suffixWrapperCls}
329
+ onMouseDown={this.handlePreventMouseDown}
330
+ onClick={this.handleClickPrefixOrSuffix}
331
+ x-semi-prop="suffix"
332
+ >
333
+ {suffix}
334
+ </div>
335
+ );
317
336
  }
318
337
 
319
338
  renderTags() {
@@ -317,7 +317,12 @@ class Combobox extends BaseComponent<ComboboxProps, ComboboxState> {
317
317
  return (
318
318
  <LocaleConsumer componentName="TimePicker">
319
319
  {(locale: Locale['TimePicker'], localeCode: Locale['code']) => (
320
- <ScrollList header={panelHeader} footer={panelFooter}>
320
+ <ScrollList
321
+ header={panelHeader}
322
+ footer={panelFooter}
323
+ x-semi-header-alias="panelHeader"
324
+ x-semi-footer-alias="panelFooter"
325
+ >
321
326
  {this.renderAMPMSelect(locale, localeCode)}
322
327
  {this.renderHourSelect(value.getHours(), locale)}
323
328
  {this.renderMinuteSelect(value.getMinutes(), locale)}
@@ -413,6 +413,7 @@ export default class TimePicker extends BaseComponent<TimePickerProps, TimePicke
413
413
  // this.picker.blur();
414
414
  }
415
415
 
416
+ /* istanbul ignore next */
416
417
  handlePanelVisibleChange = (visible: boolean) => this.foundation.handleVisibleChange(visible);
417
418
 
418
419
  openPanel = () => {
package/toast/toast.tsx CHANGED
@@ -120,7 +120,7 @@ class Toast extends BaseComponent<ToastReactProps, ToastState> {
120
120
  const btnSize = 'small';
121
121
  return (
122
122
  <div
123
- role='alert'
123
+ role="alert"
124
124
  aria-label={`${type ? type : 'default'} type`}
125
125
  className={toastCls}
126
126
  style={style}
@@ -129,7 +129,7 @@ class Toast extends BaseComponent<ToastReactProps, ToastState> {
129
129
  >
130
130
  <div className={`${prefixCls}-content`}>
131
131
  {this.renderIcon()}
132
- <span className={`${prefixCls}-content-text`} style={textStyle}>
132
+ <span className={`${prefixCls}-content-text`} style={textStyle} x-semi-prop="content">
133
133
  {content}
134
134
  </span>
135
135
  {showClose && (
@@ -137,7 +137,7 @@ class Toast extends BaseComponent<ToastReactProps, ToastState> {
137
137
  <Button
138
138
  onClick={e => this.close(e)}
139
139
  type="tertiary"
140
- icon={<IconClose />}
140
+ icon={<IconClose x-semi-prop="icon" />}
141
141
  theme={btnTheme}
142
142
  size={btnSize}
143
143
  />
package/tooltip/index.tsx CHANGED
@@ -664,7 +664,10 @@ export default class Tooltip extends BaseComponent<TooltipProps, TooltipState> {
664
664
  }
665
665
 
666
666
  children = cloneElement(children as React.ReactElement, { style: childrenStyle });
667
- children = this.wrapSpan(children);
667
+ if (trigger !== 'custom') {
668
+ // no need to wrap span when trigger is custom, cause it don't need bind event
669
+ children = this.wrapSpan(children);
670
+ }
668
671
  this.isWrapped = true;
669
672
  } else if (!isValidElement(children)) {
670
673
  children = this.wrapSpan(children);
@@ -353,6 +353,7 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
353
353
  checked={checked}
354
354
  role="listitem"
355
355
  onChange={() => this.onSelectOrRemove(item)}
356
+ x-semi-children-alias={`dataSource[${index}].label`}
356
357
  >
357
358
  {item.label}
358
359
  </Checkbox>
package/tree/treeNode.tsx CHANGED
@@ -269,7 +269,7 @@ export default class TreeNode extends PureComponent<TreeNodeProps, TreeNodeState
269
269
  });
270
270
  return (
271
271
  <ul className={wrapperCls}>
272
- <li className={`${prefixcls}-label ${prefixcls}-label-empty`}>
272
+ <li className={`${prefixcls}-label ${prefixcls}-label-empty`} x-semi-prop="emptyContent">
273
273
  {emptyContent}
274
274
  </li>
275
275
  </ul>
@@ -1343,7 +1343,7 @@ export const CheckRelationDemo = () => {
1343
1343
  defaultValue='China'
1344
1344
  />
1345
1345
  <br /><br />
1346
- <div>checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear</div>
1346
+ <div>多选 + checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear</div>
1347
1347
  <TreeSelect
1348
1348
  dropdownStyle={dropdownStyle}
1349
1349
  treeData={treeData}
@@ -1354,6 +1354,19 @@ export const CheckRelationDemo = () => {
1354
1354
  defaultExpandAll
1355
1355
  style={style}
1356
1356
  searchPosition='trigger'
1357
+ defaultValue={['China', 'Japan']}
1358
+ />
1359
+ <br /><br />
1360
+ <div>单选 + checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear</div>
1361
+ <TreeSelect
1362
+ dropdownStyle={dropdownStyle}
1363
+ treeData={treeData}
1364
+ filterTreeNode
1365
+ showClear
1366
+ checkRelation='unRelated'
1367
+ defaultExpandAll
1368
+ style={style}
1369
+ searchPosition='trigger'
1357
1370
  defaultValue='China'
1358
1371
  />
1359
1372
  <br /><br />
@@ -1459,4 +1472,150 @@ export const SearchableAndExpandedKeys = () => {
1459
1472
  />
1460
1473
  </>
1461
1474
  )
1462
- }
1475
+ }
1476
+
1477
+ export const loadData = () => {
1478
+ const initialData = [
1479
+ {
1480
+ label: 'Expand to load',
1481
+ value: '0',
1482
+ key: '0',
1483
+ },
1484
+ {
1485
+ label: 'Expand to load',
1486
+ value: '1',
1487
+ key: '1',
1488
+ },
1489
+ {
1490
+ label: 'Leaf Node',
1491
+ value: '2',
1492
+ key: '2',
1493
+ isLeaf: true,
1494
+ },
1495
+ ];
1496
+ const [treeData, setTreeData] = useState(initialData);
1497
+ const [loadedKeys, setLoadedKeys] = useState(['2']);
1498
+
1499
+ function updateTreeData(list, key, children) {
1500
+ return list.map(node => {
1501
+ if (node.key === key) {
1502
+ return { ...node, children };
1503
+ }
1504
+ if (node.children) {
1505
+ return { ...node, children: updateTreeData(node.children, key, children) };
1506
+ }
1507
+ return node;
1508
+ });
1509
+ }
1510
+
1511
+ function onLoadData({ key, children }) {
1512
+ return new Promise(resolve => {
1513
+ if (children) {
1514
+ resolve();
1515
+ return;
1516
+ }
1517
+ setTimeout(() => {
1518
+ setTreeData(origin =>
1519
+ updateTreeData(origin, key, [
1520
+ {
1521
+ label: 'Child Node',
1522
+ key: `${key}-0`,
1523
+ },
1524
+ {
1525
+ label: 'Child Node',
1526
+ key: `${key}-1`,
1527
+ },
1528
+ ]),
1529
+ );
1530
+ resolve();
1531
+ }, 1000);
1532
+ });
1533
+ }
1534
+ return (
1535
+ <TreeSelect
1536
+ loadData={onLoadData}
1537
+ filterTreeNode
1538
+ treeData={treeData}
1539
+ style={{ width: 300 }}
1540
+ placeholder="请选择"
1541
+ />
1542
+ );
1543
+ }
1544
+
1545
+
1546
+ export const loadDataAndLoadedkeys = () => {
1547
+ const initialData = [
1548
+ {
1549
+ label: 'Expand to load',
1550
+ value: '0',
1551
+ key: '0',
1552
+ },
1553
+ {
1554
+ label: 'Expand to load',
1555
+ value: '1',
1556
+ key: '1',
1557
+ },
1558
+ {
1559
+ label: 'Leaf Node',
1560
+ value: '2',
1561
+ key: '2',
1562
+ isLeaf: true,
1563
+ },
1564
+ ];
1565
+ const [treeData, setTreeData] = useState(initialData);
1566
+ const [loadedKeys, setLoadedKeys] = useState(['2']);
1567
+
1568
+ function updateTreeData(list, key, children) {
1569
+ return list.map(node => {
1570
+ if (node.key === key) {
1571
+ return { ...node, children };
1572
+ }
1573
+ if (node.children) {
1574
+ return { ...node, children: updateTreeData(node.children, key, children) };
1575
+ }
1576
+ return node;
1577
+ });
1578
+ }
1579
+
1580
+ function updateLoadedKeys(key) {
1581
+ if(!loadedKeys.includes(key)){
1582
+ setLoadedKeys([...loadedKeys, key]);
1583
+ console.log('[...loadedKeys, key]', [...loadedKeys, key]);
1584
+ }
1585
+ }
1586
+
1587
+ function onLoadData({ key, children }) {
1588
+ return new Promise(resolve => {
1589
+ if (children) {
1590
+ resolve();
1591
+ return;
1592
+ }
1593
+ setTimeout(() => {
1594
+ setTreeData(origin =>
1595
+ updateTreeData(origin, key, [
1596
+ {
1597
+ label: 'Child Node',
1598
+ key: `${key}-0`,
1599
+ },
1600
+ {
1601
+ label: 'Child Node',
1602
+ key: `${key}-1`,
1603
+ },
1604
+ ]),
1605
+ );
1606
+ // updateLoadedKeys(key);
1607
+ resolve();
1608
+ }, 1000);
1609
+ });
1610
+ }
1611
+ return (
1612
+ <TreeSelect
1613
+ loadData={onLoadData}
1614
+ filterTreeNode
1615
+ // loadedKeys={loadedKeys}
1616
+ treeData={treeData}
1617
+ style={{ width: 300 }}
1618
+ placeholder="请选择"
1619
+ />
1620
+ );
1621
+ }
@@ -646,7 +646,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
646
646
  [`${prefixcls}-suffix-text`]: suffix && isString(suffix),
647
647
  [`${prefixcls}-suffix-icon`]: isSemiIcon(suffix),
648
648
  });
649
- return <div className={suffixWrapperCls}>{suffix}</div>;
649
+ return (
650
+ <div className={suffixWrapperCls} x-semi-prop="suffix">
651
+ {suffix}
652
+ </div>
653
+ );
650
654
  };
651
655
 
652
656
  renderPrefix = () => {
@@ -660,7 +664,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
660
664
  [`${prefixcls}-prefix-icon`]: isSemiIcon(labelNode),
661
665
  });
662
666
 
663
- return <div className={prefixWrapperCls} id={insetLabelId}>{labelNode}</div>;
667
+ return (
668
+ <div className={prefixWrapperCls} id={insetLabelId} x-semi-prop="prefix,insetLabel">
669
+ {labelNode}
670
+ </div>
671
+ );
664
672
  };
665
673
 
666
674
  renderContent = () => {
@@ -683,6 +691,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
683
691
  this.foundation.handleClick(e);
684
692
  };
685
693
 
694
+ /* istanbul ignore next */
686
695
  handleSelectionEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
687
696
  this.foundation.handleSelectionEnterPress(e);
688
697
  };
@@ -840,6 +849,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
840
849
  this.foundation.handleClear(e);
841
850
  };
842
851
 
852
+ /* istanbul ignore next */
843
853
  handleClearEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
844
854
  e && e.stopPropagation();
845
855
  this.foundation.handleClearEnterPress(e);
@@ -867,7 +877,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
867
877
  if (showClearBtn) {
868
878
  return null;
869
879
  }
870
- return arrowIcon ? <div className={cls(`${prefixcls}-arrow`)}>{arrowIcon}</div> : null;
880
+ return arrowIcon ? (
881
+ <div className={cls(`${prefixcls}-arrow`)} x-semi-prop="arrowIcon">
882
+ {arrowIcon}
883
+ </div>
884
+ ) : null;
871
885
  };
872
886
 
873
887
  renderClearBtn = () => {
@@ -526,7 +526,7 @@ export default class Base extends Component<BaseTypographyProps, BaseTypographyS
526
526
  }
527
527
  const iconSize: Size = size === 'small' ? 'small' : 'default';
528
528
  return (
529
- <span className={`${prefixCls}-icon`}>
529
+ <span className={`${prefixCls}-icon`} x-semi-prop="icon">
530
530
  {isSemiIcon(icon) ? React.cloneElement((icon as React.ReactElement), { size: iconSize }) : icon}
531
531
  </span>
532
532
  );