@douyinfe/semi-ui 2.10.2 → 2.10.5

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 (114) hide show
  1. package/cascader/index.tsx +20 -17
  2. package/checkbox/checkbox.tsx +1 -0
  3. package/checkbox/checkboxInner.tsx +10 -1
  4. package/datePicker/__test__/datePicker.test.js +1 -0
  5. package/datePicker/_story/v2/FixTriggerRender.tsx +36 -0
  6. package/datePicker/_story/v2/index.js +1 -0
  7. package/datePicker/datePicker.tsx +7 -4
  8. package/dist/umd/semi-ui.js +5466 -3738
  9. package/dist/umd/semi-ui.js.map +1 -1
  10. package/dist/umd/semi-ui.min.js +1 -1
  11. package/dist/umd/semi-ui.min.js.map +1 -1
  12. package/input/index.tsx +5 -1
  13. package/inputNumber/index.tsx +5 -2
  14. package/lib/cjs/cascader/index.d.ts +1 -0
  15. package/lib/cjs/cascader/index.js +13 -4
  16. package/lib/cjs/checkbox/checkbox.d.ts +1 -0
  17. package/lib/cjs/checkbox/checkbox.js +2 -1
  18. package/lib/cjs/checkbox/checkboxInner.d.ts +8 -0
  19. package/lib/cjs/checkbox/checkboxInner.js +11 -2
  20. package/lib/cjs/datePicker/datePicker.d.ts +1 -0
  21. package/lib/cjs/datePicker/datePicker.js +21 -5
  22. package/lib/cjs/form/baseForm.d.ts +2 -1
  23. package/lib/cjs/form/field.d.ts +2 -1
  24. package/lib/cjs/input/index.d.ts +2 -0
  25. package/lib/cjs/input/index.js +11 -4
  26. package/lib/cjs/inputNumber/index.d.ts +1 -0
  27. package/lib/cjs/inputNumber/index.js +8 -2
  28. package/lib/cjs/modal/ModalContent.d.ts +1 -0
  29. package/lib/cjs/modal/ModalContent.js +14 -3
  30. package/lib/cjs/modal/confirm.d.ts +10 -5
  31. package/lib/cjs/radio/radio.d.ts +5 -0
  32. package/lib/cjs/radio/radio.js +2 -1
  33. package/lib/cjs/radio/radioInner.d.ts +8 -0
  34. package/lib/cjs/radio/radioInner.js +11 -2
  35. package/lib/cjs/rating/index.d.ts +2 -0
  36. package/lib/cjs/rating/index.js +12 -5
  37. package/lib/cjs/rating/item.d.ts +10 -0
  38. package/lib/cjs/rating/item.js +4 -1
  39. package/lib/cjs/select/index.d.ts +2 -0
  40. package/lib/cjs/select/index.js +15 -3
  41. package/lib/cjs/table/Table.d.ts +1 -1
  42. package/lib/cjs/tabs/index.d.ts +1 -0
  43. package/lib/cjs/tabs/index.js +2 -1
  44. package/lib/cjs/tabs/interface.d.ts +1 -0
  45. package/lib/cjs/tagInput/index.d.ts +2 -0
  46. package/lib/cjs/tagInput/index.js +13 -4
  47. package/lib/cjs/timePicker/TimeInput.d.ts +2 -1
  48. package/lib/cjs/timePicker/TimeInput.js +7 -3
  49. package/lib/cjs/timePicker/TimePicker.d.ts +2 -0
  50. package/lib/cjs/timePicker/TimePicker.js +2 -1
  51. package/lib/cjs/timePicker/index.d.ts +1 -0
  52. package/lib/cjs/tooltip/index.d.ts +3 -0
  53. package/lib/cjs/tooltip/index.js +8 -2
  54. package/lib/cjs/tree/index.d.ts +1 -0
  55. package/lib/cjs/tree/index.js +9 -2
  56. package/lib/cjs/typography/title.d.ts +1 -1
  57. package/lib/es/cascader/index.d.ts +1 -0
  58. package/lib/es/cascader/index.js +13 -4
  59. package/lib/es/checkbox/checkbox.d.ts +1 -0
  60. package/lib/es/checkbox/checkbox.js +2 -1
  61. package/lib/es/checkbox/checkboxInner.d.ts +8 -0
  62. package/lib/es/checkbox/checkboxInner.js +11 -2
  63. package/lib/es/datePicker/datePicker.d.ts +1 -0
  64. package/lib/es/datePicker/datePicker.js +21 -5
  65. package/lib/es/form/baseForm.d.ts +2 -1
  66. package/lib/es/form/field.d.ts +2 -1
  67. package/lib/es/input/index.d.ts +2 -0
  68. package/lib/es/input/index.js +11 -4
  69. package/lib/es/inputNumber/index.d.ts +1 -0
  70. package/lib/es/inputNumber/index.js +8 -2
  71. package/lib/es/modal/ModalContent.d.ts +1 -0
  72. package/lib/es/modal/ModalContent.js +14 -3
  73. package/lib/es/modal/confirm.d.ts +10 -5
  74. package/lib/es/radio/radio.d.ts +5 -0
  75. package/lib/es/radio/radio.js +2 -1
  76. package/lib/es/radio/radioInner.d.ts +8 -0
  77. package/lib/es/radio/radioInner.js +11 -2
  78. package/lib/es/rating/index.d.ts +2 -0
  79. package/lib/es/rating/index.js +12 -5
  80. package/lib/es/rating/item.d.ts +10 -0
  81. package/lib/es/rating/item.js +4 -1
  82. package/lib/es/select/index.d.ts +2 -0
  83. package/lib/es/select/index.js +15 -3
  84. package/lib/es/table/Table.d.ts +1 -1
  85. package/lib/es/tabs/index.d.ts +1 -0
  86. package/lib/es/tabs/index.js +2 -1
  87. package/lib/es/tabs/interface.d.ts +1 -0
  88. package/lib/es/tagInput/index.d.ts +2 -0
  89. package/lib/es/tagInput/index.js +13 -4
  90. package/lib/es/timePicker/TimeInput.d.ts +2 -1
  91. package/lib/es/timePicker/TimeInput.js +7 -3
  92. package/lib/es/timePicker/TimePicker.d.ts +2 -0
  93. package/lib/es/timePicker/TimePicker.js +2 -1
  94. package/lib/es/timePicker/index.d.ts +1 -0
  95. package/lib/es/tooltip/index.d.ts +3 -0
  96. package/lib/es/tooltip/index.js +9 -2
  97. package/lib/es/tree/index.d.ts +1 -0
  98. package/lib/es/tree/index.js +9 -2
  99. package/lib/es/typography/title.d.ts +1 -1
  100. package/modal/ModalContent.tsx +6 -3
  101. package/package.json +9 -9
  102. package/radio/radio.tsx +5 -0
  103. package/radio/radioInner.tsx +10 -1
  104. package/rating/index.tsx +6 -4
  105. package/rating/item.tsx +11 -0
  106. package/select/index.tsx +6 -2
  107. package/tabs/index.tsx +1 -0
  108. package/tabs/interface.ts +1 -0
  109. package/tagInput/index.tsx +6 -3
  110. package/timePicker/TimeInput.tsx +5 -3
  111. package/timePicker/TimePicker.tsx +2 -0
  112. package/tooltip/index.tsx +5 -1
  113. package/tree/index.tsx +3 -1
  114. package/yarn-error.log +26235 -0
@@ -168,6 +168,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
168
168
  disableStrictly: PropTypes.bool,
169
169
  leafOnly: PropTypes.bool,
170
170
  enableLeafClick: PropTypes.bool,
171
+ preventScroll: PropTypes.bool,
171
172
  };
172
173
 
173
174
  static defaultProps = {
@@ -268,16 +269,16 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
268
269
  this.setState({ inputPlaceHolder: value });
269
270
  },
270
271
  focusInput: () => {
272
+ const { preventScroll } = this.props;
271
273
  if (this.inputRef && this.inputRef.current) {
272
274
  // TODO: check the reason
273
- (this.inputRef.current as any).focus();
275
+ (this.inputRef.current as any).focus({ preventScroll });
274
276
  }
275
277
  },
276
278
  };
277
- const cascaderAdapter: Pick<CascaderAdapter,
278
- 'registerClickOutsideHandler'
279
- | 'unregisterClickOutsideHandler'
280
- | 'rePositionDropdown'
279
+ const cascaderAdapter: Pick<
280
+ CascaderAdapter,
281
+ 'registerClickOutsideHandler' | 'unregisterClickOutsideHandler' | 'rePositionDropdown'
281
282
  > = {
282
283
  registerClickOutsideHandler: cb => {
283
284
  const clickOutsideHandler = (e: Event) => {
@@ -412,13 +413,15 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
412
413
  realValue as SimpleValueType[][] :
413
414
  [realValue] as SimpleValueType[][];
414
415
  } else {
415
- normallizedValue = [[realValue]];
416
+ if (realValue !== undefined) {
417
+ normallizedValue = [[realValue]];
418
+ }
416
419
  }
417
420
  // formatValuePath is used to save value of valuePath
418
421
  const formatValuePath: (string | number)[][] = [];
419
422
  normallizedValue.forEach((valueItem: SimpleValueType[]) => {
420
423
  const formatItem: (string | number)[] = onChangeWithObject ?
421
- (valueItem as CascaderData[]).map(i => i.value) :
424
+ (valueItem as CascaderData[]).map(i => i?.value) :
422
425
  valueItem as (string | number)[];
423
426
  formatValuePath.push(formatItem);
424
427
  });
@@ -885,9 +888,9 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
885
888
  const { isOpen, isFocus, isInput, checkedKeys } = this.state;
886
889
  const filterable = Boolean(filterTreeNode);
887
890
  const useCustomTrigger = typeof triggerRender === 'function';
888
- const classNames = useCustomTrigger ?
889
- cls(className) :
890
- cls(prefixcls, className, {
891
+ const classNames = useCustomTrigger
892
+ ? cls(className)
893
+ : cls(prefixcls, className, {
891
894
  [`${prefixcls}-focus`]: isFocus || (isOpen && !isInput),
892
895
  [`${prefixcls}-disabled`]: disabled,
893
896
  [`${prefixcls}-single`]: true,
@@ -899,18 +902,18 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
899
902
  [`${prefixcls}-with-prefix`]: prefix || insetLabel,
900
903
  [`${prefixcls}-with-suffix`]: suffix,
901
904
  });
902
- const mouseEvent = showClear ?
903
- {
905
+ const mouseEvent = showClear
906
+ ? {
904
907
  onMouseEnter: () => this.handleMouseOver(),
905
908
  onMouseLeave: () => this.handleMouseLeave(),
906
- } :
907
- {};
909
+ }
910
+ : {};
908
911
  const sectionCls = cls(`${prefixcls}-selection`, {
909
912
  [`${prefixcls}-selection-multiple`]: multiple && !isEmpty(checkedKeys),
910
913
  });
911
- const inner = useCustomTrigger ?
912
- this.renderCustomTrigger() :
913
- [
914
+ const inner = useCustomTrigger
915
+ ? this.renderCustomTrigger()
916
+ : [
914
917
  <Fragment key={'prefix'}>{prefix || insetLabel ? this.renderPrefix() : null}</Fragment>,
915
918
  <Fragment key={'selection'}>
916
919
  <div className={sectionCls}>{this.renderSelectContent()}</div>
@@ -62,6 +62,7 @@ class Checkbox extends BaseComponent<CheckboxProps, CheckboxState> {
62
62
  index: PropTypes.number,
63
63
  'aria-label': PropTypes.string,
64
64
  tabIndex: PropTypes.number,
65
+ preventScroll: PropTypes.bool,
65
66
  };
66
67
 
67
68
  static defaultProps = {
@@ -23,6 +23,10 @@ export interface CheckboxInnerProps {
23
23
  addonId?: string;
24
24
  extraId?: string;
25
25
  'aria-label'?: React.AriaAttributes['aria-label'];
26
+ focusInner?: boolean;
27
+ onInputFocus?: (e: any) => void;
28
+ onInputBlur?: (e: any) => void;
29
+ preventScroll?: boolean;
26
30
  }
27
31
 
28
32
  class CheckboxInner extends PureComponent<CheckboxInnerProps> {
@@ -43,6 +47,10 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
43
47
  isPureCardType: PropTypes.bool,
44
48
  addonId: PropTypes.string,
45
49
  extraId: PropTypes.string,
50
+ focusInner: PropTypes.bool,
51
+ onInputFocus: PropTypes.func,
52
+ onInputBlur: PropTypes.func,
53
+ preventScroll: PropTypes.bool,
46
54
  };
47
55
 
48
56
  static defaultProps = {
@@ -55,7 +63,8 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
55
63
  }
56
64
 
57
65
  focus() {
58
- this.inputEntity.focus();
66
+ const { preventScroll } = this.props;
67
+ this.inputEntity.focus({ preventScroll });
59
68
  }
60
69
 
61
70
  render() {
@@ -1056,6 +1056,7 @@ describe(`DatePicker`, () => {
1056
1056
  const rightSecondWeek = rightPanel.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-week`)[1];
1057
1057
  const rightSecondWeekDays = rightSecondWeek.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-day`);
1058
1058
  leftSecondWeekDays[0].click();
1059
+ await sleep();
1059
1060
  rightSecondWeekDays[0].click();
1060
1061
 
1061
1062
  const baseElem = elem.find(BaseDatePicker);
@@ -0,0 +1,36 @@
1
+ import React, { useState, useCallback, useMemo } from 'react';
2
+ import { DatePicker, Button, Icon, Space } from '@douyinfe/semi-ui';
3
+
4
+ export default function Demo() {
5
+ const [date, setDate] = useState([]);
6
+ const onChange = useCallback(date => {
7
+ setDate(date);
8
+ console.log(date);
9
+ }, []);
10
+ const onClear = useCallback(e => {
11
+ e && e.stopPropagation();
12
+ setDate(null);
13
+ }, []);
14
+
15
+ const closeIcon = useMemo(() => (date ? <Icon type="close" onClick={onClear} /> : <Icon type="chevron_down" />), [date]);
16
+
17
+ return (
18
+ <Space>
19
+ <DatePicker
20
+ type="dateTimeRange"
21
+ onChange={onChange}
22
+ value={date}
23
+ triggerRender={({ placeholder }) => (
24
+ <Button theme={'light'} icon={closeIcon} iconPosition={'right'}>
25
+ {(date && String(date)) || placeholder}
26
+ </Button>
27
+ )}
28
+ />
29
+ <DatePicker
30
+ type="dateRange"
31
+ motion={false}
32
+ triggerRender={({ placeholder }) => <Button theme={'light'}>{placeholder}</Button>}
33
+ />
34
+ </Space>
35
+ );
36
+ }
@@ -4,3 +4,4 @@ export { default as FixInputRangeFocus } from './FixInputRangeFocus';
4
4
  export { default as InsetInput } from './InsetInput';
5
5
  export { default as InsetInputE2E } from './InsetInputE2E';
6
6
  export { default as FixDefaultPickerValue } from './FixDefaultPickerValue';
7
+ export { default as FixedTriggerRender } from './FixTriggerRender';
@@ -125,6 +125,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
125
125
  // Callback function for panel date switching
126
126
  onPanelChange: PropTypes.func,
127
127
  rangeSeparator: PropTypes.string,
128
+ preventScroll: PropTypes.bool,
128
129
  };
129
130
 
130
131
  static defaultProps = {
@@ -272,13 +273,14 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
272
273
  typeIsYearOrMonth: () => ['month', 'year'].includes(this.props.type),
273
274
  setMotionEnd: motionEnd => this.setState({ motionEnd }),
274
275
  setRangeInputFocus: rangeInputFocus => {
276
+ const { preventScroll } = this.props;
275
277
  if (rangeInputFocus !== this.state.rangeInputFocus) {
276
278
  this.setState({ rangeInputFocus });
277
279
  }
278
280
  switch (rangeInputFocus) {
279
281
  case 'rangeStart':
280
282
  const inputStartNode = get(this, 'rangeInputStartRef.current');
281
- inputStartNode && inputStartNode.focus();
283
+ inputStartNode && inputStartNode.focus({ preventScroll });
282
284
  /**
283
285
  * 解决选择完startDate,切换到endDate后panel被立马关闭的问题。
284
286
  * 用户打开panel,选了startDate后,会执行setRangeInputFocus('rangeEnd'),focus到endDateInput,
@@ -298,7 +300,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
298
300
  break;
299
301
  case 'rangeEnd':
300
302
  const inputEndNode = get(this, 'rangeInputEndRef.current');
301
- inputEndNode && inputEndNode.focus();
303
+ inputEndNode && inputEndNode.focus({ preventScroll });
302
304
  /**
303
305
  * 解决选择完startDate,切换到endDate后panel被立马关闭的问题。
304
306
  * 用户打开panel,选了startDate后,会执行setRangeInputFocus('rangeEnd'),focus到endDateInput,
@@ -323,19 +325,20 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
323
325
  couldPanelClosed: () => this.focusRecordsRef.current.rangeStart && this.focusRecordsRef.current.rangeEnd,
324
326
  isEventTarget: e => e && e.target === e.currentTarget,
325
327
  setInsetInputFocus: () => {
328
+ const { preventScroll } = this.props;
326
329
  const { rangeInputFocus } = this.state;
327
330
  switch (rangeInputFocus) {
328
331
  case 'rangeEnd':
329
332
  if (document.activeElement !== this.rangeInputEndRef.current) {
330
333
  const inputEndNode = get(this, 'rangeInputEndRef.current');
331
- inputEndNode && inputEndNode.focus();
334
+ inputEndNode && inputEndNode.focus({ preventScroll });
332
335
  }
333
336
  break;
334
337
  case 'rangeStart':
335
338
  default:
336
339
  if (document.activeElement !== this.rangeInputStartRef.current) {
337
340
  const inputStartNode = get(this, 'rangeInputStartRef.current');
338
- inputStartNode && inputStartNode.focus();
341
+ inputStartNode && inputStartNode.focus({ preventScroll });
339
342
  }
340
343
  break;
341
344
  }