From 08a3682b8968176f3bf52184ad4c7767cc8291a0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 21 Jun 2023 07:25:09 +0300 Subject: [PATCH] Limit search input to first character matching when only one character is typed --- .../Page/Header/AuthorSearchInputConnector.js | 2 ++ .../src/Components/Page/Header/fuse.worker.js | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/frontend/src/Components/Page/Header/AuthorSearchInputConnector.js b/frontend/src/Components/Page/Header/AuthorSearchInputConnector.js index 0b244db02..966015e7a 100644 --- a/frontend/src/Components/Page/Header/AuthorSearchInputConnector.js +++ b/frontend/src/Components/Page/Header/AuthorSearchInputConnector.js @@ -26,6 +26,7 @@ function createCleanAuthorSelector() { sortName, titleSlug, images, + firstCharacter: authorName.charAt(0).toLowerCase(), tags: tags.reduce((acc, id) => { const matchingTag = allTags.find((tag) => tag.id === id); @@ -58,6 +59,7 @@ function createCleanBookSelector() { sortName: title, titleSlug, images, + firstCharacter: title.charAt(0).toLowerCase(), tags: [] }; }); diff --git a/frontend/src/Components/Page/Header/fuse.worker.js b/frontend/src/Components/Page/Header/fuse.worker.js index 5ddb505f4..c612ca347 100644 --- a/frontend/src/Components/Page/Header/fuse.worker.js +++ b/frontend/src/Components/Page/Header/fuse.worker.js @@ -15,9 +15,36 @@ const fuseOptions = { function getSuggestions(items, value) { const limit = 10; + let suggestions = []; - const fuse = new Fuse(items, fuseOptions); - return fuse.search(value, { limit }); + if (value.length === 1) { + for (let i = 0; i < items.length; i++) { + const s = items[i]; + if (s.firstCharacter === value.toLowerCase()) { + suggestions.push({ + item: items[i], + indices: [ + [0, 0] + ], + matches: [ + { + value: s.title, + key: 'title' + } + ], + arrayIndex: 0 + }); + if (suggestions.length > limit) { + break; + } + } + } + } else { + const fuse = new Fuse(items, fuseOptions); + suggestions = fuse.search(value, { limit }); + } + + return suggestions; } onmessage = function(e) {