@douyinfe/semi-ui 2.31.2-alpha.0 → 2.32.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 (137) hide show
  1. package/dist/css/semi.css +40 -11
  2. package/dist/css/semi.min.css +1 -1
  3. package/dist/umd/semi-ui.js +693 -379
  4. package/dist/umd/semi-ui.js.map +1 -1
  5. package/dist/umd/semi-ui.min.js +1 -1
  6. package/dist/umd/semi-ui.min.js.map +1 -1
  7. package/lib/cjs/anchor/index.d.ts +1 -1
  8. package/lib/cjs/autoComplete/index.d.ts +1 -1
  9. package/lib/cjs/button/Button.d.ts +1 -1
  10. package/lib/cjs/button/buttonGroup.d.ts +1 -1
  11. package/lib/cjs/button/index.d.ts +1 -1
  12. package/lib/cjs/cascader/index.d.ts +1 -0
  13. package/lib/cjs/cascader/index.js +10 -1
  14. package/lib/cjs/datePicker/dateInput.d.ts +5 -1
  15. package/lib/cjs/datePicker/dateInput.js +16 -9
  16. package/lib/cjs/datePicker/datePicker.d.ts +33 -5
  17. package/lib/cjs/datePicker/datePicker.js +104 -23
  18. package/lib/cjs/datePicker/index.d.ts +1 -0
  19. package/lib/cjs/datePicker/monthsGrid.d.ts +1 -1
  20. package/lib/cjs/datePicker/monthsGrid.js +11 -3
  21. package/lib/cjs/datePicker/yearAndMonth.d.ts +10 -6
  22. package/lib/cjs/datePicker/yearAndMonth.js +84 -30
  23. package/lib/cjs/form/baseForm.d.ts +3 -3
  24. package/lib/cjs/form/field.d.ts +2 -2
  25. package/lib/cjs/input/index.d.ts +1 -1
  26. package/lib/cjs/input/inputGroup.d.ts +1 -1
  27. package/lib/cjs/locale/interface.d.ts +1 -0
  28. package/lib/cjs/locale/source/ar.js +2 -1
  29. package/lib/cjs/locale/source/de.js +2 -1
  30. package/lib/cjs/locale/source/en_GB.js +2 -1
  31. package/lib/cjs/locale/source/en_US.js +2 -1
  32. package/lib/cjs/locale/source/es.js +2 -1
  33. package/lib/cjs/locale/source/fr.js +2 -1
  34. package/lib/cjs/locale/source/id_ID.js +2 -1
  35. package/lib/cjs/locale/source/it.js +2 -1
  36. package/lib/cjs/locale/source/ja_JP.js +2 -1
  37. package/lib/cjs/locale/source/ko_KR.js +2 -1
  38. package/lib/cjs/locale/source/ms_MY.js +2 -1
  39. package/lib/cjs/locale/source/nl_NL.js +2 -1
  40. package/lib/cjs/locale/source/pl_PL.js +2 -1
  41. package/lib/cjs/locale/source/pt_BR.js +2 -1
  42. package/lib/cjs/locale/source/ro.d.ts +1 -0
  43. package/lib/cjs/locale/source/ro.js +2 -1
  44. package/lib/cjs/locale/source/ru_RU.js +2 -1
  45. package/lib/cjs/locale/source/sv_SE.js +2 -1
  46. package/lib/cjs/locale/source/th_TH.js +2 -1
  47. package/lib/cjs/locale/source/tr_TR.js +2 -1
  48. package/lib/cjs/locale/source/vi_VN.js +2 -1
  49. package/lib/cjs/locale/source/zh_CN.js +2 -1
  50. package/lib/cjs/locale/source/zh_TW.js +2 -1
  51. package/lib/cjs/modal/confirm.d.ts +8 -8
  52. package/lib/cjs/navigation/Item.js +4 -2
  53. package/lib/cjs/navigation/nav-context.d.ts +2 -0
  54. package/lib/cjs/rating/index.d.ts +1 -1
  55. package/lib/cjs/rating/item.d.ts +1 -1
  56. package/lib/cjs/select/index.d.ts +18 -1
  57. package/lib/cjs/select/index.js +4 -1
  58. package/lib/cjs/sideSheet/SideSheetContent.d.ts +3 -1
  59. package/lib/cjs/sideSheet/SideSheetContent.js +3 -2
  60. package/lib/cjs/sideSheet/index.js +6 -3
  61. package/lib/cjs/space/index.js +5 -2
  62. package/lib/cjs/switch/index.d.ts +1 -1
  63. package/lib/cjs/switch/index.js +1 -1
  64. package/lib/cjs/table/Table.d.ts +2 -2
  65. package/lib/cjs/table/index.d.ts +1 -1
  66. package/lib/cjs/tagInput/index.d.ts +1 -1
  67. package/lib/cjs/timePicker/TimePicker.d.ts +1 -1
  68. package/lib/cjs/timePicker/index.d.ts +1 -1
  69. package/lib/cjs/treeSelect/index.d.ts +1 -0
  70. package/lib/cjs/treeSelect/index.js +7 -3
  71. package/lib/cjs/typography/title.d.ts +1 -1
  72. package/lib/es/anchor/index.d.ts +1 -1
  73. package/lib/es/autoComplete/index.d.ts +1 -1
  74. package/lib/es/button/Button.d.ts +1 -1
  75. package/lib/es/button/buttonGroup.d.ts +1 -1
  76. package/lib/es/button/index.d.ts +1 -1
  77. package/lib/es/cascader/index.d.ts +1 -0
  78. package/lib/es/cascader/index.js +10 -1
  79. package/lib/es/datePicker/dateInput.d.ts +5 -1
  80. package/lib/es/datePicker/dateInput.js +16 -9
  81. package/lib/es/datePicker/datePicker.d.ts +33 -5
  82. package/lib/es/datePicker/datePicker.js +109 -23
  83. package/lib/es/datePicker/index.d.ts +1 -0
  84. package/lib/es/datePicker/monthsGrid.d.ts +1 -1
  85. package/lib/es/datePicker/monthsGrid.js +11 -3
  86. package/lib/es/datePicker/yearAndMonth.d.ts +10 -6
  87. package/lib/es/datePicker/yearAndMonth.js +83 -29
  88. package/lib/es/form/baseForm.d.ts +3 -3
  89. package/lib/es/form/field.d.ts +2 -2
  90. package/lib/es/input/index.d.ts +1 -1
  91. package/lib/es/input/inputGroup.d.ts +1 -1
  92. package/lib/es/locale/interface.d.ts +1 -0
  93. package/lib/es/locale/source/ar.js +2 -1
  94. package/lib/es/locale/source/de.js +2 -1
  95. package/lib/es/locale/source/en_GB.js +2 -1
  96. package/lib/es/locale/source/en_US.js +2 -1
  97. package/lib/es/locale/source/es.js +2 -1
  98. package/lib/es/locale/source/fr.js +2 -1
  99. package/lib/es/locale/source/id_ID.js +2 -1
  100. package/lib/es/locale/source/it.js +2 -1
  101. package/lib/es/locale/source/ja_JP.js +2 -1
  102. package/lib/es/locale/source/ko_KR.js +2 -1
  103. package/lib/es/locale/source/ms_MY.js +2 -1
  104. package/lib/es/locale/source/nl_NL.js +2 -1
  105. package/lib/es/locale/source/pl_PL.js +2 -1
  106. package/lib/es/locale/source/pt_BR.js +2 -1
  107. package/lib/es/locale/source/ro.d.ts +1 -0
  108. package/lib/es/locale/source/ro.js +2 -1
  109. package/lib/es/locale/source/ru_RU.js +2 -1
  110. package/lib/es/locale/source/sv_SE.js +2 -1
  111. package/lib/es/locale/source/th_TH.js +2 -1
  112. package/lib/es/locale/source/tr_TR.js +2 -1
  113. package/lib/es/locale/source/vi_VN.js +2 -1
  114. package/lib/es/locale/source/zh_CN.js +2 -1
  115. package/lib/es/locale/source/zh_TW.js +2 -1
  116. package/lib/es/modal/confirm.d.ts +8 -8
  117. package/lib/es/navigation/Item.js +4 -2
  118. package/lib/es/navigation/nav-context.d.ts +2 -0
  119. package/lib/es/rating/index.d.ts +1 -1
  120. package/lib/es/rating/item.d.ts +1 -1
  121. package/lib/es/select/index.d.ts +18 -1
  122. package/lib/es/select/index.js +4 -1
  123. package/lib/es/sideSheet/SideSheetContent.d.ts +3 -1
  124. package/lib/es/sideSheet/SideSheetContent.js +3 -2
  125. package/lib/es/sideSheet/index.js +6 -3
  126. package/lib/es/space/index.js +4 -2
  127. package/lib/es/switch/index.d.ts +1 -1
  128. package/lib/es/switch/index.js +1 -1
  129. package/lib/es/table/Table.d.ts +2 -2
  130. package/lib/es/table/index.d.ts +1 -1
  131. package/lib/es/tagInput/index.d.ts +1 -1
  132. package/lib/es/timePicker/TimePicker.d.ts +1 -1
  133. package/lib/es/timePicker/index.d.ts +1 -1
  134. package/lib/es/treeSelect/index.d.ts +1 -0
  135. package/lib/es/treeSelect/index.js +7 -3
  136. package/lib/es/typography/title.d.ts +1 -1
  137. package/package.json +8 -8
@@ -39,7 +39,7 @@ declare class Anchor extends BaseComponent<AnchorProps, AnchorState> {
39
39
  static contextType: React.Context<ContextValue>;
40
40
  static Link: typeof Link;
41
41
  static PropTypes: {
42
- size: PropTypes.Requireable<"small" | "default">;
42
+ size: PropTypes.Requireable<"default" | "small">;
43
43
  railTheme: PropTypes.Requireable<"primary" | "tertiary" | "muted">;
44
44
  className: PropTypes.Requireable<string>;
45
45
  style: PropTypes.Requireable<object>;
@@ -125,7 +125,7 @@ declare class AutoComplete<T extends AutoCompleteItems> extends BaseComponent<Au
125
125
  renderSelectedItem: PropTypes.Requireable<(...args: any[]) => any>;
126
126
  suffix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
127
127
  showClear: PropTypes.Requireable<boolean>;
128
- size: PropTypes.Requireable<"small" | "default" | "large">;
128
+ size: PropTypes.Requireable<"default" | "small" | "large">;
129
129
  style: PropTypes.Requireable<object>;
130
130
  stopPropagation: PropTypes.Requireable<NonNullable<string | boolean>>;
131
131
  maxHeight: PropTypes.Requireable<NonNullable<string | number>>;
@@ -47,7 +47,7 @@ export default class Button extends PureComponent<ButtonProps> {
47
47
  disabled: PropTypes.Requireable<boolean>;
48
48
  prefixCls: PropTypes.Requireable<string>;
49
49
  style: PropTypes.Requireable<object>;
50
- size: PropTypes.Requireable<"small" | "default" | "large">;
50
+ size: PropTypes.Requireable<"default" | "small" | "large">;
51
51
  type: PropTypes.Requireable<"warning" | "primary" | "tertiary" | "secondary" | "danger">;
52
52
  block: PropTypes.Requireable<boolean>;
53
53
  onClick: PropTypes.Requireable<(...args: any[]) => any>;
@@ -18,7 +18,7 @@ export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
18
18
  children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
19
19
  disabled: PropTypes.Requireable<boolean>;
20
20
  type: PropTypes.Requireable<string>;
21
- size: PropTypes.Requireable<"small" | "default" | "large">;
21
+ size: PropTypes.Requireable<"default" | "small" | "large">;
22
22
  theme: PropTypes.Requireable<"solid" | "light" | "borderless">;
23
23
  'aria-label': PropTypes.Requireable<string>;
24
24
  };
@@ -22,7 +22,7 @@ declare class Button extends React.PureComponent<ButtonProps> {
22
22
  onMouseEnter: import("prop-types").Requireable<(...args: any[]) => any>;
23
23
  onMouseLeave: import("prop-types").Requireable<(...args: any[]) => any>;
24
24
  disabled: import("prop-types").Requireable<boolean>;
25
- size: import("prop-types").Requireable<"small" | "default" | "large">;
25
+ size: import("prop-types").Requireable<"default" | "small" | "large">;
26
26
  type: import("prop-types").Requireable<"warning" | "primary" | "tertiary" | "secondary" | "danger">;
27
27
  block: import("prop-types").Requireable<boolean>;
28
28
  onClick: import("prop-types").Requireable<(...args: any[]) => any>;
@@ -188,6 +188,7 @@ declare class Cascader extends BaseComponent<CascaderProps, CascaderState> {
188
188
  componentDidUpdate(prevProps: CascaderProps): void;
189
189
  handleInputChange: (value: string) => void;
190
190
  handleTagRemove: (e: any, tagValuePath: Array<string | number>) => void;
191
+ handleRemoveByKey: (key: any) => void;
191
192
  renderTagItem: (value: string | Array<string>, idx: number, type: string) => string | number | boolean | React.ReactFragment | JSX.Element;
192
193
  renderTagInput(): JSX.Element;
193
194
  renderInput(): JSX.Element;
@@ -82,6 +82,13 @@ class Cascader extends _baseComponent.default {
82
82
  this.foundation.handleTagRemove(e, tagValuePath);
83
83
  };
84
84
 
85
+ this.handleRemoveByKey = key => {
86
+ const {
87
+ keyEntities
88
+ } = this.state;
89
+ this.handleTagRemove(null, keyEntities[key].valuePath);
90
+ };
91
+
85
92
  this.renderTagItem = (value, idx, type) => {
86
93
  const {
87
94
  keyEntities,
@@ -375,7 +382,9 @@ class Cascader extends _baseComponent.default {
375
382
  disabled: disabled,
376
383
  triggerRender: triggerRender,
377
384
  componentName: 'Cascader',
378
- componentProps: Object.assign({}, this.props)
385
+ componentProps: Object.assign({}, this.props),
386
+ onSearch: this.handleInputChange,
387
+ onRemove: this.handleRemoveByKey
379
388
  });
380
389
  };
381
390
 
@@ -15,6 +15,9 @@ export interface DateInputProps extends DateInputFoundationProps, BaseProps {
15
15
  onClear?: (e: React.MouseEvent<HTMLDivElement>) => void;
16
16
  onInsetInputChange?: (options: InsetInputChangeProps) => void;
17
17
  value?: Date[];
18
+ inputRef?: React.RefObject<HTMLInputElement>;
19
+ rangeInputStartRef?: React.RefObject<HTMLInputElement>;
20
+ rangeInputEndRef?: React.RefObject<HTMLInputElement>;
18
21
  }
19
22
  export default class DateInput extends BaseComponent<DateInputProps, {}> {
20
23
  static propTypes: {
@@ -26,7 +29,7 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
26
29
  onFocus: PropTypes.Requireable<(...args: any[]) => any>;
27
30
  value: PropTypes.Requireable<any[]>;
28
31
  disabled: PropTypes.Requireable<boolean>;
29
- type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
32
+ type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "monthRange" | "dateTimeRange">;
30
33
  showClear: PropTypes.Requireable<boolean>;
31
34
  format: PropTypes.Requireable<string>;
32
35
  inputStyle: PropTypes.Requireable<object>;
@@ -81,6 +84,7 @@ export default class DateInput extends BaseComponent<DateInputProps, {}> {
81
84
  renderRangeClearBtn(rangeStart: string, rangeEnd: string): JSX.Element;
82
85
  renderRangeSuffix(suffix: React.ReactNode): JSX.Element;
83
86
  renderRangeInput(rangeProps: DateInputProps): JSX.Element;
87
+ isRenderMultipleInputs(): boolean;
84
88
  renderInputInset(): JSX.Element;
85
89
  renderTriggerInput(): JSX.Element;
86
90
  render(): JSX.Element;
@@ -284,6 +284,14 @@ class DateInput extends _baseComponent.default {
284
284
  })), this.renderRangeClearBtn(rangeStart, rangeEnd), this.renderRangeSuffix(suffix));
285
285
  }
286
286
 
287
+ isRenderMultipleInputs() {
288
+ const {
289
+ type
290
+ } = this.props; // isRange and not monthRange render multiple inputs
291
+
292
+ return type.includes('Range') && type !== 'monthRange';
293
+ }
294
+
287
295
  renderInputInset() {
288
296
  const {
289
297
  type,
@@ -297,9 +305,6 @@ class DateInput extends _baseComponent.default {
297
305
  density,
298
306
  insetInput
299
307
  } = this.props;
300
-
301
- const _isRangeType = type.includes('Range');
302
-
303
308
  const newInsetInputValue = this.foundation.getInsetInputValue({
304
309
  value,
305
310
  insetInputValue
@@ -334,7 +339,7 @@ class DateInput extends _baseComponent.default {
334
339
  valuePath: 'monthLeft.timeInput',
335
340
  onChange: this.handleInsetInputChange,
336
341
  onFocus: handleInsetTimeFocus
337
- }), _isRangeType && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
342
+ }), this.isRenderMultipleInputs() && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
338
343
  className: separatorCls
339
344
  }, density === 'compact' ? null : '-'), /*#__PURE__*/_react.default.createElement(_insetInput.InsetDateInput, {
340
345
  forwardRef: rangeInputEndRef,
@@ -379,6 +384,7 @@ class DateInput extends _baseComponent.default {
379
384
  prefix,
380
385
  autofocus,
381
386
  size,
387
+ inputRef,
382
388
  // range input support props, no need passing to not range type
383
389
  rangeInputStartRef,
384
390
  rangeInputEndRef,
@@ -391,7 +397,7 @@ class DateInput extends _baseComponent.default {
391
397
  insetInputValue,
392
398
  defaultPickerValue
393
399
  } = _a,
394
- 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", "insetInput", "insetInputValue", "defaultPickerValue"]);
400
+ rest = __rest(_a, ["placeholder", "type", "value", "inputValue", "inputStyle", "disabled", "showClear", "inputReadOnly", "insetLabel", "validateStatus", "block", "prefixCls", "multiple", "dateFnsLocale", "onBlur", "onClear", "onFocus", "prefix", "autofocus", "size", "inputRef", "rangeInputStartRef", "rangeInputEndRef", "onRangeClear", "onRangeBlur", "onRangeEndTabPress", "rangeInputFocus", "rangeSeparator", "insetInput", "insetInputValue", "defaultPickerValue"]);
395
401
 
396
402
  const dateIcon = /*#__PURE__*/_react.default.createElement(_semiIcons.IconCalendar, {
397
403
  "aria-hidden": true
@@ -411,22 +417,23 @@ class DateInput extends _baseComponent.default {
411
417
  }
412
418
 
413
419
  const inputCls = (0, _classnames.default)({
414
- [`${prefixCls}-input-readonly`]: inputReadOnly
420
+ [`${prefixCls}-input-readonly`]: inputReadOnly,
421
+ [`${prefixCls}-monthRange-input`]: type === 'monthRange'
415
422
  });
416
- const isRangeType = /range/i.test(type);
417
423
  const rangeProps = Object.assign(Object.assign({}, this.props), {
418
424
  text,
419
425
  suffix,
420
426
  inputCls
421
427
  });
422
- return isRangeType ? this.renderRangeInput(rangeProps) : /*#__PURE__*/_react.default.createElement(_index.default, Object.assign({}, rest, {
428
+ return this.isRenderMultipleInputs() ? this.renderRangeInput(rangeProps) : /*#__PURE__*/_react.default.createElement(_index.default, Object.assign({}, rest, {
429
+ ref: inputRef,
423
430
  insetLabel: insetLabel,
424
431
  disabled: disabled,
425
432
  readonly: inputReadOnly,
426
433
  className: inputCls,
427
434
  style: inputStyle,
428
435
  hideSuffix: showClear,
429
- placeholder: placeholder,
436
+ placeholder: type === 'monthRange' && Array.isArray(placeholder) ? placeholder[0] + rangeSeparator + placeholder[1] : placeholder,
430
437
  onEnterPress: this.handleEnterPress,
431
438
  onChange: this.handleChange,
432
439
  onClear: this.handleInputClear,
@@ -28,10 +28,21 @@ export interface DatePickerProps extends DatePickerFoundationProps {
28
28
  renderDate?: (dayNumber?: number, fullDate?: string) => React.ReactNode;
29
29
  renderFullDate?: (dayNumber?: number, fullDate?: string, dayStatus?: DayStatusType) => React.ReactNode;
30
30
  triggerRender?: (props: DatePickerProps) => React.ReactNode;
31
+ /**
32
+ * There are multiple input boxes when selecting a range, and the input boxes will be out of focus multiple times.
33
+ *
34
+ * Use `onOpenChange` or `onClickOutSide` instead
35
+ */
31
36
  onBlur?: React.MouseEventHandler<HTMLInputElement>;
32
37
  onClear?: React.MouseEventHandler<HTMLDivElement>;
38
+ /**
39
+ * There are multiple input boxes when selecting a range, and the input boxes will be focused multiple times.
40
+ *
41
+ * Use `onOpenChange` or `triggerRender` instead
42
+ */
33
43
  onFocus?: (e: React.MouseEvent, rangeType: RangeType) => void;
34
44
  onPresetClick?: (item: PresetType, e: React.MouseEvent<HTMLDivElement>) => void;
45
+ onClickOutSide?: () => void;
35
46
  locale?: Locale['DatePicker'];
36
47
  dateFnsLocale?: Locale['dateFnsLocale'];
37
48
  yearAndMonthOpts?: ScrollItemProps<any>;
@@ -46,8 +57,8 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
46
57
  'aria-invalid': PropTypes.Requireable<boolean>;
47
58
  'aria-labelledby': PropTypes.Requireable<string>;
48
59
  'aria-required': PropTypes.Requireable<boolean>;
49
- type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
50
- size: PropTypes.Requireable<"small" | "default" | "large">;
60
+ type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "monthRange" | "dateTimeRange">;
61
+ size: PropTypes.Requireable<"default" | "small" | "large">;
51
62
  clearIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
52
63
  density: PropTypes.Requireable<"default" | "compact">;
53
64
  defaultValue: PropTypes.Requireable<NonNullable<string | number | object>>;
@@ -113,6 +124,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
113
124
  rangeSeparator: PropTypes.Requireable<string>;
114
125
  preventScroll: PropTypes.Requireable<boolean>;
115
126
  yearAndMonthOpts: PropTypes.Requireable<object>;
127
+ onClickOutSide: PropTypes.Requireable<(...args: any[]) => any>;
116
128
  };
117
129
  static defaultProps: {
118
130
  onChangeWithDateFirst: boolean;
@@ -155,12 +167,14 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
155
167
  syncSwitchMonth: boolean;
156
168
  rangeSeparator: " ~ ";
157
169
  insetInput: boolean;
170
+ onClickOutSide: (...args: any[]) => void;
158
171
  };
159
172
  triggerElRef: React.MutableRefObject<HTMLElement>;
160
173
  panelRef: React.RefObject<HTMLDivElement>;
161
174
  monthGrid: React.RefObject<MonthsGrid>;
162
- rangeInputStartRef: React.RefObject<HTMLElement>;
163
- rangeInputEndRef: React.RefObject<HTMLElement>;
175
+ inputRef: DateInputProps['inputRef'];
176
+ rangeInputStartRef: DateInputProps['rangeInputStartRef'];
177
+ rangeInputEndRef: DateInputProps['rangeInputEndRef'];
164
178
  focusRecordsRef: React.RefObject<{
165
179
  rangeStart: boolean;
166
180
  rangeEnd: boolean;
@@ -175,6 +189,20 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
175
189
  componentDidUpdate(prevProps: DatePickerProps): void;
176
190
  componentDidMount(): void;
177
191
  componentWillUnmount(): void;
192
+ open(): void;
193
+ close(): void;
194
+ /**
195
+ *
196
+ * When selecting a range, the default focus is on the start input box, passing in `rangeEnd` can focus on the end input box
197
+ *
198
+ * When `insetInput` is `true`, due to trigger disabled, the cursor will focus on the input box of the popup layer panel
199
+ *
200
+ * 范围选择时,默认聚焦在开始输入框,传入 `rangeEnd` 可以聚焦在结束输入框
201
+ *
202
+ * `insetInput` 打开时,由于 trigger 禁用,会把焦点放在弹出面板的输入框上
203
+ */
204
+ focus(focusType?: Exclude<RangeType, false>): void;
205
+ blur(): void;
178
206
  setTriggerRef: (node: HTMLDivElement) => HTMLDivElement;
179
207
  handleSelectedChange: MonthsGridProps['onChange'];
180
208
  handleYMSelectedChange: YearAndMonthProps['onSelect'];
@@ -199,7 +227,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
199
227
  handleInsetDateFocus: (e: React.FocusEvent, rangeType: 'rangeStart' | 'rangeEnd') => void;
200
228
  handleInsetTimeFocus: () => void;
201
229
  handlePanelVisibleChange: (visible: boolean) => void;
202
- renderInner(extraProps?: Partial<DatePickerProps>): JSX.Element;
230
+ renderInner(): JSX.Element;
203
231
  handleConfirm: (e: React.MouseEvent) => void;
204
232
  handleCancel: (e: React.MouseEvent) => void;
205
233
  renderFooter: (locale: Locale['DatePicker'], localeCode: string) => JSX.Element;
@@ -173,7 +173,8 @@ class DatePicker extends _baseComponent.default {
173
173
  density,
174
174
  topSlot,
175
175
  bottomSlot,
176
- presetPosition
176
+ presetPosition,
177
+ type
177
178
  } = this.props;
178
179
  const wrapCls = (0, _classnames.default)(_constants.cssClasses.PREFIX, {
179
180
  [_constants.cssClasses.PANEL_YAM]: this.adapter.typeIsYearOrMonth(),
@@ -182,11 +183,12 @@ class DatePicker extends _baseComponent.default {
182
183
  return /*#__PURE__*/_react.default.createElement("div", {
183
184
  ref: this.panelRef,
184
185
  className: wrapCls,
185
- style: dropdownStyle
186
+ style: dropdownStyle,
187
+ "x-type": type
186
188
  }, topSlot && /*#__PURE__*/_react.default.createElement("div", {
187
189
  className: `${_constants.cssClasses.PREFIX}-topSlot`,
188
190
  "x-semi-prop": "topSlot"
189
- }, topSlot), presetPosition === "top" && this.renderQuickControls(), this.adapter.typeIsYearOrMonth() ? this.renderYearMonthPanel(locale, localeCode) : this.renderMonthGrid(locale, localeCode, dateFnsLocale), presetPosition === "bottom" && this.renderQuickControls(), bottomSlot && /*#__PURE__*/_react.default.createElement("div", {
191
+ }, topSlot), presetPosition === "top" && type !== 'monthRange' && this.renderQuickControls(), this.adapter.typeIsYearOrMonth() ? this.renderYearMonthPanel(locale, localeCode) : this.renderMonthGrid(locale, localeCode, dateFnsLocale), presetPosition === "bottom" && type !== 'monthRange' && this.renderQuickControls(), bottomSlot && /*#__PURE__*/_react.default.createElement("div", {
190
192
  className: `${_constants.cssClasses.PREFIX}-bottomSlot`,
191
193
  "x-semi-prop": "bottomSlot"
192
194
  }, bottomSlot), this.renderFooter(locale, localeCode));
@@ -196,15 +198,31 @@ class DatePicker extends _baseComponent.default {
196
198
  const {
197
199
  density,
198
200
  presetPosition,
199
- yearAndMonthOpts
201
+ yearAndMonthOpts,
202
+ type
200
203
  } = this.props;
201
204
  const date = this.state.value[0];
202
- let year = 0;
203
- let month = 0;
205
+ const year = {
206
+ left: 0,
207
+ right: 0
208
+ };
209
+ const month = {
210
+ left: 0,
211
+ right: 0
212
+ };
204
213
 
205
214
  if ((0, _isDate2.default)(date)) {
206
- year = date.getFullYear();
207
- month = date.getMonth() + 1;
215
+ year.left = date.getFullYear();
216
+ month.left = date.getMonth() + 1;
217
+ }
218
+
219
+ if (type === 'monthRange') {
220
+ const dateRight = this.state.value[1];
221
+
222
+ if ((0, _isDate2.default)(dateRight)) {
223
+ year.right = dateRight.getFullYear();
224
+ month.right = dateRight.getMonth() + 1;
225
+ }
208
226
  }
209
227
 
210
228
  return /*#__PURE__*/_react.default.createElement(_yearAndMonth.default, {
@@ -220,6 +238,7 @@ class DatePicker extends _baseComponent.default {
220
238
  presetPosition: presetPosition,
221
239
  renderQuickControls: this.renderQuickControls(),
222
240
  renderDateInput: this.renderDateInput(),
241
+ type: type,
223
242
  yearAndMonthOpts: yearAndMonthOpts
224
243
  });
225
244
  };
@@ -279,6 +298,7 @@ class DatePicker extends _baseComponent.default {
279
298
  this.triggerElRef = /*#__PURE__*/_react.default.createRef();
280
299
  this.panelRef = /*#__PURE__*/_react.default.createRef();
281
300
  this.monthGrid = /*#__PURE__*/_react.default.createRef();
301
+ this.inputRef = /*#__PURE__*/_react.default.createRef();
282
302
  this.rangeInputStartRef = /*#__PURE__*/_react.default.createRef();
283
303
  this.rangeInputEndRef = /*#__PURE__*/_react.default.createRef();
284
304
  this.focusRecordsRef = /*#__PURE__*/_react.default.createRef(); // @ts-ignore ignore readonly
@@ -294,10 +314,10 @@ class DatePicker extends _baseComponent.default {
294
314
  var _this2 = this;
295
315
 
296
316
  return Object.assign(Object.assign({}, super.adapter), {
297
- togglePanel: panelShow => {
317
+ togglePanel: (panelShow, cb) => {
298
318
  this.setState({
299
319
  panelShow
300
- });
320
+ }, cb);
301
321
 
302
322
  if (!panelShow) {
303
323
  this.focusRecordsRef.current.rangeEnd = false;
@@ -311,17 +331,20 @@ class DatePicker extends _baseComponent.default {
311
331
  }
312
332
 
313
333
  this.clickOutSideHandler = e => {
314
- if (this.adapter.needConfirm()) {
315
- return;
316
- }
317
-
318
334
  const triggerEl = this.triggerElRef && this.triggerElRef.current;
319
335
  const panelEl = this.panelRef && this.panelRef.current;
320
336
  const isInTrigger = triggerEl && triggerEl.contains(e.target);
321
337
  const isInPanel = panelEl && panelEl.contains(e.target);
338
+ const clickOutSide = !isInTrigger && !isInPanel && this._mounted;
322
339
 
323
- if (!isInTrigger && !isInPanel && this._mounted) {
324
- this.foundation.closePanel(e);
340
+ if (this.adapter.needConfirm()) {
341
+ clickOutSide && this.props.onClickOutSide();
342
+ return;
343
+ } else {
344
+ if (clickOutSide) {
345
+ this.props.onClickOutSide();
346
+ this.foundation.closePanel(e);
347
+ }
325
348
  }
326
349
  };
327
350
 
@@ -388,7 +411,7 @@ class DatePicker extends _baseComponent.default {
388
411
  }
389
412
  },
390
413
  needConfirm: () => ['dateTime', 'dateTimeRange'].includes(this.props.type) && this.props.needConfirm === true,
391
- typeIsYearOrMonth: () => ['month', 'year'].includes(this.props.type),
414
+ typeIsYearOrMonth: () => ['month', 'year', 'monthRange'].includes(this.props.type),
392
415
  setRangeInputFocus: rangeInputFocus => {
393
416
  const {
394
417
  preventScroll
@@ -486,6 +509,34 @@ class DatePicker extends _baseComponent.default {
486
509
  break;
487
510
  }
488
511
  },
512
+ setInputFocus: () => {
513
+ const {
514
+ preventScroll
515
+ } = this.props;
516
+ const inputNode = (0, _get2.default)(this, 'inputRef.current');
517
+ inputNode && inputNode.focus({
518
+ preventScroll
519
+ });
520
+ },
521
+ setInputBlur: () => {
522
+ const inputNode = (0, _get2.default)(this, 'inputRef.current');
523
+ inputNode && inputNode.blur();
524
+ },
525
+ setRangeInputBlur: () => {
526
+ const {
527
+ rangeInputFocus
528
+ } = this.state;
529
+
530
+ if (rangeInputFocus === 'rangeStart') {
531
+ const inputStartNode = (0, _get2.default)(this, 'rangeInputStartRef.current');
532
+ inputStartNode && inputStartNode.blur();
533
+ } else if (rangeInputFocus === 'rangeEnd') {
534
+ const inputEndNode = (0, _get2.default)(this, 'rangeInputEndRef.current');
535
+ inputEndNode && inputEndNode.blur();
536
+ }
537
+
538
+ this.adapter.setRangeInputFocus(false);
539
+ },
489
540
  setTriggerDisabled: disabled => {
490
541
  this.setState({
491
542
  triggerDisabled: disabled
@@ -528,6 +579,33 @@ class DatePicker extends _baseComponent.default {
528
579
  super.componentWillUnmount();
529
580
  }
530
581
 
582
+ open() {
583
+ this.foundation.open();
584
+ }
585
+
586
+ close() {
587
+ this.foundation.close();
588
+ }
589
+ /**
590
+ *
591
+ * When selecting a range, the default focus is on the start input box, passing in `rangeEnd` can focus on the end input box
592
+ *
593
+ * When `insetInput` is `true`, due to trigger disabled, the cursor will focus on the input box of the popup layer panel
594
+ *
595
+ * 范围选择时,默认聚焦在开始输入框,传入 `rangeEnd` 可以聚焦在结束输入框
596
+ *
597
+ * `insetInput` 打开时,由于 trigger 禁用,会把焦点放在弹出面板的输入框上
598
+ */
599
+
600
+
601
+ focus(focusType) {
602
+ this.foundation.focus(focusType);
603
+ }
604
+
605
+ blur() {
606
+ this.foundation.blur();
607
+ }
608
+
531
609
  renderMonthGrid(locale, localeCode, dateFnsLocale) {
532
610
  const {
533
611
  type,
@@ -649,7 +727,7 @@ class DatePicker extends _baseComponent.default {
649
727
  })) : null;
650
728
  }
651
729
 
652
- renderInner(extraProps) {
730
+ renderInner() {
653
731
  const {
654
732
  clearIcon,
655
733
  type,
@@ -691,7 +769,7 @@ class DatePicker extends _baseComponent.default {
691
769
  const phText = placeholder || locale.placeholder[type]; // i18n
692
770
  // These values should be passed to triggerRender, do not delete any key if it is not necessary
693
771
 
694
- const props = Object.assign(Object.assign({}, extraProps), {
772
+ const props = {
695
773
  placeholder: phText,
696
774
  clearIcon,
697
775
  disabled: inputDisabled,
@@ -725,8 +803,9 @@ class DatePicker extends _baseComponent.default {
725
803
  onRangeClear: this.handleRangeInputClear,
726
804
  onRangeEndTabPress: this.handleRangeEndTabPress,
727
805
  rangeInputStartRef: insetInput ? null : this.rangeInputStartRef,
728
- rangeInputEndRef: insetInput ? null : this.rangeInputEndRef
729
- });
806
+ rangeInputEndRef: insetInput ? null : this.rangeInputEndRef,
807
+ inputRef: this.inputRef
808
+ };
730
809
  return /*#__PURE__*/_react.default.createElement("div", {
731
810
  // tooltip will mount a11y props to children
732
811
  // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
@@ -843,7 +922,8 @@ DatePicker.propTypes = {
843
922
  onPanelChange: _propTypes.default.func,
844
923
  rangeSeparator: _propTypes.default.string,
845
924
  preventScroll: _propTypes.default.bool,
846
- yearAndMonthOpts: _propTypes.default.object
925
+ yearAndMonthOpts: _propTypes.default.object,
926
+ onClickOutSide: _propTypes.default.func
847
927
  };
848
928
  DatePicker.defaultProps = {
849
929
  onChangeWithDateFirst: true,
@@ -880,5 +960,6 @@ DatePicker.defaultProps = {
880
960
  autoSwitchDate: true,
881
961
  syncSwitchMonth: false,
882
962
  rangeSeparator: _constants.strings.DEFAULT_SEPARATOR_RANGE,
883
- insetInput: false
963
+ insetInput: false,
964
+ onClickOutSide: _noop2.default
884
965
  };
@@ -8,5 +8,6 @@ export type { MonthsGridProps } from './monthsGrid';
8
8
  export type { QuickControlProps } from './quickControl';
9
9
  export type { YearAndMonthProps } from './yearAndMonth';
10
10
  export type { InsetInputProps } from '@douyinfe/semi-foundation/lib/cjs/datePicker/inputFoundation';
11
+ export type { DatePicker as BaseDatePicker };
11
12
  declare const _default: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<DatePicker>>;
12
13
  export default _default;
@@ -19,7 +19,7 @@ export interface MonthsGridProps extends MonthsGridFoundationProps, BaseProps {
19
19
  export declare type MonthsGridState = MonthsGridFoundationState;
20
20
  export default class MonthsGrid extends BaseComponent<MonthsGridProps, MonthsGridState> {
21
21
  static propTypes: {
22
- type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "dateTimeRange">;
22
+ type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "monthRange" | "dateTimeRange">;
23
23
  defaultValue: PropTypes.Requireable<any[]>;
24
24
  defaultPickerValue: PropTypes.Requireable<NonNullable<string | number | object>>;
25
25
  multiple: PropTypes.Requireable<boolean>;
@@ -508,9 +508,17 @@ class MonthsGrid extends _baseComponent.default {
508
508
  ref: current => this.cacheRefCurrent(`yam-${panelType}`, current),
509
509
  locale: locale,
510
510
  localeCode: localeCode,
511
- currentYear: y,
512
- currentMonth: m,
513
- onSelect: item => this.foundation.toYearMonth(panelType, new Date(item.currentYear, item.currentMonth - 1)),
511
+ // currentYear={y}
512
+ // currentMonth={m}
513
+ currentYear: {
514
+ left: y,
515
+ right: 0
516
+ },
517
+ currentMonth: {
518
+ left: m,
519
+ right: 0
520
+ },
521
+ onSelect: item => this.foundation.toYearMonth(panelType, new Date(item.currentYear.left, item.currentMonth.left - 1)),
514
522
  onBackToMain: () => {
515
523
  this.foundation.showDatePanel(panelType);
516
524
  const wrapCurrent = this.adapter.getCache(`wrap-${panelType}`);
@@ -4,14 +4,15 @@ import YearAndMonthFoundation, { MonthScrollItem, YearAndMonthAdapter, YearAndMo
4
4
  import BaseComponent, { BaseProps } from '../_base/baseComponent';
5
5
  import ScrollItem from '../scrollList/scrollItem';
6
6
  import { Locale } from '../locale/interface';
7
+ import { PanelType } from '@douyinfe/semi-foundation/lib/cjs/datePicker/monthsGridFoundation';
7
8
  export interface YearAndMonthProps extends YearAndMonthFoundationProps, BaseProps {
8
9
  locale?: Locale['DatePicker'];
9
10
  }
10
11
  export declare type YearAndMonthState = YearAndMonthFoundationState;
11
12
  declare class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonthState> {
12
13
  static propTypes: {
13
- currentYear: PropTypes.Requireable<number>;
14
- currentMonth: PropTypes.Requireable<number>;
14
+ currentYear: PropTypes.Requireable<object>;
15
+ currentMonth: PropTypes.Requireable<object>;
15
16
  onSelect: PropTypes.Requireable<(...args: any[]) => any>;
16
17
  locale: PropTypes.Requireable<object>;
17
18
  localeCode: PropTypes.Requireable<string>;
@@ -23,6 +24,7 @@ declare class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonth
23
24
  presetPosition: PropTypes.Requireable<"left" | "top" | "right" | "bottom">;
24
25
  renderQuickControls: PropTypes.Requireable<PropTypes.ReactNodeLike>;
25
26
  renderDateInput: PropTypes.Requireable<PropTypes.ReactNodeLike>;
27
+ type: PropTypes.Requireable<"dateTime" | "date" | "month" | "dateRange" | "year" | "monthRange" | "dateTimeRange">;
26
28
  };
27
29
  static defaultProps: {
28
30
  disabledDate: {
@@ -33,6 +35,7 @@ declare class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonth
33
35
  yearCycled: boolean;
34
36
  noBackBtn: boolean;
35
37
  onSelect: (...args: any[]) => void;
38
+ type: string;
36
39
  };
37
40
  foundation: YearAndMonthFoundation;
38
41
  yearRef: React.RefObject<ScrollItem<YearScrollItem>>;
@@ -40,12 +43,13 @@ declare class YearAndMonth extends BaseComponent<YearAndMonthProps, YearAndMonth
40
43
  constructor(props: YearAndMonthProps);
41
44
  get adapter(): YearAndMonthAdapter;
42
45
  static getDerivedStateFromProps(props: YearAndMonthProps, state: YearAndMonthState): Partial<YearAndMonthFoundationState>;
43
- renderColYear(): JSX.Element;
44
- selectYear: (item: YearScrollItem) => void;
45
- selectMonth: (item: MonthScrollItem) => void;
46
+ renderColYear(panelType: PanelType): JSX.Element;
47
+ selectYear: (item: YearScrollItem, panelType?: PanelType) => void;
48
+ selectMonth: (item: MonthScrollItem, panelType?: PanelType) => void;
46
49
  reselect: () => void;
47
- renderColMonth(): JSX.Element;
50
+ renderColMonth(panelType: PanelType): JSX.Element;
48
51
  backToMain: React.MouseEventHandler<HTMLButtonElement>;
52
+ renderPanel(panelType: PanelType): JSX.Element;
49
53
  render(): JSX.Element;
50
54
  }
51
55
  export default YearAndMonth;