Добавление функции поиска по списку объектов без привязки к раскладке (#33)
This commit is contained in:
11
package-lock.json
generated
11
package-lock.json
generated
@ -2443,6 +2443,12 @@
|
|||||||
"@babel/types": "^7.3.0"
|
"@babel/types": "^7.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/convert-layout": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/convert-layout/-/convert-layout-0.5.1.tgz",
|
||||||
|
"integrity": "sha512-XvVVk2SBGAXOxsDg/WZ1fbX2oMZDZbU/e37MIDBnnRdw7iAHO0LVslUiPsI4IO52f6YJO/W84PT5nFcRpZRxvg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/eslint": {
|
"@types/eslint": {
|
||||||
"version": "7.2.6",
|
"version": "7.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
|
||||||
@ -4996,6 +5002,11 @@
|
|||||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"convert-layout": {
|
||||||
|
"version": "0.8.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/convert-layout/-/convert-layout-0.8.2.tgz",
|
||||||
|
"integrity": "sha512-mxEN+1bUOhBKqJlgW/k/2cU/Wl2KZEvzLO0A94gl5aQp2F4MIymk93Bct7ZCTtUaP6wZFxz6IW62K8PX2kbvdQ=="
|
||||||
|
},
|
||||||
"convert-source-map": {
|
"convert-source-map": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
"@most/core": "^1.6.1",
|
"@most/core": "^1.6.1",
|
||||||
"@most/scheduler": "^1.3.0",
|
"@most/scheduler": "^1.3.0",
|
||||||
"axios": "^0.21.0",
|
"axios": "^0.21.0",
|
||||||
|
"convert-layout": "^0.8.2",
|
||||||
"date-fns": "^2.16.1",
|
"date-fns": "^2.16.1",
|
||||||
"fp-ts": "^2.8.5",
|
"fp-ts": "^2.8.5",
|
||||||
"history": "^5.0.0",
|
"history": "^5.0.0",
|
||||||
@ -36,6 +37,7 @@
|
|||||||
"@babel/preset-env": "^7.12.1",
|
"@babel/preset-env": "^7.12.1",
|
||||||
"@babel/preset-typescript": "^7.12.1",
|
"@babel/preset-typescript": "^7.12.1",
|
||||||
"@most/types": "^1.1.0",
|
"@most/types": "^1.1.0",
|
||||||
|
"@types/convert-layout": "^0.5.1",
|
||||||
"@types/jest": "^26.0.15",
|
"@types/jest": "^26.0.15",
|
||||||
"@types/lodash": "^4.14.165",
|
"@types/lodash": "^4.14.165",
|
||||||
"@types/node": "^12.19.1",
|
"@types/node": "^12.19.1",
|
||||||
|
|||||||
43
src/core/utils/__test__/performTextSearch.test.ts
Normal file
43
src/core/utils/__test__/performTextSearch.test.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import {performTextSearch} from '../performTextSearch';
|
||||||
|
|
||||||
|
describe('performTextSearch', () => {
|
||||||
|
it('Проверка отфильтрованных значений', () => {
|
||||||
|
const items = [
|
||||||
|
{name: 'Иван', age: 6, color: 'red'},
|
||||||
|
{name: 'Сергей', age: 12, color: 'white'},
|
||||||
|
{name: 'John', age: 33, color: 'black'},
|
||||||
|
{name: 'James', age: 43, color: 'yellow'},
|
||||||
|
];
|
||||||
|
|
||||||
|
expect(performTextSearch(items, 'ива', ['name'])).toEqual([
|
||||||
|
{name: 'Иван', age: 6, color: 'red'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, 'cth', ['name'])).toEqual([
|
||||||
|
{name: 'Сергей', age: 12, color: 'white'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, 'utq', ['name'])).toEqual([
|
||||||
|
{name: 'Сергей', age: 12, color: 'white'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, 'о', ['name'])).toEqual([
|
||||||
|
{name: 'John', age: 33, color: 'black'},
|
||||||
|
{name: 'James', age: 43, color: 'yellow'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, 'e', ['name', 'color'])).toEqual([
|
||||||
|
{name: 'Иван', age: 6, color: 'red'},
|
||||||
|
{name: 'Сергей', age: 12, color: 'white'},
|
||||||
|
{name: 'James', age: 43, color: 'yellow'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, '3', ['age'])).toEqual([
|
||||||
|
{name: 'John', age: 33, color: 'black'},
|
||||||
|
{name: 'James', age: 43, color: 'yellow'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, '', ['age'])).toEqual([
|
||||||
|
{name: 'Иван', age: 6, color: 'red'},
|
||||||
|
{name: 'Сергей', age: 12, color: 'white'},
|
||||||
|
{name: 'John', age: 33, color: 'black'},
|
||||||
|
{name: 'James', age: 43, color: 'yellow'},
|
||||||
|
]);
|
||||||
|
expect(performTextSearch(items, 'sdfsse23', ['age'])).toEqual([]);
|
||||||
|
expect(performTextSearch([], 'sdfsse23', ['age'])).toEqual([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
29
src/core/utils/performTextSearch.ts
Normal file
29
src/core/utils/performTextSearch.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import ru from 'convert-layout/ru';
|
||||||
|
import {isEmpty, isNotEmpty} from '../referers/common';
|
||||||
|
|
||||||
|
export function performTextSearch<T, K extends keyof T>(items: T[], searchText: string, searchProperties: K[]) {
|
||||||
|
if (isEmpty(items) || isEmpty(searchText)) {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = searchText.toLowerCase();
|
||||||
|
const queryToEn = ru.toEn(query);
|
||||||
|
const queryToRu = ru.fromEn(query);
|
||||||
|
|
||||||
|
const hasQuery = (itemText: string) => {
|
||||||
|
const text = itemText.toLowerCase();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Т.к. convert-layout заменяет не все символы верно,
|
||||||
|
* ищем так же по первоначальной строке
|
||||||
|
* https://github.com/ai/convert-layout/issues/22
|
||||||
|
*/
|
||||||
|
return text.includes(query) || text.includes(queryToEn) || text.includes(queryToRu);
|
||||||
|
};
|
||||||
|
|
||||||
|
return items.filter(item => searchProperties.some(property => {
|
||||||
|
const propertyValue = item[property];
|
||||||
|
const text = isNotEmpty(propertyValue) ? `${propertyValue}` : undefined;
|
||||||
|
return text && hasQuery(text);
|
||||||
|
}));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user