@douyinfe/semi-ui 2.17.1 → 2.18.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 (149) hide show
  1. package/anchor/index.tsx +1 -1
  2. package/anchor/link.tsx +3 -4
  3. package/autoComplete/__test__/autoComplete.test.js +6 -6
  4. package/autoComplete/index.tsx +1 -1
  5. package/autoComplete/option.tsx +164 -0
  6. package/calendar/__test__/calendar.test.js +21 -2
  7. package/calendar/_story/calendar.stories.js +31 -0
  8. package/calendar/index.tsx +3 -1
  9. package/calendar/interface.ts +2 -1
  10. package/carousel/index.tsx +5 -5
  11. package/dist/css/semi.css +160 -22
  12. package/dist/css/semi.min.css +1 -1
  13. package/dist/umd/semi-ui.js +332 -74
  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/_story/FieldProps/labelOptional.jsx +30 -0
  18. package/form/_story/form.stories.js +7 -0
  19. package/form/hoc/withField.tsx +1 -0
  20. package/form/label.tsx +21 -7
  21. package/gulpfile.js +3 -1
  22. package/lib/cjs/_base/base.css +35 -0
  23. package/lib/cjs/anchor/index.js +2 -1
  24. package/lib/cjs/anchor/link.d.ts +1 -1
  25. package/lib/cjs/anchor/link.js +9 -5
  26. package/lib/cjs/autoComplete/index.d.ts +1 -1
  27. package/lib/cjs/autoComplete/index.js +1 -1
  28. package/lib/cjs/autoComplete/option.d.ts +50 -0
  29. package/lib/cjs/autoComplete/option.js +218 -0
  30. package/lib/cjs/calendar/index.d.ts +2 -0
  31. package/lib/cjs/calendar/index.js +3 -1
  32. package/lib/cjs/calendar/interface.d.ts +2 -1
  33. package/lib/cjs/carousel/index.js +2 -2
  34. package/lib/cjs/form/hoc/withField.js +2 -1
  35. package/lib/cjs/form/label.d.ts +8 -5
  36. package/lib/cjs/form/label.js +15 -4
  37. package/lib/cjs/locale/interface.d.ts +3 -0
  38. package/lib/cjs/locale/source/ar.js +3 -0
  39. package/lib/cjs/locale/source/de.js +3 -0
  40. package/lib/cjs/locale/source/en_GB.js +3 -0
  41. package/lib/cjs/locale/source/en_US.js +3 -0
  42. package/lib/cjs/locale/source/es.js +3 -0
  43. package/lib/cjs/locale/source/fr.js +3 -0
  44. package/lib/cjs/locale/source/id_ID.js +3 -0
  45. package/lib/cjs/locale/source/it.js +3 -0
  46. package/lib/cjs/locale/source/ja_JP.js +3 -0
  47. package/lib/cjs/locale/source/ko_KR.js +3 -0
  48. package/lib/cjs/locale/source/ms_MY.js +3 -0
  49. package/lib/cjs/locale/source/pt_BR.js +3 -0
  50. package/lib/cjs/locale/source/ru_RU.js +3 -0
  51. package/lib/cjs/locale/source/th_TH.js +3 -0
  52. package/lib/cjs/locale/source/tr_TR.js +3 -0
  53. package/lib/cjs/locale/source/vi_VN.js +3 -0
  54. package/lib/cjs/locale/source/zh_CN.js +3 -0
  55. package/lib/cjs/locale/source/zh_TW.js +3 -0
  56. package/lib/cjs/modal/Modal.js +0 -8
  57. package/lib/cjs/modal/ModalContent.js +4 -1
  58. package/lib/cjs/tag/group.d.ts +3 -0
  59. package/lib/cjs/tag/group.js +24 -6
  60. package/lib/cjs/tag/index.d.ts +2 -1
  61. package/lib/cjs/tag/index.js +7 -5
  62. package/lib/cjs/tag/interface.d.ts +2 -1
  63. package/lib/cjs/tree/index.d.ts +3 -1
  64. package/lib/cjs/tree/index.js +23 -0
  65. package/lib/cjs/tree/interface.d.ts +4 -0
  66. package/lib/es/_base/base.css +35 -0
  67. package/lib/es/anchor/index.js +2 -1
  68. package/lib/es/anchor/link.d.ts +1 -1
  69. package/lib/es/anchor/link.js +9 -5
  70. package/lib/es/autoComplete/index.d.ts +1 -1
  71. package/lib/es/autoComplete/index.js +1 -1
  72. package/lib/es/autoComplete/option.d.ts +50 -0
  73. package/lib/es/autoComplete/option.js +188 -0
  74. package/lib/es/calendar/index.d.ts +2 -0
  75. package/lib/es/calendar/index.js +3 -1
  76. package/lib/es/calendar/interface.d.ts +2 -1
  77. package/lib/es/carousel/index.js +2 -2
  78. package/lib/es/form/hoc/withField.js +2 -1
  79. package/lib/es/form/label.d.ts +8 -5
  80. package/lib/es/form/label.js +13 -4
  81. package/lib/es/locale/interface.d.ts +3 -0
  82. package/lib/es/locale/source/ar.js +3 -0
  83. package/lib/es/locale/source/de.js +3 -0
  84. package/lib/es/locale/source/en_GB.js +3 -0
  85. package/lib/es/locale/source/en_US.js +3 -0
  86. package/lib/es/locale/source/es.js +3 -0
  87. package/lib/es/locale/source/fr.js +3 -0
  88. package/lib/es/locale/source/id_ID.js +3 -0
  89. package/lib/es/locale/source/it.js +3 -0
  90. package/lib/es/locale/source/ja_JP.js +3 -0
  91. package/lib/es/locale/source/ko_KR.js +3 -0
  92. package/lib/es/locale/source/ms_MY.js +3 -0
  93. package/lib/es/locale/source/pt_BR.js +3 -0
  94. package/lib/es/locale/source/ru_RU.js +3 -0
  95. package/lib/es/locale/source/th_TH.js +3 -0
  96. package/lib/es/locale/source/tr_TR.js +3 -0
  97. package/lib/es/locale/source/vi_VN.js +3 -0
  98. package/lib/es/locale/source/zh_CN.js +3 -0
  99. package/lib/es/locale/source/zh_TW.js +3 -0
  100. package/lib/es/modal/Modal.js +0 -8
  101. package/lib/es/modal/ModalContent.js +4 -1
  102. package/lib/es/tag/group.d.ts +3 -0
  103. package/lib/es/tag/group.js +24 -6
  104. package/lib/es/tag/index.d.ts +2 -1
  105. package/lib/es/tag/index.js +7 -5
  106. package/lib/es/tag/interface.d.ts +2 -1
  107. package/lib/es/tree/index.d.ts +3 -1
  108. package/lib/es/tree/index.js +22 -0
  109. package/lib/es/tree/interface.d.ts +4 -0
  110. package/locale/interface.ts +3 -0
  111. package/locale/source/ar.ts +3 -0
  112. package/locale/source/de.ts +3 -0
  113. package/locale/source/en_GB.ts +3 -0
  114. package/locale/source/en_US.ts +3 -0
  115. package/locale/source/es.ts +3 -0
  116. package/locale/source/fr.ts +3 -0
  117. package/locale/source/id_ID.ts +3 -0
  118. package/locale/source/it.ts +3 -0
  119. package/locale/source/ja_JP.ts +3 -0
  120. package/locale/source/ko_KR.ts +3 -0
  121. package/locale/source/ms_MY.ts +3 -0
  122. package/locale/source/pt_BR.ts +3 -0
  123. package/locale/source/ru_RU.ts +3 -0
  124. package/locale/source/th_TH.ts +3 -0
  125. package/locale/source/tr_TR.ts +4 -1
  126. package/locale/source/vi_VN.ts +3 -0
  127. package/locale/source/zh_CN.ts +3 -0
  128. package/locale/source/zh_TW.ts +3 -0
  129. package/modal/Modal.tsx +0 -6
  130. package/modal/ModalContent.tsx +4 -1
  131. package/modal/__test__/modal.test.js +1 -1
  132. package/modal/_story/__snapshots__/modal.stories.tsx.snap +203 -0
  133. package/package.json +7 -7
  134. package/radio/_story/radio.stories.js +2 -2
  135. package/rating/__test__/rating.test.js +1 -1
  136. package/select/__test__/select.test.js +11 -17
  137. package/select/_story/select.stories.js +6 -6
  138. package/steps/_story/steps.stories.js +3 -3
  139. package/switch/_story/switch.stories.js +4 -4
  140. package/switch/_story/switch.stories.tsx +4 -4
  141. package/tag/_story/tag.stories.js +57 -1
  142. package/tag/group.tsx +20 -3
  143. package/tag/index.tsx +6 -5
  144. package/tag/interface.ts +2 -1
  145. package/transfer/_story/transfer.stories.js +2 -2
  146. package/tree/_story/tree.stories.js +152 -3
  147. package/tree/index.tsx +16 -1
  148. package/tree/interface.ts +6 -0
  149. package/upload/_story/upload.stories.js +2 -2
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { AutoCompleteAdapter, StateOptionItem, DataItem } from '@douyinfe/semi-foundation/lib/es/autoComplete/foundation';
4
4
  import BaseComponent, { ValidateStatus } from '../_base/baseComponent';
5
5
  import { Position } from '../tooltip';
6
- import Option from '../select/option';
6
+ import Option from './option';
7
7
  import '@douyinfe/semi-foundation/lib/es/autoComplete/autoComplete.css';
8
8
  import { Motion } from '../_base/base';
9
9
  /**
@@ -19,7 +19,7 @@ import Spin from '../spin';
19
19
  import Popover from '../popover';
20
20
  import Input from '../input';
21
21
  import Trigger from '../trigger';
22
- import Option from '../select/option';
22
+ import Option from './option';
23
23
  import warning from '@douyinfe/semi-foundation/lib/es/utils/warning';
24
24
  import '@douyinfe/semi-foundation/lib/es/autoComplete/autoComplete.css';
25
25
  const prefixCls = cssClasses.PREFIX;
@@ -0,0 +1,50 @@
1
+ import React, { PureComponent } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { BasicOptionProps } from '@douyinfe/semi-foundation/lib/es/autoComplete/optionFoundation';
4
+ export interface OptionProps extends BasicOptionProps {
5
+ [x: string]: any;
6
+ value?: string | number;
7
+ label?: string | number | React.ReactNode;
8
+ children?: React.ReactNode;
9
+ disabled?: boolean;
10
+ showTick?: boolean;
11
+ className?: string;
12
+ style?: React.CSSProperties;
13
+ }
14
+ interface renderOptionContentArgument {
15
+ config: {
16
+ searchWords: any;
17
+ sourceString: React.ReactNode;
18
+ };
19
+ children: React.ReactNode;
20
+ inputValue: string;
21
+ prefixCls: string;
22
+ }
23
+ declare class Option extends PureComponent<OptionProps> {
24
+ static isSelectOption: boolean;
25
+ static propTypes: {
26
+ children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
27
+ disabled: PropTypes.Requireable<boolean>;
28
+ value: PropTypes.Requireable<string | number>;
29
+ selected: PropTypes.Requireable<boolean>;
30
+ label: PropTypes.Requireable<PropTypes.ReactNodeLike>;
31
+ empty: PropTypes.Requireable<boolean>;
32
+ emptyContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
33
+ onSelect: PropTypes.Requireable<(...args: any[]) => any>;
34
+ focused: PropTypes.Requireable<boolean>;
35
+ showTick: PropTypes.Requireable<boolean>;
36
+ className: PropTypes.Requireable<string>;
37
+ style: PropTypes.Requireable<object>;
38
+ onMouseEnter: PropTypes.Requireable<(...args: any[]) => any>;
39
+ prefixCls: PropTypes.Requireable<string>;
40
+ renderOptionItem: PropTypes.Requireable<(...args: any[]) => any>;
41
+ inputValue: PropTypes.Requireable<string>;
42
+ };
43
+ static defaultProps: {
44
+ prefixCls: string;
45
+ };
46
+ onClick({ value, label, children, ...rest }: Partial<OptionProps>, event: React.MouseEvent): void;
47
+ renderOptionContent({ config, children, inputValue, prefixCls }: renderOptionContentArgument): React.ReactNode;
48
+ render(): any;
49
+ }
50
+ export default Option;
@@ -0,0 +1,188 @@
1
+ import _isString from "lodash/isString";
2
+ import _indexOfInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/index-of";
3
+ import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
4
+ import _Object$assign from "@babel/runtime-corejs3/core-js-stable/object/assign";
5
+
6
+ var __rest = this && this.__rest || function (s, e) {
7
+ var t = {};
8
+
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && _indexOfInstanceProperty(e).call(e, p) < 0) t[p] = s[p];
10
+
11
+ if (s != null && typeof _Object$getOwnPropertySymbols === "function") for (var i = 0, p = _Object$getOwnPropertySymbols(s); i < p.length; i++) {
12
+ if (_indexOfInstanceProperty(e).call(e, p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
13
+ }
14
+ return t;
15
+ };
16
+ /* eslint-disable max-len */
17
+
18
+
19
+ import React, { PureComponent } from 'react';
20
+ import classNames from 'classnames';
21
+ import PropTypes from 'prop-types';
22
+ import { cssClasses } from '@douyinfe/semi-foundation/lib/es/autoComplete/constants';
23
+ import LocaleConsumer from '../locale/localeConsumer';
24
+ import { IconTick } from '@douyinfe/semi-icons';
25
+ import { getHighLightTextHTML } from '../_utils/index';
26
+
27
+ class Option extends PureComponent {
28
+ onClick(_a, event) {
29
+ var {
30
+ value,
31
+ label,
32
+ children
33
+ } = _a,
34
+ rest = __rest(_a, ["value", "label", "children"]);
35
+
36
+ const {
37
+ props
38
+ } = this;
39
+ const isDisabled = props.disabled;
40
+
41
+ if (!isDisabled) {
42
+ props.onSelect(_Object$assign(_Object$assign({}, rest), {
43
+ value,
44
+ label: label || children
45
+ }), event);
46
+ }
47
+ }
48
+
49
+ renderOptionContent(_ref) {
50
+ let {
51
+ config,
52
+ children,
53
+ inputValue,
54
+ prefixCls
55
+ } = _ref;
56
+
57
+ if (_isString(children) && inputValue) {
58
+ return getHighLightTextHTML(config);
59
+ }
60
+
61
+ return children;
62
+ }
63
+
64
+ render() {
65
+ const _a = this.props,
66
+ {
67
+ children,
68
+ disabled,
69
+ value,
70
+ selected,
71
+ label,
72
+ empty,
73
+ emptyContent,
74
+ onSelect,
75
+ focused,
76
+ showTick,
77
+ className,
78
+ style,
79
+ onMouseEnter,
80
+ prefixCls,
81
+ renderOptionItem,
82
+ inputValue
83
+ } = _a,
84
+ rest = __rest(_a, ["children", "disabled", "value", "selected", "label", "empty", "emptyContent", "onSelect", "focused", "showTick", "className", "style", "onMouseEnter", "prefixCls", "renderOptionItem", "inputValue"]);
85
+
86
+ const optionClassName = classNames(prefixCls, {
87
+ ["".concat(prefixCls, "-disabled")]: disabled,
88
+ ["".concat(prefixCls, "-selected")]: selected,
89
+ ["".concat(prefixCls, "-focused")]: focused,
90
+ ["".concat(prefixCls, "-empty")]: empty,
91
+ [className]: className
92
+ });
93
+ const selectedIconClassName = classNames(["".concat(prefixCls, "-icon")]);
94
+
95
+ if (empty) {
96
+ if (emptyContent === null) {
97
+ return null;
98
+ }
99
+
100
+ return /*#__PURE__*/React.createElement(LocaleConsumer, {
101
+ componentName: "Select"
102
+ }, locale => /*#__PURE__*/React.createElement("div", {
103
+ className: optionClassName,
104
+ "x-semi-prop": "emptyContent"
105
+ }, emptyContent || locale.emptyText));
106
+ } // Since there are empty, locale and other logic, the custom renderOptionItem is directly converged to the internal option instead of being placed in Select/index
107
+
108
+
109
+ if (typeof renderOptionItem === 'function') {
110
+ return renderOptionItem(_Object$assign({
111
+ disabled,
112
+ focused,
113
+ selected,
114
+ style,
115
+ label,
116
+ value,
117
+ inputValue,
118
+ onMouseEnter: e => onMouseEnter(e),
119
+ onClick: e => this.onClick(_Object$assign({
120
+ value,
121
+ label,
122
+ children
123
+ }, rest), e)
124
+ }, rest));
125
+ }
126
+
127
+ const config = {
128
+ searchWords: inputValue,
129
+ sourceString: children,
130
+ option: {
131
+ highlightClassName: "".concat(prefixCls, "-keyword")
132
+ }
133
+ };
134
+ return (
135
+ /*#__PURE__*/
136
+ // eslint-disable-next-line jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events
137
+ React.createElement("div", {
138
+ className: optionClassName,
139
+ onClick: e => {
140
+ this.onClick(_Object$assign({
141
+ value,
142
+ label,
143
+ children
144
+ }, rest), e);
145
+ },
146
+ onMouseEnter: e => onMouseEnter && onMouseEnter(e),
147
+ role: "option",
148
+ "aria-selected": selected ? "true" : "false",
149
+ "aria-disabled": disabled ? "true" : "false",
150
+ style: style
151
+ }, showTick ? /*#__PURE__*/React.createElement("div", {
152
+ className: selectedIconClassName
153
+ }, /*#__PURE__*/React.createElement(IconTick, null)) : null, _isString(children) ? /*#__PURE__*/React.createElement("div", {
154
+ className: "".concat(prefixCls, "-text")
155
+ }, this.renderOptionContent({
156
+ children,
157
+ config,
158
+ inputValue,
159
+ prefixCls
160
+ })) : children)
161
+ );
162
+ }
163
+
164
+ }
165
+
166
+ Option.isSelectOption = true;
167
+ Option.propTypes = {
168
+ children: PropTypes.node,
169
+ disabled: PropTypes.bool,
170
+ value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
171
+ selected: PropTypes.bool,
172
+ label: PropTypes.node,
173
+ empty: PropTypes.bool,
174
+ emptyContent: PropTypes.node,
175
+ onSelect: PropTypes.func,
176
+ focused: PropTypes.bool,
177
+ showTick: PropTypes.bool,
178
+ className: PropTypes.string,
179
+ style: PropTypes.object,
180
+ onMouseEnter: PropTypes.func,
181
+ prefixCls: PropTypes.string,
182
+ renderOptionItem: PropTypes.func,
183
+ inputValue: PropTypes.string
184
+ };
185
+ Option.defaultProps = {
186
+ prefixCls: cssClasses.PREFIX_OPTION
187
+ };
188
+ export default Option;
@@ -18,6 +18,7 @@ declare class Calendar extends BaseComponent<CalendarProps, {}> {
18
18
  }>[]>;
19
19
  mode: PropTypes.Requireable<string>;
20
20
  showCurrTime: PropTypes.Requireable<boolean>;
21
+ weekStartsOn: PropTypes.Requireable<number>;
21
22
  scrollTop: PropTypes.Requireable<number>;
22
23
  onClick: PropTypes.Requireable<(...args: any[]) => any>;
23
24
  renderTimeDisplay: PropTypes.Requireable<(...args: any[]) => any>;
@@ -35,6 +36,7 @@ declare class Calendar extends BaseComponent<CalendarProps, {}> {
35
36
  markWeekend: boolean;
36
37
  height: number;
37
38
  scrollTop: number;
39
+ weekStartsOn: number;
38
40
  };
39
41
  render(): React.FunctionComponentElement<any>;
40
42
  }
@@ -54,6 +54,7 @@ Calendar.propTypes = {
54
54
  })),
55
55
  mode: PropTypes.string,
56
56
  showCurrTime: PropTypes.bool,
57
+ weekStartsOn: PropTypes.number,
57
58
  scrollTop: PropTypes.number,
58
59
  onClick: PropTypes.func,
59
60
  renderTimeDisplay: PropTypes.func,
@@ -70,6 +71,7 @@ Calendar.defaultProps = {
70
71
  mode: 'week',
71
72
  markWeekend: false,
72
73
  height: 600,
73
- scrollTop: 400
74
+ scrollTop: 400,
75
+ weekStartsOn: 0
74
76
  };
75
77
  export default Calendar;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { EventObject } from '@douyinfe/semi-foundation/lib/es/calendar/foundation';
2
+ import { EventObject, weeekStartsOnEnum } from '@douyinfe/semi-foundation/lib/es/calendar/foundation';
3
3
  import { strings } from '@douyinfe/semi-foundation/lib/es/calendar/constants';
4
4
  import { ArrayElement } from '../_base/base';
5
5
  import { BaseProps } from '../_base/baseComponent';
@@ -10,6 +10,7 @@ export interface CalendarProps extends BaseProps {
10
10
  events?: EventObject[];
11
11
  mode?: ArrayElement<typeof strings.MODE>;
12
12
  showCurrTime?: boolean;
13
+ weekStartsOn?: weeekStartsOnEnum;
13
14
  scrollTop?: number;
14
15
  onClick?: (e: React.MouseEvent, value: Date) => void;
15
16
  onClose?: (e: React.MouseEvent) => void;
@@ -41,7 +41,7 @@ class Carousel extends BaseComponent {
41
41
  };
42
42
 
43
43
  this.handleAutoPlay = () => {
44
- if (!this.foundation.getIsControledComponent()) {
44
+ if (!this.foundation.getIsControlledComponent()) {
45
45
  this.foundation.handleAutoPlay();
46
46
  }
47
47
  };
@@ -61,7 +61,7 @@ class Carousel extends BaseComponent {
61
61
  autoPlay
62
62
  } = this.props;
63
63
 
64
- if ((typeof autoPlay !== 'object' || autoPlay.hoverToPause) && !this.foundation.getIsControledComponent()) {
64
+ if ((typeof autoPlay !== 'object' || autoPlay.hoverToPause) && !this.foundation.getIsControlledComponent()) {
65
65
  this.foundation.handleAutoPlay();
66
66
  }
67
67
  };
@@ -99,7 +99,8 @@ function withField(Component, opts) {
99
99
  if (arrayFieldState) {
100
100
  initVal = arrayFieldState.shouldUseInitValue && typeof initValue !== 'undefined' ? initValue : initValueInFormOpts;
101
101
  }
102
- } catch (err) {}
102
+ } catch (err) {} // FIXME typeof initVal
103
+
103
104
 
104
105
  const [value, setValue, getVal] = useStateWithGetter(typeof initVal !== undefined ? initVal : null);
105
106
 
@@ -1,22 +1,23 @@
1
1
  import React, { PureComponent } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  export interface LabelProps {
4
+ /** text-align of label */
5
+ align?: string;
6
+ className?: string;
7
+ children?: React.ReactNode;
8
+ disabled?: boolean;
4
9
  id?: string;
5
10
  /** Whether to display the required * symbol */
6
11
  required?: boolean;
7
12
  /** Content of label */
8
13
  text?: React.ReactNode;
9
- disabled?: boolean;
10
14
  /** Used to configure the htmlFor attribute of the label tag */
11
15
  name?: string;
12
- /** text-align of label */
13
- align?: string;
14
16
  /** width of label */
15
17
  width?: number | string;
16
18
  style?: React.CSSProperties;
17
- className?: string;
18
- children?: React.ReactNode;
19
19
  extra?: React.ReactNode;
20
+ optional?: boolean;
20
21
  }
21
22
  export default class Label extends PureComponent<LabelProps> {
22
23
  static defaultProps: {
@@ -24,6 +25,7 @@ export default class Label extends PureComponent<LabelProps> {
24
25
  name: string;
25
26
  align: string;
26
27
  className: string;
28
+ optional: boolean;
27
29
  };
28
30
  static propTypes: {
29
31
  id: PropTypes.Requireable<string>;
@@ -37,6 +39,7 @@ export default class Label extends PureComponent<LabelProps> {
37
39
  style: PropTypes.Requireable<object>;
38
40
  className: PropTypes.Requireable<string>;
39
41
  extra: PropTypes.Requireable<PropTypes.ReactNodeLike>;
42
+ optional: PropTypes.Requireable<boolean>;
40
43
  };
41
44
  render(): JSX.Element;
42
45
  }
@@ -2,6 +2,7 @@ import React, { PureComponent } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import PropTypes from 'prop-types';
4
4
  import { cssClasses } from '@douyinfe/semi-foundation/lib/es/form/constants';
5
+ import LocaleConsumer from '../locale/localeConsumer';
5
6
  const prefixCls = cssClasses.PREFIX;
6
7
  export default class Label extends PureComponent {
7
8
  render() {
@@ -16,7 +17,8 @@ export default class Label extends PureComponent {
16
17
  style,
17
18
  className,
18
19
  extra,
19
- id
20
+ id,
21
+ optional
20
22
  } = this.props;
21
23
  const labelCls = classNames(className, {
22
24
  ["".concat(prefixCls, "-field-label")]: true,
@@ -28,10 +30,15 @@ export default class Label extends PureComponent {
28
30
  });
29
31
  const labelStyle = style ? style : {};
30
32
  width ? labelStyle.width = width : null;
33
+ const optionalText = /*#__PURE__*/React.createElement(LocaleConsumer, {
34
+ componentName: "Form"
35
+ }, locale => /*#__PURE__*/React.createElement("span", {
36
+ className: "".concat(prefixCls, "-field-label-optional-text")
37
+ }, locale.optional));
31
38
  const textContent = /*#__PURE__*/React.createElement("div", {
32
39
  className: "".concat(prefixCls, "-field-label-text"),
33
40
  "x-semi-prop": "label"
34
- }, typeof text !== 'undefined' ? text : children);
41
+ }, typeof text !== 'undefined' ? text : children, optional ? optionalText : null);
35
42
  const contentWithExtra = /*#__PURE__*/React.createElement(React.Fragment, null, textContent, /*#__PURE__*/React.createElement("div", {
36
43
  className: "".concat(prefixCls, "-field-label-extra")
37
44
  }, extra));
@@ -48,7 +55,8 @@ Label.defaultProps = {
48
55
  required: false,
49
56
  name: '',
50
57
  align: 'left',
51
- className: ''
58
+ className: '',
59
+ optional: false
52
60
  };
53
61
  Label.propTypes = {
54
62
  id: PropTypes.string,
@@ -61,5 +69,6 @@ Label.propTypes = {
61
69
  width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
62
70
  style: PropTypes.object,
63
71
  className: PropTypes.string,
64
- extra: PropTypes.node
72
+ extra: PropTypes.node,
73
+ optional: PropTypes.bool
65
74
  };
@@ -148,4 +148,7 @@ export interface Locale {
148
148
  total: string;
149
149
  selected: string;
150
150
  };
151
+ Form: {
152
+ optional: string;
153
+ };
151
154
  }
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'إلغاء تحديد الكل',
148
148
  total: 'مجموع ${total} العناصر',
149
149
  selected: '${total} العناصر المحدد'
150
+ },
151
+ Form: {
152
+ optional: '(اختياري)'
150
153
  }
151
154
  }; // [i18n-Arabic]
152
155
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Alles abwählen',
148
148
  total: 'Gesamt ${total} Artikel',
149
149
  selected: '${total} ausgewählte Artikel'
150
+ },
151
+ Form: {
152
+ optional: '(Optional)'
150
153
  }
151
154
  }; // [i18n-German]
152
155
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Unselect all',
148
148
  total: 'Total ${total} items',
149
149
  selected: '${total} items selected'
150
+ },
151
+ Form: {
152
+ optional: '(optional)'
150
153
  }
151
154
  }; // [i18n-English(GB)]
152
155
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Unselect all',
148
148
  total: 'Total ${total} items',
149
149
  selected: '${total} items selected'
150
+ },
151
+ Form: {
152
+ optional: '(optional)'
150
153
  }
151
154
  }; // [i18n-English(US)]
152
155
 
@@ -152,6 +152,9 @@ const locale = {
152
152
  clearSelectAll: 'Deseleccionar todo',
153
153
  total: 'Total ${total} objetos',
154
154
  selected: '${total} objetos seleccionados'
155
+ },
156
+ Form: {
157
+ optional: '(opcional)'
155
158
  }
156
159
  };
157
160
  export default locale;
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Désélectionner tout',
148
148
  total: 'Totale ${total} articles',
149
149
  selected: '${total} articles sélectionnés'
150
+ },
151
+ Form: {
152
+ optional: '(optionnel)'
150
153
  }
151
154
  }; // [i18n-French]
152
155
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Nyahpilih Semua',
148
148
  total: 'Total ${total} proyek',
149
149
  selected: '${total} item dipilih'
150
+ },
151
+ Form: {
152
+ optional: '(opsional)'
150
153
  }
151
154
  }; // [i18n-Indonesia(ID)]
152
155
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Deseleziona tutto',
148
148
  total: 'Totale ${total} elementi',
149
149
  selected: '${total} elementi selezionati'
150
+ },
151
+ Form: {
152
+ optional: '(opzionale)'
150
153
  }
151
154
  }; // [i18n-Italian]
152
155
 
@@ -148,6 +148,9 @@ const local = {
148
148
  clearSelectAll: 'すべてを選択解除',
149
149
  total: '合計 ${total} アイテム',
150
150
  selected: '選択済み ${total} アイテム'
151
+ },
152
+ Form: {
153
+ optional: '(オプション)'
151
154
  }
152
155
  }; // [i18n-Japan]
153
156
 
@@ -148,6 +148,9 @@ const local = {
148
148
  clearSelectAll: '모두 선택 취소',
149
149
  total: '총 {total} 개 항목',
150
150
  selected: '선택된 {Total} 개 항목'
151
+ },
152
+ Form: {
153
+ optional: '(선택 과목)'
151
154
  }
152
155
  }; // [i18n-Korea]
153
156
 
@@ -147,6 +147,9 @@ const local = {
147
147
  clearSelectAll: 'Nyahpilih semua',
148
148
  total: 'Jumlah ${total} item',
149
149
  selected: '${total} projek dipilih'
150
+ },
151
+ Form: {
152
+ optional: '(pilihan)'
150
153
  }
151
154
  }; // [i18n-Malaysia(MY)]
152
155
 
@@ -155,6 +155,9 @@ const local = {
155
155
  clearSelectAll: 'Cancelar selecionar tudo',
156
156
  total: 'Total de ${total} itens',
157
157
  selected: '${total} itens selecionados'
158
+ },
159
+ Form: {
160
+ optional: '(opcional)'
158
161
  }
159
162
  }; // 葡萄牙语
160
163
 
@@ -150,6 +150,9 @@ const local = {
150
150
  clearSelectAll: 'Снять выделение',
151
151
  total: 'Всего ${total} элементов',
152
152
  selected: 'Выбрано ${total} элементов'
153
+ },
154
+ Form: {
155
+ optional: '(по желанию)'
153
156
  }
154
157
  }; // [i18n-Russia] 俄罗斯语
155
158
 
@@ -151,6 +151,9 @@ const local = {
151
151
  clearSelectAll: 'ยกเลิกการเลือกทั้งหมด',
152
152
  total: 'รวม ${total} รายการ',
153
153
  selected: 'เลือก ${total} รายการ'
154
+ },
155
+ Form: {
156
+ optional: '(ไม่จำเป็น)'
154
157
  }
155
158
  }; // [i18n-Thai]
156
159
 
@@ -150,6 +150,9 @@ const local = {
150
150
  clearSelectAll: 'Tümünün seçimini kaldır',
151
151
  total: 'Toplam ${total} öğe',
152
152
  selected: '${total} öğe seçildi'
153
+ },
154
+ Form: {
155
+ optional: '(isteğe bağlı)'
153
156
  }
154
157
  }; // [i18n-Turkish]
155
158
 
@@ -150,6 +150,9 @@ const local = {
150
150
  clearSelectAll: 'Bỏ chọn tất cả',
151
151
  total: 'Tổng số ${total} mặt hàng',
152
152
  selected: '${total} mục được chọn'
153
+ },
154
+ Form: {
155
+ optional: '(không bắt buộc)'
153
156
  }
154
157
  }; // [i18n-Vietnam] 越南语
155
158
 
@@ -148,6 +148,9 @@ const local = {
148
148
  clearSelectAll: '取消全选',
149
149
  total: '共 ${total} 项',
150
150
  selected: '已选 ${total} 项'
151
+ },
152
+ Form: {
153
+ optional: '(可选)'
151
154
  }
152
155
  }; // 中文
153
156
 
@@ -148,6 +148,9 @@ const local = {
148
148
  clearSelectAll: '取消全選',
149
149
  total: '共 ${total} 項',
150
150
  selected: '已選 ${total} 項'
151
+ },
152
+ Form: {
153
+ optional: '(可選)'
151
154
  }
152
155
  }; // 中文
153
156
 
@@ -125,14 +125,6 @@ class Modal extends BaseComponent {
125
125
  let style = styleFromProps;
126
126
  const maskStyle = maskStyleFromProps;
127
127
  const renderFooter = 'footer' in this.props ? footer : this.renderFooter();
128
-
129
- if (this.props.centered) {
130
- style = _Object$assign({
131
- transform: 'translateY(-50%)',
132
- top: '50%'
133
- }, style);
134
- }
135
-
136
128
  let wrapperStyle = {
137
129
  zIndex
138
130
  };