@douyinfe/semi-ui 2.5.0 → 2.6.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 (68) hide show
  1. package/calendar/monthCalendar.tsx +14 -13
  2. package/cascader/index.tsx +21 -3
  3. package/cascader/item.tsx +25 -5
  4. package/datePicker/dateInput.tsx +8 -5
  5. package/datePicker/datePicker.tsx +6 -1
  6. package/datePicker/month.tsx +14 -7
  7. package/datePicker/monthsGrid.tsx +17 -5
  8. package/datePicker/navigation.tsx +8 -4
  9. package/datePicker/quickControl.tsx +1 -0
  10. package/datePicker/yearAndMonth.tsx +1 -1
  11. package/dist/css/semi.css +21 -8
  12. package/dist/css/semi.min.css +1 -1
  13. package/dist/umd/semi-ui.js +232 -92
  14. package/dist/umd/semi-ui.js.map +1 -1
  15. package/dist/umd/semi-ui.min.js +1 -1
  16. package/dist/umd/semi-ui.min.js.map +1 -1
  17. package/form/__test__/formApi.test.js +182 -0
  18. package/form/_story/FormApi/arrayDemo.jsx +4 -7
  19. package/form/_story/Layout/slotDemo.jsx +2 -2
  20. package/form/_story/demo.jsx +18 -1
  21. package/form/_story/form.stories.js +6 -6
  22. package/form/baseForm.tsx +2 -2
  23. package/form/hoc/withField.tsx +1 -1
  24. package/lib/cjs/_base/base.css +5 -5
  25. package/lib/cjs/calendar/monthCalendar.js +21 -5
  26. package/lib/cjs/cascader/index.d.ts +9 -2
  27. package/lib/cjs/cascader/index.js +14 -1
  28. package/lib/cjs/cascader/item.d.ts +6 -2
  29. package/lib/cjs/cascader/item.js +33 -4
  30. package/lib/cjs/datePicker/dateInput.d.ts +0 -2
  31. package/lib/cjs/datePicker/dateInput.js +17 -6
  32. package/lib/cjs/datePicker/datePicker.js +15 -12
  33. package/lib/cjs/datePicker/month.d.ts +1 -0
  34. package/lib/cjs/datePicker/month.js +18 -2
  35. package/lib/cjs/datePicker/monthsGrid.js +16 -4
  36. package/lib/cjs/datePicker/navigation.js +8 -0
  37. package/lib/cjs/datePicker/quickControl.js +1 -0
  38. package/lib/cjs/datePicker/yearAndMonth.js +1 -0
  39. package/lib/cjs/form/baseForm.js +2 -2
  40. package/lib/cjs/form/hoc/withField.js +1 -1
  41. package/lib/cjs/scrollList/scrollItem.d.ts +2 -1
  42. package/lib/cjs/scrollList/scrollItem.js +13 -3
  43. package/lib/es/_base/base.css +5 -5
  44. package/lib/es/calendar/monthCalendar.js +22 -5
  45. package/lib/es/cascader/index.d.ts +9 -2
  46. package/lib/es/cascader/index.js +14 -1
  47. package/lib/es/cascader/item.d.ts +6 -2
  48. package/lib/es/cascader/item.js +31 -4
  49. package/lib/es/datePicker/dateInput.d.ts +0 -2
  50. package/lib/es/datePicker/dateInput.js +17 -6
  51. package/lib/es/datePicker/datePicker.js +15 -12
  52. package/lib/es/datePicker/month.d.ts +1 -0
  53. package/lib/es/datePicker/month.js +18 -2
  54. package/lib/es/datePicker/monthsGrid.js +16 -4
  55. package/lib/es/datePicker/navigation.js +8 -0
  56. package/lib/es/datePicker/quickControl.js +2 -0
  57. package/lib/es/datePicker/yearAndMonth.js +1 -0
  58. package/lib/es/form/baseForm.js +2 -2
  59. package/lib/es/form/hoc/withField.js +1 -1
  60. package/lib/es/scrollList/scrollItem.d.ts +2 -1
  61. package/lib/es/scrollList/scrollItem.js +13 -3
  62. package/package.json +9 -9
  63. package/scrollList/_story/ScrollList/index.js +3 -0
  64. package/scrollList/_story/WheelList/index.js +3 -0
  65. package/scrollList/scrollItem.tsx +30 -9
  66. package/table/_story/Perf/Virtualized/index.jsx +6 -0
  67. package/table/_story/v2/FixedHeaderMerge/index.jsx +1 -1
  68. package/table/_story/v2/defaultFilteredValue.tsx +0 -9
@@ -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/es/cascader/foundation';
4
4
  import '@douyinfe/semi-foundation/lib/es/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,7 +180,7 @@ 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;
@@ -191,6 +194,10 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
191
194
  handleMouseOver: () => void;
192
195
  handleMouseLeave: () => void;
193
196
  handleClear: (e: MouseEvent) => void;
197
+ /**
198
+ * A11y: simulate clear button click
199
+ */
200
+ handleClearEnterPress: (e: KeyboardEvent) => void;
194
201
  showClearBtn: () => boolean;
195
202
  renderClearBtn: () => JSX.Element;
196
203
  renderArrow: () => JSX.Element;
@@ -330,6 +330,15 @@ class Cascader extends BaseComponent {
330
330
  e && e.stopPropagation();
331
331
  this.foundation.handleClear();
332
332
  };
333
+ /**
334
+ * A11y: simulate clear button click
335
+ */
336
+
337
+
338
+ this.handleClearEnterPress = e => {
339
+ e && e.stopPropagation();
340
+ this.foundation.handleClearEnterPress();
341
+ };
333
342
 
334
343
  this.showClearBtn = () => {
335
344
  const {
@@ -356,6 +365,7 @@ class Cascader extends BaseComponent {
356
365
  return /*#__PURE__*/React.createElement("div", {
357
366
  className: clearCls,
358
367
  onClick: this.handleClear,
368
+ onKeyPress: this.handleClearEnterPress,
359
369
  role: 'button',
360
370
  tabIndex: 0
361
371
  }, /*#__PURE__*/React.createElement(IconClear, null));
@@ -445,6 +455,7 @@ class Cascader extends BaseComponent {
445
455
  style: style,
446
456
  ref: this.triggerRef,
447
457
  onClick: e => this.foundation.handleClick(e),
458
+ onKeyPress: e => this.foundation.handleSelectionEnterPress(e),
448
459
  "aria-invalid": this.props['aria-invalid'],
449
460
  "aria-errormessage": this.props['aria-errormessage'],
450
461
  "aria-label": this.props['aria-label'],
@@ -887,6 +898,7 @@ Cascader.propTypes = {
887
898
  'aria-errormessage': PropTypes.string,
888
899
  'aria-describedby': PropTypes.string,
889
900
  'aria-required': PropTypes.bool,
901
+ 'aria-label': PropTypes.string,
890
902
  arrowIcon: PropTypes.node,
891
903
  changeOnSelect: PropTypes.bool,
892
904
  defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
@@ -981,6 +993,7 @@ Cascader.defaultProps = {
981
993
  onClear: _noop,
982
994
  onDropdownVisibleChange: _noop,
983
995
  onListScroll: _noop,
984
- enableLeafClick: false
996
+ enableLeafClick: false,
997
+ 'aria-label': 'Cascader'
985
998
  };
986
999
  export default Cascader;
@@ -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) => {
@@ -2,10 +2,12 @@ import _includes from "lodash/includes";
2
2
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
3
3
  import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
4
4
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
5
+ import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign";
5
6
  import React, { PureComponent } from 'react';
6
7
  import cls from 'classnames';
7
8
  import PropTypes from 'prop-types';
8
9
  import { cssClasses, strings } from '@douyinfe/semi-foundation/lib/es/cascader/constants';
10
+ import isEnterPress from '@douyinfe/semi-foundation/lib/es/utils/isEnterPress';
9
11
  import ConfigContext from '../configProvider/context';
10
12
  import LocaleConsumer from '../locale/localeConsumer';
11
13
  import { IconChevronRight, IconTick } from '@douyinfe/semi-icons';
@@ -27,6 +29,16 @@ export default class Item extends PureComponent {
27
29
 
28
30
  onItemClick(e, item);
29
31
  };
32
+ /**
33
+ * A11y: simulate item click
34
+ */
35
+
36
+
37
+ this.handleItemEnterPress = (keyboardEvent, item) => {
38
+ if (isEnterPress(keyboardEvent)) {
39
+ this.onClick(keyboardEvent, item);
40
+ }
41
+ };
30
42
 
31
43
  this.onHover = (e, item) => {
32
44
  const {
@@ -106,6 +118,7 @@ export default class Item extends PureComponent {
106
118
 
107
119
  case 'empty':
108
120
  return /*#__PURE__*/React.createElement("span", {
121
+ "aria-hidden": true,
109
122
  className: _concatInstanceProperty(_context3 = "".concat(prefixcls, "-icon ")).call(_context3, prefixcls, "-icon-empty")
110
123
  });
111
124
 
@@ -169,11 +182,13 @@ export default class Item extends PureComponent {
169
182
  ["".concat(prefixcls, "-disabled")]: disabled
170
183
  });
171
184
  return /*#__PURE__*/React.createElement("li", {
185
+ role: 'menuitem',
172
186
  className: className,
173
187
  key: key,
174
188
  onClick: e => {
175
189
  this.onClick(e, item);
176
- }
190
+ },
191
+ onKeyPress: e => this.handleItemEnterPress(e, item)
177
192
  }, /*#__PURE__*/React.createElement("span", {
178
193
  className: "".concat(prefixcls, "-label")
179
194
  }, !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/React.createElement(Checkbox, {
@@ -198,13 +213,15 @@ export default class Item extends PureComponent {
198
213
  let showChildItem;
199
214
  const ind = content.length;
200
215
  content.push( /*#__PURE__*/React.createElement("ul", {
216
+ role: 'menu',
201
217
  className: "".concat(prefixcls, "-list"),
202
218
  key: renderData[0].key,
203
219
  onScroll: e => this.props.onListScroll(e, ind)
204
220
  }, _mapInstanceProperty(renderData).call(renderData, item => {
205
221
  const {
206
222
  data,
207
- key
223
+ key,
224
+ parentKey
208
225
  } = item;
209
226
  const {
210
227
  children,
@@ -229,16 +246,26 @@ export default class Item extends PureComponent {
229
246
  ["".concat(prefixcls, "-select")]: selected && !multiple,
230
247
  ["".concat(prefixcls, "-disabled")]: disabled
231
248
  });
232
- return /*#__PURE__*/React.createElement("li", {
249
+ const otherAriaProps = parentKey ? {
250
+ ['aria-owns']: "cascaderItem-".concat(parentKey)
251
+ } : {};
252
+ return /*#__PURE__*/React.createElement("li", _Object$assign({
253
+ role: 'menuitem',
254
+ id: "cascaderItem-".concat(key),
255
+ "aria-expanded": active,
256
+ "aria-haspopup": Boolean(showExpand),
257
+ "aria-disabled": disabled
258
+ }, otherAriaProps, {
233
259
  className: className,
234
260
  key: key,
235
261
  onClick: e => {
236
262
  this.onClick(e, item);
237
263
  },
264
+ onKeyPress: e => this.handleItemEnterPress(e, item),
238
265
  onMouseEnter: e => {
239
266
  this.onHover(e, item);
240
267
  }
241
- }, /*#__PURE__*/React.createElement("span", {
268
+ }), /*#__PURE__*/React.createElement("span", {
242
269
  className: "".concat(prefixcls, "-label")
243
270
  }, selected && !multiple && this.renderIcon('tick'), !selected && !multiple && this.renderIcon('empty'), multiple && /*#__PURE__*/React.createElement(Checkbox, {
244
271
  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;
@@ -15,6 +15,8 @@ var __rest = this && this.__rest || function (s, e) {
15
15
  }
16
16
  return t;
17
17
  };
18
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/interactive-supports-focus */
19
+
18
20
  /* eslint-disable max-lines-per-function */
19
21
 
20
22
  /* eslint-disable no-unused-vars */
@@ -170,9 +172,14 @@ export default class DateInput extends BaseComponent {
170
172
  } = this.props;
171
173
  const allowClear = (rangeStart || rangeEnd) && showClear;
172
174
  return allowClear && !disabled ? /*#__PURE__*/React.createElement("div", {
175
+ role: "button",
176
+ tabIndex: 0,
177
+ "aria-label": "Clear range input value",
173
178
  className: "".concat(prefixCls, "-range-input-clearbtn"),
174
179
  onMouseDown: e => !disabled && this.handleRangeInputClear(e)
175
- }, /*#__PURE__*/React.createElement(IconClear, null)) : null;
180
+ }, /*#__PURE__*/React.createElement(IconClear, {
181
+ "aria-hidden": true
182
+ })) : null;
176
183
  }
177
184
 
178
185
  renderRangeSuffix(suffix) {
@@ -273,6 +280,8 @@ export default class DateInput extends BaseComponent {
273
280
  validateStatus,
274
281
  block,
275
282
  prefixCls,
283
+ multiple,
284
+ // Whether to allow multiple values for email and file types
276
285
  dateFnsLocale,
277
286
  // No need to pass to input
278
287
  onBlur,
@@ -290,10 +299,14 @@ export default class DateInput extends BaseComponent {
290
299
  rangeInputFocus,
291
300
  rangeSeparator
292
301
  } = _a,
293
- 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"]);
302
+ 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"]);
294
303
 
295
- const dateIcon = /*#__PURE__*/React.createElement(IconCalendar, null);
296
- const dateTimeIcon = /*#__PURE__*/React.createElement(IconCalendarClock, null);
304
+ const dateIcon = /*#__PURE__*/React.createElement(IconCalendar, {
305
+ "aria-hidden": true
306
+ });
307
+ const dateTimeIcon = /*#__PURE__*/React.createElement(IconCalendarClock, {
308
+ "aria-hidden": true
309
+ });
297
310
  const suffix = _includesInstanceProperty(type).call(type, 'Time') ? dateTimeIcon : dateIcon;
298
311
  let text = '';
299
312
 
@@ -348,7 +361,6 @@ DateInput.propTypes = {
348
361
  value: PropTypes.array,
349
362
  disabled: PropTypes.bool,
350
363
  type: PropTypes.oneOf(strings.TYPE_SET),
351
- multiple: PropTypes.bool,
352
364
  showClear: PropTypes.bool,
353
365
  format: PropTypes.string,
354
366
  inputStyle: PropTypes.object,
@@ -372,7 +384,6 @@ DateInput.defaultProps = {
372
384
  onBlur: noop,
373
385
  onClear: noop,
374
386
  onFocus: noop,
375
- multiple: false,
376
387
  type: 'date',
377
388
  inputStyle: {},
378
389
  inputReadOnly: false,
@@ -9,6 +9,8 @@ import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/ins
9
9
  import _setTimeout from "@babel/runtime-corejs3/core-js-stable/set-timeout";
10
10
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
11
11
 
12
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus */
13
+
12
14
  /* eslint-disable max-len */
13
15
  import React from 'react';
14
16
  import classnames from 'classnames';
@@ -576,18 +578,19 @@ export default class DatePicker extends BaseComponent {
576
578
  onRangeEndTabPress: this.handleRangeEndTabPress
577
579
  });
578
580
 
579
- return (
580
- /*#__PURE__*/
581
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
582
- React.createElement("div", {
583
- onClick: this.handleTriggerWrapperClick,
584
- className: inputCls
585
- }, typeof triggerRender === 'function' ? /*#__PURE__*/React.createElement(Trigger, _Object$assign({}, props, {
586
- triggerRender: triggerRender,
587
- componentName: "DatePicker",
588
- componentProps: _Object$assign({}, this.props)
589
- })) : /*#__PURE__*/React.createElement(DateInput, _Object$assign({}, props)))
590
- );
581
+ return /*#__PURE__*/React.createElement("div", {
582
+ // tooltip will mount a11y props to children
583
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
584
+ role: "combobox",
585
+ "aria-label": _Array$isArray(value) && value.length ? "Change date" : "Choose date",
586
+ "aria-disabled": disabled,
587
+ onClick: this.handleTriggerWrapperClick,
588
+ className: inputCls
589
+ }, typeof triggerRender === 'function' ? /*#__PURE__*/React.createElement(Trigger, _Object$assign({}, props, {
590
+ triggerRender: triggerRender,
591
+ componentName: "DatePicker",
592
+ componentProps: _Object$assign({}, this.props)
593
+ })) : /*#__PURE__*/React.createElement(DateInput, _Object$assign({}, props)));
591
594
  }
592
595
 
593
596
  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;
@@ -6,6 +6,8 @@ import _trimInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instanc
6
6
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
7
7
  import _Set from "@babel/runtime-corejs3/core-js-stable/set";
8
8
 
9
+ /* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/no-noninteractive-element-interactions */
10
+
9
11
  /* eslint-disable max-len */
10
12
  import React from 'react';
11
13
  import classNames from 'classnames';
@@ -328,8 +330,10 @@ export default class Month extends BaseComponent {
328
330
  const weekdaysText = _mapInstanceProperty(weekdays).call(weekdays, key => locale.weeks[key]);
329
331
 
330
332
  return /*#__PURE__*/React.createElement("div", {
333
+ role: "row",
331
334
  className: weekdayCls
332
335
  }, _mapInstanceProperty(weekdaysText).call(weekdaysText, (E, i) => /*#__PURE__*/React.createElement("div", {
336
+ role: "columnheader",
333
337
  key: E + i,
334
338
  className: weekdayItemCls
335
339
  }, E)));
@@ -364,6 +368,7 @@ export default class Month extends BaseComponent {
364
368
  renderWeek(week, weekIndex) {
365
369
  const weekCls = cssClasses.WEEK;
366
370
  return /*#__PURE__*/React.createElement("div", {
371
+ role: "row",
367
372
  className: weekCls,
368
373
  key: weekIndex
369
374
  }, _mapInstanceProperty(week).call(week, (day, dayIndex) => this.renderDay(day, dayIndex)));
@@ -384,6 +389,8 @@ export default class Month extends BaseComponent {
384
389
 
385
390
  if (!fullDate) {
386
391
  return /*#__PURE__*/React.createElement("div", {
392
+ role: "gridcell",
393
+ tabIndex: -1,
387
394
  key: dayNumber + dayIndex,
388
395
  className: cssClasses.DAY
389
396
  }, /*#__PURE__*/React.createElement("span", null));
@@ -421,6 +428,11 @@ export default class Month extends BaseComponent {
421
428
  const customRender = _isFunction(renderFullDate);
422
429
 
423
430
  return /*#__PURE__*/React.createElement("div", {
431
+ role: "gridcell",
432
+ tabIndex: dayStatus.isDisabled ? -1 : 0,
433
+ "aria-disabled": dayStatus.isDisabled,
434
+ "aria-selected": dayStatus.isSelected,
435
+ "aria-label": fullDate,
424
436
  className: !customRender ? dayCls : cssClasses.DAY,
425
437
  title: fullDate,
426
438
  key: dayNumber + dayIndex,
@@ -434,13 +446,16 @@ export default class Month extends BaseComponent {
434
446
 
435
447
  render() {
436
448
  const {
437
- forwardRef
449
+ forwardRef,
450
+ multiple
438
451
  } = this.props;
439
452
  const weekday = this.renderDayOfWeek();
440
453
  const weeks = this.renderWeeks();
441
454
  const monthCls = classNames(cssClasses.MONTH);
442
455
  const ref = forwardRef || this.monthRef;
443
456
  return /*#__PURE__*/React.createElement("div", {
457
+ role: "grid",
458
+ "aria-multiselectable": multiple,
444
459
  ref: ref,
445
460
  className: monthCls
446
461
  }, weekday, weeks);
@@ -466,7 +481,8 @@ Month.propTypes = {
466
481
  startDateOffset: PropTypes.func,
467
482
  endDateOffset: PropTypes.func,
468
483
  rangeInputFocus: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
469
- focusRecordsRef: PropTypes.object
484
+ focusRecordsRef: PropTypes.object,
485
+ multiple: PropTypes.bool
470
486
  };
471
487
  Month.defaultProps = {
472
488
  month: new Date(),
@@ -7,6 +7,8 @@ import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign"
7
7
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
8
8
  import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
9
9
 
10
+ /* eslint-disable jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events */
11
+
10
12
  /* eslint-disable react/no-did-update-set-state */
11
13
 
12
14
  /* eslint-disable max-len */
@@ -362,7 +364,8 @@ export default class MonthsGrid extends BaseComponent {
362
364
  endDateOffset,
363
365
  density,
364
366
  rangeInputFocus,
365
- syncSwitchMonth
367
+ syncSwitchMonth,
368
+ multiple
366
369
  } = this.props;
367
370
  let monthText = ''; // i18n monthText
368
371
 
@@ -428,7 +431,8 @@ export default class MonthsGrid extends BaseComponent {
428
431
  onWeeksRowNumChange: weeksRowNum => this.handleWeeksRowNumChange(weeksRowNum, panelType),
429
432
  startDateOffset: startDateOffset,
430
433
  endDateOffset: endDateOffset,
431
- focusRecordsRef: this.props.focusRecordsRef
434
+ focusRecordsRef: this.props.focusRecordsRef,
435
+ multiple: multiple
432
436
  }));
433
437
  }
434
438
 
@@ -584,14 +588,22 @@ export default class MonthsGrid extends BaseComponent {
584
588
  className: switchCls,
585
589
  ref: current => this.adapter.setCache("switch-".concat(panelType), current)
586
590
  }, /*#__PURE__*/React.createElement("div", {
591
+ role: "button",
592
+ "aria-label": "Switch to date panel",
587
593
  className: dateCls,
588
594
  onClick: e => this.foundation.showDatePanel(panelType)
589
- }, showSwithIcon && /*#__PURE__*/React.createElement(IconCalendar, null), /*#__PURE__*/React.createElement("span", {
595
+ }, showSwithIcon && /*#__PURE__*/React.createElement(IconCalendar, {
596
+ "aria-hidden": true
597
+ }), /*#__PURE__*/React.createElement("span", {
590
598
  className: textCls
591
599
  }, dateText || monthText)), /*#__PURE__*/React.createElement("div", {
600
+ role: "button",
601
+ "aria-label": "Switch to time panel",
592
602
  className: timeCls,
593
603
  onClick: e => this.foundation.showTimePicker(panelType, true)
594
- }, showSwithIcon && /*#__PURE__*/React.createElement(IconClock, null), /*#__PURE__*/React.createElement("span", {
604
+ }, showSwithIcon && /*#__PURE__*/React.createElement(IconClock, {
605
+ "aria-hidden": true
606
+ }), /*#__PURE__*/React.createElement("span", {
595
607
  className: textCls
596
608
  }, timeText)));
597
609
  }
@@ -54,7 +54,9 @@ export default class Navigation extends PureComponent {
54
54
  ref: ref
55
55
  }, /*#__PURE__*/React.createElement(IconButton, {
56
56
  key: "double-chevron-left",
57
+ "aria-label": "Previous year",
57
58
  icon: /*#__PURE__*/React.createElement(IconDoubleChevronLeft, {
59
+ "aria-hidden": true,
58
60
  size: iconBtnSize
59
61
  }),
60
62
  size: buttonSize,
@@ -64,7 +66,9 @@ export default class Navigation extends PureComponent {
64
66
  style: leftButtonStyle
65
67
  }), /*#__PURE__*/React.createElement(IconButton, {
66
68
  key: "chevron-left",
69
+ "aria-label": "Previous month",
67
70
  icon: /*#__PURE__*/React.createElement(IconChevronLeft, {
71
+ "aria-hidden": true,
68
72
  size: iconBtnSize
69
73
  }),
70
74
  size: buttonSize,
@@ -80,7 +84,9 @@ export default class Navigation extends PureComponent {
80
84
  size: buttonSize
81
85
  }, /*#__PURE__*/React.createElement("span", null, monthText))), /*#__PURE__*/React.createElement(IconButton, {
82
86
  key: "chevron-right",
87
+ "aria-label": "Next month",
83
88
  icon: /*#__PURE__*/React.createElement(IconChevronRight, {
89
+ "aria-hidden": true,
84
90
  size: iconBtnSize
85
91
  }),
86
92
  size: buttonSize,
@@ -90,7 +96,9 @@ export default class Navigation extends PureComponent {
90
96
  style: rightButtonStyle
91
97
  }), /*#__PURE__*/React.createElement(IconButton, {
92
98
  key: "double-chevron-right",
99
+ "aria-label": "Next year",
93
100
  icon: /*#__PURE__*/React.createElement(IconDoubleChevronRight, {
101
+ "aria-hidden": true,
94
102
  size: iconBtnSize
95
103
  }),
96
104
  size: buttonSize,
@@ -1,5 +1,7 @@
1
1
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
2
2
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
3
+
4
+ /* eslint-disable jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events */
3
5
  import React, { PureComponent } from 'react';
4
6
  import classNames from 'classnames';
5
7
  import PropTypes from 'prop-types';
@@ -222,6 +222,7 @@ class YearAndMonth extends BaseComponent {
222
222
  }, /*#__PURE__*/React.createElement(IconButton, {
223
223
  noHorizontalPadding: false,
224
224
  icon: /*#__PURE__*/React.createElement(IconChevronLeft, {
225
+ "aria-hidden": true,
225
226
  size: iconSize
226
227
  }),
227
228
  size: buttonSize,
@@ -77,8 +77,8 @@ class Form extends BaseComponent {
77
77
  notifySubmitFail: (errors, values) => {
78
78
  this.props.onSubmitFail(errors, values);
79
79
  },
80
- forceUpdate: () => {
81
- this.forceUpdate();
80
+ forceUpdate: callback => {
81
+ this.forceUpdate(callback);
82
82
  },
83
83
  notifyChange: formState => {
84
84
  this.props.onChange(formState);
@@ -498,7 +498,7 @@ function withField(Component, opts) {
498
498
  text: label || field,
499
499
  id: labelId,
500
500
  required: required,
501
- name: name || field,
501
+ name: a11yId || name || field,
502
502
  width: mergeLabelWidth,
503
503
  align: mergeLabelAlign
504
504
  }, needSpread));
@@ -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/es/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;
@@ -274,13 +274,14 @@ export default class ScrollItem extends BaseComponent {
274
274
  transform: itemTrans
275
275
  } = item;
276
276
  const transform = typeof itemTrans === 'function' ? itemTrans : commonTrans;
277
+ const selected = selectedIndex === index;
277
278
  const cls = classnames({
278
- ["".concat(cssClasses.PREFIX, "-item-sel")]: selectedIndex === index && mode !== wheelMode,
279
+ ["".concat(cssClasses.PREFIX, "-item-sel")]: selected && mode !== wheelMode,
279
280
  ["".concat(cssClasses.PREFIX, "-item-disabled")]: Boolean(item.disabled)
280
281
  });
281
282
  let text = '';
282
283
 
283
- if (selectedIndex === index) {
284
+ if (selected) {
284
285
  if (typeof transform === 'function') {
285
286
  text = transform(item.value, item.text);
286
287
  } else {
@@ -304,7 +305,10 @@ export default class ScrollItem extends BaseComponent {
304
305
  React.createElement("li", _Object$assign({
305
306
  key: prefixKey + index
306
307
  }, events, {
307
- className: cls
308
+ className: cls,
309
+ role: "option",
310
+ "aria-selected": selected,
311
+ "aria-disabled": item.disabled
308
312
  }), text)
309
313
  );
310
314
  });
@@ -323,6 +327,9 @@ export default class ScrollItem extends BaseComponent {
323
327
  className: wrapperCls,
324
328
  ref: this._cacheWrapperNode
325
329
  }, /*#__PURE__*/React.createElement("ul", {
330
+ role: "listbox",
331
+ "aria-multiselectable": false,
332
+ "aria-label": this.props['aria-label'],
326
333
  ref: this._cacheListNode
327
334
  }, inner));
328
335
  };
@@ -380,6 +387,9 @@ export default class ScrollItem extends BaseComponent {
380
387
  ref: this._cacheWrapperNode,
381
388
  onScroll: this.scrollToSelectItem
382
389
  }, /*#__PURE__*/React.createElement("ul", {
390
+ role: "listbox",
391
+ "aria-label": this.props['aria-label'],
392
+ "aria-multiselectable": false,
383
393
  ref: this._cacheListNode,
384
394
  onClick: this.clickToSelectItem
385
395
  }, prependList, inner, appendList)));