@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.
- package/calendar/monthCalendar.tsx +14 -13
- package/cascader/index.tsx +21 -3
- package/cascader/item.tsx +25 -5
- package/datePicker/dateInput.tsx +8 -5
- package/datePicker/datePicker.tsx +6 -1
- package/datePicker/month.tsx +14 -7
- package/datePicker/monthsGrid.tsx +17 -5
- package/datePicker/navigation.tsx +8 -4
- package/datePicker/quickControl.tsx +1 -0
- package/datePicker/yearAndMonth.tsx +1 -1
- package/dist/css/semi.css +21 -8
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +232 -92
- package/dist/umd/semi-ui.js.map +1 -1
- package/dist/umd/semi-ui.min.js +1 -1
- package/dist/umd/semi-ui.min.js.map +1 -1
- package/form/__test__/formApi.test.js +182 -0
- package/form/_story/FormApi/arrayDemo.jsx +4 -7
- package/form/_story/Layout/slotDemo.jsx +2 -2
- package/form/_story/demo.jsx +18 -1
- package/form/_story/form.stories.js +6 -6
- package/form/baseForm.tsx +2 -2
- package/form/hoc/withField.tsx +1 -1
- package/lib/cjs/_base/base.css +5 -5
- package/lib/cjs/calendar/monthCalendar.js +21 -5
- package/lib/cjs/cascader/index.d.ts +9 -2
- package/lib/cjs/cascader/index.js +14 -1
- package/lib/cjs/cascader/item.d.ts +6 -2
- package/lib/cjs/cascader/item.js +33 -4
- package/lib/cjs/datePicker/dateInput.d.ts +0 -2
- package/lib/cjs/datePicker/dateInput.js +17 -6
- package/lib/cjs/datePicker/datePicker.js +15 -12
- package/lib/cjs/datePicker/month.d.ts +1 -0
- package/lib/cjs/datePicker/month.js +18 -2
- package/lib/cjs/datePicker/monthsGrid.js +16 -4
- package/lib/cjs/datePicker/navigation.js +8 -0
- package/lib/cjs/datePicker/quickControl.js +1 -0
- package/lib/cjs/datePicker/yearAndMonth.js +1 -0
- package/lib/cjs/form/baseForm.js +2 -2
- package/lib/cjs/form/hoc/withField.js +1 -1
- package/lib/cjs/scrollList/scrollItem.d.ts +2 -1
- package/lib/cjs/scrollList/scrollItem.js +13 -3
- package/lib/es/_base/base.css +5 -5
- package/lib/es/calendar/monthCalendar.js +22 -5
- package/lib/es/cascader/index.d.ts +9 -2
- package/lib/es/cascader/index.js +14 -1
- package/lib/es/cascader/item.d.ts +6 -2
- package/lib/es/cascader/item.js +31 -4
- package/lib/es/datePicker/dateInput.d.ts +0 -2
- package/lib/es/datePicker/dateInput.js +17 -6
- package/lib/es/datePicker/datePicker.js +15 -12
- package/lib/es/datePicker/month.d.ts +1 -0
- package/lib/es/datePicker/month.js +18 -2
- package/lib/es/datePicker/monthsGrid.js +16 -4
- package/lib/es/datePicker/navigation.js +8 -0
- package/lib/es/datePicker/quickControl.js +2 -0
- package/lib/es/datePicker/yearAndMonth.js +1 -0
- package/lib/es/form/baseForm.js +2 -2
- package/lib/es/form/hoc/withField.js +1 -1
- package/lib/es/scrollList/scrollItem.d.ts +2 -1
- package/lib/es/scrollList/scrollItem.js +13 -3
- package/package.json +9 -9
- package/scrollList/_story/ScrollList/index.js +3 -0
- package/scrollList/_story/WheelList/index.js +3 -0
- package/scrollList/scrollItem.tsx +30 -9
- package/table/_story/Perf/Virtualized/index.jsx +6 -0
- package/table/_story/v2/FixedHeaderMerge/index.jsx +1 -1
- 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;
|
package/lib/es/cascader/index.js
CHANGED
|
@@ -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) => {
|
package/lib/es/cascader/item.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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,
|
|
296
|
-
|
|
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
|
-
|
|
581
|
-
// eslint-disable-next-line jsx-a11y/
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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,
|
|
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,
|
|
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,
|
package/lib/es/form/baseForm.js
CHANGED
|
@@ -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);
|
|
@@ -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")]:
|
|
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 (
|
|
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)));
|