@douyinfe/semi-ui 2.47.1 → 2.48.0-alpha.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.
@@ -89549,6 +89549,12 @@ class TreeSelectFoundation extends foundation {
89549
89549
  this.close(e);
89550
89550
  });
89551
89551
  };
89552
+ this.clearInputValue = () => {
89553
+ const {
89554
+ inputValue
89555
+ } = this.getStates();
89556
+ inputValue && this._adapter.updateInputValue('');
89557
+ };
89552
89558
  }
89553
89559
  init() {
89554
89560
  const {
@@ -89700,7 +89706,7 @@ class TreeSelectFoundation extends foundation {
89700
89706
  const isSearching = Boolean(inputValue);
89701
89707
  const treeNodeProps = {
89702
89708
  eventKey: key,
89703
- expanded: isSearching && !this._isExpandControlled() ? filteredExpandedKeys.has(key) : expandedKeys.has(key),
89709
+ expanded: isSearching ? filteredExpandedKeys.has(key) : expandedKeys.has(key),
89704
89710
  selected: selectedKeys.includes(key),
89705
89711
  checked: realChecked,
89706
89712
  halfChecked: realHalfChecked,
@@ -89973,8 +89979,8 @@ class TreeSelectFoundation extends foundation {
89973
89979
  expandedOptsKeys.forEach(item => newExpandedKeys.add(item));
89974
89980
  const newFlattenNodes = flattenTreeData(treeData, newExpandedKeys, keyMaps);
89975
89981
  this._adapter.updateState({
89976
- expandedKeys: isExpandControlled ? expandedKeys : newExpandedKeys,
89977
- flattenNodes: isExpandControlled ? flattenNodes : newFlattenNodes,
89982
+ expandedKeys: newExpandedKeys,
89983
+ flattenNodes: newFlattenNodes,
89978
89984
  inputValue: '',
89979
89985
  motionKeys: new Set([]),
89980
89986
  filteredKeys: new Set([]),
@@ -90023,8 +90029,8 @@ class TreeSelectFoundation extends foundation {
90023
90029
  const newFilteredExpandedKeys = new Set(expandedOptsKeys);
90024
90030
  this._adapter.notifySearch(sugInput, Array.from(newFilteredExpandedKeys));
90025
90031
  this._adapter.updateState({
90026
- expandedKeys: this._isExpandControlled() ? expandedKeys : newExpandedKeys,
90027
- flattenNodes: this._isExpandControlled() ? flattenNodes : newFlattenNodes,
90032
+ expandedKeys: newExpandedKeys,
90033
+ flattenNodes: newFlattenNodes,
90028
90034
  motionKeys: new Set([]),
90029
90035
  filteredKeys: new Set(filteredOptsKeys),
90030
90036
  filteredExpandedKeys: newFilteredExpandedKeys,
@@ -90232,7 +90238,7 @@ class TreeSelectFoundation extends foundation {
90232
90238
  return;
90233
90239
  }
90234
90240
  const isExpandControlled = this._isExpandControlled();
90235
- if (isSearching && !isExpandControlled) {
90241
+ if (isSearching) {
90236
90242
  this.handleNodeExpandInSearch(e, treeNode);
90237
90243
  return;
90238
90244
  }
@@ -91002,13 +91008,27 @@ class TreeSelect extends BaseComponent {
91002
91008
  searchAutoFocus,
91003
91009
  searchPosition
91004
91010
  } = this.props;
91005
- if (isVisible === false && Boolean(filterTreeNode)) {
91006
- this.foundation.clearInput();
91011
+ // inputValue 清空,如果有选中值的话,选中项能够快速回显
91012
+ // Clear the inputValue. If there is a selected value, the selected item can be quickly echoed.
91013
+ if (isVisible === false && filterTreeNode) {
91014
+ this.foundation.clearInputValue();
91007
91015
  }
91008
91016
  if (filterTreeNode && searchPosition === treeSelect_constants_strings.SEARCH_POSITION_DROPDOWN && isVisible && searchAutoFocus) {
91009
91017
  this.foundation.focusInput(true);
91010
91018
  }
91011
91019
  };
91020
+ this.afterClose = () => {
91021
+ // flattenNode 的变化将导致弹出层面板中的选项数目变化
91022
+ // 在弹层完全收起之后,再通过 clearInput 重新计算 state 中的 expandedKey, flattenNode
91023
+ // 防止在弹出层未收起时弹层面板中选项数目变化导致视觉上出现弹层闪动问题
91024
+ // Changes to flattenNode will cause the number of options in the popup panel to change
91025
+ // After the pop-up layer is completely closed, recalculate the expandedKey and flattenNode in the state through clearInput.
91026
+ // 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.
91027
+ const {
91028
+ filterTreeNode
91029
+ } = this.props;
91030
+ filterTreeNode && this.foundation.clearInput();
91031
+ };
91012
91032
  this.renderTreeNode = (treeNode, ind, style) => {
91013
91033
  const {
91014
91034
  data,
@@ -91041,6 +91061,7 @@ class TreeSelect extends BaseComponent {
91041
91061
  this.renderNodeList = () => {
91042
91062
  const {
91043
91063
  flattenNodes,
91064
+ cachedFlattenNodes,
91044
91065
  motionKeys,
91045
91066
  motionType,
91046
91067
  filteredKeys
@@ -91056,7 +91077,7 @@ class TreeSelect extends BaseComponent {
91056
91077
  if (!virtualize || isEmpty_default()(virtualize)) {
91057
91078
  return /*#__PURE__*/external_root_React_commonjs2_react_commonjs_react_amd_react_default().createElement(NodeList, {
91058
91079
  flattenNodes: flattenNodes,
91059
- flattenList: this._flattenNodes,
91080
+ flattenList: cachedFlattenNodes,
91060
91081
  motionKeys: motionExpand ? motionKeys : new Set([]),
91061
91082
  motionType: motionType,
91062
91083
  // When motionKeys is empty, but filteredKeys is not empty (that is, the search hits), this situation should be distinguished from ordinary motionKeys
@@ -91175,6 +91196,7 @@ class TreeSelect extends BaseComponent {
91175
91196
  keyEntities: {},
91176
91197
  treeData: [],
91177
91198
  flattenNodes: [],
91199
+ cachedFlattenNodes: undefined,
91178
91200
  selectedKeys: [],
91179
91201
  checkedKeys: new Set(),
91180
91202
  halfCheckedKeys: new Set(),
@@ -91204,6 +91226,7 @@ class TreeSelect extends BaseComponent {
91204
91226
  };
91205
91227
  }
91206
91228
  static getDerivedStateFromProps(props, prevState) {
91229
+ var _a;
91207
91230
  const {
91208
91231
  prevProps,
91209
91232
  rePosKey
@@ -91221,6 +91244,8 @@ class TreeSelect extends BaseComponent {
91221
91244
  };
91222
91245
  const needUpdateTreeData = needUpdate('treeData');
91223
91246
  const needUpdateExpandedKeys = needUpdate('expandedKeys');
91247
+ const isExpandControlled = ('expandedKeys' in props);
91248
+ const isSearching = Boolean(props.filterTreeNode && prevState.inputValue && prevState.inputValue.length);
91224
91249
  // TreeNode
91225
91250
  if (needUpdateTreeData) {
91226
91251
  treeData = props.treeData;
@@ -91239,31 +91264,97 @@ class TreeSelect extends BaseComponent {
91239
91264
  }
91240
91265
  }
91241
91266
  const expandAllWhenDataChange = needUpdateTreeData && props.expandAll;
91242
- // expandedKeys
91243
- if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
91244
- newState.expandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
91245
- // only show animation when treeData does not change
91246
- if (prevProps && props.motion && !treeData) {
91247
- const {
91248
- motionKeys,
91249
- motionType
91250
- } = calcMotionKeys(prevState.expandedKeys, newState.expandedKeys, keyEntities);
91251
- newState.motionKeys = new Set(motionKeys);
91252
- newState.motionType = motionType;
91253
- }
91254
- } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
91255
- newState.expandedKeys = new Set(Object.keys(keyEntities));
91256
- } else if (!prevProps && props.defaultExpandedKeys) {
91257
- newState.expandedKeys = calcExpandedKeys(props.defaultExpandedKeys, keyEntities);
91258
- } else if (!prevProps && props.defaultValue) {
91259
- newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
91260
- } else if (!prevProps && props.value) {
91261
- newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
91262
- }
91263
- // flattenNodes
91264
- if (treeData || needUpdateExpandedKeys) {
91265
- const flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
91266
- newState.flattenNodes = flattenNodes;
91267
+ if (!isSearching) {
91268
+ // expandedKeys
91269
+ if (needUpdateExpandedKeys || prevProps && needUpdate('autoExpandParent')) {
91270
+ newState.expandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
91271
+ // only show animation when treeData does not change
91272
+ if (prevProps && props.motion && !treeData) {
91273
+ const {
91274
+ motionKeys,
91275
+ motionType
91276
+ } = calcMotionKeys(prevState.expandedKeys, newState.expandedKeys, keyEntities);
91277
+ newState.motionKeys = new Set(motionKeys);
91278
+ newState.motionType = motionType;
91279
+ if (motionType === 'hide') {
91280
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
91281
+ newState.cachedFlattenNodes = treeUtil_cloneDeep(prevState.flattenNodes);
91282
+ }
91283
+ }
91284
+ } else if (!prevProps && (props.defaultExpandAll || props.expandAll) || expandAllWhenDataChange) {
91285
+ newState.expandedKeys = new Set(Object.keys(keyEntities));
91286
+ } else if (!prevProps && props.defaultExpandedKeys) {
91287
+ newState.expandedKeys = calcExpandedKeys(props.defaultExpandedKeys, keyEntities);
91288
+ } else if (!prevProps && props.defaultValue) {
91289
+ newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.defaultValue, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
91290
+ } else if (!prevProps && props.value) {
91291
+ newState.expandedKeys = calcExpandedKeysForValues(normalizeValue(props.value, withObject, keyMaps), keyEntities, props.multiple, valueEntities);
91292
+ } else if (!isExpandControlled && needUpdateTreeData && props.value) {
91293
+ // 当 treeData 已经设置具体的值,并且设置了 props.loadData ,则认为 treeData 的更新是因为 loadData 导致的
91294
+ // 如果是因为 loadData 导致 treeData改变, 此时在这里重新计算 key 会导致为未选中的展开项目被收起
91295
+ // 所以此时不需要重新计算 expandedKeys,因为在点击展开按钮时候已经把被展开的项添加到 expandedKeys 中
91296
+ // When treeData has a specific value and props.loadData is set, it is considered that the update of treeData is caused by loadData
91297
+ // If the treeData is changed because of loadData, recalculating the key here will cause the unselected expanded items to be collapsed
91298
+ // 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
91299
+ if (!(prevState.treeData && ((_a = prevState.treeData) === null || _a === void 0 ? void 0 : _a.length) > 0 && props.loadData)) {
91300
+ newState.expandedKeys = calcExpandedKeysForValues(props.value, keyEntities, props.multiple, valueEntities);
91301
+ }
91302
+ }
91303
+ if (!newState.expandedKeys) {
91304
+ delete newState.expandedKeys;
91305
+ }
91306
+ if (treeData || newState.expandedKeys) {
91307
+ const flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, keyMaps);
91308
+ newState.flattenNodes = flattenNodes;
91309
+ }
91310
+ } else {
91311
+ let filteredState;
91312
+ // treeData changed while searching
91313
+ if (treeData) {
91314
+ // Get filter data
91315
+ filteredState = filterTreeData({
91316
+ treeData,
91317
+ inputValue: prevState.inputValue,
91318
+ filterTreeNode: props.filterTreeNode,
91319
+ filterProps: props.treeNodeFilterProp,
91320
+ showFilteredOnly: props.showFilteredOnly,
91321
+ keyEntities: newState.keyEntities,
91322
+ prevExpandedKeys: [...prevState.filteredExpandedKeys],
91323
+ keyMaps: keyMaps
91324
+ });
91325
+ newState.flattenNodes = filteredState.flattenNodes;
91326
+ newState.motionKeys = new Set([]);
91327
+ newState.filteredKeys = filteredState.filteredKeys;
91328
+ newState.filteredShownKeys = filteredState.filteredShownKeys;
91329
+ newState.filteredExpandedKeys = filteredState.filteredExpandedKeys;
91330
+ }
91331
+ // expandedKeys changed while searching
91332
+ if (props.expandedKeys) {
91333
+ newState.filteredExpandedKeys = calcExpandedKeys(props.expandedKeys, keyEntities, props.autoExpandParent || !prevProps);
91334
+ if (prevProps && props.motion) {
91335
+ const prevKeys = prevState ? prevState.filteredExpandedKeys : new Set([]);
91336
+ // only show animation when treeData does not change
91337
+ if (!treeData) {
91338
+ const motionResult = calcMotionKeys(prevKeys, newState.filteredExpandedKeys, keyEntities);
91339
+ let {
91340
+ motionKeys
91341
+ } = motionResult;
91342
+ const {
91343
+ motionType
91344
+ } = motionResult;
91345
+ if (props.showFilteredOnly) {
91346
+ motionKeys = motionKeys.filter(key => prevState.filteredShownKeys.has(key));
91347
+ }
91348
+ if (motionType === 'hide') {
91349
+ // cache flatten nodes: expandedKeys changed may not be triggered by interaction
91350
+ newState.cachedFlattenNodes = treeUtil_cloneDeep(prevState.flattenNodes);
91351
+ }
91352
+ newState.motionKeys = new Set(motionKeys);
91353
+ newState.motionType = motionType;
91354
+ }
91355
+ }
91356
+ newState.flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.filteredExpandedKeys || prevState.filteredExpandedKeys, keyMaps, props.showFilteredOnly && prevState.filteredShownKeys);
91357
+ }
91267
91358
  }
91268
91359
  // selectedKeys: single mode controlled
91269
91360
  const isMultiple = props.multiple;
@@ -91370,7 +91461,9 @@ class TreeSelect extends BaseComponent {
91370
91461
  this.props.onSearch && this.props.onSearch(input, filteredExpandedKeys);
91371
91462
  },
91372
91463
  cacheFlattenNodes: bool => {
91373
- this._flattenNodes = bool ? treeUtil_cloneDeep(this.state.flattenNodes) : null;
91464
+ this.setState({
91465
+ cachedFlattenNodes: bool ? treeUtil_cloneDeep(this.state.flattenNodes) : undefined
91466
+ });
91374
91467
  },
91375
91468
  notifyLoad: (newLoadedKeys, data) => {
91376
91469
  const {
@@ -91515,7 +91608,8 @@ class TreeSelect extends BaseComponent {
91515
91608
  autoAdjustOverflow: autoAdjustOverflow,
91516
91609
  mouseLeaveDelay: mouseLeaveDelay,
91517
91610
  mouseEnterDelay: mouseEnterDelay,
91518
- onVisibleChange: this.handlePopoverClose
91611
+ onVisibleChange: this.handlePopoverClose,
91612
+ afterClose: this.afterClose
91519
91613
  }, selection);
91520
91614
  }
91521
91615
  }