@douyinfe/semi-ui 2.50.0-alpha.1 → 2.50.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 (43) hide show
  1. package/dist/css/semi.css +3 -0
  2. package/dist/css/semi.min.css +1 -1
  3. package/dist/umd/semi-ui.js +523 -416
  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/datePicker/yearAndMonth.js +1 -5
  8. package/lib/cjs/form/baseForm.d.ts +1 -1
  9. package/lib/cjs/form/field.d.ts +1 -1
  10. package/lib/cjs/image/interface.d.ts +3 -3
  11. package/lib/cjs/image/previewFooter.js +5 -8
  12. package/lib/cjs/image/previewHeader.d.ts +2 -2
  13. package/lib/cjs/image/previewHeader.js +9 -8
  14. package/lib/cjs/image/previewImage.d.ts +1 -12
  15. package/lib/cjs/image/previewImage.js +23 -83
  16. package/lib/cjs/image/previewInner.d.ts +12 -3
  17. package/lib/cjs/image/previewInner.js +65 -44
  18. package/lib/cjs/index.d.ts +2 -0
  19. package/lib/cjs/index.js +14 -0
  20. package/lib/cjs/notification/index.js +6 -5
  21. package/lib/cjs/select/index.d.ts +1 -1
  22. package/lib/cjs/timePicker/TimePicker.d.ts +1 -1
  23. package/lib/cjs/treeSelect/index.d.ts +2 -2
  24. package/lib/cjs/treeSelect/index.js +117 -29
  25. package/lib/es/datePicker/yearAndMonth.js +1 -5
  26. package/lib/es/form/baseForm.d.ts +1 -1
  27. package/lib/es/form/field.d.ts +1 -1
  28. package/lib/es/image/interface.d.ts +3 -3
  29. package/lib/es/image/previewFooter.js +5 -8
  30. package/lib/es/image/previewHeader.d.ts +2 -2
  31. package/lib/es/image/previewHeader.js +4 -3
  32. package/lib/es/image/previewImage.d.ts +1 -12
  33. package/lib/es/image/previewImage.js +23 -83
  34. package/lib/es/image/previewInner.d.ts +12 -3
  35. package/lib/es/image/previewInner.js +65 -44
  36. package/lib/es/index.d.ts +2 -0
  37. package/lib/es/index.js +2 -0
  38. package/lib/es/notification/index.js +6 -5
  39. package/lib/es/select/index.d.ts +1 -1
  40. package/lib/es/timePicker/TimePicker.d.ts +1 -1
  41. package/lib/es/treeSelect/index.d.ts +2 -2
  42. package/lib/es/treeSelect/index.js +118 -30
  43. package/package.json +8 -8
@@ -20,7 +20,7 @@ import ReactDOM from 'react-dom';
20
20
  import cls from 'classnames';
21
21
  import PropTypes from 'prop-types';
22
22
  import TreeSelectFoundation from '@douyinfe/semi-foundation/lib/es/treeSelect/foundation';
23
- import { convertDataToEntities, flattenTreeData, calcExpandedKeysForValues, calcMotionKeys, findKeysForValues, calcCheckedKeys, calcExpandedKeys, getValueOrKey, normalizeKeyList, calcDisabledKeys, normalizeValue, updateKeys } from '@douyinfe/semi-foundation/lib/es/tree/treeUtil';
23
+ import { convertDataToEntities, flattenTreeData, calcExpandedKeysForValues, calcMotionKeys, findKeysForValues, calcCheckedKeys, calcExpandedKeys, getValueOrKey, normalizeKeyList, calcDisabledKeys, normalizeValue, updateKeys, filterTreeData } from '@douyinfe/semi-foundation/lib/es/tree/treeUtil';
24
24
  import { cssClasses, strings } from '@douyinfe/semi-foundation/lib/es/treeSelect/constants';
25
25
  import { numbers as popoverNumbers } from '@douyinfe/semi-foundation/lib/es/popover/constants';
26
26
  import { FixedSizeList as VirtualList } from 'react-window';
@@ -680,13 +680,27 @@ class TreeSelect extends BaseComponent {
680
680
  searchAutoFocus,
681
681
  searchPosition
682
682
  } = this.props;
683
- if (isVisible === false && Boolean(filterTreeNode)) {
684
- this.foundation.clearInput();
683
+ // inputValue 清空,如果有选中值的话,选中项能够快速回显
684
+ // Clear the inputValue. If there is a selected value, the selected item can be quickly echoed.
685
+ if (isVisible === false && filterTreeNode) {
686
+ this.foundation.clearInputValue();
685
687
  }
686
688
  if (filterTreeNode && searchPosition === strings.SEARCH_POSITION_DROPDOWN && isVisible && searchAutoFocus) {
687
689
  this.foundation.focusInput(true);
688
690
  }
689
691
  };
692
+ this.afterClose = () => {
693
+ // flattenNode 的变化将导致弹出层面板中的选项数目变化
694
+ // 在弹层完全收起之后,再通过 clearInput 重新计算 state 中的 expandedKey, flattenNode
695
+ // 防止在弹出层未收起时弹层面板中选项数目变化导致视觉上出现弹层闪动问题
696
+ // Changes to flattenNode will cause the number of options in the popup panel to change
697
+ // After the pop-up layer is completely closed, recalculate the expandedKey and flattenNode in the state through clearInput.
698
+ // Prevent the pop-up layer from flickering visually due to changes in the number of options in the pop-up panel when the pop-up layer is not collapsed.
699
+ const {
700
+ filterTreeNode
701
+ } = this.props;
702
+ filterTreeNode && this.foundation.clearInput();
703
+ };
690
704
  this.renderTreeNode = (treeNode, ind, style) => {
691
705
  const {
692
706
  data,
@@ -723,6 +737,7 @@ class TreeSelect extends BaseComponent {
723
737
  this.renderNodeList = () => {
724
738
  const {
725
739
  flattenNodes,
740
+ cachedFlattenNodes,
726
741
  motionKeys,
727
742
  motionType,
728
743
  filteredKeys
@@ -738,7 +753,7 @@ class TreeSelect extends BaseComponent {
738
753
  if (!virtualize || _isEmpty(virtualize)) {
739
754
  return /*#__PURE__*/React.createElement(NodeList, {
740
755
  flattenNodes: flattenNodes,
741
- flattenList: this._flattenNodes,
756
+ flattenList: cachedFlattenNodes,
742
757
  motionKeys: motionExpand ? motionKeys : new Set([]),
743
758
  motionType: motionType,
744
759
  // When motionKeys is empty, but filteredKeys is not empty (that is, the search hits), this situation should be distinguished from ordinary motionKeys
@@ -857,6 +872,7 @@ class TreeSelect extends BaseComponent {
857
872
  keyEntities: {},
858
873
  treeData: [],
859
874
  flattenNodes: [],
875
+ cachedFlattenNodes: undefined,
860
876
  selectedKeys: [],
861
877
  checkedKeys: new Set(),
862
878
  halfCheckedKeys: new Set(),
@@ -886,6 +902,7 @@ class TreeSelect extends BaseComponent {
886
902
  };
887
903
  }
888
904
  static getDerivedStateFromProps(props, prevState) {
905
+ var _a;
889
906
  const {
890
907
  prevProps,
891
908
  rePosKey
@@ -903,6 +920,8 @@ class TreeSelect extends BaseComponent {
903
920
  };
904
921
  const needUpdateTreeData = needUpdate('treeData');
905
922
  const needUpdateExpandedKeys = needUpdate('expandedKeys');
923
+ const isExpandControlled = ('expandedKeys' in props);
924
+ const isSearching = Boolean(props.filterTreeNode && prevState.inputValue && prevState.inputValue.length);
906
925
  // TreeNode
907
926
  if (needUpdateTreeData) {
908
927
  treeData = props.treeData;
@@ -921,31 +940,97 @@ class TreeSelect extends BaseComponent {
921
940
  }
922
941
  }
923
942
  const expandAllWhenDataChange = needUpdateTreeData && props.expandAll;
924
- // expandedKeys
925
- if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
926
- newState.expandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
927
- // only show animation when treeData does not change
928
- if (prevProps && props.motion && !treeData) {
929
- const {
930
- motionKeys,
931
- motionType
932
- } = calcMotionKeys(prevState.expandedKeys, newState.expandedKeys, keyEntities);
933
- newState.motionKeys = new Set(motionKeys);
934
- newState.motionType = motionType;
943
+ if (!isSearching) {
944
+ // expandedKeys
945
+ if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
946
+ newState.expandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
947
+ // only show animation when treeData does not change
948
+ if (prevProps && props.motion && !treeData) {
949
+ const {
950
+ motionKeys,
951
+ motionType
952
+ } = calcMotionKeys(prevState.expandedKeys, newState.expandedKeys, keyEntities);
953
+ newState.motionKeys = new Set(motionKeys);
954
+ newState.motionType = motionType;
955
+ if (motionType === 'hide') {
956
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
957
+ newState.cachedFlattenNodes = cloneDeep(prevState.flattenNodes);
958
+ }
959
+ }
960
+ } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
961
+ newState.expandedKeys = new Set(Object.keys(keyEntities));
962
+ } else if (!prevProps && props.defaultExpandedKeys) {
963
+ newState.expandedKeys = calcExpandedKeys(props.defaultExpandedKeys, keyEntities);
964
+ } else if (!prevProps && props.defaultValue) {
965
+ newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
966
+ } else if (!prevProps && props.value) {
967
+ newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
968
+ } else if (!isExpandControlled && needUpdateTreeData && props.value) {
969
+ // 当 treeData 已经设置具体的值,并且设置了 props.loadData ,则认为 treeData 的更新是因为 loadData 导致的
970
+ // 如果是因为 loadData 导致 treeData改变, 此时在这里重新计算 key 会导致为未选中的展开项目被收起
971
+ // 所以此时不需要重新计算 expandedKeys,因为在点击展开按钮时候已经把被展开的项添加到 expandedKeys 中
972
+ // When treeData has a specific value and props.loadData is set, it is considered that the update of treeData is caused by loadData
973
+ // If the treeData is changed because of loadData, recalculating the key here will cause the unselected expanded items to be collapsed
974
+ // So there is no need to recalculate expandedKeys at this time, because the expanded item has been added to expandedKeys when the expand button is clicked
975
+ if (!(prevState.treeData && ((_a = prevState.treeData) === null || _a === void 0 ? void 0 : _a.length) > 0 && props.loadData)) {
976
+ newState.expandedKeys = calcExpandedKeysForValues(props.value, keyEntities, props.multiple, valueEntities);
977
+ }
978
+ }
979
+ if (!newState.expandedKeys) {
980
+ delete newState.expandedKeys;
981
+ }
982
+ if (treeData || newState.expandedKeys) {
983
+ const flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
984
+ newState.flattenNodes = flattenNodes;
985
+ }
986
+ } else {
987
+ let filteredState;
988
+ // treeData changed while searching
989
+ if (treeData) {
990
+ // Get filter data
991
+ filteredState = filterTreeData({
992
+ treeData,
993
+ inputValue: prevState.inputValue,
994
+ filterTreeNode: props.filterTreeNode,
995
+ filterProps: props.treeNodeFilterProp,
996
+ showFilteredOnly: props.showFilteredOnly,
997
+ keyEntities: newState.keyEntities,
998
+ prevExpandedKeys: [...prevState.filteredExpandedKeys],
999
+ keyMaps: keyMaps
1000
+ });
1001
+ newState.flattenNodes = filteredState.flattenNodes;
1002
+ newState.motionKeys = new Set([]);
1003
+ newState.filteredKeys = filteredState.filteredKeys;
1004
+ newState.filteredShownKeys = filteredState.filteredShownKeys;
1005
+ newState.filteredExpandedKeys = filteredState.filteredExpandedKeys;
1006
+ }
1007
+ // expandedKeys changed while searching
1008
+ if (props.expandedKeys) {
1009
+ newState.filteredExpandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
1010
+ if (prevProps && props.motion) {
1011
+ const prevKeys = prevState ? prevState.filteredExpandedKeys : new Set([]);
1012
+ // only show animation when treeData does not change
1013
+ if (!treeData) {
1014
+ const motionResult = calcMotionKeys(prevKeys, newState.filteredExpandedKeys, keyEntities);
1015
+ let {
1016
+ motionKeys
1017
+ } = motionResult;
1018
+ const {
1019
+ motionType
1020
+ } = motionResult;
1021
+ if (props.showFilteredOnly) {
1022
+ motionKeys = motionKeys.filter(key => prevState.filteredShownKeys.has(key));
1023
+ }
1024
+ if (motionType === 'hide') {
1025
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
1026
+ newState.cachedFlattenNodes = cloneDeep(prevState.flattenNodes);
1027
+ }
1028
+ newState.motionKeys = new Set(motionKeys);
1029
+ newState.motionType = motionType;
1030
+ }
1031
+ }
1032
+ newState.flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.filteredExpandedKeys || prevState.filteredExpandedKeys, keyMaps, props.showFilteredOnly && prevState.filteredShownKeys);
935
1033
  }
936
- } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
937
- newState.expandedKeys = new Set(Object.keys(keyEntities));
938
- } else if (!prevProps && props.defaultExpandedKeys) {
939
- newState.expandedKeys = calcExpandedKeys(props.defaultExpandedKeys, keyEntities);
940
- } else if (!prevProps && props.defaultValue) {
941
- newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
942
- } else if (!prevProps && props.value) {
943
- newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
944
- }
945
- // flattenNodes
946
- if (treeData || needUpdateExpandedKeys) {
947
- const flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
948
- newState.flattenNodes = flattenNodes;
949
1034
  }
950
1035
  // selectedKeys: single mode controlled
951
1036
  const isMultiple = props.multiple;
@@ -1052,7 +1137,9 @@ class TreeSelect extends BaseComponent {
1052
1137
  this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys);
1053
1138
  },
1054
1139
  cacheFlattenNodes: bool => {
1055
- this._flattenNodes = bool ? cloneDeep(this.state.flattenNodes) : null;
1140
+ this.setState({
1141
+ cachedFlattenNodes: bool ? cloneDeep(this.state.flattenNodes) : undefined
1142
+ });
1056
1143
  },
1057
1144
  notifyLoad: (newLoadedKeys, data) => {
1058
1145
  const {
@@ -1197,7 +1284,8 @@ class TreeSelect extends BaseComponent {
1197
1284
  autoAdjustOverflow: autoAdjustOverflow,
1198
1285
  mouseLeaveDelay: mouseLeaveDelay,
1199
1286
  mouseEnterDelay: mouseEnterDelay,
1200
- onVisibleChange: this.handlePopoverClose
1287
+ onVisibleChange: this.handlePopoverClose,
1288
+ afterClose: this.afterClose
1201
1289
  }, selection);
1202
1290
  }
1203
1291
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-ui",
3
- "version": "2.50.0-alpha.1",
3
+ "version": "2.50.0",
4
4
  "description": "A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/es/index.js",
@@ -20,12 +20,12 @@
20
20
  "@dnd-kit/core": "^6.0.8",
21
21
  "@dnd-kit/sortable": "^7.0.2",
22
22
  "@dnd-kit/utilities": "^3.2.1",
23
- "@douyinfe/semi-animation": "2.50.0-alpha.1",
24
- "@douyinfe/semi-animation-react": "2.50.0-alpha.1",
25
- "@douyinfe/semi-foundation": "2.50.0-alpha.1",
26
- "@douyinfe/semi-icons": "2.50.0-alpha.1",
27
- "@douyinfe/semi-illustrations": "2.50.0-alpha.1",
28
- "@douyinfe/semi-theme-default": "2.50.0-alpha.1",
23
+ "@douyinfe/semi-animation": "2.50.0",
24
+ "@douyinfe/semi-animation-react": "2.50.0",
25
+ "@douyinfe/semi-foundation": "2.50.0",
26
+ "@douyinfe/semi-icons": "2.50.0",
27
+ "@douyinfe/semi-illustrations": "2.50.0",
28
+ "@douyinfe/semi-theme-default": "2.50.0",
29
29
  "async-validator": "^3.5.0",
30
30
  "classnames": "^2.2.6",
31
31
  "copy-text-to-clipboard": "^2.1.1",
@@ -75,7 +75,7 @@
75
75
  ],
76
76
  "author": "",
77
77
  "license": "MIT",
78
- "gitHead": "72a7047b76f30f4a2aa8d82a7a75c0841c2c0d08",
78
+ "gitHead": "4f5ca71f4a992aaadf6c637d8a798ba18c0af740",
79
79
  "devDependencies": {
80
80
  "@babel/plugin-proposal-decorators": "^7.15.8",
81
81
  "@babel/plugin-transform-runtime": "^7.15.8",