@douyinfe/semi-ui 2.1.4-alpha.0 → 2.2.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 (162) hide show
  1. package/_base/_story/a11y.jsx +1302 -0
  2. package/_base/_story/a11y.scss +49 -0
  3. package/_base/_story/index.scss +1 -0
  4. package/_base/_story/index.stories.js +3 -1
  5. package/_utils/index.ts +2 -1
  6. package/button/Button.tsx +1 -0
  7. package/button/__test__/button.test.js +15 -0
  8. package/button/_story/button.stories.js +13 -0
  9. package/button/buttonGroup.tsx +6 -4
  10. package/cascader/__test__/cascader.test.js +221 -0
  11. package/cascader/_story/cascader.stories.js +138 -0
  12. package/cascader/index.tsx +37 -21
  13. package/cascader/item.tsx +7 -2
  14. package/checkbox/__test__/checkboxGroup.test.js +37 -5
  15. package/checkbox/_story/checkbox.stories.js +78 -6
  16. package/checkbox/checkbox.tsx +3 -0
  17. package/checkbox/checkboxGroup.tsx +3 -2
  18. package/datePicker/__test__/datePicker.test.js +67 -2
  19. package/datePicker/_story/datePicker.stories.js +3 -1
  20. package/datePicker/_story/v2/YearButton.jsx +17 -0
  21. package/datePicker/_story/v2/index.js +1 -0
  22. package/datePicker/monthsGrid.tsx +12 -1
  23. package/datePicker/navigation.tsx +55 -29
  24. package/descriptions/__test__/descriptions.test.js +27 -1
  25. package/descriptions/_story/descriptions.stories.js +52 -2
  26. package/descriptions/item.tsx +1 -1
  27. package/dist/css/semi.css +105 -32
  28. package/dist/css/semi.min.css +1 -1
  29. package/dist/umd/semi-ui.js +801 -227
  30. package/dist/umd/semi-ui.js.map +1 -1
  31. package/dist/umd/semi-ui.min.js +1 -1
  32. package/dist/umd/semi-ui.min.js.map +1 -1
  33. package/form/_story/form.stories.js +0 -67
  34. package/form/_story/form.stories.tsx +2 -2
  35. package/form/hoc/withField.tsx +2 -2
  36. package/lib/cjs/_base/base.css +2 -2
  37. package/lib/cjs/_utils/index.d.ts +1 -0
  38. package/lib/cjs/_utils/index.js +3 -2
  39. package/lib/cjs/button/Button.d.ts +1 -0
  40. package/lib/cjs/button/buttonGroup.js +11 -3
  41. package/lib/cjs/cascader/index.d.ts +7 -0
  42. package/lib/cjs/cascader/index.js +35 -22
  43. package/lib/cjs/cascader/item.d.ts +2 -0
  44. package/lib/cjs/cascader/item.js +9 -2
  45. package/lib/cjs/checkbox/checkbox.js +4 -1
  46. package/lib/cjs/checkbox/checkboxGroup.d.ts +1 -0
  47. package/lib/cjs/checkbox/checkboxGroup.js +3 -1
  48. package/lib/cjs/datePicker/dateInput.d.ts +1 -1
  49. package/lib/cjs/datePicker/datePicker.d.ts +1 -1
  50. package/lib/cjs/datePicker/monthsGrid.d.ts +2 -1
  51. package/lib/cjs/datePicker/monthsGrid.js +6 -0
  52. package/lib/cjs/datePicker/navigation.js +47 -7
  53. package/lib/cjs/descriptions/item.js +1 -1
  54. package/lib/cjs/form/baseForm.d.ts +6 -0
  55. package/lib/cjs/form/field.d.ts +6 -0
  56. package/lib/cjs/form/hoc/withField.js +3 -1
  57. package/lib/cjs/locale/source/es.d.ts +7 -0
  58. package/lib/cjs/locale/source/es.js +168 -0
  59. package/lib/cjs/modal/Modal.d.ts +8 -8
  60. package/lib/cjs/modal/Modal.js +4 -4
  61. package/lib/cjs/modal/confirm.d.ts +10 -10
  62. package/lib/cjs/navigation/index.d.ts +2 -2
  63. package/lib/cjs/pagination/index.js +9 -4
  64. package/lib/cjs/radio/radio.d.ts +1 -1
  65. package/lib/cjs/radio/radio.js +1 -0
  66. package/lib/cjs/radio/radioGroup.d.ts +1 -1
  67. package/lib/cjs/rating/item.js +3 -2
  68. package/lib/cjs/select/index.d.ts +10 -0
  69. package/lib/cjs/select/index.js +15 -9
  70. package/lib/cjs/table/Table.d.ts +1 -1
  71. package/lib/cjs/timePicker/TimePicker.d.ts +2 -2
  72. package/lib/cjs/timePicker/TimeShape.d.ts +1 -1
  73. package/lib/cjs/timePicker/index.d.ts +2 -2
  74. package/lib/cjs/timeline/item.d.ts +5 -2
  75. package/lib/cjs/timeline/item.js +13 -7
  76. package/lib/cjs/tree/treeNode.js +0 -2
  77. package/lib/cjs/treeSelect/index.js +1 -0
  78. package/lib/cjs/typography/title.d.ts +1 -1
  79. package/lib/cjs/upload/fileCard.d.ts +2 -0
  80. package/lib/cjs/upload/fileCard.js +70 -45
  81. package/lib/cjs/upload/index.d.ts +34 -4
  82. package/lib/cjs/upload/index.js +141 -25
  83. package/lib/cjs/upload/interface.d.ts +3 -0
  84. package/lib/es/_base/base.css +2 -2
  85. package/lib/es/_utils/index.d.ts +1 -0
  86. package/lib/es/_utils/index.js +3 -2
  87. package/lib/es/button/Button.d.ts +1 -0
  88. package/lib/es/button/buttonGroup.js +3 -3
  89. package/lib/es/cascader/index.d.ts +7 -0
  90. package/lib/es/cascader/index.js +34 -25
  91. package/lib/es/cascader/item.d.ts +2 -0
  92. package/lib/es/cascader/item.js +9 -2
  93. package/lib/es/checkbox/checkbox.js +4 -1
  94. package/lib/es/checkbox/checkboxGroup.d.ts +1 -0
  95. package/lib/es/checkbox/checkboxGroup.js +3 -1
  96. package/lib/es/datePicker/dateInput.d.ts +1 -1
  97. package/lib/es/datePicker/datePicker.d.ts +1 -1
  98. package/lib/es/datePicker/monthsGrid.d.ts +2 -1
  99. package/lib/es/datePicker/monthsGrid.js +6 -0
  100. package/lib/es/datePicker/navigation.js +48 -8
  101. package/lib/es/descriptions/item.js +1 -1
  102. package/lib/es/form/baseForm.d.ts +6 -0
  103. package/lib/es/form/field.d.ts +6 -0
  104. package/lib/es/form/hoc/withField.js +3 -1
  105. package/lib/es/locale/source/es.d.ts +7 -0
  106. package/lib/es/locale/source/es.js +157 -0
  107. package/lib/es/modal/Modal.d.ts +8 -8
  108. package/lib/es/modal/Modal.js +4 -4
  109. package/lib/es/modal/confirm.d.ts +10 -10
  110. package/lib/es/navigation/index.d.ts +2 -2
  111. package/lib/es/pagination/index.js +8 -4
  112. package/lib/es/radio/radio.d.ts +1 -1
  113. package/lib/es/radio/radio.js +1 -0
  114. package/lib/es/radio/radioGroup.d.ts +1 -1
  115. package/lib/es/rating/item.js +3 -2
  116. package/lib/es/select/index.d.ts +10 -0
  117. package/lib/es/select/index.js +19 -9
  118. package/lib/es/table/Table.d.ts +1 -1
  119. package/lib/es/timePicker/TimePicker.d.ts +2 -2
  120. package/lib/es/timePicker/TimeShape.d.ts +1 -1
  121. package/lib/es/timePicker/index.d.ts +2 -2
  122. package/lib/es/timeline/item.d.ts +5 -2
  123. package/lib/es/timeline/item.js +12 -7
  124. package/lib/es/tree/treeNode.js +0 -2
  125. package/lib/es/treeSelect/index.js +1 -0
  126. package/lib/es/typography/title.d.ts +1 -1
  127. package/lib/es/upload/fileCard.d.ts +2 -0
  128. package/lib/es/upload/fileCard.js +69 -44
  129. package/lib/es/upload/index.d.ts +34 -4
  130. package/lib/es/upload/index.js +141 -24
  131. package/lib/es/upload/interface.d.ts +3 -0
  132. package/locale/source/es.ts +160 -0
  133. package/modal/Modal.tsx +6 -6
  134. package/navigation/__test__/navigation.test.js +4 -4
  135. package/navigation/_story/AutoOpen/index.js +1 -1
  136. package/navigation/_story/WithChildren/index.js +1 -1
  137. package/navigation/_story/navigation.stories.js +1 -1
  138. package/navigation/_story/navigation.stories.tsx +4 -4
  139. package/navigation/index.tsx +2 -2
  140. package/package.json +16 -8
  141. package/pagination/_story/pagination.stories.js +11 -0
  142. package/pagination/index.tsx +9 -4
  143. package/popover/Arrow.tsx +1 -1
  144. package/radio/__test__/radioGroup.test.jsx +41 -6
  145. package/radio/_story/radio.stories.js +22 -11
  146. package/radio/radio.tsx +1 -0
  147. package/rating/item.tsx +2 -1
  148. package/select/_story/select.stories.js +39 -14
  149. package/select/index.tsx +21 -7
  150. package/table/_story/DynamicFilters/index.js +13 -16
  151. package/timeline/__test__/timeline.test.js +17 -1
  152. package/timeline/_story/timeline.stories.js +70 -6
  153. package/timeline/item.tsx +11 -6
  154. package/tooltip/_story/tooltip.stories.js +1 -1
  155. package/tree/_story/tree.stories.js +2 -2
  156. package/tree/treeNode.tsx +0 -2
  157. package/treeSelect/index.tsx +3 -2
  158. package/tsconfig.json +2 -1
  159. package/upload/__test__/upload.test.js +50 -1
  160. package/upload/fileCard.tsx +110 -95
  161. package/upload/index.tsx +155 -54
  162. package/upload/interface.ts +3 -0
@@ -0,0 +1,49 @@
1
+ body[data-page="a11y"] {
2
+ overflow: hidden;
3
+
4
+ #root {
5
+ padding: 0 !important;
6
+
7
+ .semi-slider {
8
+ padding: 0;
9
+ }
10
+
11
+ .rows-container > .semi-row {
12
+ margin-bottom: 24px;
13
+ }
14
+
15
+ .mt12 {
16
+ margin-top: 12px;
17
+ }
18
+
19
+ .mb12 {
20
+ margin-bottom: 12px;
21
+ }
22
+ }
23
+
24
+ .grid {
25
+
26
+ .semi-row,
27
+ .semi-row-flex {
28
+ text-align: center;
29
+
30
+ .semi-col {
31
+ min-height: 30px;
32
+ line-height: 30px;
33
+ background: var(--semi-color-primary-light-default);
34
+ outline: 1px solid var(--semi-color-primary-light-active);
35
+ }
36
+ }
37
+
38
+ &.grid-gutter {
39
+
40
+ .semi-col {
41
+
42
+ .gutter-box,
43
+ .col-content {
44
+ background: var(--semi-color-primary-light-hover);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
@@ -5,6 +5,7 @@ body {
5
5
  color: var(--semi-color-text-0);
6
6
  }
7
7
 
8
+
8
9
  // 给每个组件的 story 区域加个 padding,如果需要更大的 padding 可以在组件内自定义样式
9
10
  .sb-show-main.sb-main-padded {
10
11
 
@@ -1,6 +1,7 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { Button, Typography, Card, Tooltip, Tag, Avatar, Rating, Nav, Layout } from '../../index';
3
3
  import { IconHelpCircle, IconUser, IconStar, IconSetting } from '@douyinfe/semi-icons';
4
+ import SemiA11y from './a11y';
4
5
  import './index.scss';
5
6
 
6
7
  export default {
@@ -8,7 +9,8 @@ export default {
8
9
  };
9
10
 
10
11
  export {
11
- TestAlwaysDarkLight
12
+ TestAlwaysDarkLight,
13
+ SemiA11y
12
14
  };
13
15
 
14
16
  const TestAlwaysDarkLight = () => {
package/_utils/index.ts CHANGED
@@ -83,7 +83,7 @@ export const getHighLightTextHTML = ({
83
83
  const markEle = option.highlightTag || 'mark';
84
84
  const highlightClassName = option.highlightClassName || '';
85
85
  const highlightStyle = option.highlightStyle || {};
86
- return chunks.map((chunk: HighLightTextHTMLChunk) => {
86
+ return chunks.map((chunk: HighLightTextHTMLChunk, index: number) => {
87
87
  const { end, start, highlight } = chunk;
88
88
  const text = sourceString.substr(start, end - start);
89
89
  if (highlight) {
@@ -92,6 +92,7 @@ export const getHighLightTextHTML = ({
92
92
  {
93
93
  style: highlightStyle,
94
94
  className: highlightClassName,
95
+ key: text + index
95
96
  },
96
97
  text
97
98
  );
package/button/Button.tsx CHANGED
@@ -15,6 +15,7 @@ export type Theme = 'solid' | 'borderless' | 'light';
15
15
  export type Type = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';
16
16
 
17
17
  export interface ButtonProps {
18
+ id?: string;
18
19
  block?: boolean;
19
20
  circle?: boolean;
20
21
  disabled?: boolean;
@@ -1,4 +1,5 @@
1
1
  import Button from '../index';
2
+ import ButtonGroup from '../index';
2
3
  import { mount } from 'enzyme';
3
4
  import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
4
5
  import { IconEdit } from '@douyinfe/semi-icons';
@@ -46,4 +47,18 @@ describe('Button', () => {
46
47
  expect(elem.find(`.${BASE_CLASS_PREFIX}-button-content-left`).length).toBe(1);
47
48
  expect(elem.find(`.${BASE_CLASS_PREFIX}-button-content-right`).length).toBe(0);
48
49
  });
50
+
51
+ it(`button group with invalid child`, () => {
52
+ const buttonGroup = mount(
53
+ <ButtonGroup>
54
+ {false}
55
+ {null}
56
+ {undefined}
57
+ {1}
58
+ <Button>查询</Button>
59
+ <Button>剪切</Button>
60
+ </ButtonGroup>
61
+ );
62
+ expect(buttonGroup.getDOMNode().textContent).toEqual('1查询剪切');
63
+ });
49
64
  });
@@ -122,6 +122,19 @@ export const ButtonGroupDemo = () => (
122
122
  </Button>
123
123
  </ButtonGroup>
124
124
  <br />
125
+ <div>ButtonGroup children 不是合法元素的情况:</div>
126
+ <ButtonGroup>
127
+ {false}
128
+ {123}
129
+ {null}
130
+ {undefined}
131
+ text
132
+ <span>span</span>
133
+ {true && <Button>拷贝</Button>}
134
+ <Button>查询</Button>
135
+ <Button>剪切</Button>
136
+ </ButtonGroup>
137
+ <br />
125
138
  </div>
126
139
  );
127
140
 
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { isValidElement, cloneElement } from 'react';
2
2
  import BaseComponent, { BaseProps } from '../_base/baseComponent';
3
3
  import PropTypes from 'prop-types';
4
4
  import { cssClasses, strings } from '@douyinfe/semi-foundation/button/constants';
@@ -38,9 +38,11 @@ export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
38
38
  let inner;
39
39
 
40
40
  if (children) {
41
- inner = ((Array.isArray(children) ? children : [children]) as React.ReactElement[]).map((itm, index) =>
42
- React.cloneElement(itm, { disabled, size, type, ...itm.props, ...rest, key: index })
43
- );
41
+ inner = ((Array.isArray(children) ? children : [children])).map((itm, index) => (
42
+ isValidElement(itm)
43
+ ? cloneElement(itm, { disabled, size, type, ...itm.props, ...rest, key: index })
44
+ : itm
45
+ ));
44
46
  }
45
47
  return <div className={`${prefixCls}-group`}>{inner}</div>;
46
48
  }
@@ -997,6 +997,149 @@ describe('Cascader', () => {
997
997
  ).toEqual('美国');
998
998
  });
999
999
 
1000
+ it('multiple select enableLeafClick', () => {
1001
+ const cascaderWithMultiple = render({
1002
+ multiple: true,
1003
+ enableLeafClick: true,
1004
+ treeData: [
1005
+ {
1006
+ label: '北美洲',
1007
+ value: 'Beimeizhou',
1008
+ key: 'beimeizhou',
1009
+ children: [
1010
+ {
1011
+ label: '美国',
1012
+ value: 'Meiguo',
1013
+ key: 'meiguo',
1014
+ },
1015
+ {
1016
+ label: '加拿大',
1017
+ value: 'Jianada',
1018
+ key: 'jianada',
1019
+ },
1020
+ ],
1021
+ },
1022
+ {
1023
+ label: '南美洲',
1024
+ value: 'Nanmeiguo',
1025
+ key: 'Nanmeiguo',
1026
+ }
1027
+ ]
1028
+ })
1029
+ const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
1030
+ selectBox.simulate('click');
1031
+ // click checkbox
1032
+ cascaderWithMultiple
1033
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1034
+ .at(0)
1035
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1036
+ .at(1)
1037
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
1038
+ .at(0)
1039
+ .find(`.${BASE_CLASS_PREFIX}-checkbox`)
1040
+ .at(0)
1041
+ .simulate('click');
1042
+ expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
1043
+ // click option cancel checked
1044
+ cascaderWithMultiple
1045
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1046
+ .at(0)
1047
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1048
+ .at(1)
1049
+ .simulate('click')
1050
+ expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(0);
1051
+ // click option select
1052
+ cascaderWithMultiple
1053
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1054
+ .at(0)
1055
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1056
+ .at(0)
1057
+ .simulate('click')
1058
+ cascaderWithMultiple
1059
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1060
+ .at(1)
1061
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1062
+ .at(0)
1063
+ .simulate('click')
1064
+ expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
1065
+ const states = cascaderWithMultiple.state()
1066
+ cascaderWithMultiple.unmount();
1067
+ })
1068
+
1069
+ it('multiple select disable enableLeafClick', () => {
1070
+ const cascaderWithMultiple = render({
1071
+ multiple: true,
1072
+ treeData: [
1073
+ {
1074
+ label: '北美洲',
1075
+ value: 'Beimeizhou',
1076
+ key: 'beimeizhou',
1077
+ children: [
1078
+ {
1079
+ label: '美国',
1080
+ value: 'Meiguo',
1081
+ key: 'meiguo',
1082
+ },
1083
+ {
1084
+ label: '加拿大',
1085
+ value: 'Jianada',
1086
+ key: 'jianada',
1087
+ },
1088
+ ],
1089
+ },
1090
+ {
1091
+ label: '南美洲',
1092
+ value: 'Nanmeiguo',
1093
+ key: 'Nanmeiguo',
1094
+ }
1095
+ ]
1096
+ })
1097
+ const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
1098
+ selectBox.simulate('click');
1099
+ // click checkbox
1100
+ cascaderWithMultiple
1101
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1102
+ .at(0)
1103
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1104
+ .at(1)
1105
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
1106
+ .at(0)
1107
+ .find(`.${BASE_CLASS_PREFIX}-checkbox`)
1108
+ .at(0)
1109
+ .simulate('click');
1110
+ expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
1111
+ // click option can't cancel checked
1112
+ cascaderWithMultiple
1113
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
1114
+ .at(0)
1115
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
1116
+ .at(1)
1117
+ .simulate('click')
1118
+ expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
1119
+ cascaderWithMultiple.unmount();
1120
+ })
1121
+
1122
+ it('separator', () => {
1123
+ const cascader = render({
1124
+ filterTreeNode: true,
1125
+ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'],
1126
+ separator: ' > ',
1127
+ defaultOpen: true,
1128
+ });
1129
+ const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);
1130
+ expect(input.props().placeholder).toEqual('亚洲 > 中国 > 北京');
1131
+ const event = { target: { value: '中国' } };
1132
+ input.simulate('change', event);
1133
+ expect(
1134
+ cascader
1135
+ .find(`.${BASE_CLASS_PREFIX}-cascader-option-list li`)
1136
+ .at(0)
1137
+ .getDOMNode()
1138
+ .textContent
1139
+ ).toEqual('亚洲 > 中国 > 北京');
1140
+ cascader.unmount();
1141
+ });
1142
+
1000
1143
  it('triggerRender', () => {
1001
1144
  const spyTriggerRender = sinon.spy(() => <span>123</span>);
1002
1145
  const cascaderAutoMerge = render({
@@ -1027,4 +1170,82 @@ describe('Cascader', () => {
1027
1170
  expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0']));
1028
1171
  cascaderNoAutoMerge.unmount();
1029
1172
  });
1173
+
1174
+ it('autoMergeValue', () => {
1175
+ const cascader = render({
1176
+ multiple: true,
1177
+ autoMergeValue: false,
1178
+ defaultValue: 'Yazhou',
1179
+ });
1180
+ const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1181
+ expect(tags.length).toEqual(4);
1182
+ cascader.unmount();
1183
+
1184
+ const cascaderAutoMerge = render({
1185
+ multiple: true,
1186
+ autoMergeValue: true,
1187
+ defaultValue: 'Yazhou',
1188
+ });
1189
+ const tags2 = cascaderAutoMerge.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1190
+ expect(tags2.length).toEqual(1);
1191
+ expect(
1192
+ tags2
1193
+ .find(`.${BASE_CLASS_PREFIX}-tag-content`)
1194
+ .getDOMNode()
1195
+ .textContent
1196
+ ).toEqual('亚洲');
1197
+ cascaderAutoMerge.unmount();
1198
+ });
1199
+
1200
+ it('leafOnly', () => {
1201
+ /* autoMergeValue and leafOnly are both false */
1202
+ const cascader = render({
1203
+ multiple: true,
1204
+ autoMergeValue: false,
1205
+ leafOnly: false,
1206
+ defaultValue: 'Yazhou',
1207
+ });
1208
+ const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1209
+ expect(tags.length).toEqual(4);
1210
+ cascader.unmount();
1211
+
1212
+ /* autoMergeValue and leafOnly are both true */
1213
+ const cascader2 = render({
1214
+ multiple: true,
1215
+ autoMergeValue: true,
1216
+ leafOnly: true,
1217
+ defaultValue: 'Yazhou',
1218
+ });
1219
+ const tags2 = cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1220
+ expect(tags2.length).toEqual(2);
1221
+ cascader2.unmount();
1222
+
1223
+ /* autoMergeValue is false, leafOnly is true */
1224
+ const cascader3 = render({
1225
+ multiple: true,
1226
+ autoMergeValue: false,
1227
+ leafOnly: true,
1228
+ defaultValue: 'Yazhou',
1229
+ });
1230
+ const tags3 = cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1231
+ expect(tags3.length).toEqual(2);
1232
+ cascader3.unmount();
1233
+
1234
+ /* autoMergeValue is true, leafOnly is false */
1235
+ const cascader4 = render({
1236
+ multiple: true,
1237
+ autoMergeValue: true,
1238
+ leafOnly: false,
1239
+ defaultValue: 'Yazhou',
1240
+ });
1241
+ const tags4 = cascader4.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
1242
+ expect(tags4.length).toEqual(1);
1243
+ expect(
1244
+ tags4
1245
+ .find(`.${BASE_CLASS_PREFIX}-tag-content`)
1246
+ .getDOMNode()
1247
+ .textContent
1248
+ ).toEqual('亚洲');
1249
+ cascader4.unmount();
1250
+ });
1030
1251
  });
@@ -273,6 +273,25 @@ export const _Cascader = () => {
273
273
  />
274
274
  <br />
275
275
  <br />
276
+ <Cascader
277
+ style={{ width: 300 }}
278
+ treeData={treeData1}
279
+ placeholder="Multiple select"
280
+ multiple
281
+ motion={false}
282
+ />
283
+ <br />
284
+ <br />
285
+ <Cascader
286
+ style={{ width: 300 }}
287
+ treeData={treeData1}
288
+ placeholder="Multiple select enableLeafClick"
289
+ multiple
290
+ enableLeafClick
291
+ motion={false}
292
+ />
293
+ <br />
294
+ <br />
276
295
  <Cascader
277
296
  style={{ width: 300 }}
278
297
  treeData={[]}
@@ -374,6 +393,23 @@ export const Disabled = () => {
374
393
  filterTreeNode
375
394
  disabled
376
395
  />
396
+ <br /><br />
397
+ <Cascader
398
+ defaultValue={['yazhou', 'zhongguo']}
399
+ style={{ width: 300 }}
400
+ treeData={treeData2}
401
+ multiple
402
+ filterTreeNode
403
+ disabled
404
+ />
405
+ <br /><br />
406
+ <Cascader
407
+ defaultValue={['yazhou', 'zhongguo']}
408
+ style={{ width: 300 }}
409
+ treeData={treeData2}
410
+ multiple
411
+ disabled
412
+ />
377
413
  </div>
378
414
  );
379
415
  };
@@ -420,6 +456,20 @@ export const DisabledOption = () => {
420
456
  defaultValue={['yazhou', 'riben']}
421
457
  placeholder="Japan node is disabled"
422
458
  />
459
+ <br />
460
+ <br />
461
+ <div>multiple selection + filterTreeNode + defaultValue is disabled option</div>
462
+ <Cascader
463
+ filterTreeNode
464
+ multiple
465
+ style={{ width: 300 }}
466
+ treeData={treeData2}
467
+ defaultValue={[
468
+ ['yazhou', 'riben'],
469
+ ['beimeizhou', 'jianada']
470
+ ]}
471
+ placeholder="Japan node is disabled"
472
+ />
423
473
  </div>
424
474
  );
425
475
  };
@@ -1211,3 +1261,91 @@ export const OnChangeWithObject = () => (
1211
1261
  />
1212
1262
  </>
1213
1263
  );
1264
+
1265
+ export const LeafOnly = () => {
1266
+ const [value, setValue] = useState([])
1267
+ return (
1268
+ <div>
1269
+ <div>autoMergeValue=false,leafOnly=false</div>
1270
+ <Cascader
1271
+ style={{ width: 300 }}
1272
+ treeData={treeData4}
1273
+ placeholder="请选择所在地区"
1274
+ multiple
1275
+ autoMergeValue={false}
1276
+ leafOnly={false}
1277
+ defaultValue={['zhejiang']}
1278
+ />
1279
+ <br />
1280
+ <br />
1281
+ <div>autoMergeValue=false,leafOnly=true, leafOnly生效</div>
1282
+ <Cascader
1283
+ style={{ width: 300 }}
1284
+ treeData={treeData4}
1285
+ placeholder="请选择所在地区"
1286
+ multiple
1287
+ autoMergeValue={false}
1288
+ leafOnly={true}
1289
+ defaultValue={['zhejiang']}
1290
+ />
1291
+ <br />
1292
+ <br />
1293
+ <div>受控,autoMergeValue=false,leafOnly=true, leafOnly生效</div>
1294
+ <Cascader
1295
+ style={{ width: 300 }}
1296
+ treeData={treeData4}
1297
+ placeholder="请选择所在地区"
1298
+ multiple
1299
+ onChange={v=>{
1300
+ console.log(v);
1301
+ setValue(v)
1302
+ }}
1303
+ autoMergeValue={false}
1304
+ leafOnly={true}
1305
+ value={value}
1306
+ />
1307
+ <br />
1308
+ <br />
1309
+ <div>受控 onChangeWithObject, autoMergeValue=false,leafOnly=true, leafOnly生效</div>
1310
+ <Cascader
1311
+ style={{ width: 300 }}
1312
+ treeData={treeData4}
1313
+ placeholder="请选择所在地区"
1314
+ multiple
1315
+ onChange={v=>{
1316
+ console.log(v);
1317
+ setValue(v)
1318
+ }}
1319
+ onChangeWithObject
1320
+ autoMergeValue={false}
1321
+ leafOnly={true}
1322
+ value={value}
1323
+ />
1324
+ <br />
1325
+ <br />
1326
+ <div>autoMergeValue=true,leafOnly=false</div>
1327
+ <Cascader
1328
+ style={{ width: 300 }}
1329
+ treeData={treeData4}
1330
+ placeholder="请选择所在地区"
1331
+ multiple
1332
+ autoMergeValue={true}
1333
+ leafOnly={false}
1334
+ defaultValue={['zhejiang']}
1335
+ />
1336
+ <br />
1337
+ <br />
1338
+ <br />
1339
+ <div>autoMergeValue=true,leafOnly=true</div>
1340
+ <Cascader
1341
+ style={{ width: 300 }}
1342
+ treeData={treeData4}
1343
+ placeholder="请选择所在地区"
1344
+ multiple
1345
+ autoMergeValue={true}
1346
+ leafOnly={true}
1347
+ defaultValue={['zhejiang']}
1348
+ />
1349
+ </div>
1350
+ );
1351
+ }