From 793fa0583f93ae0cc8f05ee9c509a481bfd614c7 Mon Sep 17 00:00:00 2001 From: Nikolay <46225163+vigdorov@users.noreply.github.com> Date: Mon, 28 Dec 2020 10:33:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D0=BE=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D1=83=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=BA=D0=B8=20=D0=BA=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B5=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 11 +++++ package.json | 2 + .../utils/__test__/performTextSearch.test.ts | 43 +++++++++++++++++++ src/core/utils/performTextSearch.ts | 29 +++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 src/core/utils/__test__/performTextSearch.test.ts create mode 100644 src/core/utils/performTextSearch.ts diff --git a/package-lock.json b/package-lock.json index 2993e5b..799b887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2443,6 +2443,12 @@ "@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": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", @@ -4996,6 +5002,11 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "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": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", diff --git a/package.json b/package.json index aaaf122..446da05 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@most/core": "^1.6.1", "@most/scheduler": "^1.3.0", "axios": "^0.21.0", + "convert-layout": "^0.8.2", "date-fns": "^2.16.1", "fp-ts": "^2.8.5", "history": "^5.0.0", @@ -36,6 +37,7 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-typescript": "^7.12.1", "@most/types": "^1.1.0", + "@types/convert-layout": "^0.5.1", "@types/jest": "^26.0.15", "@types/lodash": "^4.14.165", "@types/node": "^12.19.1", diff --git a/src/core/utils/__test__/performTextSearch.test.ts b/src/core/utils/__test__/performTextSearch.test.ts new file mode 100644 index 0000000..cc223d4 --- /dev/null +++ b/src/core/utils/__test__/performTextSearch.test.ts @@ -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([]); + }); +}); diff --git a/src/core/utils/performTextSearch.ts b/src/core/utils/performTextSearch.ts new file mode 100644 index 0000000..58652d6 --- /dev/null +++ b/src/core/utils/performTextSearch.ts @@ -0,0 +1,29 @@ +import ru from 'convert-layout/ru'; +import {isEmpty, isNotEmpty} from '../referers/common'; + +export function performTextSearch(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); + })); +}