From 8b2f678817eb6c06dce849d465333c5eebdf1142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Tue, 8 Mar 2022 16:46:33 +0800 Subject: [PATCH] fix: search with enter not trigger correct change params (#253) * fix: search with enter should give correct value * test: update test case --- src/OptionList/useKeyboard.ts | 16 ++++++++++++++-- tests/keyboard.spec.js | 23 ++++++++++++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/OptionList/useKeyboard.ts b/src/OptionList/useKeyboard.ts index 3d8528c9..a1099ada 100644 --- a/src/OptionList/useKeyboard.ts +++ b/src/OptionList/useKeyboard.ts @@ -1,8 +1,9 @@ import * as React from 'react'; import type { RefOptionListProps } from 'rc-select/lib/OptionList'; +import { useBaseProps } from 'rc-select'; import KeyCode from 'rc-util/lib/KeyCode'; import type { DefaultOptionType, InternalFieldNames, SingleValueType } from '../Cascader'; -import { useBaseProps } from 'rc-select'; +import { SEARCH_MARK } from '../hooks/useSearchOptions'; export default ( ref: React.Ref, @@ -151,7 +152,18 @@ export default ( // >>> Select case KeyCode.ENTER: { if (validActiveValueCells.length) { - onKeyBoardSelect(validActiveValueCells, lastActiveOptions[lastActiveIndex]); + const option = lastActiveOptions[lastActiveIndex]; + + // Search option should revert back of origin options + const originOptions: DefaultOptionType[] = option?.[SEARCH_MARK] || []; + if (originOptions.length) { + onKeyBoardSelect( + originOptions.map(opt => opt[fieldNames.value]), + originOptions[originOptions.length - 1], + ); + } else { + onKeyBoardSelect(validActiveValueCells, lastActiveOptions[lastActiveIndex]); + } } break; } diff --git a/tests/keyboard.spec.js b/tests/keyboard.spec.js index 46bf0e80..7b025e0b 100644 --- a/tests/keyboard.spec.js +++ b/tests/keyboard.spec.js @@ -7,9 +7,11 @@ import { addressOptions } from './demoOptions'; describe('Cascader.Keyboard', () => { let wrapper; let selectedValue; + let selectedOptions; let menus; - const onChange = value => { + const onChange = (value, options) => { selectedValue = value; + selectedOptions = options; }; beforeEach(() => { @@ -18,6 +20,7 @@ describe('Cascader.Keyboard', () => { afterEach(() => { selectedValue = null; + selectedOptions = null; menus = null; }); @@ -73,6 +76,24 @@ describe('Cascader.Keyboard', () => { wrapper.find('input').simulate('keyDown', { which: KeyCode.ENTER }); expect(wrapper.isOpen()).toBeFalsy(); expect(selectedValue).toEqual(['zj', 'hangzhou', 'yuhang']); + expect(selectedOptions).toEqual([ + addressOptions[1], + addressOptions[1].children[0], + addressOptions[1].children[0].children[0], + ]); + }); + + it('enter on search', () => { + wrapper.find('input').simulate('change', { target: { value: '余杭' } }); + wrapper.find('input').simulate('keyDown', { which: KeyCode.DOWN }); + wrapper.find('input').simulate('keyDown', { which: KeyCode.ENTER }); + + expect(selectedValue).toEqual(['zj', 'hangzhou', 'yuhang']); + expect(selectedOptions).toEqual([ + addressOptions[1], + addressOptions[1].children[0], + addressOptions[1].children[0].children[0], + ]); }); it('rtl', () => {