@douyinfe/semi-ui 2.5.1 → 2.7.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 (111) hide show
  1. package/button/__test__/button.test.js +7 -0
  2. package/button/buttonGroup.tsx +5 -2
  3. package/calendar/monthCalendar.tsx +14 -13
  4. package/cascader/__test__/cascader.test.js +159 -81
  5. package/cascader/_story/cascader.stories.js +36 -23
  6. package/cascader/index.tsx +47 -8
  7. package/cascader/item.tsx +25 -5
  8. package/datePicker/_story/v2/InsetInput.jsx +104 -0
  9. package/datePicker/_story/v2/InsetInputE2E.jsx +69 -0
  10. package/datePicker/_story/v2/index.js +2 -0
  11. package/datePicker/dateInput.tsx +102 -13
  12. package/datePicker/datePicker.tsx +95 -16
  13. package/datePicker/index.tsx +15 -0
  14. package/datePicker/insetInput.tsx +76 -0
  15. package/datePicker/month.tsx +14 -7
  16. package/datePicker/monthsGrid.tsx +31 -12
  17. package/datePicker/navigation.tsx +8 -4
  18. package/datePicker/quickControl.tsx +1 -0
  19. package/datePicker/yearAndMonth.tsx +1 -1
  20. package/dist/css/semi.css +120 -8
  21. package/dist/css/semi.min.css +1 -1
  22. package/dist/umd/semi-ui.js +1100 -193
  23. package/dist/umd/semi-ui.js.map +1 -1
  24. package/dist/umd/semi-ui.min.js +1 -1
  25. package/dist/umd/semi-ui.min.js.map +1 -1
  26. package/form/hoc/withField.tsx +1 -1
  27. package/input/_story/input.stories.js +13 -0
  28. package/lib/cjs/_base/base.css +5 -5
  29. package/lib/cjs/button/buttonGroup.d.ts +1 -0
  30. package/lib/cjs/button/buttonGroup.js +6 -2
  31. package/lib/cjs/calendar/monthCalendar.js +21 -5
  32. package/lib/cjs/cascader/index.d.ts +10 -2
  33. package/lib/cjs/cascader/index.js +52 -10
  34. package/lib/cjs/cascader/item.d.ts +6 -2
  35. package/lib/cjs/cascader/item.js +33 -4
  36. package/lib/cjs/datePicker/dateInput.d.ts +9 -4
  37. package/lib/cjs/datePicker/dateInput.js +107 -13
  38. package/lib/cjs/datePicker/datePicker.d.ts +7 -2
  39. package/lib/cjs/datePicker/datePicker.js +138 -30
  40. package/lib/cjs/datePicker/index.js +24 -2
  41. package/lib/cjs/datePicker/insetInput.d.ts +21 -0
  42. package/lib/cjs/datePicker/insetInput.js +80 -0
  43. package/lib/cjs/datePicker/month.d.ts +1 -0
  44. package/lib/cjs/datePicker/month.js +18 -2
  45. package/lib/cjs/datePicker/monthsGrid.js +35 -11
  46. package/lib/cjs/datePicker/navigation.js +8 -0
  47. package/lib/cjs/datePicker/quickControl.js +1 -0
  48. package/lib/cjs/datePicker/yearAndMonth.js +1 -0
  49. package/lib/cjs/form/hoc/withField.js +1 -1
  50. package/lib/cjs/navigation/Item.d.ts +2 -2
  51. package/lib/cjs/navigation/Item.js +8 -6
  52. package/lib/cjs/navigation/SubNav.js +2 -2
  53. package/lib/cjs/scrollList/scrollItem.d.ts +2 -1
  54. package/lib/cjs/scrollList/scrollItem.js +13 -3
  55. package/lib/cjs/table/Body/index.d.ts +2 -0
  56. package/lib/cjs/table/Body/index.js +13 -4
  57. package/lib/cjs/tree/index.js +5 -3
  58. package/lib/cjs/tree/interface.d.ts +1 -0
  59. package/lib/cjs/tree/nodeList.js +2 -1
  60. package/lib/cjs/treeSelect/index.js +7 -3
  61. package/lib/es/_base/base.css +5 -5
  62. package/lib/es/button/buttonGroup.d.ts +1 -0
  63. package/lib/es/button/buttonGroup.js +5 -2
  64. package/lib/es/calendar/monthCalendar.js +22 -5
  65. package/lib/es/cascader/index.d.ts +10 -2
  66. package/lib/es/cascader/index.js +49 -7
  67. package/lib/es/cascader/item.d.ts +6 -2
  68. package/lib/es/cascader/item.js +31 -4
  69. package/lib/es/datePicker/dateInput.d.ts +9 -4
  70. package/lib/es/datePicker/dateInput.js +106 -13
  71. package/lib/es/datePicker/datePicker.d.ts +7 -2
  72. package/lib/es/datePicker/datePicker.js +139 -30
  73. package/lib/es/datePicker/index.js +20 -0
  74. package/lib/es/datePicker/insetInput.d.ts +21 -0
  75. package/lib/es/datePicker/insetInput.js +65 -0
  76. package/lib/es/datePicker/month.d.ts +1 -0
  77. package/lib/es/datePicker/month.js +18 -2
  78. package/lib/es/datePicker/monthsGrid.js +35 -11
  79. package/lib/es/datePicker/navigation.js +8 -0
  80. package/lib/es/datePicker/quickControl.js +2 -0
  81. package/lib/es/datePicker/yearAndMonth.js +1 -0
  82. package/lib/es/form/hoc/withField.js +1 -1
  83. package/lib/es/navigation/Item.d.ts +2 -2
  84. package/lib/es/navigation/Item.js +8 -6
  85. package/lib/es/navigation/SubNav.js +2 -2
  86. package/lib/es/scrollList/scrollItem.d.ts +2 -1
  87. package/lib/es/scrollList/scrollItem.js +13 -3
  88. package/lib/es/table/Body/index.d.ts +2 -0
  89. package/lib/es/table/Body/index.js +13 -4
  90. package/lib/es/tree/index.js +5 -3
  91. package/lib/es/tree/interface.d.ts +1 -0
  92. package/lib/es/tree/nodeList.js +2 -1
  93. package/lib/es/treeSelect/index.js +7 -3
  94. package/navigation/Item.tsx +15 -12
  95. package/navigation/SubNav.tsx +4 -4
  96. package/package.json +9 -9
  97. package/scrollList/_story/ScrollList/index.js +3 -0
  98. package/scrollList/_story/WheelList/index.js +3 -0
  99. package/scrollList/scrollItem.tsx +30 -9
  100. package/table/Body/index.tsx +15 -4
  101. package/table/__test__/table.test.js +18 -0
  102. package/table/_story/v2/FixedExpandedRow/index.jsx +95 -0
  103. package/table/_story/v2/index.js +2 -1
  104. package/tree/__test__/tree.test.js +87 -2
  105. package/tree/_story/tree.stories.js +65 -5
  106. package/tree/index.tsx +4 -2
  107. package/tree/interface.ts +1 -0
  108. package/tree/nodeList.tsx +2 -2
  109. package/treeSelect/__test__/treeSelect.test.js +28 -0
  110. package/treeSelect/_story/treeSelect.stories.js +55 -2
  111. package/treeSelect/index.tsx +11 -3
@@ -499,7 +499,7 @@ function withField<
499
499
  text={label || field}
500
500
  id={labelId}
501
501
  required={required}
502
- name={name || field}
502
+ name={a11yId || name || field}
503
503
  width={mergeLabelWidth}
504
504
  align={mergeLabelAlign}
505
505
  {...needSpread}
@@ -884,4 +884,17 @@ export const ClearButton = () => {
884
884
 
885
885
  ClearButton.story = {
886
886
  name: 'clear button',
887
+ };
888
+
889
+ export const InputFocus = () => {
890
+ const ref = React.useRef();
891
+ const handleClick = () => {
892
+ ref.current.focus();
893
+ };
894
+ return (
895
+ <>
896
+ <Button onClick={handleClick}>focus input</Button>
897
+ <Input ref={ref} onChange={() => console.log('ref', ref) } onFocus={() => console.log('focus')} />
898
+ </>
899
+ );
887
900
  };
@@ -19,7 +19,7 @@ body .semi-always-light {
19
19
  --semi-blue-2: 152,205,253;
20
20
  --semi-blue-3: 101,178,252;
21
21
  --semi-blue-4: 50,149,251;
22
- --semi-blue-5: 0,119,250;
22
+ --semi-blue-5: 0,100,250;
23
23
  --semi-blue-6: 0,98,214;
24
24
  --semi-blue-7: 0,79,179;
25
25
  --semi-blue-8: 0,61,143;
@@ -410,7 +410,7 @@ body, body[theme-mode=dark] .semi-always-light {
410
410
  --semi-color-bg-4: rgba(var(--semi-white), 1);
411
411
  --semi-color-text-0: rgba(var(--semi-grey-9), 1);
412
412
  --semi-color-text-1: rgba(var(--semi-grey-9), .8);
413
- --semi-color-text-2: rgba(var(--semi-grey-9), .6);
413
+ --semi-color-text-2: rgba(var(--semi-grey-9), .62);
414
414
  --semi-color-text-3: rgba(var(--semi-grey-9), .35);
415
415
  --semi-shadow-elevated: 0 0 1px rgba(0, 0, 0, .3), 0 4px 14px rgba(0, 0, 0, .1);
416
416
  --semi-border-radius-extra-small: 3px;
@@ -487,9 +487,9 @@ body[theme-mode=dark], body .semi-always-dark {
487
487
  --semi-color-nav-bg: rgba(35, 36, 41, 1);
488
488
  --semi-shadow-elevated: inset 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 14px rgba(0, 0, 0, .25);
489
489
  --semi-color-overlay-bg: rgba(22, 22, 26, .6);
490
- --semi-color-fill-0: rgba(var(--semi-white), .05);
491
- --semi-color-fill-1: rgba(var(--semi-white), .09);
492
- --semi-color-fill-2: rgba(var(--semi-white), .13);
490
+ --semi-color-fill-0: rgba(var(--semi-white), .12);
491
+ --semi-color-fill-1: rgba(var(--semi-white), .16);
492
+ --semi-color-fill-2: rgba(var(--semi-white), .20);
493
493
  --semi-color-border: rgba(var(--semi-white), .08);
494
494
  --semi-color-shadow: rgba(var(--semi-black), .04);
495
495
  --semi-color-bg-0: rgba(22, 22, 26, 1);
@@ -9,6 +9,7 @@ export interface ButtonGroupProps extends BaseProps {
9
9
  type?: Type;
10
10
  size?: Size;
11
11
  theme?: Theme;
12
+ className?: string;
12
13
  'aria-label'?: React.AriaAttributes['aria-label'];
13
14
  }
14
15
  export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
@@ -30,6 +30,8 @@ var _baseComponent = _interopRequireDefault(require("../_base/baseComponent"));
30
30
 
31
31
  var _propTypes = _interopRequireDefault(require("prop-types"));
32
32
 
33
+ var _classnames = _interopRequireDefault(require("classnames"));
34
+
33
35
  var _constants = require("@douyinfe/semi-foundation/lib/cjs/button/constants");
34
36
 
35
37
  require("@douyinfe/semi-foundation/lib/cjs/button/button.css");
@@ -60,11 +62,13 @@ class ButtonGroup extends _baseComponent.default {
60
62
  disabled,
61
63
  size,
62
64
  type,
65
+ className,
63
66
  'aria-label': ariaLabel
64
67
  } = _a,
65
- rest = __rest(_a, ["children", "disabled", "size", "type", 'aria-label']);
68
+ rest = __rest(_a, ["children", "disabled", "size", "type", "className", 'aria-label']);
66
69
 
67
70
  let inner;
71
+ const cls = (0, _classnames.default)("".concat(prefixCls, "-group"), className);
68
72
 
69
73
  if (children) {
70
74
  var _context;
@@ -79,7 +83,7 @@ class ButtonGroup extends _baseComponent.default {
79
83
  }
80
84
 
81
85
  return /*#__PURE__*/_react.default.createElement("div", {
82
- className: "".concat(prefixCls, "-group"),
86
+ className: cls,
83
87
  role: "group",
84
88
  "aria-label": ariaLabel
85
89
  }, inner);
@@ -52,6 +52,7 @@ var _iconButton = _interopRequireDefault(require("../iconButton"));
52
52
 
53
53
  require("@douyinfe/semi-foundation/lib/cjs/calendar/calendar.css");
54
54
 
55
+ /* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */
55
56
  // eslint-disable-next-line max-len
56
57
  const toPercent = num => {
57
58
  const res = num < 1 ? num * 100 : 100;
@@ -95,11 +96,13 @@ class monthCalendar extends _baseComponent.default {
95
96
  } = this.props;
96
97
  this.monthlyData = this.foundation.getMonthlyData(displayValue, dateFnsLocale);
97
98
  return /*#__PURE__*/_react.default.createElement("div", {
98
- className: "".concat(prefixCls, "-header")
99
+ className: "".concat(prefixCls, "-header"),
100
+ role: "presentation"
99
101
  }, /*#__PURE__*/_react.default.createElement("div", {
100
- role: "gridcell",
102
+ role: "presentation",
101
103
  className: "".concat(prefixCls, "-grid")
102
104
  }, /*#__PURE__*/_react.default.createElement("ul", {
105
+ role: "row",
103
106
  className: "".concat(prefixCls, "-grid-row")
104
107
  }, (0, _map.default)(_context = this.monthlyData[0]).call(_context, day => {
105
108
  const {
@@ -109,6 +112,8 @@ class monthCalendar extends _baseComponent.default {
109
112
  ["".concat(_constants.cssClasses.PREFIX, "-weekend")]: markWeekend && day.isWeekend
110
113
  });
111
114
  return /*#__PURE__*/_react.default.createElement("li", {
115
+ role: "columnheader",
116
+ "aria-label": weekday,
112
117
  key: "".concat(weekday, "-monthheader"),
113
118
  className: listCls
114
119
  }, /*#__PURE__*/_react.default.createElement("span", null, weekday));
@@ -195,7 +200,10 @@ class monthCalendar extends _baseComponent.default {
195
200
 
196
201
  const text = /*#__PURE__*/_react.default.createElement(_localeConsumer.default, {
197
202
  componentName: "Calendar"
198
- }, locale => /*#__PURE__*/_react.default.createElement("div", {
203
+ }, locale =>
204
+ /*#__PURE__*/
205
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
206
+ _react.default.createElement("div", {
199
207
  className: "".concat(cardCls, "-wrapper"),
200
208
  style: {
201
209
  bottom: 0
@@ -264,11 +272,12 @@ class monthCalendar extends _baseComponent.default {
264
272
  day
265
273
  } = events;
266
274
  return /*#__PURE__*/_react.default.createElement("div", {
267
- role: "gridcell",
275
+ role: "presentation",
268
276
  className: "".concat(prefixCls, "-weekrow"),
269
277
  ref: _this.cellDom,
270
278
  key: "".concat(index, "-weekrow")
271
279
  }, /*#__PURE__*/_react.default.createElement("ul", {
280
+ role: "row",
272
281
  className: "".concat(prefixCls, "-skeleton")
273
282
  }, (0, _map.default)(weekDay).call(weekDay, each => {
274
283
  const {
@@ -288,6 +297,9 @@ class monthCalendar extends _baseComponent.default {
288
297
  const shouldRenderCollapsed = Boolean(day && day[ind] && day[ind].length > itemLimit);
289
298
 
290
299
  const inner = /*#__PURE__*/_react.default.createElement("li", {
300
+ role: "gridcell",
301
+ "aria-label": date.toLocaleDateString(),
302
+ "aria-current": isToday ? "date" : false,
291
303
  key: "".concat(date, "-weeksk"),
292
304
  className: listCls,
293
305
  onClick: e => _this.handleClick(e, [date])
@@ -310,9 +322,10 @@ class monthCalendar extends _baseComponent.default {
310
322
  parsedEvents
311
323
  } = this.state;
312
324
  return /*#__PURE__*/_react.default.createElement("div", {
313
- role: "gridcell",
325
+ role: "presentation",
314
326
  className: "".concat(prefixCls, "-week")
315
327
  }, /*#__PURE__*/_react.default.createElement("ul", {
328
+ role: "presentation",
316
329
  className: "".concat(prefixCls, "-grid-col")
317
330
  }, (0, _map.default)(_context3 = (0, _keys.default)(this.monthlyData)).call(_context3, weekInd => this.renderWeekRow(weekInd, this.monthlyData[weekInd], parsedEvents[weekInd]))));
318
331
  };
@@ -439,12 +452,15 @@ class monthCalendar extends _baseComponent.default {
439
452
  return /*#__PURE__*/_react.default.createElement(_localeConsumer.default, {
440
453
  componentName: "Calendar"
441
454
  }, (locale, localeCode, dateFnsLocale) => /*#__PURE__*/_react.default.createElement("div", {
455
+ role: "grid",
442
456
  className: monthCls,
443
457
  key: this.state.itemLimit,
444
458
  style: monthStyle
445
459
  }, /*#__PURE__*/_react.default.createElement("div", {
460
+ role: "presentation",
446
461
  className: "".concat(prefixCls, "-sticky-top")
447
462
  }, header, this.renderHeader(dateFnsLocale)), /*#__PURE__*/_react.default.createElement("div", {
463
+ role: "presentation",
448
464
  className: "".concat(prefixCls, "-grid-wrapper")
449
465
  }, this.renderMonthGrid())));
450
466
  }
@@ -1,4 +1,4 @@
1
- import React, { ReactNode, CSSProperties, MouseEvent } from 'react';
1
+ import React, { ReactNode, CSSProperties, MouseEvent, KeyboardEvent } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { BasicCascaderInnerData, BasicCascaderProps, BasicTriggerRenderProps, BasicScrollPanelProps, CascaderAdapter, CascaderType } from '@douyinfe/semi-foundation/lib/cjs/cascader/foundation';
4
4
  import '@douyinfe/semi-foundation/lib/cjs/cascader/cascader.css';
@@ -24,6 +24,7 @@ export interface CascaderProps extends BasicCascaderProps {
24
24
  'aria-invalid'?: React.AriaAttributes['aria-invalid'];
25
25
  'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
26
26
  'aria-required'?: React.AriaAttributes['aria-required'];
27
+ 'aria-label'?: React.AriaAttributes['aria-label'];
27
28
  arrowIcon?: ReactNode;
28
29
  defaultValue?: Value;
29
30
  dropdownStyle?: CSSProperties;
@@ -65,6 +66,7 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
65
66
  'aria-errormessage': PropTypes.Requireable<string>;
66
67
  'aria-describedby': PropTypes.Requireable<string>;
67
68
  'aria-required': PropTypes.Requireable<boolean>;
69
+ 'aria-label': PropTypes.Requireable<string>;
68
70
  arrowIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
69
71
  changeOnSelect: PropTypes.Requireable<boolean>;
70
72
  defaultValue: PropTypes.Requireable<string | any[]>;
@@ -158,6 +160,7 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
158
160
  onDropdownVisibleChange: (...args: any[]) => void;
159
161
  onListScroll: (...args: any[]) => void;
160
162
  enableLeafClick: boolean;
163
+ 'aria-label': string;
161
164
  };
162
165
  options: any;
163
166
  isEmpty: boolean;
@@ -177,13 +180,14 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
177
180
  renderTagItem: (value: string | Array<string>, idx: number, type: string) => React.ReactNode;
178
181
  renderTagInput(): JSX.Element;
179
182
  renderInput(): JSX.Element;
180
- handleItemClick: (e: MouseEvent, item: Entity | Data) => void;
183
+ handleItemClick: (e: MouseEvent | KeyboardEvent, item: Entity | Data) => void;
181
184
  handleItemHover: (e: MouseEvent, item: Entity) => void;
182
185
  onItemCheckboxClick: (item: Entity | Data) => void;
183
186
  handleListScroll: (e: React.UIEvent<HTMLUListElement, UIEvent>, ind: number) => void;
184
187
  renderContent: () => JSX.Element;
185
188
  renderPlusN: (hiddenTag: Array<ReactNode>) => JSX.Element;
186
189
  renderMultipleTags: () => JSX.Element;
190
+ renderDisplayText: () => ReactNode;
187
191
  renderSelectContent: () => JSX.Element;
188
192
  renderSuffix: () => JSX.Element;
189
193
  renderPrefix: () => JSX.Element;
@@ -191,6 +195,10 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
191
195
  handleMouseOver: () => void;
192
196
  handleMouseLeave: () => void;
193
197
  handleClear: (e: MouseEvent) => void;
198
+ /**
199
+ * A11y: simulate clear button click
200
+ */
201
+ handleClearEnterPress: (e: KeyboardEvent) => void;
194
202
  showClearBtn: () => boolean;
195
203
  renderClearBtn: () => JSX.Element;
196
204
  renderArrow: () => JSX.Element;
@@ -20,14 +20,14 @@ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-sta
20
20
 
21
21
  var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
22
22
 
23
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
24
+
23
25
  var _set = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set"));
24
26
 
25
27
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
26
28
 
27
29
  var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
28
30
 
29
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
30
-
31
31
  var _flatten2 = _interopRequireDefault(require("lodash/flatten"));
32
32
 
33
33
  var _noop2 = _interopRequireDefault(require("lodash/noop"));
@@ -66,7 +66,7 @@ var _util = require("@douyinfe/semi-foundation/lib/cjs/cascader/util");
66
66
 
67
67
  var _treeUtil = require("@douyinfe/semi-foundation/lib/cjs/tree/treeUtil");
68
68
 
69
- var _context4 = _interopRequireDefault(require("../configProvider/context"));
69
+ var _context5 = _interopRequireDefault(require("../configProvider/context"));
70
70
 
71
71
  var _baseComponent = _interopRequireDefault(require("../_base/baseComponent"));
72
72
 
@@ -267,6 +267,36 @@ class Cascader extends _baseComponent.default {
267
267
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, displayTag, !(0, _isEmpty2.default)(hiddenTag) && this.renderPlusN(hiddenTag));
268
268
  };
269
269
 
270
+ this.renderDisplayText = () => {
271
+ const {
272
+ displayProp,
273
+ separator,
274
+ displayRender
275
+ } = this.props;
276
+ const {
277
+ selectedKeys
278
+ } = this.state;
279
+ let displayText = '';
280
+
281
+ if (selectedKeys.size) {
282
+ const displayPath = this.foundation.getItemPropPath([...selectedKeys][0], displayProp);
283
+
284
+ if (displayRender && typeof displayRender === 'function') {
285
+ displayText = displayRender(displayPath);
286
+ } else {
287
+ displayText = (0, _map.default)(displayPath).call(displayPath, (path, index) => {
288
+ var _context3;
289
+
290
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, {
291
+ key: (0, _concat.default)(_context3 = "".concat(path, "-")).call(_context3, index)
292
+ }, index < displayPath.length - 1 ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, path, separator) : path);
293
+ });
294
+ }
295
+ }
296
+
297
+ return displayText;
298
+ };
299
+
270
300
  this.renderSelectContent = () => {
271
301
  const {
272
302
  placeholder,
@@ -274,7 +304,6 @@ class Cascader extends _baseComponent.default {
274
304
  multiple
275
305
  } = this.props;
276
306
  const {
277
- selectedKeys,
278
307
  checkedKeys
279
308
  } = this.state;
280
309
  const searchable = Boolean(filterTreeNode);
@@ -289,9 +318,9 @@ class Cascader extends _baseComponent.default {
289
318
 
290
319
  return this.renderMultipleTags();
291
320
  } else {
292
- const displayText = selectedKeys.size ? this.foundation.renderDisplayText([...selectedKeys][0]) : '';
321
+ const displayText = this.renderDisplayText();
293
322
  const spanCls = (0, _classnames.default)({
294
- ["".concat(prefixcls, "-selection-placeholder")]: !displayText || !displayText.length
323
+ ["".concat(prefixcls, "-selection-placeholder")]: !displayText
295
324
  });
296
325
  return /*#__PURE__*/_react.default.createElement("span", {
297
326
  className: spanCls
@@ -387,6 +416,15 @@ class Cascader extends _baseComponent.default {
387
416
  e && e.stopPropagation();
388
417
  this.foundation.handleClear();
389
418
  };
419
+ /**
420
+ * A11y: simulate clear button click
421
+ */
422
+
423
+
424
+ this.handleClearEnterPress = e => {
425
+ e && e.stopPropagation();
426
+ this.foundation.handleClearEnterPress();
427
+ };
390
428
 
391
429
  this.showClearBtn = () => {
392
430
  const {
@@ -413,6 +451,7 @@ class Cascader extends _baseComponent.default {
413
451
  return /*#__PURE__*/_react.default.createElement("div", {
414
452
  className: clearCls,
415
453
  onClick: this.handleClear,
454
+ onKeyPress: this.handleClearEnterPress,
416
455
  role: 'button',
417
456
  tabIndex: 0
418
457
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClear, null));
@@ -502,6 +541,7 @@ class Cascader extends _baseComponent.default {
502
541
  style: style,
503
542
  ref: this.triggerRef,
504
543
  onClick: e => this.foundation.handleClick(e),
544
+ onKeyPress: e => this.foundation.handleSelectionEnterPress(e),
505
545
  "aria-invalid": this.props['aria-invalid'],
506
546
  "aria-errormessage": this.props['aria-errormessage'],
507
547
  "aria-label": this.props['aria-label'],
@@ -824,7 +864,7 @@ class Cascader extends _baseComponent.default {
824
864
  }
825
865
 
826
866
  renderTagInput() {
827
- var _context3;
867
+ var _context4;
828
868
 
829
869
  const {
830
870
  size,
@@ -843,7 +883,7 @@ class Cascader extends _baseComponent.default {
843
883
  const tagInputcls = (0, _classnames.default)("".concat(prefixcls, "-tagInput-wrapper"));
844
884
  const tagValue = [];
845
885
  const realKeys = this.mergeType === _constants.strings.NONE_MERGE_TYPE ? checkedKeys : resolvedCheckedKeys;
846
- (0, _forEach.default)(_context3 = [...realKeys]).call(_context3, checkedKey => {
886
+ (0, _forEach.default)(_context4 = [...realKeys]).call(_context4, checkedKey => {
847
887
  if (!(0, _isEmpty2.default)(keyEntities[checkedKey])) {
848
888
  tagValue.push(keyEntities[checkedKey].valuePath);
849
889
  }
@@ -934,13 +974,14 @@ class Cascader extends _baseComponent.default {
934
974
 
935
975
  }
936
976
 
937
- Cascader.contextType = _context4.default;
977
+ Cascader.contextType = _context5.default;
938
978
  Cascader.propTypes = {
939
979
  'aria-labelledby': _propTypes.default.string,
940
980
  'aria-invalid': _propTypes.default.bool,
941
981
  'aria-errormessage': _propTypes.default.string,
942
982
  'aria-describedby': _propTypes.default.string,
943
983
  'aria-required': _propTypes.default.bool,
984
+ 'aria-label': _propTypes.default.string,
944
985
  arrowIcon: _propTypes.default.node,
945
986
  changeOnSelect: _propTypes.default.bool,
946
987
  defaultValue: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.array]),
@@ -1035,7 +1076,8 @@ Cascader.defaultProps = {
1035
1076
  onClear: _noop2.default,
1036
1077
  onDropdownVisibleChange: _noop2.default,
1037
1078
  onListScroll: _noop2.default,
1038
- enableLeafClick: false
1079
+ enableLeafClick: false,
1080
+ 'aria-label': 'Cascader'
1039
1081
  };
1040
1082
  var _default = Cascader;
1041
1083
  exports.default = _default;
@@ -22,7 +22,7 @@ export interface CascaderItemProps {
22
22
  selectedKeys: Set<string>;
23
23
  loadedKeys: Set<string>;
24
24
  loadingKeys: Set<string>;
25
- onItemClick: (e: React.MouseEvent, item: Entity | Data) => void;
25
+ onItemClick: (e: React.MouseEvent | React.KeyboardEvent, item: Entity | Data) => void;
26
26
  onItemHover: (e: React.MouseEvent, item: Entity) => void;
27
27
  showNext: ShowNextType;
28
28
  onItemCheckboxClick: (item: Entity | Data) => void;
@@ -57,7 +57,11 @@ export default class Item extends PureComponent<CascaderItemProps> {
57
57
  static defaultProps: {
58
58
  empty: boolean;
59
59
  };
60
- onClick: (e: React.MouseEvent, item: Entity | Data) => void;
60
+ onClick: (e: React.MouseEvent | React.KeyboardEvent, item: Entity | Data) => void;
61
+ /**
62
+ * A11y: simulate item click
63
+ */
64
+ handleItemEnterPress: (keyboardEvent: React.KeyboardEvent, item: Entity | Data) => void;
61
65
  onHover: (e: React.MouseEvent, item: Entity) => void;
62
66
  onCheckboxChange: (e: CheckboxEvent, item: Entity | Data) => void;
63
67
  getItemStatus: (key: string) => {
@@ -20,6 +20,8 @@ var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-st
20
20
 
21
21
  var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
22
22
 
23
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
24
+
23
25
  var _includes2 = _interopRequireDefault(require("lodash/includes"));
24
26
 
25
27
  var _react = _interopRequireWildcard(require("react"));
@@ -30,6 +32,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
30
32
 
31
33
  var _constants = require("@douyinfe/semi-foundation/lib/cjs/cascader/constants");
32
34
 
35
+ var _isEnterPress = _interopRequireDefault(require("@douyinfe/semi-foundation/lib/cjs/utils/isEnterPress"));
36
+
33
37
  var _context7 = _interopRequireDefault(require("../configProvider/context"));
34
38
 
35
39
  var _localeConsumer = _interopRequireDefault(require("../locale/localeConsumer"));
@@ -61,6 +65,16 @@ class Item extends _react.PureComponent {
61
65
 
62
66
  onItemClick(e, item);
63
67
  };
68
+ /**
69
+ * A11y: simulate item click
70
+ */
71
+
72
+
73
+ this.handleItemEnterPress = (keyboardEvent, item) => {
74
+ if ((0, _isEnterPress.default)(keyboardEvent)) {
75
+ this.onClick(keyboardEvent, item);
76
+ }
77
+ };
64
78
 
65
79
  this.onHover = (e, item) => {
66
80
  const {
@@ -140,6 +154,7 @@ class Item extends _react.PureComponent {
140
154
 
141
155
  case 'empty':
142
156
  return /*#__PURE__*/_react.default.createElement("span", {
157
+ "aria-hidden": true,
143
158
  className: (0, _concat.default)(_context3 = "".concat(prefixcls, "-icon ")).call(_context3, prefixcls, "-icon-empty")
144
159
  });
145
160
 
@@ -202,11 +217,13 @@ class Item extends _react.PureComponent {
202
217
  ["".concat(prefixcls, "-disabled")]: disabled
203
218
  });
204
219
  return /*#__PURE__*/_react.default.createElement("li", {
220
+ role: 'menuitem',
205
221
  className: className,
206
222
  key: key,
207
223
  onClick: e => {
208
224
  this.onClick(e, item);
209
- }
225
+ },
226
+ onKeyPress: e => this.handleItemEnterPress(e, item)
210
227
  }, /*#__PURE__*/_react.default.createElement("span", {
211
228
  className: "".concat(prefixcls, "-label")
212
229
  }, !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/_react.default.createElement(_checkbox.default, {
@@ -232,13 +249,15 @@ class Item extends _react.PureComponent {
232
249
  let showChildItem;
233
250
  const ind = content.length;
234
251
  content.push( /*#__PURE__*/_react.default.createElement("ul", {
252
+ role: 'menu',
235
253
  className: "".concat(prefixcls, "-list"),
236
254
  key: renderData[0].key,
237
255
  onScroll: e => this.props.onListScroll(e, ind)
238
256
  }, (0, _map.default)(renderData).call(renderData, item => {
239
257
  const {
240
258
  data,
241
- key
259
+ key,
260
+ parentKey
242
261
  } = item;
243
262
  const {
244
263
  children,
@@ -263,16 +282,26 @@ class Item extends _react.PureComponent {
263
282
  ["".concat(prefixcls, "-select")]: selected && !multiple,
264
283
  ["".concat(prefixcls, "-disabled")]: disabled
265
284
  });
266
- return /*#__PURE__*/_react.default.createElement("li", {
285
+ const otherAriaProps = parentKey ? {
286
+ ['aria-owns']: "cascaderItem-".concat(parentKey)
287
+ } : {};
288
+ return /*#__PURE__*/_react.default.createElement("li", (0, _assign.default)({
289
+ role: 'menuitem',
290
+ id: "cascaderItem-".concat(key),
291
+ "aria-expanded": active,
292
+ "aria-haspopup": Boolean(showExpand),
293
+ "aria-disabled": disabled
294
+ }, otherAriaProps, {
267
295
  className: className,
268
296
  key: key,
269
297
  onClick: e => {
270
298
  this.onClick(e, item);
271
299
  },
300
+ onKeyPress: e => this.handleItemEnterPress(e, item),
272
301
  onMouseEnter: e => {
273
302
  this.onHover(e, item);
274
303
  }
275
- }, /*#__PURE__*/_react.default.createElement("span", {
304
+ }), /*#__PURE__*/_react.default.createElement("span", {
276
305
  className: "".concat(prefixcls, "-label")
277
306
  }, selected && !multiple && this.renderIcon('tick'), !selected && !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/_react.default.createElement(_checkbox.default, {
278
307
  onChange: e => this.onCheckboxChange(e, item),
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import DateInputFoundation, { DateInputAdapter, DateInputFoundationProps, RangeType } from '@douyinfe/semi-foundation/lib/cjs/datePicker/inputFoundation';
3
+ import DateInputFoundation, { DateInputAdapter, DateInputFoundationProps, RangeType, InsetInputChangeProps, InsetInputChangeFoundationProps } from '@douyinfe/semi-foundation/lib/cjs/datePicker/inputFoundation';
4
4
  import { noop } from '@douyinfe/semi-foundation/lib/cjs/utils/function';
5
- import BaseComponent, { BaseProps } from '../_base/baseComponent';
6
5
  import { ValueType } from '@douyinfe/semi-foundation/lib/cjs/datePicker/foundation';
6
+ import BaseComponent, { BaseProps } from '../_base/baseComponent';
7
7
  export interface DateInputProps extends DateInputFoundationProps, BaseProps {
8
8
  insetLabel?: React.ReactNode;
9
9
  prefix?: React.ReactNode;
@@ -13,6 +13,8 @@ export interface DateInputProps extends DateInputFoundationProps, BaseProps {
13
13
  onBlur?: (e: React.MouseEvent<HTMLInputElement>) => void;
14
14
  onFocus?: (e: React.MouseEvent<HTMLInputElement>, rangeType?: RangeType) => void;
15
15
  onClear?: (e: React.MouseEvent<HTMLDivElement>) => void;
16
+ onInsetInputChange?: (options: InsetInputChangeProps) => void;
17
+ value?: Date[];
16
18
  }
17
19
  export default class DateInput extends BaseComponent<DateInputProps, {}> {
18
20
  static propTypes: {
@@ -25,7 +27,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
25
27
  value: PropTypes.Requireable<any[]>;
26
28
  disabled: PropTypes.Requireable<boolean>;
27
29
  type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
28
- multiple: PropTypes.Requireable<boolean>;
29
30
  showClear: PropTypes.Requireable<boolean>;
30
31
  format: PropTypes.Requireable<string>;
31
32
  inputStyle: PropTypes.Requireable<object>;
@@ -40,6 +41,8 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
40
41
  rangeInputStartRef: PropTypes.Requireable<object>;
41
42
  rangeInputEndRef: PropTypes.Requireable<object>;
42
43
  rangeSeparator: PropTypes.Requireable<string>;
44
+ insetInput: PropTypes.Requireable<boolean>;
45
+ insetInputValue: PropTypes.Requireable<object>;
43
46
  };
44
47
  static defaultProps: {
45
48
  showClear: boolean;
@@ -49,7 +52,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
49
52
  onBlur: typeof noop;
50
53
  onClear: typeof noop;
51
54
  onFocus: typeof noop;
52
- multiple: boolean;
53
55
  type: string;
54
56
  inputStyle: {};
55
57
  inputReadOnly: boolean;
@@ -71,11 +73,14 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
71
73
  handleRangeInputEndKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => void;
72
74
  handleRangeInputFocus: (e: React.MouseEvent<HTMLElement>, rangeType: RangeType) => void;
73
75
  handleRangeStartFocus: React.MouseEventHandler<HTMLElement>;
76
+ handleInsetInputChange: (options: InsetInputChangeFoundationProps) => void;
74
77
  getRangeInputValue: (rangeStart: string, rangeEnd: string) => string;
75
78
  renderRangePrefix(): JSX.Element;
76
79
  renderRangeSeparator(rangeStart: string, rangeEnd: string): JSX.Element;
77
80
  renderRangeClearBtn(rangeStart: string, rangeEnd: string): JSX.Element;
78
81
  renderRangeSuffix(suffix: React.ReactNode): JSX.Element;
79
82
  renderRangeInput(rangeProps: DateInputProps): JSX.Element;
83
+ renderInputInset(): JSX.Element;
84
+ renderTriggerInput(): JSX.Element;
80
85
  render(): JSX.Element;
81
86
  }