From d161dd447831cc48e8f730d9e48e57a110d45bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Thu, 5 Jun 2025 15:05:05 +0800 Subject: [PATCH 01/13] feat: combine showSearch --- src/TreeSelect.tsx | 48 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/TreeSelect.tsx b/src/TreeSelect.tsx index d6d2929d..e9c2ceef 100644 --- a/src/TreeSelect.tsx +++ b/src/TreeSelect.tsx @@ -37,8 +37,17 @@ import type { export type SemanticName = 'input' | 'prefix' | 'suffix'; export type PopupSemantic = 'item' | 'itemTitle'; +interface SearchConfig { + searchValue?: string; + /** @deprecated Use `searchValue` instead */ + inputValue?: string; + onSearch?: (value: string) => void; + autoClearSearchValue?: boolean; + filterTreeNode?: boolean | ((inputValue: string, treeNode: DataNode) => boolean); + treeNodeFilterProp?: string; +} export interface TreeSelectProps - extends Omit { + extends Omit { prefixCls?: string; id?: string; children?: React.ReactNode; @@ -54,12 +63,18 @@ export interface TreeSelectProps void; // >>> Search + showSearch?: boolean | SearchConfig; + /** @deprecated Use `showSearch.searchValue` instead */ searchValue?: string; /** @deprecated Use `searchValue` instead */ inputValue?: string; + /** @deprecated Use `showSearch.onSearch` instead */ onSearch?: (value: string) => void; + /** @deprecated Use `showSearch.autoClearSearchValue` instead */ autoClearSearchValue?: boolean; + /** @deprecated Use `showSearch.filterTreeNode` instead */ filterTreeNode?: boolean | ((inputValue: string, treeNode: DataNode) => boolean); + /** @deprecated Use `showSearch.treeNodeFilterProp` instead */ treeNodeFilterProp?: string; // >>> Select @@ -127,12 +142,7 @@ const TreeSelect = React.forwardRef((props, ref) onDeselect, // Search - searchValue, - inputValue, - onSearch, - autoClearSearchValue = true, - filterTreeNode, - treeNodeFilterProp = 'value', + showSearch, // Selector showCheckedStrategy, @@ -193,6 +203,28 @@ const TreeSelect = React.forwardRef((props, ref) const mergedLabelInValue = treeCheckStrictly || labelInValue; const mergedMultiple = mergedCheckable || multiple; + const legacySearchProps = [ + 'searchValue', + 'inputValue', + 'onSearch', + 'autoClearSearchValue', + 'filterTreeNode', + 'treeNodeFilterProp', + ]; + const legacyShowSearch: SearchConfig = {}; + legacySearchProps.forEach(propsName => { + legacyShowSearch[propsName] = props?.[propsName]; + }); + const mergedShowSearch = typeof showSearch === 'object' ? showSearch : legacyShowSearch; + const { + searchValue, + inputValue, + onSearch, + autoClearSearchValue = true, + filterTreeNode, + treeNodeFilterProp = 'value', + } = mergedShowSearch; + const [internalValue, setInternalValue] = useMergedState(defaultValue, { value }); // `multiple` && `!treeCheckable` should be show all @@ -725,6 +757,8 @@ const TreeSelect = React.forwardRef((props, ref) displayValues={cachedDisplayValues} onDisplayValuesChange={onDisplayValuesChange} // >>> Search + {...mergedShowSearch} + showSearch={showSearch === undefined ? undefined : !!showSearch} searchValue={mergedSearchValue} onSearch={onInternalSearch} // >>> Options From aadd0410d636d410a148281fbb3d1a5748623030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Thu, 5 Jun 2025 16:13:08 +0800 Subject: [PATCH 02/13] feat: use hooks (add useSearchConfig) --- src/TreeSelect.tsx | 23 ++++++---------------- src/hooks/useSearchConfig.ts | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 src/hooks/useSearchConfig.ts diff --git a/src/TreeSelect.tsx b/src/TreeSelect.tsx index e9c2ceef..344528b3 100644 --- a/src/TreeSelect.tsx +++ b/src/TreeSelect.tsx @@ -34,10 +34,11 @@ import type { FieldNames, LegacyDataNode, } from './interface'; +import useSearchConfig from './hooks/useSearchConfig'; export type SemanticName = 'input' | 'prefix' | 'suffix'; export type PopupSemantic = 'item' | 'itemTitle'; -interface SearchConfig { +export interface SearchConfig { searchValue?: string; /** @deprecated Use `searchValue` instead */ inputValue?: string; @@ -203,19 +204,7 @@ const TreeSelect = React.forwardRef((props, ref) const mergedLabelInValue = treeCheckStrictly || labelInValue; const mergedMultiple = mergedCheckable || multiple; - const legacySearchProps = [ - 'searchValue', - 'inputValue', - 'onSearch', - 'autoClearSearchValue', - 'filterTreeNode', - 'treeNodeFilterProp', - ]; - const legacyShowSearch: SearchConfig = {}; - legacySearchProps.forEach(propsName => { - legacyShowSearch[propsName] = props?.[propsName]; - }); - const mergedShowSearch = typeof showSearch === 'object' ? showSearch : legacyShowSearch; + const [mergedShowSearch, searchConfig] = useSearchConfig(showSearch, props); const { searchValue, inputValue, @@ -223,7 +212,7 @@ const TreeSelect = React.forwardRef((props, ref) autoClearSearchValue = true, filterTreeNode, treeNodeFilterProp = 'value', - } = mergedShowSearch; + } = searchConfig; const [internalValue, setInternalValue] = useMergedState(defaultValue, { value }); @@ -757,8 +746,8 @@ const TreeSelect = React.forwardRef((props, ref) displayValues={cachedDisplayValues} onDisplayValuesChange={onDisplayValuesChange} // >>> Search - {...mergedShowSearch} - showSearch={showSearch === undefined ? undefined : !!showSearch} + {...searchConfig} + showSearch={mergedShowSearch} searchValue={mergedSearchValue} onSearch={onInternalSearch} // >>> Options diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts new file mode 100644 index 00000000..90acaa70 --- /dev/null +++ b/src/hooks/useSearchConfig.ts @@ -0,0 +1,38 @@ +import type { SearchConfig } from '@/TreeSelect'; +import * as React from 'react'; +const legacySearchProps = [ + 'searchValue', + 'inputValue', + 'onSearch', + 'autoClearSearchValue', + 'filterTreeNode', + 'treeNodeFilterProp', +]; +// Convert `showSearch` to unique config +export default function useSearchConfig(showSearch, props) { + return React.useMemo<[boolean, SearchConfig]>(() => { + const legacyShowSearch: SearchConfig = {}; + legacySearchProps.forEach(propsName => { + legacyShowSearch[propsName] = props?.[propsName]; + }); + const searchConfig: SearchConfig = + typeof showSearch === 'object' ? showSearch : legacyShowSearch; + if (showSearch === undefined) { + return [undefined, searchConfig]; + } + if (!showSearch) { + return [false, {}]; + } + return [true, searchConfig]; + }, [ + showSearch, + props?.filterOption, + props?.searchValue, + props?.optionFilterProp, + props?.optionLabelProp, + props?.filterSort, + props?.onSearch, + props?.autoClearSearchValue, + props?.tokenSeparators, + ]); +} From 4174ca04b8a000569ac09c616ef0d93e8ed10f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Thu, 5 Jun 2025 16:14:15 +0800 Subject: [PATCH 03/13] feat: change useSearchConfig memo value --- src/hooks/useSearchConfig.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 90acaa70..82e00bbf 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -26,13 +26,11 @@ export default function useSearchConfig(showSearch, props) { return [true, searchConfig]; }, [ showSearch, - props?.filterOption, props?.searchValue, - props?.optionFilterProp, - props?.optionLabelProp, - props?.filterSort, + props?.inputValue, props?.onSearch, props?.autoClearSearchValue, - props?.tokenSeparators, + props?.filterTreeNode, + props?.treeNodeFilterProp, ]); } From ed8d45241c8a9405f9e3b95d00ca4678761bf140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 16 Jun 2025 12:13:24 +0800 Subject: [PATCH 04/13] test: add test --- src/hooks/useSearchConfig.ts | 27 +++++--- tests/Select.spec.tsx | 129 ++++++++++++++++++++++++++++++++++- 2 files changed, 146 insertions(+), 10 deletions(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 82e00bbf..7872cfb5 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -9,11 +9,20 @@ const legacySearchProps = [ 'treeNodeFilterProp', ]; // Convert `showSearch` to unique config -export default function useSearchConfig(showSearch, props) { +export default function useSearchConfig(showSearch: boolean | SearchConfig, props: any) { + const { + searchValue, + inputValue, + onSearch, + autoClearSearchValue, + filterTreeNode, + treeNodeFilterProp, + } = props; return React.useMemo<[boolean, SearchConfig]>(() => { const legacyShowSearch: SearchConfig = {}; - legacySearchProps.forEach(propsName => { - legacyShowSearch[propsName] = props?.[propsName]; + legacySearchProps.forEach(name => { + const val = props?.[name]; + if (val !== undefined) legacyShowSearch[name] = val; }); const searchConfig: SearchConfig = typeof showSearch === 'object' ? showSearch : legacyShowSearch; @@ -26,11 +35,11 @@ export default function useSearchConfig(showSearch, props) { return [true, searchConfig]; }, [ showSearch, - props?.searchValue, - props?.inputValue, - props?.onSearch, - props?.autoClearSearchValue, - props?.filterTreeNode, - props?.treeNodeFilterProp, + searchValue, + inputValue, + onSearch, + autoClearSearchValue, + filterTreeNode, + treeNodeFilterProp, ]); } diff --git a/tests/Select.spec.tsx b/tests/Select.spec.tsx index 510f213a..3414258d 100644 --- a/tests/Select.spec.tsx +++ b/tests/Select.spec.tsx @@ -1,4 +1,4 @@ -import { render } from '@testing-library/react'; +import { render, fireEvent } from '@testing-library/react'; import { mount } from 'enzyme'; import KeyCode from '@rc-component/util/lib/KeyCode'; import React from 'react'; @@ -709,4 +709,131 @@ describe('TreeSelect.basic', () => { expect(itemTitle).toHaveStyle(customStyles.popup.itemTitle); expect(item).toHaveStyle(customStyles.popup.item); }); + + describe('combine showSearch', () => { + const treeData = [ + { key: '0', value: 'a', title: '0 label' }, + { + key: '1', + value: 'b', + title: '1 label', + children: [ + { key: '10', value: 'ba', title: '10 label' }, + { key: '11', value: 'bb', title: '11 label' }, + ], + }, + ]; + it('searchValue and onSearch', () => { + const currentSearchFn = jest.fn(); + const legacySearchFn = jest.fn(); + const { container } = render( + <> +
+ +
+
+ +
+ , + ); + const legacyInput = container.querySelector('#test1 input'); + const currentInput = container.querySelector('#test2 input'); + fireEvent.change(legacyInput, { target: { value: '2' } }); + fireEvent.change(currentInput, { target: { value: '2' } }); + expect(currentSearchFn).toHaveBeenCalledWith('2'); + expect(legacySearchFn).toHaveBeenCalledWith('2'); + }); + it('treeNodeFilterProp and autoClearSearchValue', () => { + const { container } = render( + <> +
+ +
+
+ +
+ , + ); + const legacyInput = container.querySelector('#test1 input'); + const currentInput = container.querySelector('#test2 input'); + fireEvent.change(legacyInput, { target: { value: 'a' } }); + fireEvent.change(currentInput, { target: { value: 'a' } }); + const legacyItem = container.querySelector( + '#test1 .rc-tree-select-tree-title', + ); + const currentItem = container.querySelector( + '#test2 .rc-tree-select-tree-title', + ); + + expect(legacyInput).toHaveValue('a'); + expect(currentInput).toHaveValue('a'); + fireEvent.click(legacyItem); + fireEvent.click(currentItem); + const valueSpan = container.querySelectorAll( + ' .rc-tree-select-selection-item', + ); + + expect(valueSpan[0]).toHaveTextContent('0 label'); + expect(valueSpan[1]).toHaveTextContent('0 label'); + }); + it('filterTreeNode', () => { + const { container } = render( + <> +
+ node.value === inputValue} + /> +
+
+ node.value === inputValue, + }} + open + treeDefaultExpandAll + treeData={treeData} + /> +
+ , + ); + const legacyInput = container.querySelector('#test1 input'); + const currentInput = container.querySelector('#test2 input'); + fireEvent.change(legacyInput, { target: { value: 'bb' } }); + fireEvent.change(currentInput, { target: { value: 'bb' } }); + const options = container.querySelectorAll(' .rc-tree-select-tree-title'); + + expect(options).toHaveLength(4); + }); + }); }); From 59161dc90cd40e38499d8b5f7186b018a156c039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 16 Jun 2025 12:22:55 +0800 Subject: [PATCH 05/13] fix: delete inputValue in ShowSearch --- src/TreeSelect.tsx | 5 +---- src/hooks/useSearchConfig.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/TreeSelect.tsx b/src/TreeSelect.tsx index 344528b3..bb5512e4 100644 --- a/src/TreeSelect.tsx +++ b/src/TreeSelect.tsx @@ -40,8 +40,6 @@ export type SemanticName = 'input' | 'prefix' | 'suffix'; export type PopupSemantic = 'item' | 'itemTitle'; export interface SearchConfig { searchValue?: string; - /** @deprecated Use `searchValue` instead */ - inputValue?: string; onSearch?: (value: string) => void; autoClearSearchValue?: boolean; filterTreeNode?: boolean | ((inputValue: string, treeNode: DataNode) => boolean); @@ -207,7 +205,6 @@ const TreeSelect = React.forwardRef((props, ref) const [mergedShowSearch, searchConfig] = useSearchConfig(showSearch, props); const { searchValue, - inputValue, onSearch, autoClearSearchValue = true, filterTreeNode, @@ -240,7 +237,7 @@ const TreeSelect = React.forwardRef((props, ref) // =========================== Search =========================== const [mergedSearchValue, setSearchValue] = useMergedState('', { - value: searchValue !== undefined ? searchValue : inputValue, + value: searchValue, postState: search => search || '', }); diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 7872cfb5..56bee378 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -2,7 +2,6 @@ import type { SearchConfig } from '@/TreeSelect'; import * as React from 'react'; const legacySearchProps = [ 'searchValue', - 'inputValue', 'onSearch', 'autoClearSearchValue', 'filterTreeNode', @@ -22,7 +21,12 @@ export default function useSearchConfig(showSearch: boolean | SearchConfig, prop const legacyShowSearch: SearchConfig = {}; legacySearchProps.forEach(name => { const val = props?.[name]; - if (val !== undefined) legacyShowSearch[name] = val; + if (val !== undefined) { + legacyShowSearch[name] = val; + } + if (name === 'searchValue') { + legacyShowSearch[name] = val ?? props?.inputValue; + } }); const searchConfig: SearchConfig = typeof showSearch === 'object' ? showSearch : legacyShowSearch; From 148a60ecd463fddf64c7b175f3afde03785275c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 16 Jun 2025 12:24:24 +0800 Subject: [PATCH 06/13] feat: inputValue Use `showSearch.searchValue` instead --- src/TreeSelect.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TreeSelect.tsx b/src/TreeSelect.tsx index bb5512e4..df71504b 100644 --- a/src/TreeSelect.tsx +++ b/src/TreeSelect.tsx @@ -65,7 +65,7 @@ export interface TreeSelectProps void; From 926e495efd6312cfa44d32c8a1e911173e207e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 16 Jun 2025 12:48:07 +0800 Subject: [PATCH 07/13] feat: change ts --- src/hooks/useSearchConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 56bee378..d80e2c8b 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -17,7 +17,7 @@ export default function useSearchConfig(showSearch: boolean | SearchConfig, prop filterTreeNode, treeNodeFilterProp, } = props; - return React.useMemo<[boolean, SearchConfig]>(() => { + return React.useMemo<[boolean | undefined, SearchConfig]>(() => { const legacyShowSearch: SearchConfig = {}; legacySearchProps.forEach(name => { const val = props?.[name]; From 168821553ea0e47d3cfae9fe3b4dcde9f5646bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 16 Jun 2025 16:02:45 +0800 Subject: [PATCH 08/13] feat: change useSearchConfig --- src/hooks/useSearchConfig.ts | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index d80e2c8b..1364e948 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -1,14 +1,11 @@ -import type { SearchConfig } from '@/TreeSelect'; +import type { SearchConfig, TreeSelectProps } from '@/TreeSelect'; import * as React from 'react'; -const legacySearchProps = [ - 'searchValue', - 'onSearch', - 'autoClearSearchValue', - 'filterTreeNode', - 'treeNodeFilterProp', -]; + // Convert `showSearch` to unique config -export default function useSearchConfig(showSearch: boolean | SearchConfig, props: any) { +export default function useSearchConfig( + showSearch: boolean | SearchConfig, + props: TreeSelectProps, +) { const { searchValue, inputValue, @@ -18,24 +15,27 @@ export default function useSearchConfig(showSearch: boolean | SearchConfig, prop treeNodeFilterProp, } = props; return React.useMemo<[boolean | undefined, SearchConfig]>(() => { - const legacyShowSearch: SearchConfig = {}; - legacySearchProps.forEach(name => { - const val = props?.[name]; - if (val !== undefined) { - legacyShowSearch[name] = val; - } - if (name === 'searchValue') { - legacyShowSearch[name] = val ?? props?.inputValue; - } - }); - const searchConfig: SearchConfig = - typeof showSearch === 'object' ? showSearch : legacyShowSearch; - if (showSearch === undefined) { - return [undefined, searchConfig]; + const legacysearchConfig: SearchConfig = { + searchValue: searchValue ?? inputValue, + onSearch, + autoClearSearchValue, + filterTreeNode, + treeNodeFilterProp, + }; + + if (showSearch === undefined || showSearch === true) { + return [showSearch as boolean, legacysearchConfig]; } + if (!showSearch) { return [false, {}]; } + + const searchConfig = { + ...legacysearchConfig, + ...showSearch, + }; + return [true, searchConfig]; }, [ showSearch, From df15a381c3a85e8ca2382998d094b0ac3e7936c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 18 Jun 2025 11:22:40 +0800 Subject: [PATCH 09/13] feat: change useSearchConfig1 --- src/hooks/useSearchConfig.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 1364e948..3ef27700 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -15,26 +15,21 @@ export default function useSearchConfig( treeNodeFilterProp, } = props; return React.useMemo<[boolean | undefined, SearchConfig]>(() => { - const legacysearchConfig: SearchConfig = { + const searchConfig: SearchConfig = { searchValue: searchValue ?? inputValue, onSearch, autoClearSearchValue, filterTreeNode, treeNodeFilterProp, + ...(typeof showSearch === 'object' ? showSearch : {}), }; - - if (showSearch === undefined || showSearch === true) { - return [showSearch as boolean, legacysearchConfig]; - } - - if (!showSearch) { + if (showSearch === false) { return [false, {}]; } - const searchConfig = { - ...legacysearchConfig, - ...showSearch, - }; + if (showSearch === undefined) { + return [undefined, searchConfig]; + } return [true, searchConfig]; }, [ From f015c609953021e54f996e048658a5778d8f71e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 18 Jun 2025 14:28:46 +0800 Subject: [PATCH 10/13] feat: change useSearchConfig --- src/hooks/useSearchConfig.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/hooks/useSearchConfig.ts b/src/hooks/useSearchConfig.ts index 3ef27700..3d30fd9e 100644 --- a/src/hooks/useSearchConfig.ts +++ b/src/hooks/useSearchConfig.ts @@ -15,23 +15,18 @@ export default function useSearchConfig( treeNodeFilterProp, } = props; return React.useMemo<[boolean | undefined, SearchConfig]>(() => { + const isObject = typeof showSearch === 'object'; + const searchConfig: SearchConfig = { searchValue: searchValue ?? inputValue, onSearch, autoClearSearchValue, filterTreeNode, treeNodeFilterProp, - ...(typeof showSearch === 'object' ? showSearch : {}), + ...(isObject ? showSearch : {}), }; - if (showSearch === false) { - return [false, {}]; - } - - if (showSearch === undefined) { - return [undefined, searchConfig]; - } - return [true, searchConfig]; + return [isObject ? true : showSearch, searchConfig]; }, [ showSearch, searchValue, From 0e96c1eb88d50180643200c7c37cc1dbc7db3730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 18 Jun 2025 16:01:17 +0800 Subject: [PATCH 11/13] test: test showSearch --- tests/Select.spec.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/Select.spec.tsx b/tests/Select.spec.tsx index 3414258d..9fe40fa7 100644 --- a/tests/Select.spec.tsx +++ b/tests/Select.spec.tsx @@ -835,5 +835,21 @@ describe('TreeSelect.basic', () => { expect(options).toHaveLength(4); }); + it.only.each([ + // [description, props, shouldExist] + ['showSearch=false ', { showSearch: false }, false], + ['showSearch=undefined ', {}, false], + ['showSearch=true', { showSearch: true }, true], + ])('%s', (_, props: { showSearch?: boolean; mode?: 'tags' }, shouldExist) => { + const { container } = render( + , + ); + const inputNode = container.querySelector('input'); + if (shouldExist) { + expect(inputNode).not.toHaveAttribute('readonly'); + } else { + expect(inputNode).toHaveAttribute('readonly'); + } + }); }); }); From e12bcea781c2f0d69c4d2209ddcfc7a693febd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 18 Jun 2025 16:02:10 +0800 Subject: [PATCH 12/13] test: test showSearch --- tests/Select.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Select.spec.tsx b/tests/Select.spec.tsx index 9fe40fa7..b61abf46 100644 --- a/tests/Select.spec.tsx +++ b/tests/Select.spec.tsx @@ -835,7 +835,7 @@ describe('TreeSelect.basic', () => { expect(options).toHaveLength(4); }); - it.only.each([ + it.each([ // [description, props, shouldExist] ['showSearch=false ', { showSearch: false }, false], ['showSearch=undefined ', {}, false], From 7203a7f011dcd4f2104865df3479e07d698af738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 24 Jun 2025 09:47:50 +0800 Subject: [PATCH 13/13] build: Upgrade @rc-component/select to 1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f8f3307..611d15fc 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ }, "dependencies": { "classnames": "2.x", - "@rc-component/select": "~1.0.7", + "@rc-component/select": "~1.1.0", "@rc-component/tree": "~1.0.1", "@rc-component/util": "^1.2.1" },