Skip to content

Commit 856be00

Browse files
committed
feat: add disabledStrategy
1 parent a5625a1 commit 856be00

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed

src/OptionList.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import useMemo from 'rc-util/lib/hooks/useMemo';
88
import * as React from 'react';
99
import LegacyContext from './LegacyContext';
1010
import TreeSelectContext from './TreeSelectContext';
11-
import type { Key, SafeKey } from './interface';
11+
import type { DataNode, Key, SafeKey } from './interface';
1212
import { getAllKeys, isCheckDisabled } from './utils/valueUtil';
1313

1414
const HIDDEN_STYLE = {
@@ -156,6 +156,21 @@ const OptionList: React.ForwardRefRenderFunction<ReviseRefOptionListProps> = (_,
156156
// eslint-disable-next-line react-hooks/exhaustive-deps
157157
}, [searchValue]);
158158

159+
const disabledStrategy = (node: DataNode) => {
160+
if (node.disabled) {
161+
return true;
162+
}
163+
164+
if (isOverMaxCount) {
165+
const selectedValues = displayValues?.map(v => v.value) || [];
166+
if (!selectedValues.includes(node[fieldNames.value])) {
167+
return true;
168+
}
169+
}
170+
171+
return undefined;
172+
};
173+
159174
// ========================== Get First Selectable Node ==========================
160175
const getFirstMatchingNode = (nodes: EventDataNode<any>[]): EventDataNode<any> | null => {
161176
for (const node of nodes) {
@@ -385,6 +400,7 @@ const OptionList: React.ForwardRefRenderFunction<ReviseRefOptionListProps> = (_,
385400
filterTreeNode={filterTreeNode}
386401
expandAction={treeExpandAction}
387402
onScroll={onPopupScroll}
403+
disabledStrategy={disabledStrategy}
388404
/>
389405
</div>
390406
);

src/TreeSelect.tsx

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -610,30 +610,14 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
610610
const isOverMaxCount =
611611
mergedMultiple && maxCount !== undefined && cachedDisplayValues?.length >= maxCount;
612612

613-
const traverse = (nodes: DataNode[]): DataNode[] => {
614-
return nodes.map(node => ({
615-
...node,
616-
disabled:
617-
isOverMaxCount && !cachedDisplayValues?.some(v => v.value === node.value)
618-
? true
619-
: node.disabled,
620-
children: node.children ? traverse(node.children) : undefined,
621-
}));
622-
};
623-
624-
const processedTreeData = React.useMemo(
625-
() => traverse(filteredTreeData),
626-
[filteredTreeData, isOverMaxCount],
627-
);
628-
629613
const treeSelectContext = React.useMemo<TreeSelectContextProps>(() => {
630614
return {
631615
virtual,
632616
dropdownMatchSelectWidth,
633617
listHeight,
634618
listItemHeight,
635619
listItemScrollOffset,
636-
treeData: processedTreeData,
620+
treeData: filteredTreeData,
637621
fieldNames: mergedFieldNames,
638622
onSelect: onOptionSelect,
639623
treeExpandAction,
@@ -648,7 +632,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
648632
listHeight,
649633
listItemHeight,
650634
listItemScrollOffset,
651-
processedTreeData,
635+
filteredTreeData,
652636
mergedFieldNames,
653637
onOptionSelect,
654638
treeExpandAction,

0 commit comments

Comments
 (0)