@douyinfe/semi-ui 2.5.0 → 2.6.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 (97) hide show
  1. package/button/index.tsx +1 -1
  2. package/calendar/monthCalendar.tsx +14 -13
  3. package/cascader/index.tsx +21 -3
  4. package/cascader/item.tsx +25 -5
  5. package/datePicker/dateInput.tsx +8 -5
  6. package/datePicker/datePicker.tsx +6 -1
  7. package/datePicker/month.tsx +14 -7
  8. package/datePicker/monthsGrid.tsx +17 -5
  9. package/datePicker/navigation.tsx +8 -4
  10. package/datePicker/quickControl.tsx +1 -0
  11. package/datePicker/yearAndMonth.tsx +1 -1
  12. package/dist/css/semi.css +22 -8
  13. package/dist/css/semi.min.css +1 -1
  14. package/dist/umd/semi-ui.js +259 -104
  15. package/dist/umd/semi-ui.js.map +1 -1
  16. package/dist/umd/semi-ui.min.js +1 -1
  17. package/dist/umd/semi-ui.min.js.map +1 -1
  18. package/form/__test__/formApi.test.js +182 -0
  19. package/form/_story/FormApi/arrayDemo.jsx +4 -7
  20. package/form/_story/Layout/slotDemo.jsx +2 -2
  21. package/form/_story/demo.jsx +18 -1
  22. package/form/_story/form.stories.js +6 -6
  23. package/form/baseForm.tsx +2 -2
  24. package/form/hoc/withField.tsx +1 -1
  25. package/lib/cjs/_base/base.css +5 -5
  26. package/lib/cjs/button/Button.d.ts +4 -4
  27. package/lib/cjs/button/buttonGroup.d.ts +2 -2
  28. package/lib/cjs/button/index.d.ts +5 -6
  29. package/lib/cjs/calendar/monthCalendar.js +21 -5
  30. package/lib/cjs/cascader/index.d.ts +9 -2
  31. package/lib/cjs/cascader/index.js +14 -1
  32. package/lib/cjs/cascader/item.d.ts +6 -2
  33. package/lib/cjs/cascader/item.js +33 -4
  34. package/lib/cjs/datePicker/dateInput.d.ts +0 -2
  35. package/lib/cjs/datePicker/dateInput.js +17 -6
  36. package/lib/cjs/datePicker/datePicker.js +15 -12
  37. package/lib/cjs/datePicker/month.d.ts +1 -0
  38. package/lib/cjs/datePicker/month.js +18 -2
  39. package/lib/cjs/datePicker/monthsGrid.js +16 -4
  40. package/lib/cjs/datePicker/navigation.js +8 -0
  41. package/lib/cjs/datePicker/quickControl.js +1 -0
  42. package/lib/cjs/datePicker/yearAndMonth.js +1 -0
  43. package/lib/cjs/form/baseForm.js +2 -2
  44. package/lib/cjs/form/hoc/withField.js +1 -1
  45. package/lib/cjs/iconButton/index.d.ts +2 -2
  46. package/lib/cjs/navigation/Item.d.ts +2 -2
  47. package/lib/cjs/navigation/Item.js +8 -6
  48. package/lib/cjs/navigation/SubNav.js +2 -2
  49. package/lib/cjs/scrollList/scrollItem.d.ts +2 -1
  50. package/lib/cjs/scrollList/scrollItem.js +13 -3
  51. package/lib/cjs/table/Body/index.d.ts +2 -0
  52. package/lib/cjs/table/Body/index.js +13 -4
  53. package/lib/cjs/tooltip/index.js +6 -2
  54. package/lib/es/_base/base.css +5 -5
  55. package/lib/es/button/Button.d.ts +4 -4
  56. package/lib/es/button/buttonGroup.d.ts +2 -2
  57. package/lib/es/button/index.d.ts +5 -6
  58. package/lib/es/calendar/monthCalendar.js +22 -5
  59. package/lib/es/cascader/index.d.ts +9 -2
  60. package/lib/es/cascader/index.js +14 -1
  61. package/lib/es/cascader/item.d.ts +6 -2
  62. package/lib/es/cascader/item.js +31 -4
  63. package/lib/es/datePicker/dateInput.d.ts +0 -2
  64. package/lib/es/datePicker/dateInput.js +17 -6
  65. package/lib/es/datePicker/datePicker.js +15 -12
  66. package/lib/es/datePicker/month.d.ts +1 -0
  67. package/lib/es/datePicker/month.js +18 -2
  68. package/lib/es/datePicker/monthsGrid.js +16 -4
  69. package/lib/es/datePicker/navigation.js +8 -0
  70. package/lib/es/datePicker/quickControl.js +2 -0
  71. package/lib/es/datePicker/yearAndMonth.js +1 -0
  72. package/lib/es/form/baseForm.js +2 -2
  73. package/lib/es/form/hoc/withField.js +1 -1
  74. package/lib/es/iconButton/index.d.ts +2 -2
  75. package/lib/es/navigation/Item.d.ts +2 -2
  76. package/lib/es/navigation/Item.js +8 -6
  77. package/lib/es/navigation/SubNav.js +2 -2
  78. package/lib/es/scrollList/scrollItem.d.ts +2 -1
  79. package/lib/es/scrollList/scrollItem.js +13 -3
  80. package/lib/es/table/Body/index.d.ts +2 -0
  81. package/lib/es/table/Body/index.js +13 -4
  82. package/lib/es/tooltip/index.js +6 -2
  83. package/navigation/Item.tsx +15 -12
  84. package/navigation/SubNav.tsx +4 -4
  85. package/package.json +9 -9
  86. package/scrollList/_story/ScrollList/index.js +3 -0
  87. package/scrollList/_story/WheelList/index.js +3 -0
  88. package/scrollList/scrollItem.tsx +30 -9
  89. package/table/Body/index.tsx +15 -4
  90. package/table/__test__/table.test.js +18 -0
  91. package/table/_story/Perf/Virtualized/index.jsx +6 -0
  92. package/table/_story/v2/FixedExpandedRow/index.jsx +95 -0
  93. package/table/_story/v2/FixedHeaderMerge/index.jsx +1 -1
  94. package/table/_story/v2/defaultFilteredValue.tsx +0 -9
  95. package/table/_story/v2/index.js +2 -1
  96. package/tooltip/_story/tooltip.stories.js +702 -625
  97. package/tooltip/index.tsx +2 -2
@@ -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),
@@ -25,7 +25,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
25
25
  value: PropTypes.Requireable<any[]>;
26
26
  disabled: PropTypes.Requireable<boolean>;
27
27
  type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
28
- multiple: PropTypes.Requireable<boolean>;
29
28
  showClear: PropTypes.Requireable<boolean>;
30
29
  format: PropTypes.Requireable<string>;
31
30
  inputStyle: PropTypes.Requireable<object>;
@@ -49,7 +48,6 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
49
48
  onBlur: typeof noop;
50
49
  onClear: typeof noop;
51
50
  onFocus: typeof noop;
52
- multiple: boolean;
53
51
  type: string;
54
52
  inputStyle: {};
55
53
  inputReadOnly: boolean;
@@ -52,6 +52,8 @@ var __rest = void 0 && (void 0).__rest || function (s, e) {
52
52
  }
53
53
  return t;
54
54
  };
55
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/interactive-supports-focus */
56
+
55
57
  /* eslint-disable max-lines-per-function */
56
58
 
57
59
  /* eslint-disable no-unused-vars */
@@ -195,9 +197,14 @@ class DateInput extends _baseComponent.default {
195
197
  } = this.props;
196
198
  const allowClear = (rangeStart || rangeEnd) && showClear;
197
199
  return allowClear && !disabled ? /*#__PURE__*/_react.default.createElement("div", {
200
+ role: "button",
201
+ tabIndex: 0,
202
+ "aria-label": "Clear range input value",
198
203
  className: "".concat(prefixCls, "-range-input-clearbtn"),
199
204
  onMouseDown: e => !disabled && this.handleRangeInputClear(e)
200
- }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClear, null)) : null;
205
+ }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconClear, {
206
+ "aria-hidden": true
207
+ })) : null;
201
208
  }
202
209
 
203
210
  renderRangeSuffix(suffix) {
@@ -298,6 +305,8 @@ class DateInput extends _baseComponent.default {
298
305
  validateStatus,
299
306
  block,
300
307
  prefixCls,
308
+ multiple,
309
+ // Whether to allow multiple values for email and file types
301
310
  dateFnsLocale,
302
311
  // No need to pass to input
303
312
  onBlur,
@@ -315,11 +324,15 @@ class DateInput extends _baseComponent.default {
315
324
  rangeInputFocus,
316
325
  rangeSeparator
317
326
  } = _a,
318
- rest = __rest(_a, ["placeholder", "type", "value", "inputValue", "inputStyle", "disabled", "showClear", "inputReadOnly", "insetLabel", "validateStatus", "block", "prefixCls", "dateFnsLocale", "onBlur", "onClear", "onFocus", "prefix", "autofocus", "size", "rangeInputStartRef", "rangeInputEndRef", "onRangeClear", "onRangeBlur", "onRangeEndTabPress", "rangeInputFocus", "rangeSeparator"]);
327
+ rest = __rest(_a, ["placeholder", "type", "value", "inputValue", "inputStyle", "disabled", "showClear", "inputReadOnly", "insetLabel", "validateStatus", "block", "prefixCls", "multiple", "dateFnsLocale", "onBlur", "onClear", "onFocus", "prefix", "autofocus", "size", "rangeInputStartRef", "rangeInputEndRef", "onRangeClear", "onRangeBlur", "onRangeEndTabPress", "rangeInputFocus", "rangeSeparator"]);
319
328
 
320
- const dateIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, null);
329
+ const dateIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
330
+ "aria-hidden": true
331
+ });
321
332
 
322
- const dateTimeIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendarClock, null);
333
+ const dateTimeIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendarClock, {
334
+ "aria-hidden": true
335
+ });
323
336
 
324
337
  const suffix = (0, _includes.default)(type).call(type, 'Time') ? dateTimeIcon : dateIcon;
325
338
  let text = '';
@@ -375,7 +388,6 @@ DateInput.propTypes = {
375
388
  value: _propTypes.default.array,
376
389
  disabled: _propTypes.default.bool,
377
390
  type: _propTypes.default.oneOf(_constants.strings.TYPE_SET),
378
- multiple: _propTypes.default.bool,
379
391
  showClear: _propTypes.default.bool,
380
392
  format: _propTypes.default.string,
381
393
  inputStyle: _propTypes.default.object,
@@ -399,7 +411,6 @@ DateInput.defaultProps = {
399
411
  onBlur: _function.noop,
400
412
  onClear: _function.noop,
401
413
  onFocus: _function.noop,
402
- multiple: false,
403
414
  type: 'date',
404
415
  inputStyle: {},
405
416
  inputReadOnly: false,
@@ -62,6 +62,8 @@ var _yearAndMonth = _interopRequireDefault(require("./yearAndMonth"));
62
62
 
63
63
  require("@douyinfe/semi-foundation/lib/cjs/datePicker/datePicker.css");
64
64
 
65
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus */
66
+
65
67
  /* eslint-disable max-len */
66
68
  class DatePicker extends _baseComponent.default {
67
69
  constructor(props) {
@@ -608,18 +610,19 @@ class DatePicker extends _baseComponent.default {
608
610
  onRangeClear: this.handleRangeInputClear,
609
611
  onRangeEndTabPress: this.handleRangeEndTabPress
610
612
  });
611
- return (
612
- /*#__PURE__*/
613
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
614
- _react.default.createElement("div", {
615
- onClick: this.handleTriggerWrapperClick,
616
- className: inputCls
617
- }, typeof triggerRender === 'function' ? /*#__PURE__*/_react.default.createElement(_trigger.default, (0, _assign.default)({}, props, {
618
- triggerRender: triggerRender,
619
- componentName: "DatePicker",
620
- componentProps: (0, _assign.default)({}, this.props)
621
- })) : /*#__PURE__*/_react.default.createElement(_dateInput.default, (0, _assign.default)({}, props)))
622
- );
613
+ return /*#__PURE__*/_react.default.createElement("div", {
614
+ // tooltip will mount a11y props to children
615
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
616
+ role: "combobox",
617
+ "aria-label": (0, _isArray.default)(value) && value.length ? "Change date" : "Choose date",
618
+ "aria-disabled": disabled,
619
+ onClick: this.handleTriggerWrapperClick,
620
+ className: inputCls
621
+ }, typeof triggerRender === 'function' ? /*#__PURE__*/_react.default.createElement(_trigger.default, (0, _assign.default)({}, props, {
622
+ triggerRender: triggerRender,
623
+ componentName: "DatePicker",
624
+ componentProps: (0, _assign.default)({}, this.props)
625
+ })) : /*#__PURE__*/_react.default.createElement(_dateInput.default, (0, _assign.default)({}, props)));
623
626
  }
624
627
 
625
628
  render() {
@@ -33,6 +33,7 @@ export default class Month extends BaseComponent<MonthProps, MonthState> {
33
33
  endDateOffset: PropTypes.Requireable<(...args: any[]) => any>;
34
34
  rangeInputFocus: PropTypes.Requireable<string | boolean>;
35
35
  focusRecordsRef: PropTypes.Requireable<object>;
36
+ multiple: PropTypes.Requireable<boolean>;
36
37
  };
37
38
  static defaultProps: {
38
39
  month: Date;
@@ -40,6 +40,8 @@ var _index = require("@douyinfe/semi-foundation/lib/cjs/datePicker/_utils/index"
40
40
 
41
41
  var _dateFns = require("date-fns");
42
42
 
43
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-noninteractive-element-interactions */
44
+
43
45
  /* eslint-disable max-len */
44
46
  const prefixCls = _constants.cssClasses.PREFIX;
45
47
 
@@ -353,8 +355,10 @@ class Month extends _baseComponent.default {
353
355
 
354
356
  const weekdaysText = (0, _map.default)(weekdays).call(weekdays, key => locale.weeks[key]);
355
357
  return /*#__PURE__*/_react.default.createElement("div", {
358
+ role: "row",
356
359
  className: weekdayCls
357
360
  }, (0, _map.default)(weekdaysText).call(weekdaysText, (E, i) => /*#__PURE__*/_react.default.createElement("div", {
361
+ role: "columnheader",
358
362
  key: E + i,
359
363
  className: weekdayItemCls
360
364
  }, E)));
@@ -389,6 +393,7 @@ class Month extends _baseComponent.default {
389
393
  renderWeek(week, weekIndex) {
390
394
  const weekCls = _constants.cssClasses.WEEK;
391
395
  return /*#__PURE__*/_react.default.createElement("div", {
396
+ role: "row",
392
397
  className: weekCls,
393
398
  key: weekIndex
394
399
  }, (0, _map.default)(week).call(week, (day, dayIndex) => this.renderDay(day, dayIndex)));
@@ -409,6 +414,8 @@ class Month extends _baseComponent.default {
409
414
 
410
415
  if (!fullDate) {
411
416
  return /*#__PURE__*/_react.default.createElement("div", {
417
+ role: "gridcell",
418
+ tabIndex: -1,
412
419
  key: dayNumber + dayIndex,
413
420
  className: _constants.cssClasses.DAY
414
421
  }, /*#__PURE__*/_react.default.createElement("span", null));
@@ -444,6 +451,11 @@ class Month extends _baseComponent.default {
444
451
  const fullDateArgs = [dayNumber, fullDate, dayStatus];
445
452
  const customRender = (0, _isFunction2.default)(renderFullDate);
446
453
  return /*#__PURE__*/_react.default.createElement("div", {
454
+ role: "gridcell",
455
+ tabIndex: dayStatus.isDisabled ? -1 : 0,
456
+ "aria-disabled": dayStatus.isDisabled,
457
+ "aria-selected": dayStatus.isSelected,
458
+ "aria-label": fullDate,
447
459
  className: !customRender ? dayCls : _constants.cssClasses.DAY,
448
460
  title: fullDate,
449
461
  key: dayNumber + dayIndex,
@@ -457,13 +469,16 @@ class Month extends _baseComponent.default {
457
469
 
458
470
  render() {
459
471
  const {
460
- forwardRef
472
+ forwardRef,
473
+ multiple
461
474
  } = this.props;
462
475
  const weekday = this.renderDayOfWeek();
463
476
  const weeks = this.renderWeeks();
464
477
  const monthCls = (0, _classnames.default)(_constants.cssClasses.MONTH);
465
478
  const ref = forwardRef || this.monthRef;
466
479
  return /*#__PURE__*/_react.default.createElement("div", {
480
+ role: "grid",
481
+ "aria-multiselectable": multiple,
467
482
  ref: ref,
468
483
  className: monthCls
469
484
  }, weekday, weeks);
@@ -491,7 +506,8 @@ Month.propTypes = {
491
506
  startDateOffset: _propTypes.default.func,
492
507
  endDateOffset: _propTypes.default.func,
493
508
  rangeInputFocus: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
494
- focusRecordsRef: _propTypes.default.object
509
+ focusRecordsRef: _propTypes.default.object,
510
+ multiple: _propTypes.default.bool
495
511
  };
496
512
  Month.defaultProps = {
497
513
  month: new Date(),
@@ -54,6 +54,8 @@ var _semiIcons = require("@douyinfe/semi-icons");
54
54
 
55
55
  var _getDefaultFormatToken = require("@douyinfe/semi-foundation/lib/cjs/datePicker/_utils/getDefaultFormatToken");
56
56
 
57
+ /* eslint-disable jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events */
58
+
57
59
  /* eslint-disable react/no-did-update-set-state */
58
60
 
59
61
  /* eslint-disable max-len */
@@ -395,7 +397,8 @@ class MonthsGrid extends _baseComponent.default {
395
397
  endDateOffset,
396
398
  density,
397
399
  rangeInputFocus,
398
- syncSwitchMonth
400
+ syncSwitchMonth,
401
+ multiple
399
402
  } = this.props;
400
403
  let monthText = ''; // i18n monthText
401
404
 
@@ -461,7 +464,8 @@ class MonthsGrid extends _baseComponent.default {
461
464
  onWeeksRowNumChange: weeksRowNum => this.handleWeeksRowNumChange(weeksRowNum, panelType),
462
465
  startDateOffset: startDateOffset,
463
466
  endDateOffset: endDateOffset,
464
- focusRecordsRef: this.props.focusRecordsRef
467
+ focusRecordsRef: this.props.focusRecordsRef,
468
+ multiple: multiple
465
469
  }));
466
470
  }
467
471
 
@@ -613,14 +617,22 @@ class MonthsGrid extends _baseComponent.default {
613
617
  className: switchCls,
614
618
  ref: current => this.adapter.setCache("switch-".concat(panelType), current)
615
619
  }, /*#__PURE__*/_react.default.createElement("div", {
620
+ role: "button",
621
+ "aria-label": "Switch to date panel",
616
622
  className: dateCls,
617
623
  onClick: e => this.foundation.showDatePanel(panelType)
618
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, null), /*#__PURE__*/_react.default.createElement("span", {
624
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
625
+ "aria-hidden": true
626
+ }), /*#__PURE__*/_react.default.createElement("span", {
619
627
  className: textCls
620
628
  }, dateText || monthText)), /*#__PURE__*/_react.default.createElement("div", {
629
+ role: "button",
630
+ "aria-label": "Switch to time panel",
621
631
  className: timeCls,
622
632
  onClick: e => this.foundation.showTimePicker(panelType, true)
623
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, null), /*#__PURE__*/_react.default.createElement("span", {
633
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, {
634
+ "aria-hidden": true
635
+ }), /*#__PURE__*/_react.default.createElement("span", {
624
636
  className: textCls
625
637
  }, timeText)));
626
638
  }
@@ -82,7 +82,9 @@ class Navigation extends _react.PureComponent {
82
82
  ref: ref
83
83
  }, /*#__PURE__*/_react.default.createElement(_iconButton.default, {
84
84
  key: "double-chevron-left",
85
+ "aria-label": "Previous year",
85
86
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconDoubleChevronLeft, {
87
+ "aria-hidden": true,
86
88
  size: iconBtnSize
87
89
  }),
88
90
  size: buttonSize,
@@ -92,7 +94,9 @@ class Navigation extends _react.PureComponent {
92
94
  style: leftButtonStyle
93
95
  }), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
94
96
  key: "chevron-left",
97
+ "aria-label": "Previous month",
95
98
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronLeft, {
99
+ "aria-hidden": true,
96
100
  size: iconBtnSize
97
101
  }),
98
102
  size: buttonSize,
@@ -108,7 +112,9 @@ class Navigation extends _react.PureComponent {
108
112
  size: buttonSize
109
113
  }, /*#__PURE__*/_react.default.createElement("span", null, monthText))), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
110
114
  key: "chevron-right",
115
+ "aria-label": "Next month",
111
116
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronRight, {
117
+ "aria-hidden": true,
112
118
  size: iconBtnSize
113
119
  }),
114
120
  size: buttonSize,
@@ -118,7 +124,9 @@ class Navigation extends _react.PureComponent {
118
124
  style: rightButtonStyle
119
125
  }), /*#__PURE__*/_react.default.createElement(_iconButton.default, {
120
126
  key: "double-chevron-right",
127
+ "aria-label": "Next year",
121
128
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconDoubleChevronRight, {
129
+ "aria-hidden": true,
122
130
  size: iconBtnSize
123
131
  }),
124
132
  size: buttonSize,
@@ -34,6 +34,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "functi
34
34
 
35
35
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
36
 
37
+ /* eslint-disable jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events */
37
38
  const prefixCls = _constants.cssClasses.PREFIX;
38
39
 
39
40
  class QuickControl extends _react.PureComponent {
@@ -249,6 +249,7 @@ class YearAndMonth extends _baseComponent.default {
249
249
  }, /*#__PURE__*/_react.default.createElement(_iconButton.default, {
250
250
  noHorizontalPadding: false,
251
251
  icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconChevronLeft, {
252
+ "aria-hidden": true,
252
253
  size: iconSize
253
254
  }),
254
255
  size: buttonSize,
@@ -115,8 +115,8 @@ class Form extends _baseComponent.default {
115
115
  notifySubmitFail: (errors, values) => {
116
116
  this.props.onSubmitFail(errors, values);
117
117
  },
118
- forceUpdate: () => {
119
- this.forceUpdate();
118
+ forceUpdate: callback => {
119
+ this.forceUpdate(callback);
120
120
  },
121
121
  notifyChange: formState => {
122
122
  this.props.onChange(formState);
@@ -531,7 +531,7 @@ function withField(Component, opts) {
531
531
  text: label || field,
532
532
  id: labelId,
533
533
  required: required,
534
- name: name || field,
534
+ name: a11yId || name || field,
535
535
  width: mergeLabelWidth,
536
536
  align: mergeLabelAlign
537
537
  }, needSpread));
@@ -19,7 +19,7 @@ export interface IconButtonProps extends ButtonProps {
19
19
  }
20
20
  declare class IconButton extends PureComponent<IconButtonProps> {
21
21
  static defaultProps: {
22
- iconPosition: any;
22
+ iconPosition: "left";
23
23
  prefixCls: string;
24
24
  loading: boolean;
25
25
  noHorizontalPadding: boolean;
@@ -36,7 +36,7 @@ declare class IconButton extends PureComponent<IconButtonProps> {
36
36
  noHorizontalPadding: PropTypes.Requireable<string | boolean | any[]>;
37
37
  children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
38
38
  theme: PropTypes.Requireable<string>;
39
- iconPosition: PropTypes.Requireable<unknown>;
39
+ iconPosition: PropTypes.Requireable<"left" | "right">;
40
40
  className: PropTypes.Requireable<string>;
41
41
  onMouseEnter: PropTypes.Requireable<(...args: any[]) => any>;
42
42
  onMouseLeave: PropTypes.Requireable<(...args: any[]) => any>;
@@ -1,7 +1,7 @@
1
1
  import BaseComponent, { BaseProps } from '../_base/baseComponent';
2
2
  import React from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import ItemFoundation, { ItemProps, SelectedItemProps, ItemAdapter } from '@douyinfe/semi-foundation/lib/cjs/navigation/itemFoundation';
4
+ import ItemFoundation, { ItemAdapter, ItemProps, SelectedItemProps } from '@douyinfe/semi-foundation/lib/cjs/navigation/itemFoundation';
5
5
  export interface NavItemProps extends ItemProps, BaseProps {
6
6
  children?: React.ReactNode;
7
7
  disabled?: boolean;
@@ -63,7 +63,7 @@ export default class NavItem extends BaseComponent<NavItemProps, NavItemState> {
63
63
  constructor(props: NavItemProps);
64
64
  _invokeContextFunc(funcName: string, ...args: any[]): any;
65
65
  get adapter(): ItemAdapter<NavItemProps, NavItemState>;
66
- renderIcon(icon: React.ReactNode, pos: string, isToggleIcon?: boolean): JSX.Element;
66
+ renderIcon(icon: React.ReactNode, pos: string, isToggleIcon?: boolean, key?: number | string): JSX.Element;
67
67
  setItemRef: (ref: HTMLLIElement) => void;
68
68
  wrapTooltip: (node: React.ReactNode) => JSX.Element;
69
69
  handleClick: (e: React.MouseEvent) => void;
@@ -16,10 +16,10 @@ var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-s
16
16
 
17
17
  var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
18
18
 
19
- var _noop2 = _interopRequireDefault(require("lodash/noop"));
20
-
21
19
  var _times2 = _interopRequireDefault(require("lodash/times"));
22
20
 
21
+ var _noop2 = _interopRequireDefault(require("lodash/noop"));
22
+
23
23
  var _baseComponent = _interopRequireDefault(require("../_base/baseComponent"));
24
24
 
25
25
  var _react = _interopRequireDefault(require("react"));
@@ -146,6 +146,7 @@ class NavItem extends _baseComponent.default {
146
146
  var _context3;
147
147
 
148
148
  let isToggleIcon = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
149
+ let key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
149
150
 
150
151
  if (this.props.isSubNav) {
151
152
  return null;
@@ -166,7 +167,8 @@ class NavItem extends _baseComponent.default {
166
167
  ["".concat(clsPrefix, "-icon-info")]: !isToggleIcon
167
168
  });
168
169
  return /*#__PURE__*/_react.default.createElement("i", {
169
- className: className
170
+ className: className,
171
+ key: key
170
172
  }, (0, _utils.isSemiIcon)(icon) ? /*#__PURE__*/_react.default.cloneElement(icon, {
171
173
  size: icon.props.size || iconSize
172
174
  }) : icon);
@@ -206,12 +208,12 @@ class NavItem extends _baseComponent.default {
206
208
 
207
209
  if (mode === _constants.strings.MODE_VERTICAL && !limitIndent && !isCollapsed) {
208
210
  const iconAmount = icon && !indent ? level : level - 1;
209
- placeholderIcons = (0, _times2.default)(iconAmount, () => this.renderIcon(null, _constants.strings.ICON_POS_RIGHT, false));
211
+ placeholderIcons = (0, _times2.default)(iconAmount, index => this.renderIcon(null, _constants.strings.ICON_POS_RIGHT, false, index));
210
212
  }
211
213
 
212
- itemChildren = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, placeholderIcons, this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_LEFT && this.renderIcon(toggleIcon, _constants.strings.ICON_POS_RIGHT, true), icon || indent || isInSubNav ? this.renderIcon(icon, _constants.strings.ICON_POS_LEFT) : null, !(0, _isNullOrUndefined.default)(text) ? /*#__PURE__*/_react.default.createElement("span", {
214
+ itemChildren = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, placeholderIcons, this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_LEFT && this.renderIcon(toggleIcon, _constants.strings.ICON_POS_RIGHT, true, 'key-toggle-pos-right'), icon || indent || isInSubNav ? this.renderIcon(icon, _constants.strings.ICON_POS_LEFT, false, 'key-position-left') : null, !(0, _isNullOrUndefined.default)(text) ? /*#__PURE__*/_react.default.createElement("span", {
213
215
  className: "".concat(_constants.cssClasses.PREFIX, "-item-text")
214
- }, text) : '', this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_RIGHT && this.renderIcon(toggleIcon, _constants.strings.ICON_POS_RIGHT, true));
216
+ }, text) : '', this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_RIGHT && this.renderIcon(toggleIcon, _constants.strings.ICON_POS_RIGHT, true, 'key-toggle-pos-right'));
215
217
  }
216
218
 
217
219
  if (typeof link === 'string') {
@@ -233,7 +233,7 @@ class SubNav extends _baseComponent.default {
233
233
  if (mode === _constants.strings.MODE_VERTICAL && !limitIndent && !isCollapsed) {
234
234
  /* Different icons' amount means different indents.*/
235
235
  const iconAmount = icon && !indent ? level : level - 1;
236
- placeholderIcons = (0, _times2.default)(iconAmount, index => this.renderIcon(null, _constants.strings.ICON_POS_RIGHT, false, undefined, index));
236
+ placeholderIcons = (0, _times2.default)(iconAmount, index => this.renderIcon(null, _constants.strings.ICON_POS_RIGHT, false, false, index));
237
237
  }
238
238
 
239
239
  const titleDiv = /*#__PURE__*/_react.default.createElement("div", {
@@ -245,7 +245,7 @@ class SubNav extends _baseComponent.default {
245
245
  onKeyPress: this.handleKeyPress
246
246
  }, /*#__PURE__*/_react.default.createElement("div", {
247
247
  className: "".concat(prefixCls, "-item-inner")
248
- }, placeholderIcons, this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_LEFT && this.renderIcon(toggleIconType, _constants.strings.ICON_POS_RIGHT, withTransition, true, 'key-toggle-position-left'), icon || indent || isInSubNav && mode !== _constants.strings.MODE_HORIZONTAL ? this.renderIcon(icon, _constants.strings.ICON_POS_LEFT, undefined, undefined, 'key-inSubNav-position-left') : null, /*#__PURE__*/_react.default.createElement("span", {
248
+ }, placeholderIcons, this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_LEFT && this.renderIcon(toggleIconType, _constants.strings.ICON_POS_RIGHT, withTransition, true, 'key-toggle-position-left'), icon || indent || isInSubNav && mode !== _constants.strings.MODE_HORIZONTAL ? this.renderIcon(icon, _constants.strings.ICON_POS_LEFT, false, false, 'key-inSubNav-position-left') : null, /*#__PURE__*/_react.default.createElement("span", {
249
249
  className: "".concat(prefixCls, "-item-text")
250
250
  }, text), this.context.toggleIconPosition === _constants.strings.TOGGLE_ICON_RIGHT && this.renderIcon(toggleIconType, _constants.strings.ICON_POS_RIGHT, withTransition, true, 'key-toggle-position-right')));
251
251
 
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { AriaAttributes } from 'react';
2
2
  import BaseComponent from '../_base/baseComponent';
3
3
  import PropTypes from 'prop-types';
4
4
  import { Item, ScrollItemAdapter } from '@douyinfe/semi-foundation/lib/cjs/scrollList/itemFoundation';
@@ -18,6 +18,7 @@ export interface ScrollItemProps<T extends Item> {
18
18
  motion?: Motion;
19
19
  style?: React.CSSProperties;
20
20
  type?: string | number;
21
+ 'aria-label'?: AriaAttributes['aria-label'];
21
22
  }
22
23
  export interface ScrollItemState {
23
24
  prependCount: number;
@@ -299,13 +299,14 @@ class ScrollItem extends _baseComponent.default {
299
299
  transform: itemTrans
300
300
  } = item;
301
301
  const transform = typeof itemTrans === 'function' ? itemTrans : commonTrans;
302
+ const selected = selectedIndex === index;
302
303
  const cls = (0, _classnames.default)({
303
- ["".concat(_constants.cssClasses.PREFIX, "-item-sel")]: selectedIndex === index && mode !== wheelMode,
304
+ ["".concat(_constants.cssClasses.PREFIX, "-item-sel")]: selected && mode !== wheelMode,
304
305
  ["".concat(_constants.cssClasses.PREFIX, "-item-disabled")]: Boolean(item.disabled)
305
306
  });
306
307
  let text = '';
307
308
 
308
- if (selectedIndex === index) {
309
+ if (selected) {
309
310
  if (typeof transform === 'function') {
310
311
  text = transform(item.value, item.text);
311
312
  } else {
@@ -329,7 +330,10 @@ class ScrollItem extends _baseComponent.default {
329
330
  _react.default.createElement("li", (0, _assign.default)({
330
331
  key: prefixKey + index
331
332
  }, events, {
332
- className: cls
333
+ className: cls,
334
+ role: "option",
335
+ "aria-selected": selected,
336
+ "aria-disabled": item.disabled
333
337
  }), text)
334
338
  );
335
339
  });
@@ -348,6 +352,9 @@ class ScrollItem extends _baseComponent.default {
348
352
  className: wrapperCls,
349
353
  ref: this._cacheWrapperNode
350
354
  }, /*#__PURE__*/_react.default.createElement("ul", {
355
+ role: "listbox",
356
+ "aria-multiselectable": false,
357
+ "aria-label": this.props['aria-label'],
351
358
  ref: this._cacheListNode
352
359
  }, inner));
353
360
  };
@@ -402,6 +409,9 @@ class ScrollItem extends _baseComponent.default {
402
409
  ref: this._cacheWrapperNode,
403
410
  onScroll: this.scrollToSelectItem
404
411
  }, /*#__PURE__*/_react.default.createElement("ul", {
412
+ role: "listbox",
413
+ "aria-label": this.props['aria-label'],
414
+ "aria-multiselectable": false,
405
415
  ref: this._cacheListNode,
406
416
  onClick: this.clickToSelectItem
407
417
  }, prependList, inner, appendList)));
@@ -43,6 +43,8 @@ export interface BodyState {
43
43
  }
44
44
  export interface BodyContext {
45
45
  getVirtualizedListRef: GetVirtualizedListRef;
46
+ flattenedColumns: ColumnProps[];
47
+ getCellWidths: (flattenedColumns: ColumnProps[]) => number[];
46
48
  }
47
49
  declare const _default: React.ForwardRefExoticComponent<Omit<BodyProps, "forwardedRef"> & React.RefAttributes<HTMLDivElement>>;
48
50
  export default _default;