@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
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports.InsetDateInput = InsetDateInput;
12
+ exports.InsetTimeInput = InsetTimeInput;
13
+
14
+ var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
15
+
16
+ var _get2 = _interopRequireDefault(require("lodash/get"));
17
+
18
+ var _react = _interopRequireDefault(require("react"));
19
+
20
+ var _input = _interopRequireDefault(require("../input"));
21
+
22
+ function InsetDateInput(props) {
23
+ const {
24
+ insetInputValue,
25
+ valuePath,
26
+ onFocus,
27
+ onChange,
28
+ placeholder,
29
+ forwardRef
30
+ } = props;
31
+ const value = (0, _get2.default)(insetInputValue, valuePath);
32
+ return /*#__PURE__*/_react.default.createElement(_input.default, {
33
+ value: value,
34
+ onChange: (value, event) => {
35
+ onChange({
36
+ value,
37
+ event,
38
+ insetInputValue,
39
+ valuePath
40
+ });
41
+ },
42
+ onFocus: onFocus,
43
+ placeholder: placeholder,
44
+ ref: forwardRef
45
+ });
46
+ }
47
+
48
+ function InsetTimeInput(props) {
49
+ const {
50
+ insetInputValue,
51
+ valuePath,
52
+ type,
53
+ onFocus,
54
+ onChange,
55
+ placeholder,
56
+ disabled
57
+ } = props;
58
+
59
+ const _isTimeType = (0, _includes.default)(type).call(type, 'Time');
60
+
61
+ if (!_isTimeType) {
62
+ return null;
63
+ }
64
+
65
+ const value = (0, _get2.default)(insetInputValue, valuePath);
66
+ return /*#__PURE__*/_react.default.createElement(_input.default, {
67
+ value: value,
68
+ onChange: (value, event) => {
69
+ onChange({
70
+ value,
71
+ event,
72
+ insetInputValue,
73
+ valuePath
74
+ });
75
+ },
76
+ onFocus: onFocus,
77
+ placeholder: placeholder,
78
+ disabled: disabled
79
+ });
80
+ }
@@ -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,10 @@ 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
+
59
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
60
+
57
61
  /* eslint-disable react/no-did-update-set-state */
58
62
 
59
63
  /* eslint-disable max-len */
@@ -315,6 +319,9 @@ class MonthsGrid extends _baseComponent.default {
315
319
  monthRight,
316
320
  currentPanelHeight
317
321
  } = this.state;
322
+ const {
323
+ insetInput
324
+ } = this.props;
318
325
  const panelDetail = panelType === _constants.strings.PANEL_TYPE_RIGHT ? monthRight : monthLeft;
319
326
  const {
320
327
  isTimePickerOpen,
@@ -337,7 +344,7 @@ class MonthsGrid extends _baseComponent.default {
337
344
  style.minWidth = wrap.getBoundingClientRect().width;
338
345
  }
339
346
 
340
- if (this.leftIsYearOrTime() && this.rightIsYearOrTime()) {
347
+ if (this.leftIsYearOrTime() && this.rightIsYearOrTime() && !insetInput) {
341
348
  /**
342
349
  * left和right同时为tpk时,panel会有一个minHeight
343
350
  * 如果缓存的currentPanelHeight为0,则需要计算滚动列表的高度
@@ -347,7 +354,7 @@ class MonthsGrid extends _baseComponent.default {
347
354
  * When left and right are tpk at the same time, the panel will have a minHeight
348
355
  * If the cached currentPanelHeight is 0, you need to calculate the height of the scrolling list
349
356
  * If there is a cached value, use currentPanelHeight (if this height is less than the actual value, it will affect the number of cycles in the ScrollList to render the list)
350
- * See packages/semi-foundation/scrollList/itemF oundation.js initWheelList function
357
+ * See packages/semi-foundation/scrollList/itemFoundation.js initWheelList function
351
358
  */
352
359
  style.minHeight = currentPanelHeight ? currentPanelHeight : this.calcScrollListHeight();
353
360
  }
@@ -355,10 +362,14 @@ class MonthsGrid extends _baseComponent.default {
355
362
  monthCls = (0, _classnames.default)(monthCls, "".concat(prefixCls, "-yam-showing"));
356
363
  }
357
364
 
365
+ const _isDatePanelOpen = !(isYearPickerOpen || isTimePickerOpen);
366
+
367
+ const xOpenType = _isDatePanelOpen ? 'date' : isYearPickerOpen ? 'year' : 'time';
358
368
  return /*#__PURE__*/_react.default.createElement("div", {
359
369
  className: monthCls,
360
370
  key: panelType,
361
- style: style
371
+ style: style,
372
+ "x-open-type": xOpenType
362
373
  }, yearAndMonthLayer, timePickerLayer, this.foundation.isRangeType() ? panelContent : isYearPickerOpen || isTimePickerOpen ? null : panelContent, this.renderSwitch(panelType));
363
374
  }
364
375
 
@@ -395,7 +406,8 @@ class MonthsGrid extends _baseComponent.default {
395
406
  endDateOffset,
396
407
  density,
397
408
  rangeInputFocus,
398
- syncSwitchMonth
409
+ syncSwitchMonth,
410
+ multiple
399
411
  } = this.props;
400
412
  let monthText = ''; // i18n monthText
401
413
 
@@ -461,7 +473,8 @@ class MonthsGrid extends _baseComponent.default {
461
473
  onWeeksRowNumChange: weeksRowNum => this.handleWeeksRowNumChange(weeksRowNum, panelType),
462
474
  startDateOffset: startDateOffset,
463
475
  endDateOffset: endDateOffset,
464
- focusRecordsRef: this.props.focusRecordsRef
476
+ focusRecordsRef: this.props.focusRecordsRef,
477
+ multiple: multiple
465
478
  }));
466
479
  }
467
480
 
@@ -565,10 +578,11 @@ class MonthsGrid extends _baseComponent.default {
565
578
  locale,
566
579
  disabledTimePicker,
567
580
  density,
568
- dateFnsLocale
569
- } = this.props; // Type: date, dateRange, year, month, no rendering required
581
+ dateFnsLocale,
582
+ insetInput
583
+ } = this.props; // Type: date, dateRange, year, month, inset input no rendering required
570
584
 
571
- if (!(0, _includes.default)(type).call(type, 'Time')) {
585
+ if (!(0, _includes.default)(type).call(type, 'Time') || insetInput) {
572
586
  return null;
573
587
  } // switch year/month & time
574
588
 
@@ -613,14 +627,22 @@ class MonthsGrid extends _baseComponent.default {
613
627
  className: switchCls,
614
628
  ref: current => this.adapter.setCache("switch-".concat(panelType), current)
615
629
  }, /*#__PURE__*/_react.default.createElement("div", {
630
+ role: "button",
631
+ "aria-label": "Switch to date panel",
616
632
  className: dateCls,
617
633
  onClick: e => this.foundation.showDatePanel(panelType)
618
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, null), /*#__PURE__*/_react.default.createElement("span", {
634
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
635
+ "aria-hidden": true
636
+ }), /*#__PURE__*/_react.default.createElement("span", {
619
637
  className: textCls
620
638
  }, dateText || monthText)), /*#__PURE__*/_react.default.createElement("div", {
639
+ role: "button",
640
+ "aria-label": "Switch to time panel",
621
641
  className: timeCls,
622
642
  onClick: e => this.foundation.showTimePicker(panelType, true)
623
- }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, null), /*#__PURE__*/_react.default.createElement("span", {
643
+ }, showSwithIcon && /*#__PURE__*/_react.default.createElement(_semiIcons.IconClock, {
644
+ "aria-hidden": true
645
+ }), /*#__PURE__*/_react.default.createElement("span", {
624
646
  className: textCls
625
647
  }, timeText)));
626
648
  }
@@ -631,7 +653,8 @@ class MonthsGrid extends _baseComponent.default {
631
653
  monthRight
632
654
  } = this.state;
633
655
  const {
634
- type
656
+ type,
657
+ insetInput
635
658
  } = this.props;
636
659
  const monthGridCls = (0, _classnames.default)({
637
660
  ["".concat(prefixCls, "-month-grid")]: true
@@ -653,6 +676,7 @@ class MonthsGrid extends _baseComponent.default {
653
676
  className: monthGridCls,
654
677
  "x-type": type,
655
678
  "x-panel-yearandmonth-open-type": yearOpenType,
679
+ "x-insetInput": insetInput ? "true" : "false",
656
680
  ref: current => this.cacheRefCurrent('monthGrid', current)
657
681
  }, content);
658
682
  }
@@ -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,
@@ -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));
@@ -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;
@@ -418,8 +418,13 @@ class Body extends _baseComponent.default {
418
418
  const {
419
419
  flattenedColumns,
420
420
  getCellWidths
421
- } = _this.context;
422
- const cellWidths = getCellWidths(flattenedColumns);
421
+ } = _this.context; // we use memoized cellWidths to avoid re-render expanded row (fix #686)
422
+
423
+ if (flattenedColumns !== _this.flattenedColumns) {
424
+ _this.flattenedColumns = flattenedColumns;
425
+ _this.cellWidths = getCellWidths(flattenedColumns);
426
+ }
427
+
423
428
  return /*#__PURE__*/_react.default.createElement(_ExpandedRow.default, {
424
429
  style: style,
425
430
  components: components,
@@ -431,7 +436,7 @@ class Body extends _baseComponent.default {
431
436
  index: index,
432
437
  virtualized: virtualized,
433
438
  key: (0, _utils.genExpandedRowKey)(key),
434
- cellWidths: cellWidths
439
+ cellWidths: _this.cellWidths
435
440
  });
436
441
  };
437
442
  /**
@@ -601,7 +606,9 @@ class Body extends _baseComponent.default {
601
606
  };
602
607
  this.listRef = /*#__PURE__*/_react.default.createRef();
603
608
  const {
604
- getVirtualizedListRef
609
+ getVirtualizedListRef,
610
+ flattenedColumns,
611
+ getCellWidths
605
612
  } = context;
606
613
 
607
614
  if (getVirtualizedListRef) {
@@ -613,6 +620,8 @@ class Body extends _baseComponent.default {
613
620
  }
614
621
 
615
622
  this.foundation = new _bodyFoundation.default(this.adapter);
623
+ this.flattenedColumns = flattenedColumns;
624
+ this.cellWidths = getCellWidths(flattenedColumns);
616
625
  this.observer = null;
617
626
  }
618
627
 
@@ -275,7 +275,8 @@ class Tree extends _baseComponent.default {
275
275
  const isSeaching = Boolean(props.filterTreeNode && prevState.inputValue && prevState.inputValue.length);
276
276
  const newState = {
277
277
  prevProps: props
278
- }; // Accept a props field as a parameter to determine whether to update the field
278
+ };
279
+ const isExpandControlled = ('expandedKeys' in props); // Accept a props field as a parameter to determine whether to update the field
279
280
 
280
281
  const needUpdate = name => {
281
282
  const firstInProps = !prevProps && name in props;
@@ -319,7 +320,8 @@ class Tree extends _baseComponent.default {
319
320
  }
320
321
  }
321
322
 
322
- const expandAllWhenDataChange = (needUpdate('treeDataSimpleJson') || needUpdate('treeData')) && props.expandAll;
323
+ const dataUpdated = needUpdate('treeDataSimpleJson') || needUpdate('treeData');
324
+ const expandAllWhenDataChange = dataUpdated && props.expandAll;
323
325
 
324
326
  if (!isSeaching) {
325
327
  // Update expandedKeys
@@ -345,7 +347,7 @@ class Tree extends _baseComponent.default {
345
347
  newState.expandedKeys = (0, _treeUtil.calcExpandedKeys)(props.defaultExpandedKeys, keyEntities);
346
348
  } else if (!prevProps && props.defaultValue) {
347
349
  newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)(props.defaultValue, keyEntities, props.multiple, valueEntities);
348
- } else if (!prevProps && props.value) {
350
+ } else if ((!prevProps || !isExpandControlled && dataUpdated) && props.value) {
349
351
  newState.expandedKeys = (0, _treeUtil.calcExpandedKeysForValues)(props.value, keyEntities, props.multiple, valueEntities);
350
352
  }
351
353
 
@@ -109,6 +109,7 @@ export interface NodeListProps {
109
109
  motionKeys: Set<string>;
110
110
  motionType: string;
111
111
  flattenList: FlattenNode[] | undefined;
112
+ searchTargetIsDeep?: boolean;
112
113
  renderTreeNode: (treeNode: FlattenNode, ind?: number, style?: React.CSSProperties) => ReactNode;
113
114
  }
114
115
  export declare type TransitionNodes<T> = Array<T | Array<T>>;
@@ -107,12 +107,13 @@ class NodeList extends _react.PureComponent {
107
107
  const {
108
108
  flattenNodes,
109
109
  motionType,
110
+ searchTargetIsDeep,
110
111
  renderTreeNode
111
112
  } = this.props;
112
113
  const {
113
114
  transitionNodes
114
115
  } = this.state;
115
- const mapData = transitionNodes.length ? transitionNodes : flattenNodes;
116
+ const mapData = transitionNodes.length && !searchTargetIsDeep ? transitionNodes : flattenNodes;
116
117
  const options = (0, _map.default)(mapData).call(mapData, treeNode => {
117
118
  const isMotionNode = (0, _isArray.default)(treeNode);
118
119
 
@@ -795,7 +795,8 @@ class TreeSelect extends _baseComponent.default {
795
795
  const {
796
796
  flattenNodes,
797
797
  motionKeys,
798
- motionType
798
+ motionType,
799
+ filteredKeys
799
800
  } = this.state;
800
801
  const {
801
802
  direction
@@ -804,6 +805,7 @@ class TreeSelect extends _baseComponent.default {
804
805
  virtualize,
805
806
  motionExpand
806
807
  } = this.props;
808
+ const isExpandControlled = ('expandedKeys' in this.props);
807
809
 
808
810
  if (!virtualize || (0, _isEmpty2.default)(virtualize)) {
809
811
  return /*#__PURE__*/_react.default.createElement(_nodeList.default, {
@@ -811,6 +813,8 @@ class TreeSelect extends _baseComponent.default {
811
813
  flattenList: this._flattenNodes,
812
814
  motionKeys: motionExpand ? motionKeys : new _set.default([]),
813
815
  motionType: motionType,
816
+ // When motionKeys is empty, but filteredKeys is not empty (that is, the search hits), this situation should be distinguished from ordinary motionKeys
817
+ searchTargetIsDeep: isExpandControlled && motionExpand && (0, _isEmpty2.default)(motionKeys) && !(0, _isEmpty2.default)(filteredKeys),
814
818
  onMotionEnd: this.onMotionEnd,
815
819
  renderTreeNode: this.renderTreeNode
816
820
  });
@@ -1131,8 +1135,8 @@ class TreeSelect extends _baseComponent.default {
1131
1135
  notifySelect: (selectKey, bool, node) => {
1132
1136
  this.props.onSelect && this.props.onSelect(selectKey, bool, node);
1133
1137
  },
1134
- notifySearch: input => {
1135
- this.props.onSearch && this.props.onSearch(input);
1138
+ notifySearch: (input, filteredExpandedKeys) => {
1139
+ this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys);
1136
1140
  },
1137
1141
  cacheFlattenNodes: bool => {
1138
1142
  this._flattenNodes = bool ? (0, _treeUtil2.cloneDeep)(this.state.flattenNodes) : null;