@douyinfe/semi-ui 2.17.0-alpha.1 → 2.17.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 (90) hide show
  1. package/_base/_story/a11y.jsx +2 -2
  2. package/avatar/__test__/avatar.test.js +3 -3
  3. package/avatar/interface.ts +1 -1
  4. package/collapse/__test__/collapse.test.js +22 -2
  5. package/collapse/_story/accordion.stories.js +2 -2
  6. package/collapse/item.tsx +20 -6
  7. package/collapsible/_story/collapsible.stories.js +6 -6
  8. package/configProvider/_story/RTLDirection/RTLForm.jsx +1 -1
  9. package/datePicker/__test__/datePicker.test.js +5 -5
  10. package/datePicker/_story/datePicker.stories.js +138 -22
  11. package/datePicker/datePicker.tsx +42 -7
  12. package/datePicker/monthsGrid.tsx +22 -10
  13. package/datePicker/quickControl.tsx +62 -16
  14. package/datePicker/yearAndMonth.tsx +31 -5
  15. package/dist/css/semi.css +327 -46
  16. package/dist/css/semi.min.css +1 -1
  17. package/dist/umd/semi-ui.js +45864 -45368
  18. package/dist/umd/semi-ui.js.map +1 -1
  19. package/dist/umd/semi-ui.min.js +1 -1
  20. package/dist/umd/semi-ui.min.js.map +1 -1
  21. package/lib/cjs/avatar/interface.d.ts +1 -1
  22. package/lib/cjs/collapse/item.d.ts +8 -0
  23. package/lib/cjs/collapse/item.js +19 -8
  24. package/lib/cjs/datePicker/datePicker.d.ts +3 -0
  25. package/lib/cjs/datePicker/datePicker.js +56 -9
  26. package/lib/cjs/datePicker/monthsGrid.d.ts +3 -0
  27. package/lib/cjs/datePicker/monthsGrid.js +14 -3
  28. package/lib/cjs/datePicker/quickControl.d.ts +6 -0
  29. package/lib/cjs/datePicker/quickControl.js +61 -14
  30. package/lib/cjs/datePicker/yearAndMonth.d.ts +3 -0
  31. package/lib/cjs/datePicker/yearAndMonth.js +15 -3
  32. package/lib/cjs/popover/index.d.ts +3 -0
  33. package/lib/cjs/popover/index.js +4 -2
  34. package/lib/cjs/select/index.d.ts +6 -1
  35. package/lib/cjs/select/index.js +130 -72
  36. package/lib/cjs/select/option.js +4 -2
  37. package/lib/cjs/tag/index.js +6 -4
  38. package/lib/cjs/tag/interface.d.ts +1 -0
  39. package/lib/cjs/tagInput/index.d.ts +13 -1
  40. package/lib/cjs/tagInput/index.js +217 -91
  41. package/lib/cjs/timePicker/TimePicker.js +1 -1
  42. package/lib/cjs/tooltip/index.d.ts +4 -0
  43. package/lib/cjs/tooltip/index.js +5 -3
  44. package/lib/cjs/typography/base.js +3 -15
  45. package/lib/cjs/typography/text.js +1 -11
  46. package/lib/es/avatar/interface.d.ts +1 -1
  47. package/lib/es/collapse/item.d.ts +8 -0
  48. package/lib/es/collapse/item.js +19 -8
  49. package/lib/es/datePicker/datePicker.d.ts +3 -0
  50. package/lib/es/datePicker/datePicker.js +56 -9
  51. package/lib/es/datePicker/monthsGrid.d.ts +3 -0
  52. package/lib/es/datePicker/monthsGrid.js +14 -3
  53. package/lib/es/datePicker/quickControl.d.ts +6 -0
  54. package/lib/es/datePicker/quickControl.js +61 -15
  55. package/lib/es/datePicker/yearAndMonth.d.ts +3 -0
  56. package/lib/es/datePicker/yearAndMonth.js +14 -3
  57. package/lib/es/popover/index.d.ts +3 -0
  58. package/lib/es/popover/index.js +4 -2
  59. package/lib/es/select/index.d.ts +6 -1
  60. package/lib/es/select/index.js +129 -71
  61. package/lib/es/select/option.js +4 -2
  62. package/lib/es/tag/index.js +6 -4
  63. package/lib/es/tag/interface.d.ts +1 -0
  64. package/lib/es/tagInput/index.d.ts +13 -1
  65. package/lib/es/tagInput/index.js +217 -93
  66. package/lib/es/timePicker/TimePicker.js +1 -1
  67. package/lib/es/tooltip/index.d.ts +4 -0
  68. package/lib/es/tooltip/index.js +5 -3
  69. package/lib/es/typography/base.js +3 -15
  70. package/lib/es/typography/text.js +1 -10
  71. package/package.json +7 -7
  72. package/popover/index.tsx +4 -1
  73. package/select/__test__/select.test.js +5 -3
  74. package/select/_story/select.stories.js +1 -1
  75. package/select/_story/select.stories.tsx +2 -2
  76. package/select/index.tsx +65 -30
  77. package/select/option.tsx +2 -0
  78. package/table/_story/Perf/Render/complex.jsx +1 -1
  79. package/table/_story/Perf/Render/resizableSelection.jsx +1 -1
  80. package/tag/index.tsx +3 -2
  81. package/tag/interface.ts +1 -0
  82. package/tagInput/_story/tagInput.stories.js +20 -2
  83. package/tagInput/index.tsx +126 -26
  84. package/timePicker/TimePicker.tsx +1 -1
  85. package/tooltip/index.tsx +5 -2
  86. package/typography/_story/typography.stories.js +3 -15
  87. package/typography/base.tsx +4 -9
  88. package/typography/text.tsx +1 -9
  89. package/upload/__test__/upload.test.js +9 -9
  90. package/upload/_story/upload.stories.js +5 -5
@@ -218,7 +218,7 @@ const initValues = {
218
218
  preview: true,
219
219
  fileInstance: new File([new ArrayBuffer(2048)], 'jiafang1.jpeg', { type: 'image/jpeg' }),
220
220
  url:
221
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
221
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
222
222
  },
223
223
  {
224
224
  uid: '3',
@@ -229,7 +229,7 @@ const initValues = {
229
229
  preview: true,
230
230
  fileInstance: new File([new ArrayBuffer(2048)], 'jiafang2.jpeg', { type: 'image/jpeg' }),
231
231
  url:
232
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
232
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
233
233
  },
234
234
  ],
235
235
  };
@@ -261,7 +261,7 @@ describe('Avatar', () => {
261
261
  it('src', () => {
262
262
  const element = (
263
263
  <Avatar
264
- src="https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/avatarDemo.jpeg"
264
+ src="https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/dy.png"
265
265
  style={{ margin: 4 }}
266
266
  />
267
267
  );
@@ -272,7 +272,7 @@ describe('Avatar', () => {
272
272
  .at(0)
273
273
  .props()
274
274
  .src
275
- ).toEqual('https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/avatarDemo.jpeg');
275
+ ).toEqual('https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/dy.png');
276
276
  });
277
277
 
278
278
  it('shape', () => {
@@ -320,7 +320,7 @@ describe('Avatar', () => {
320
320
  const avatar = mount(
321
321
  <Avatar
322
322
  onError={spyOnError}
323
- src="https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/avatarDemo.jpeg"
323
+ src="https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/dy.png"
324
324
  />
325
325
  );
326
326
  avatar
@@ -38,7 +38,7 @@ export interface AvatarProps extends BaseProps {
38
38
  }
39
39
 
40
40
  export type AvatarGroupShape = 'circle' | 'square';
41
- export type AvatarGroupSize = 'extra-extra-small' | 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';
41
+ export type AvatarGroupSize = 'extra-extra-small' | 'extra-small' | 'small' | 'default' | 'medium' | 'large' | 'extra-large';
42
42
  export type AvatarGroupOverlapFrom = 'start' | 'end';
43
43
 
44
44
  export interface AvatarGroupProps {
@@ -3,11 +3,13 @@ import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; //
3
3
 
4
4
  import { IconPlus, IconMinus, IconCopy } from '@douyinfe/semi-icons';
5
5
 
6
- let getCollapse = collapseProps => {
6
+ let getCollapse = (collapseProps, panel1Props) => {
7
7
  let props = collapseProps ? collapseProps : {};
8
+ let panelProps = panel1Props ? panel1Props : {};
9
+
8
10
  return (
9
11
  <Collapse {...collapseProps}>
10
- <Collapse.Panel header="This is panel header 1" itemKey="1">
12
+ <Collapse.Panel header="This is panel header 1" itemKey="1" {...panelProps}>
11
13
  <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
12
14
  </Collapse.Panel>
13
15
  <Collapse.Panel header="This is panel header 2" itemKey="2">
@@ -145,4 +147,22 @@ describe('Collapse', () => {
145
147
  expect(headers.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("false");
146
148
  expect(headers.at(2).getDOMNode().getAttribute(expandAttr)).toEqual("true");
147
149
  });
150
+
151
+ it('disable Collapse', () => {
152
+ let props = {
153
+ disabled: true,
154
+ };
155
+ const disabledPanel = mount(getCollapse({}, props));
156
+ expect(disabledPanel.exists('.semi-collapse-header-disabled')).toEqual(true);
157
+ });
158
+
159
+ it('hide the panel icon', () => {
160
+ const hidePanelArrow = mount(
161
+ <Collapse >
162
+ <Collapse.Panel header="This is panel header 1" itemKey="1" showArrow={false}>
163
+ <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
164
+ </Collapse.Panel>
165
+ </Collapse>);
166
+ expect(hidePanelArrow.exists('.semi-collapse-header-icon')).toEqual(false);
167
+ });
148
168
  });
@@ -17,7 +17,7 @@ export default {
17
17
  export const RegularCollapse = () => (
18
18
  <div>
19
19
  <Collapse onChange={k => console.log(k)}>
20
- <Panel header="This is panel header 1" itemKey="1">
20
+ <Panel header="This is panel header 1" itemKey="1" showArrow={false}>
21
21
  <p>{text}</p>
22
22
  </Panel>
23
23
  <Panel header="This is panel header 2" itemKey="2">
@@ -32,7 +32,7 @@ export const RegularCollapse = () => (
32
32
  <Panel header="This is panel header 1" itemKey="1">
33
33
  <p>{text}</p>
34
34
  </Panel>
35
- <Panel header="This is panel header 2" itemKey="124">
35
+ <Panel header="This is panel header 2" itemKey="124" disabled>
36
36
  <p>{text}</p>
37
37
  </Panel>
38
38
  <Panel header="This is panel header 3" itemKey="3" disabled>
package/collapse/item.tsx CHANGED
@@ -15,6 +15,8 @@ export interface CollapsePanelProps {
15
15
  children?: React.ReactNode;
16
16
  reCalcKey?: number | string;
17
17
  style?: CSSProperties;
18
+ showArrow?: boolean,
19
+ disabled?: boolean,
18
20
  }
19
21
 
20
22
  export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
@@ -32,6 +34,13 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
32
34
  PropTypes.string,
33
35
  PropTypes.number,
34
36
  ]),
37
+ showArrow: PropTypes.bool,
38
+ disabled: PropTypes.bool,
39
+ };
40
+
41
+ static defaultProps = {
42
+ showArrow: true,
43
+ disabled: false,
35
44
  };
36
45
 
37
46
  private ariaID = getUuidShort({});
@@ -40,6 +49,7 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
40
49
 
41
50
  renderHeader(active: boolean, expandIconEnable = true) {
42
51
  const {
52
+ showArrow,
43
53
  header,
44
54
  extra,
45
55
  } = this.props;
@@ -65,20 +75,20 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
65
75
  if (typeof header === 'string') {
66
76
  return (
67
77
  <>
68
- {iconPosLeft ? icon : null}
78
+ {showArrow && (iconPosLeft ? icon : null)}
69
79
  <span>{header}</span>
70
80
  <span className={`${cssClasses.PREFIX}-header-right`}>
71
81
  <span>{extra}</span>
72
- {iconPosLeft ? null : icon}
82
+ {showArrow && (iconPosLeft ? null : icon)}
73
83
  </span>
74
84
  </>
75
85
  );
76
86
  }
77
87
  return (
78
88
  <>
79
- {iconPosLeft ? icon : null}
89
+ {showArrow && (iconPosLeft ? icon : null)}
80
90
  {header}
81
- {iconPosLeft ? null : icon}
91
+ {showArrow && (iconPosLeft ? null : icon)}
82
92
  </>
83
93
  );
84
94
  }
@@ -91,6 +101,8 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
91
101
  reCalcKey,
92
102
  header,
93
103
  extra,
104
+ showArrow,
105
+ disabled,
94
106
  ...restProps
95
107
  } = this.props;
96
108
  const {
@@ -106,6 +118,7 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
106
118
  });
107
119
  const headerCls = cls({
108
120
  [`${cssClasses.PREFIX}-header`]: true,
121
+ [`${cssClasses.PREFIX}-header-disabled`]: disabled,
109
122
  [`${cssClasses.PREFIX}-header-iconLeft`]: expandIconPosition === 'left',
110
123
  });
111
124
  const contentCls = cls({
@@ -120,11 +133,12 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
120
133
  role="button"
121
134
  tabIndex={0}
122
135
  className={headerCls}
136
+ aria-disabled={disabled}
123
137
  aria-expanded={active ? 'true' : 'false'}
124
138
  aria-owns={this.ariaID}
125
- onClick={e => onClick(itemKey, e)}
139
+ onClick={e => !disabled && onClick(itemKey, e)}
126
140
  >
127
- {this.renderHeader(active, children !== undefined)}
141
+ {this.renderHeader(active, children !== undefined && !disabled)}
128
142
  </div>
129
143
  {
130
144
  children && (
@@ -368,7 +368,7 @@ class WithUpload extends React.Component {
368
368
  status: 'success',
369
369
  uid: 'd116a179410eb0ca18e66074509bde93-0',
370
370
  url:
371
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
371
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
372
372
  },
373
373
  {
374
374
  preview: false,
@@ -376,7 +376,7 @@ class WithUpload extends React.Component {
376
376
  status: 'success',
377
377
  uid: 'b7d579069320590ba4b128672eedbae2-1',
378
378
  url:
379
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
379
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
380
380
  },
381
381
  {
382
382
  preview: false,
@@ -384,7 +384,7 @@ class WithUpload extends React.Component {
384
384
  status: 'success',
385
385
  uid: 'b7d579069320590ba4b128672eedbae2-2',
386
386
  url:
387
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
387
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
388
388
  },
389
389
  ];
390
390
  }
@@ -410,7 +410,7 @@ class WithUpload extends React.Component {
410
410
  status: 'success',
411
411
  uid: 'd116a179410eb0ca18e66074509bde93-0',
412
412
  url:
413
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
413
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
414
414
  },
415
415
  {
416
416
  preview: false,
@@ -418,7 +418,7 @@ class WithUpload extends React.Component {
418
418
  status: 'success',
419
419
  uid: 'b7d579069320590ba4b128672eedbae2-1',
420
420
  url:
421
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
421
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
422
422
  },
423
423
  {
424
424
  preview: false,
@@ -426,7 +426,7 @@ class WithUpload extends React.Component {
426
426
  status: 'success',
427
427
  uid: 'b7d579069320590ba4b128672eedbae2-2',
428
428
  url:
429
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
429
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
430
430
  },
431
431
  ]}
432
432
  dragMainText="点击上传文件或拖拽文件到这里"
@@ -35,7 +35,7 @@ class RTLForm extends React.Component {
35
35
  type: 'image/jpeg',
36
36
  }),
37
37
  url:
38
- 'https://sf6-cdn-tos.douyinstatic.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bf8647bffab13c38772c9ff94bf91a9d.jpg',
38
+ 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/bag.jpeg',
39
39
  },
40
40
  ],
41
41
  },
@@ -114,7 +114,7 @@ describe(`DatePicker`, () => {
114
114
  const demo = mount(<DatePicker presets={presets} motion={motion} open={open} defaultValue={defaultValue} />);
115
115
  const elem = demo.find(BaseDatePicker);
116
116
 
117
- const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control-item`);
117
+ const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control button`);
118
118
 
119
119
  /**
120
120
  * click next day
@@ -560,7 +560,7 @@ describe(`DatePicker`, () => {
560
560
  };
561
561
  const demo = mount(<DatePicker {...props} />);
562
562
  const elem = demo.find(BaseDatePicker);
563
- const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control-item`);
563
+ const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control button`);
564
564
 
565
565
  // click disabled date
566
566
  btns[0].click();
@@ -675,7 +675,7 @@ describe(`DatePicker`, () => {
675
675
  const demo = mount(<DatePicker onPresetClick={handlePresetClick} presets={presets} motion={motion} open={open} defaultValue={defaultValue} />);
676
676
  const elem = demo.find(BaseDatePicker);
677
677
 
678
- const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control-item`);
678
+ const btns = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-quick-control button`);
679
679
 
680
680
  btns[0].click();
681
681
  btns[1].click();
@@ -987,7 +987,7 @@ describe(`DatePicker`, () => {
987
987
  const demo = mount(<DatePicker {...props} onChange={handleChange} />);
988
988
  const elem = demo.find(BaseDatePicker);
989
989
 
990
- const btns = document.querySelectorAll('.semi-datepicker-quick-control-item');
990
+ const btns = document.querySelectorAll('.semi-datepicker-quick-control button');
991
991
 
992
992
  btns[0].click();
993
993
  expect(handleChange.called).toBeTruthy();
@@ -1016,7 +1016,7 @@ describe(`DatePicker`, () => {
1016
1016
  const demo = mount(<DatePicker {...props} onChange={handleChange} onConfirm={handleConfirm} />);
1017
1017
  const elem = demo.find(BaseDatePicker);
1018
1018
 
1019
- const btns = document.querySelectorAll('.semi-datepicker-quick-control-item');
1019
+ const btns = document.querySelectorAll('.semi-datepicker-quick-control button');
1020
1020
 
1021
1021
  // 点击 preset
1022
1022
  btns[0].click();
@@ -10,7 +10,7 @@ import {
10
10
  startOfWeek,
11
11
  endOfWeek,
12
12
  } from 'date-fns';
13
- import { Space, ConfigProvider, InputGroup, InputNumber, Form, withField, Button } from '../../index';
13
+ import { Space, ConfigProvider, InputGroup, InputNumber, Form, withField, Button, RadioGroup, Radio } from '../../index';
14
14
 
15
15
  // stores
16
16
  import NeedConfirmDemo from './NeedConfirm';
@@ -36,6 +36,7 @@ import DatePickerSlot from './DatePickerSlot';
36
36
  import DatePickerTimeZone from './DatePickerTimeZone';
37
37
  import BetterRangePicker from './BetterRangePicker';
38
38
  import SyncSwitchMonth from './SyncSwitchMonth';
39
+ import { Checkbox } from '../../checkbox';
39
40
  export * from './v2';
40
41
 
41
42
  export default {
@@ -189,6 +190,11 @@ const presets = [
189
190
  start: addDays(new Date(), 1),
190
191
  end: addDays(new Date(), 1),
191
192
  },
193
+ {
194
+ text: 'Today After Tomorrow',
195
+ start: addDays(new Date(), 2),
196
+ end: addDays(new Date(), 2),
197
+ },
192
198
  {
193
199
  text: 'Next Week',
194
200
  start: addWeeks(new Date(), 1),
@@ -200,24 +206,14 @@ const presets = [
200
206
  end: endOfMonth(addMonths(new Date(), 1)),
201
207
  },
202
208
  {
203
- text: 'Today',
204
- start: new Date(),
205
- end: new Date(),
206
- },
207
- {
208
- text: 'Tomorrow',
209
- start: addDays(new Date(), 1),
210
- end: addDays(new Date(), 1),
211
- },
212
- {
213
- text: 'Next Week',
214
- start: addWeeks(new Date(), 1),
215
- end: addWeeks(new Date(), 2),
209
+ text: 'Next Bimonthly',
210
+ start: startOfMonth(addMonths(new Date(), 1)),
211
+ end: endOfMonth(addMonths(new Date(), 2)),
216
212
  },
217
213
  {
218
- text: 'Next Month',
219
- start: startOfMonth(addMonths(new Date(), 1)),
220
- end: endOfMonth(addMonths(new Date(), 1)),
214
+ text: 'Next Quarter',
215
+ start: startOfMonth(addMonths(new Date(), 3)),
216
+ end: endOfMonth(addMonths(new Date(), 3)),
221
217
  },
222
218
  ];
223
219
 
@@ -225,40 +221,160 @@ export const DatePickerWithPresets = () => {
225
221
  const onPresetClick = (item, e) => {
226
222
  console.log('preset click', item, e);
227
223
  };
224
+ const [presetPosition, setPresetPosition] = useState('right');
225
+ const [insetInput, setInsetInput] = useState(false);
226
+ const [presetArr, setPresetArr] = useState(presets);
227
+
228
+ const BottomSlot = function(props) {
229
+ const { style } = props;
230
+ return (
231
+ <div style={{ padding: '12px 20px', ...style }}>
232
+ <div strong style={{ color: 'var(--semi-color-text-2)' }}>
233
+ 定版前请阅读
234
+ </div>
235
+ <div link={{ href: 'https://semi.design/', target: '_blank' }}>发版须知</div>
236
+ </div>
237
+ );
238
+ };
228
239
  return (
229
240
  <div style={demoDiv}>
230
241
  <span>带快捷选择的DatePicker</span>
242
+ <br/>
243
+ <br/>
244
+ <RadioGroup onChange={e=>setPresetPosition(e.target.value)} value={presetPosition} aria-label="选择快捷选择面板位置" name="preset-radio-group">
245
+ <Radio value={'left'}>left</Radio>
246
+ <Radio value={'right'}>right</Radio>
247
+ <Radio value={'top'}>top</Radio>
248
+ <Radio value={'bottom'}>bottom</Radio>
249
+ </RadioGroup>
250
+ <Checkbox value={insetInput} onChange={e=>setInsetInput(e.target.checked)}>insetInput</Checkbox>
251
+ <Checkbox value={presetArr} onChange={e=>setPresetArr(e.target.checked ? [...presets, ...presets, ...presets]:presets)}>more presets</Checkbox>
252
+ <br/>
253
+ <div>type="date"</div>
231
254
  <DatePicker
232
- type="dateRange"
233
- presets={presets}
255
+ type="date"
256
+ presets={presetArr}
257
+ insetInput={insetInput}
258
+ presetPosition={presetPosition}
234
259
  onPresetClick={onPresetClick}
235
260
  onChange={(...args) => console.log(...args)}
236
261
  />
262
+ <br/>
263
+ <br/>
264
+ <div>type="dateTime"</div>
237
265
  <DatePicker
238
266
  type="dateTime"
239
- presets={presets.map(preset => ({
267
+ insetInput={insetInput}
268
+ needConfirm
269
+ bottomSlot={<BottomSlot/>}
270
+ presetPosition={presetPosition}
271
+ presets={presetArr.map(preset => ({
272
+ text: preset.text,
273
+ start: preset.start,
274
+ }))}
275
+ onPresetClick={onPresetClick}
276
+ onChange={(...args) => console.log(...args)}
277
+ />
278
+ <br/>
279
+ <br/>
280
+ <div>type="dateRange"</div>
281
+ <DatePicker
282
+ type="dateRange"
283
+ presets={presetArr}
284
+ insetInput={insetInput}
285
+ presetPosition={presetPosition}
286
+ onPresetClick={onPresetClick}
287
+ onChange={(...args) => console.log(...args)}
288
+ />
289
+ <br/>
290
+ <br/>
291
+ <div>type="dateTimeRange"</div>
292
+ <DatePicker
293
+ type="dateTimeRange"
294
+ presets={presetArr}
295
+ insetInput={insetInput}
296
+ presetPosition={presetPosition}
297
+ onPresetClick={onPresetClick}
298
+ onChange={(...args) => console.log(...args)}
299
+ />
300
+ <br/>
301
+ <br/>
302
+ <div>type="month"</div>
303
+ <DatePicker
304
+ type="month"
305
+ insetInput={insetInput}
306
+ presetPosition={presetPosition}
307
+ presets={presetArr.map(preset => ({
240
308
  text: preset.text,
241
309
  start: preset.start,
242
310
  }))}
243
311
  onPresetClick={onPresetClick}
244
312
  onChange={(...args) => console.log(...args)}
245
313
  />
314
+ <br/>
315
+ <br/>
316
+ <div>type="date" density="compact"</div>
317
+ <DatePicker
318
+ type="date"
319
+ presets={presetArr}
320
+ insetInput={insetInput}
321
+ density="compact"
322
+ presetPosition={presetPosition}
323
+ onPresetClick={onPresetClick}
324
+ onChange={(...args) => console.log(...args)}
325
+ />
326
+ <br/>
327
+ <br/>
328
+ <div>type="dateTime" density="compact"</div>
246
329
  <DatePicker
247
330
  type="dateTime"
331
+ insetInput={insetInput}
248
332
  needConfirm
249
- presets={presets.map(preset => ({
333
+ density="compact"
334
+ presetPosition={presetPosition}
335
+ presets={presetArr.map(preset => ({
250
336
  text: preset.text,
251
337
  start: preset.start,
252
338
  }))}
253
339
  onPresetClick={onPresetClick}
254
340
  onChange={(...args) => console.log(...args)}
255
341
  />
342
+ <br/>
343
+ <br/>
344
+ <div>type="dateRange" density="compact"</div>
345
+ <DatePicker
346
+ type="dateRange"
347
+ presets={presetArr}
348
+ density="compact"
349
+ insetInput={insetInput}
350
+ presetPosition={presetPosition}
351
+ onPresetClick={onPresetClick}
352
+ onChange={(...args) => console.log(...args)}
353
+ />
354
+ <br/>
355
+ <br/>
356
+ <div>type="dateTimeRange" density="compact"</div>
357
+ <DatePicker
358
+ type="dateTimeRange"
359
+ density="compact"
360
+ presets={presetArr}
361
+ insetInput={insetInput}
362
+ presetPosition={presetPosition}
363
+ onPresetClick={onPresetClick}
364
+ onChange={(...args) => console.log(...args)}
365
+ />
366
+ <br/>
367
+ <br/>
368
+ <div>type="month" density="compact"</div>
256
369
  <DatePicker
257
370
  type="month"
258
- presets={presets.map(preset => ({
371
+ insetInput={insetInput}
372
+ presetPosition={presetPosition}
373
+ presets={presetArr.map(preset => ({
259
374
  text: preset.text,
260
375
  start: preset.start,
261
376
  }))}
377
+ density="compact"
262
378
  onPresetClick={onPresetClick}
263
379
  onChange={(...args) => console.log(...args)}
264
380
  />
@@ -76,6 +76,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
76
76
  max: PropTypes.number, // only work when multiple is true
77
77
  placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
78
78
  presets: PropTypes.array,
79
+ presetPosition: PropTypes.oneOf(strings.PRESET_POSITION_SET),
79
80
  onChange: PropTypes.func,
80
81
  onChangeWithDateFirst: PropTypes.bool,
81
82
  weekStartsOn: PropTypes.number,
@@ -134,6 +135,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
134
135
  stopPropagation: true,
135
136
  motion: true,
136
137
  prefixCls: cssClasses.PREFIX,
138
+ presetPosition: 'bottom',
137
139
  // position: 'bottomLeft',
138
140
  zIndex: popoverNumbers.DEFAULT_Z_INDEX,
139
141
  type: 'date',
@@ -415,7 +417,8 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
415
417
  onPanelChange,
416
418
  timeZone,
417
419
  triggerRender,
418
- insetInput
420
+ insetInput,
421
+ presetPosition
419
422
  } = this.props;
420
423
  const { cachedSelectedValue, motionEnd, rangeInputFocus } = this.state;
421
424
 
@@ -456,21 +459,49 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
456
459
  focusRecordsRef={this.focusRecordsRef}
457
460
  triggerRender={triggerRender}
458
461
  insetInput={insetInput}
462
+ presetPosition={presetPosition}
463
+ renderQuickControls={this.renderQuickControls()}
464
+ renderDateInput={this.renderDateInput()}
459
465
  />
460
466
  );
461
467
  }
462
468
 
463
469
  renderQuickControls() {
464
- const { presets, type } = this.props;
470
+ const { presets, type, presetPosition, insetInput } = this.props;
465
471
  return (
466
472
  <QuickControl
467
473
  type={type}
468
474
  presets={presets}
475
+ insetInput={insetInput}
476
+ presetPosition={presetPosition}
469
477
  onPresetClick={(item, e) => this.foundation.handlePresetClick(item, e)}
470
478
  />
471
479
  );
472
480
  }
473
481
 
482
+ renderDateInput() {
483
+ const { insetInput, dateFnsLocale, density, type, format, rangeSeparator, defaultPickerValue } = this.props;
484
+ const { insetInputValue, value } = this.state;
485
+
486
+ const insetInputProps = {
487
+ dateFnsLocale,
488
+ format,
489
+ insetInputValue,
490
+ rangeSeparator,
491
+ type,
492
+ value: value as Date[],
493
+ handleInsetDateFocus: this.handleInsetDateFocus,
494
+ handleInsetTimeFocus: this.handleInsetTimeFocus,
495
+ onInsetInputChange: this.handleInsetInputChange,
496
+ rangeInputStartRef: this.rangeInputStartRef,
497
+ rangeInputEndRef: this.rangeInputEndRef,
498
+ density,
499
+ defaultPickerValue
500
+ };
501
+
502
+ return insetInput ? <DateInput {...insetInputProps} insetInput={true} /> : null;
503
+ }
504
+
474
505
  handleOpenPanel = () => this.foundation.openPanel();
475
506
  handleInputChange: DatePickerFoundation['handleInputChange'] = (...args) => this.foundation.handleInputChange(...args);
476
507
  handleInsetInputChange = (options: InsetInputChangeProps) => this.foundation.handleInsetInputChange(options);
@@ -626,7 +657,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
626
657
  };
627
658
 
628
659
  renderPanel = (locale: Locale['DatePicker'], localeCode: string, dateFnsLocale: Locale['dateFnsLocale']) => {
629
- const { dropdownClassName, dropdownStyle, density, topSlot, bottomSlot, insetInput, type, format, rangeSeparator, defaultPickerValue } = this.props;
660
+ const { dropdownClassName, dropdownStyle, density, topSlot, bottomSlot, insetInput, type, format, rangeSeparator, defaultPickerValue, presetPosition } = this.props;
630
661
  const { insetInputValue, value } = this.state;
631
662
  const wrapCls = classnames(
632
663
  cssClasses.PREFIX,
@@ -654,17 +685,18 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
654
685
  };
655
686
 
656
687
  return (
657
- <div ref={this.panelRef} className={wrapCls} style={dropdownStyle}>
688
+ <div ref={this.panelRef} className={wrapCls} style={dropdownStyle} >
658
689
  {topSlot && (
659
690
  <div className={`${cssClasses.PREFIX}-topSlot`} x-semi-prop="topSlot">
660
691
  {topSlot}
661
692
  </div>
662
693
  )}
663
- {insetInput && <DateInput {...insetInputProps} insetInput={true} />}
694
+ {presetPosition === "top" && this.renderQuickControls()}
695
+ {/* {insetInput && <DateInput {...insetInputProps} insetInput={true} />} */}
664
696
  {this.adapter.typeIsYearOrMonth()
665
697
  ? this.renderYearMonthPanel(locale, localeCode)
666
698
  : this.renderMonthGrid(locale, localeCode, dateFnsLocale)}
667
- {this.renderQuickControls()}
699
+ {presetPosition === "bottom" && this.renderQuickControls()}
668
700
  {bottomSlot && (
669
701
  <div className={`${cssClasses.PREFIX}-bottomSlot`} x-semi-prop="bottomSlot">
670
702
  {bottomSlot}
@@ -676,7 +708,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
676
708
  };
677
709
 
678
710
  renderYearMonthPanel = (locale: Locale['DatePicker'], localeCode: string) => {
679
- const { density } = this.props;
711
+ const { density, presetPosition } = this.props;
680
712
 
681
713
  const date = this.state.value[0];
682
714
  let year = 0;
@@ -698,6 +730,9 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
698
730
  currentYear={year}
699
731
  currentMonth={month}
700
732
  density={density}
733
+ presetPosition={presetPosition}
734
+ renderQuickControls={this.renderQuickControls()}
735
+ renderDateInput={this.renderDateInput()}
701
736
  />
702
737
  );
703
738
  };