fix: Ignore case and special keys when searching (#16706)

This commit is contained in:
Michael S. Molina 2021-09-15 07:33:43 -03:00 committed by GitHub
parent b0ac5d1625
commit adc3d24c21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 6 deletions

View File

@ -151,6 +151,18 @@ test('searches for label or value', async () => {
expect(options[0]).toHaveTextContent(option.label);
});
test('ignores case when searching', async () => {
render(<Select {...defaultProps} />);
await type('george');
expect(await findSelectOption('George')).toBeInTheDocument();
});
test('ignores special keys when searching', async () => {
render(<Select {...defaultProps} />);
await type('{shift}');
expect(screen.queryByText(LOADING)).not.toBeInTheDocument();
});
test('searches for custom fields', async () => {
render(<Select {...defaultProps} optionFilterProps={['label', 'gender']} />);
await type('Liam');

View File

@ -20,6 +20,7 @@ import React, {
ReactElement,
ReactNode,
RefObject,
KeyboardEvent,
UIEvent,
useEffect,
useMemo,
@ -333,13 +334,18 @@ const Select = ({
const handleData = (data: OptionsType) => {
if (data && Array.isArray(data) && data.length) {
const dataValues = new Set();
data.forEach(option =>
dataValues.add(String(option.value).toLocaleLowerCase()),
);
// merges with existing and creates unique options
setSelectOptions(prevOptions => [
...prevOptions,
...data.filter(
newOpt =>
!prevOptions.find(prevOpt => prevOpt.value === newOpt.value),
...prevOptions.filter(
previousOption =>
!dataValues.has(String(previousOption.value).toLocaleLowerCase()),
),
...data,
]);
}
};
@ -459,8 +465,8 @@ const Select = ({
return error ? <Error error={error} /> : originNode;
};
const onInputKeyDown = () => {
if (isAsync && !isTyping) {
const onInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
if (event.key.length === 1 && isAsync && !isTyping) {
setIsTyping(true);
}
};