Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/TreeSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -412,9 +412,18 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
// Convert to value and filled with label
const values = displayKeys.map(key => keyEntities[key]?.node?.[mergedFieldNames.value] ?? key);

// Avoid an O(displayed values × selected values) lookup
const labeledValueMap = new Map<SafeKey, LabeledValueType>();
rawLabeledValues.forEach(item => {
// Match `find` by keeping the first entry when controlled values contain duplicates.
if (!labeledValueMap.has(item.value)) {
labeledValueMap.set(item.value, item);
}
});

// Back fill with origin label
const labeledValues = values.map(val => {
const targetItem = rawLabeledValues.find(item => item.value === val);
const targetItem = labeledValueMap.get(val);
const label = labelInValue ? targetItem?.label : treeTitleRender?.(targetItem);
return {
value: val,
Expand Down
25 changes: 25 additions & 0 deletions tests/Select.checkable.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,31 @@ describe('TreeSelect.checkable', () => {
expect(getSelectionText(container, 0)).toEqual('0-0');
});

it('preserves labels with SHOW_ALL', () => {
const { container } = render(
<TreeSelect
treeCheckable
showCheckedStrategy={SHOW_ALL}
labelInValue
value={[
{ value: 'parent', label: 'First parent label' },
{ value: 'parent', label: 'Second parent label' },
{ value: 'child', label: 'Custom child' },
]}
>
<TreeNode key="parent" value="parent" title="Parent">
<TreeNode key="child" value="child" title="Child" />
</TreeNode>
</TreeSelect>,
);

expect(getSelections(container)).toHaveLength(2);
expect([getSelectionText(container, 0), getSelectionText(container, 1)]).toEqual([
'First parent label',
'Custom child',
]);
});

// https://github.com/ant-design/ant-design/issues/38126
it('keep label when not in options', () => {
const onChange = jest.fn();
Expand Down