@douyinfe/semi-ui 2.4.1 → 2.5.1

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 (103) hide show
  1. package/button/index.tsx +1 -1
  2. package/cascader/__test__/cascader.test.js +24 -0
  3. package/cascader/_story/cascader.stories.js +73 -0
  4. package/cascader/index.tsx +5 -2
  5. package/datePicker/_story/v2/FixInputRangeFocus.jsx +25 -0
  6. package/datePicker/_story/v2/index.js +2 -1
  7. package/datePicker/datePicker.tsx +3 -0
  8. package/dist/css/semi.css +56 -29
  9. package/dist/css/semi.min.css +1 -1
  10. package/dist/umd/semi-ui.js +523 -227
  11. package/dist/umd/semi-ui.js.map +1 -1
  12. package/dist/umd/semi-ui.min.js +1 -1
  13. package/dist/umd/semi-ui.min.js.map +1 -1
  14. package/form/__test__/formApi.test.js +182 -0
  15. package/form/_story/FormApi/arrayDemo.jsx +4 -7
  16. package/form/_story/Layout/slotDemo.jsx +2 -2
  17. package/form/_story/demo.jsx +18 -1
  18. package/form/_story/form.stories.js +6 -6
  19. package/form/baseForm.tsx +2 -2
  20. package/lib/cjs/autoComplete/index.d.ts +1 -1
  21. package/lib/cjs/button/Button.d.ts +4 -4
  22. package/lib/cjs/button/buttonGroup.d.ts +2 -2
  23. package/lib/cjs/button/index.d.ts +5 -6
  24. package/lib/cjs/cascader/index.js +6 -0
  25. package/lib/cjs/datePicker/datePicker.js +4 -0
  26. package/lib/cjs/dropdown/index.d.ts +1 -1
  27. package/lib/cjs/form/baseForm.d.ts +1 -1
  28. package/lib/cjs/form/baseForm.js +2 -2
  29. package/lib/cjs/form/field.d.ts +1 -1
  30. package/lib/cjs/iconButton/index.d.ts +2 -2
  31. package/lib/cjs/select/index.d.ts +3 -3
  32. package/lib/cjs/select/index.js +32 -28
  33. package/lib/cjs/select/option.js +2 -2
  34. package/lib/cjs/select/virtualRow.js +2 -2
  35. package/lib/cjs/table/Table.d.ts +1 -1
  36. package/lib/cjs/table/Table.js +8 -2
  37. package/lib/cjs/table/interface.d.ts +1 -0
  38. package/lib/cjs/tabs/interface.d.ts +1 -1
  39. package/lib/cjs/tooltip/index.d.ts +1 -1
  40. package/lib/cjs/tooltip/index.js +12 -4
  41. package/lib/cjs/tree/index.d.ts +2 -0
  42. package/lib/cjs/tree/index.js +15 -8
  43. package/lib/cjs/treeSelect/index.d.ts +2 -0
  44. package/lib/cjs/treeSelect/index.js +64 -27
  45. package/lib/cjs/upload/fileCard.js +31 -22
  46. package/lib/cjs/upload/index.d.ts +6 -0
  47. package/lib/cjs/upload/index.js +15 -8
  48. package/lib/cjs/upload/interface.d.ts +8 -6
  49. package/lib/es/autoComplete/index.d.ts +1 -1
  50. package/lib/es/button/Button.d.ts +4 -4
  51. package/lib/es/button/buttonGroup.d.ts +2 -2
  52. package/lib/es/button/index.d.ts +5 -6
  53. package/lib/es/cascader/index.js +5 -0
  54. package/lib/es/datePicker/datePicker.js +4 -0
  55. package/lib/es/dropdown/index.d.ts +1 -1
  56. package/lib/es/form/baseForm.d.ts +1 -1
  57. package/lib/es/form/baseForm.js +2 -2
  58. package/lib/es/form/field.d.ts +1 -1
  59. package/lib/es/iconButton/index.d.ts +2 -2
  60. package/lib/es/select/index.d.ts +3 -3
  61. package/lib/es/select/index.js +30 -26
  62. package/lib/es/select/option.js +2 -2
  63. package/lib/es/select/virtualRow.js +2 -2
  64. package/lib/es/table/Table.d.ts +1 -1
  65. package/lib/es/table/Table.js +10 -2
  66. package/lib/es/table/interface.d.ts +1 -0
  67. package/lib/es/tabs/interface.d.ts +1 -1
  68. package/lib/es/tooltip/index.d.ts +1 -1
  69. package/lib/es/tooltip/index.js +12 -4
  70. package/lib/es/tree/index.d.ts +2 -0
  71. package/lib/es/tree/index.js +15 -8
  72. package/lib/es/treeSelect/index.d.ts +2 -0
  73. package/lib/es/treeSelect/index.js +64 -27
  74. package/lib/es/upload/fileCard.js +31 -24
  75. package/lib/es/upload/index.d.ts +6 -0
  76. package/lib/es/upload/index.js +14 -8
  77. package/lib/es/upload/interface.d.ts +8 -6
  78. package/package.json +9 -9
  79. package/select/index.tsx +18 -19
  80. package/select/option.tsx +2 -2
  81. package/select/virtualRow.tsx +2 -2
  82. package/table/Table.tsx +7 -2
  83. package/table/_story/Perf/Virtualized/index.jsx +6 -0
  84. package/table/_story/table.stories.js +1 -2
  85. package/table/_story/v2/FixedHeaderMerge/index.jsx +98 -0
  86. package/table/_story/v2/FixedResizable/index.jsx +114 -0
  87. package/table/_story/v2/defaultFilteredValue.tsx +114 -0
  88. package/table/_story/v2/index.js +5 -0
  89. package/table/interface.ts +1 -0
  90. package/tabs/interface.ts +1 -1
  91. package/tooltip/__test__/tooltip.test.js +48 -4
  92. package/tooltip/_story/tooltip.stories.js +718 -559
  93. package/tooltip/index.tsx +6 -6
  94. package/tree/__test__/treeMultiple.test.js +94 -0
  95. package/tree/_story/tree.stories.js +169 -0
  96. package/tree/index.tsx +12 -5
  97. package/treeSelect/__test__/treeMultiple.test.js +94 -0
  98. package/treeSelect/_story/treeSelect.stories.js +242 -0
  99. package/treeSelect/index.tsx +72 -40
  100. package/upload/_story/upload.stories.js +22 -6
  101. package/upload/fileCard.tsx +23 -23
  102. package/upload/index.tsx +15 -6
  103. package/upload/interface.ts +7 -5
package/button/index.tsx CHANGED
@@ -12,7 +12,7 @@ export { ButtonGroupProps } from './buttonGroup';
12
12
  export { SplitButtonGroupProps } from './splitButtonGroup';
13
13
 
14
14
  // eslint-disable-next-line
15
- export interface ButtonProps extends IconButtonProps, BaseButtonProps {} // TODO check
15
+ export interface ButtonProps extends IconButtonProps {} // TODO check
16
16
  class Button extends React.PureComponent<ButtonProps> {
17
17
  static propTypes = {
18
18
  ...BaseButton.propTypes,
@@ -195,6 +195,30 @@ describe('Cascader', () => {
195
195
  // done();
196
196
  });
197
197
 
198
+ it('dynamic treeData in multiple and uncontrolled mode', () => {
199
+ const cascader = render({
200
+ defaultValue: 'Yazhou',
201
+ multiple: true,
202
+ });
203
+ const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);
204
+ expect(opt.length).toEqual(1);
205
+ cascader.setProps({ treeData: treeDataWithDisabled });
206
+ cascader.update();
207
+ expect(opt.length).toEqual(1);
208
+ });
209
+
210
+ it('dynamic treeData in multiple and controlled mode', () => {
211
+ const cascader = render({
212
+ value: 'Yazhou',
213
+ multiple: true,
214
+ });
215
+ const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);
216
+ expect(opt.length).toEqual(1);
217
+ cascader.setProps({ treeData: treeDataWithDisabled });
218
+ cascader.update();
219
+ expect(opt.length).toEqual(1);
220
+ });
221
+
198
222
  it('getPopupContainer', () => {
199
223
  let cascader = render({
200
224
  getPopupContainer: getPopupContainer,
@@ -1348,4 +1348,77 @@ export const LeafOnly = () => {
1348
1348
  />
1349
1349
  </div>
1350
1350
  );
1351
+ }
1352
+
1353
+ export const DynamicTreeData = () => {
1354
+ const [treeDataDemo1,setTreeData1]=useState(treeData2);
1355
+ const [treeDataDemo2,setTreeData2]=useState(treeData2);
1356
+ const [treeDataDemo3,setTreeData3]=useState(treeData2);
1357
+ const [treeDataDemo4,setTreeData4]=useState(treeData2);
1358
+ const [treeDataDemo5,setTreeData5]=useState(treeData2);
1359
+ const [value3,setValue3]=useState();
1360
+ const [value4,setValue4]=useState();
1361
+ return (
1362
+ <div>
1363
+ <div>多选 + 动态更新 tree</div>
1364
+ <Cascader
1365
+ style={{ width: 300 }}
1366
+ treeData={treeDataDemo1}
1367
+ multiple
1368
+ placeholder="请选择所在地区"
1369
+ />
1370
+ <Button onClick={()=>{setTreeData1(treeData3)}}>改变treeData</Button>
1371
+ <br />
1372
+ <br />
1373
+ <div>单选 + 动态更新 tree</div>
1374
+ <Cascader
1375
+ style={{ width: 300 }}
1376
+ treeData={treeDataDemo2}
1377
+ placeholder="请选择所在地区"
1378
+ />
1379
+ <Button onClick={()=>{setTreeData2(treeData3)}}>改变treeData</Button>
1380
+ <br />
1381
+ <br />
1382
+ <div>多选 + 动态更新 tree + 受控</div>
1383
+ <Cascader
1384
+ style={{ width: 300 }}
1385
+ treeData={treeDataDemo3}
1386
+ multiple
1387
+ value={value3}
1388
+ onChange={v=>{
1389
+ console.log(v);
1390
+ setValue3(v);
1391
+ }}
1392
+ placeholder="请选择所在地区"
1393
+ />
1394
+ <Button onClick={()=>{setTreeData3(treeData3)}}>改变treeData</Button>
1395
+ <br />
1396
+ <br />
1397
+ <div>单选 + 动态更新 tree + 受控</div>
1398
+ <Cascader
1399
+ style={{ width: 300 }}
1400
+ treeData={treeDataDemo4}
1401
+ value={value4}
1402
+ onChange={v=>{
1403
+ console.log(v);
1404
+ setValue4(v);
1405
+ }}
1406
+ placeholder="请选择所在地区"
1407
+ />
1408
+ <Button onClick={()=>{setTreeData4(treeData3)}}>改变treeData</Button>
1409
+ <br />
1410
+ <br />
1411
+ <div>多选 + 动态更新 tree + defaultValue 为亚洲</div>
1412
+ <Cascader
1413
+ style={{ width: 300 }}
1414
+ treeData={treeDataDemo5}
1415
+ multiple
1416
+ defaultValue='yazhou'
1417
+ placeholder="请选择所在地区"
1418
+ />
1419
+ <Button onClick={()=>{setTreeData5(treeData3)}}>改变treeData</Button>
1420
+ <br />
1421
+ <br />
1422
+ </div>
1423
+ );
1351
1424
  }
@@ -14,7 +14,7 @@ import CascaderFoundation, {
14
14
  } from '@douyinfe/semi-foundation/cascader/foundation';
15
15
  import { cssClasses, strings } from '@douyinfe/semi-foundation/cascader/constants';
16
16
  import { numbers as popoverNumbers } from '@douyinfe/semi-foundation/popover/constants';
17
- import { isEqual, isString, isEmpty, isFunction, isNumber, noop, flatten } from 'lodash';
17
+ import { isSet, isEqual, isString, isEmpty, isFunction, isNumber, noop, flatten } from 'lodash';
18
18
  import '@douyinfe/semi-foundation/cascader/cascader.scss';
19
19
  import { IconClear, IconChevronDown } from '@douyinfe/semi-icons';
20
20
  import { findKeysForValues, convertDataToEntities, calcMergeType } from '@douyinfe/semi-foundation/cascader/util';
@@ -426,7 +426,10 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
426
426
  });
427
427
  realKeys = formatKeys;
428
428
  }
429
- const calRes = calcCheckedKeys(flatten(realKeys as string[]), keyEntities);
429
+ if (isSet(realKeys)) {
430
+ realKeys = [...realKeys];
431
+ }
432
+ const calRes = calcCheckedKeys(flatten(realKeys), keyEntities);
430
433
  const checkedKeys = new Set(calRes.checkedKeys);
431
434
  const halfCheckedKeys = new Set(calRes.halfCheckedKeys);
432
435
  // disableStrictly
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { DatePicker, Button } from '../../../index';
3
+
4
+ /**
5
+ * fix gitlab #1375
6
+ */
7
+ App.storyName = 'fixed input range focus';
8
+ export default function App() {
9
+ const [visible, setVisible] = React.useState(false);
10
+ return (
11
+ <div>
12
+ {/* <Button onClick={() => { setVisible(false); }}>关闭</Button> */}
13
+ <DatePicker
14
+ type="dateTimeRange"
15
+ bottomSlot={<Button onClick={() => { setVisible(false); }}>关闭</Button>}
16
+ onFocus={() => {
17
+ console.log('focus');
18
+ setVisible(true);
19
+ }}
20
+ open={visible}
21
+ showClear
22
+ />
23
+ </div>
24
+ );
25
+ }
@@ -1,2 +1,3 @@
1
1
  export { default as YearButton } from './YearButton';
2
- export { default as PanelOpen } from './PanelOpen';
2
+ export { default as PanelOpen } from './PanelOpen';
3
+ export { default as FixInputRangeFocus } from './FixInputRangeFocus';
@@ -331,6 +331,9 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
331
331
 
332
332
  if (prevProps.open !== this.props.open) {
333
333
  this.foundation.initPanelOpenStatus();
334
+ if (!this.props.open) {
335
+ this.foundation.clearRangeInputFocus();
336
+ }
334
337
  }
335
338
  }
336
339
 
package/dist/css/semi.css CHANGED
@@ -2612,6 +2612,7 @@ body[theme-mode=dark], body .semi-always-dark {
2612
2612
  }
2613
2613
  .semi-cascader:hover {
2614
2614
  background-color: var(--semi-color-fill-1);
2615
+ border: 1px transparent solid;
2615
2616
  }
2616
2617
  .semi-cascader-small {
2617
2618
  min-height: 24px;
@@ -2687,7 +2688,7 @@ body[theme-mode=dark], body .semi-always-dark {
2687
2688
  color: var(--semi-color-text-2);
2688
2689
  }
2689
2690
  .semi-cascader-selection-tag {
2690
- margin: 1px 2px;
2691
+ margin: 1px 2px 1px 0;
2691
2692
  }
2692
2693
  .semi-cascader-selection-tag:first-child {
2693
2694
  margin-left: 0;
@@ -4739,6 +4740,10 @@ body[theme-mode=dark], body .semi-always-dark {
4739
4740
  padding-top: 6px;
4740
4741
  padding-bottom: 6px;
4741
4742
  }
4743
+ .semi-form-field[x-label-pos=left] .semi-radioGroup-buttonRadio {
4744
+ padding-top: 0;
4745
+ padding-bottom: 0;
4746
+ }
4742
4747
  .semi-form-field[x-label-pos=left] .semi-switch,
4743
4748
  .semi-form-field[x-label-pos=left] .semi-rating {
4744
4749
  vertical-align: middle;
@@ -11447,6 +11452,7 @@ body[theme-mode=dark], body .semi-always-dark {
11447
11452
  cursor: not-allowed;
11448
11453
  color: var(--semi-color-disabled-text);
11449
11454
  background-color: var(--semi-color-disabled-fill);
11455
+ -webkit-text-fill-color: var(--semi-color-disabled-text);
11450
11456
  }
11451
11457
  .semi-input-wrapper-disabled:hover {
11452
11458
  background-color: var(--semi-color-disabled-fill);
@@ -16206,7 +16212,6 @@ body[theme-mode=dark], body .semi-always-dark {
16206
16212
  word-break: break-all;
16207
16213
  word-wrap: break-word;
16208
16214
  position: relative;
16209
- user-select: none;
16210
16215
  }
16211
16216
  .semi-table-thead > .semi-table-row > .semi-table-row-head.semi-table-cell-fixed-left, .semi-table-thead > .semi-table-row > .semi-table-row-head.semi-table-cell-fixed-right {
16212
16217
  z-index: 101;
@@ -19438,11 +19443,10 @@ p.semi-typography-extended,
19438
19443
  }
19439
19444
  .semi-upload[x-prompt-pos=left] .semi-upload-add {
19440
19445
  display: inline-flex;
19441
- order: 2;
19442
19446
  }
19443
19447
  .semi-upload[x-prompt-pos=left] .semi-upload-prompt {
19444
19448
  display: inline-flex;
19445
- order: 1;
19449
+ order: -1;
19446
19450
  }
19447
19451
  .semi-upload[x-prompt-pos=left] .semi-upload-file-list {
19448
19452
  order: 2;
@@ -19622,15 +19626,9 @@ p.semi-typography-extended,
19622
19626
  .semi-upload-picture[x-prompt-pos=bottom] .semi-upload-prompt {
19623
19627
  order: 1;
19624
19628
  }
19625
- .semi-upload-picture[x-prompt-pos=bottom] .semi-upload-add {
19626
- order: 0;
19627
- }
19628
19629
  .semi-upload-picture[x-prompt-pos=right] .semi-upload-prompt {
19629
19630
  order: 1;
19630
19631
  }
19631
- .semi-upload-picture[x-prompt-pos=right] .semi-upload-add {
19632
- order: 0;
19633
- }
19634
19632
  .semi-upload-picture-add {
19635
19633
  background-color: var(--semi-color-fill-0);
19636
19634
  height: 96px;
@@ -19642,7 +19640,6 @@ p.semi-typography-extended,
19642
19640
  border: 2px dashed var(--semi-color-border);
19643
19641
  color: var(--semi-color-tertiary);
19644
19642
  border-radius: var(--semi-border-radius-small);
19645
- order: 2;
19646
19643
  cursor: pointer;
19647
19644
  }
19648
19645
  .semi-upload-picture-add:hover {
@@ -19682,35 +19679,32 @@ p.semi-typography-extended,
19682
19679
  border-radius: var(--semi-border-radius-small);
19683
19680
  }
19684
19681
  .semi-upload-picture-file-card-close {
19685
- width: 16px;
19686
- height: 16px;
19687
- background-color: var(--semi-color-overlay-bg);
19682
+ visibility: hidden;
19683
+ display: inline-flex;
19688
19684
  position: absolute;
19689
19685
  top: 8px;
19690
19686
  right: 8px;
19691
- display: flex;
19692
- justify-content: center;
19693
- align-items: center;
19694
- display: none;
19695
19687
  border-radius: var(--semi-border-radius-circle);
19696
- color: white;
19697
19688
  cursor: pointer;
19698
19689
  transition: all 0s;
19699
19690
  }
19700
- .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-close {
19701
- display: flex;
19702
- }
19703
- .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-replace {
19704
- visibility: visible;
19691
+ .semi-upload-picture-file-card-icon-close {
19692
+ font-size: 16px;
19693
+ color: var(--semi-color-white);
19705
19694
  }
19706
- .semi-upload-picture-file-card .semi-progress-circle {
19695
+ .semi-upload-picture-file-card::before {
19696
+ visibility: hidden;
19697
+ background-color: var(--semi-color-overlay-bg);
19698
+ content: "";
19707
19699
  position: absolute;
19708
- top: 50%;
19709
- left: 50%;
19710
- transform: translate(-50%, -50%);
19700
+ left: 0;
19701
+ right: 0;
19702
+ top: 0;
19703
+ bottom: 0;
19711
19704
  }
19712
19705
  .semi-upload-picture-file-card-retry {
19713
- background-color: #fff;
19706
+ visibility: hidden;
19707
+ background-color: var(--semi-color-white);
19714
19708
  width: 24px;
19715
19709
  height: 24px;
19716
19710
  position: absolute;
@@ -19738,6 +19732,15 @@ p.semi-typography-extended,
19738
19732
  color: var(--semi-color-white);
19739
19733
  transform: translate3D(-50%, -50%, 0);
19740
19734
  }
19735
+ .semi-upload-picture-file-card-preview {
19736
+ visibility: hidden;
19737
+ display: inline-flex;
19738
+ position: absolute;
19739
+ cursor: pointer;
19740
+ top: 50%;
19741
+ left: 50%;
19742
+ transform: translate3D(-50%, -50%, 0);
19743
+ }
19741
19744
  .semi-upload-picture-file-card-pic-info {
19742
19745
  display: inline-flex;
19743
19746
  box-sizing: border-box;
@@ -19769,6 +19772,30 @@ p.semi-typography-extended,
19769
19772
  .semi-upload-picture-file-card-error {
19770
19773
  outline: 1px solid var(--semi-color-danger);
19771
19774
  }
19775
+ .semi-upload-picture-file-card:hover::before {
19776
+ visibility: visible;
19777
+ }
19778
+ .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-close {
19779
+ visibility: visible;
19780
+ }
19781
+ .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-replace {
19782
+ visibility: visible;
19783
+ }
19784
+ .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-retry {
19785
+ visibility: visible;
19786
+ }
19787
+ .semi-upload-picture-file-card:hover .semi-upload-picture-file-card-preview {
19788
+ visibility: visible;
19789
+ }
19790
+ .semi-upload-picture-file-card-uploading::before {
19791
+ visibility: visible;
19792
+ }
19793
+ .semi-upload-picture-file-card .semi-progress-circle {
19794
+ position: absolute;
19795
+ top: 50%;
19796
+ left: 50%;
19797
+ transform: translate(-50%, -50%);
19798
+ }
19772
19799
  .semi-upload-drag-area {
19773
19800
  border-radius: var(--semi-border-radius-small);
19774
19801
  border: 2px dashed var(--semi-color-border);