From 211e845462a453a66a330ccbe8978a6db1a4ba5e Mon Sep 17 00:00:00 2001 From: antoine Date: Thu, 4 Sep 2025 15:01:43 +0200 Subject: [PATCH] fix autocomplete local search --- package-lock.json | 41 +++++++++++++++---- package.json | 2 +- resources/js/composables/useFullTextSearch.ts | 18 ++++---- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9736c3c1..df500a589 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "cropperjs": "^1.5.12", "dompurify": "^3.2.6", "filesize": "^10.1.0", - "flexsearch": "^0.7.43", + "flexsearch": "^0.8.205", "leaflet": "^1.9.4", "lodash": "^4.17.21", "lucide-vue-next": "^0.511.0", @@ -7930,9 +7930,36 @@ } }, "node_modules/flexsearch": { - "version": "0.7.43", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", - "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==" + "version": "0.8.205", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.205.tgz", + "integrity": "sha512-REFjMqy86DKkCTJ4gIE42c9MVm9t1vUWfEub/8taixYuhvyu4jd4XmFALk5VuKW4GH4VLav8A4BJboTsslHF1w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/ts-thomas" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/flexsearch" + }, + { + "type": "patreon", + "url": "https://patreon.com/user?u=96245532" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/ts-thomas" + }, + { + "type": "paypal", + "url": "https://www.paypal.com/donate/?hosted_button_id=GEVR88FC9BWRW" + }, + { + "type": "bountysource", + "url": "https://salt.bountysource.com/teams/ts-thomas" + } + ], + "license": "Apache-2.0" }, "node_modules/flush-write-stream": { "version": "1.1.1", @@ -25038,9 +25065,9 @@ } }, "flexsearch": { - "version": "0.7.43", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", - "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==" + "version": "0.8.205", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.205.tgz", + "integrity": "sha512-REFjMqy86DKkCTJ4gIE42c9MVm9t1vUWfEub/8taixYuhvyu4jd4XmFALk5VuKW4GH4VLav8A4BJboTsslHF1w==" }, "flush-write-stream": { "version": "1.1.1", diff --git a/package.json b/package.json index 2482e6512..35bf47ef5 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "cropperjs": "^1.5.12", "dompurify": "^3.2.6", "filesize": "^10.1.0", - "flexsearch": "^0.7.43", + "flexsearch": "^0.8.205", "leaflet": "^1.9.4", "lodash": "^4.17.21", "lucide-vue-next": "^0.511.0", diff --git a/resources/js/composables/useFullTextSearch.ts b/resources/js/composables/useFullTextSearch.ts index 44cac8e8e..63cdc5cff 100644 --- a/resources/js/composables/useFullTextSearch.ts +++ b/resources/js/composables/useFullTextSearch.ts @@ -1,25 +1,27 @@ -import Flexsearch from "flexsearch"; +import { Document, DocumentData, FieldName, Charset } from "flexsearch"; import { MaybeRefOrGetter, toValue, watch } from "vue"; -export function useFullTextSearch(list: MaybeRefOrGetter, { id, searchKeys }: { id: string, searchKeys: string[] }) { - let index: Flexsearch.Document; +export function useFullTextSearch( + list: MaybeRefOrGetter, + { id, searchKeys }: { id: string, searchKeys: FieldName[] } +) { + let index: Document; function fullTextSearch(query: string) { - return index.search(query, undefined, { enrich: true }) - .map(result => result.result.map(r => r.doc)) - .flat() + return index.search(query, { enrich: true, merge: true }) + .map(result => result.doc) } watch(() => toValue(list), (list) => { if(list) { - index = new Flexsearch.Document({ + index = new Document({ document: { id, index: searchKeys, store: true, }, tokenize: 'forward', - charset: 'latin:simple', + encoder: Charset.Normalize, }); list.forEach(item => index.add(item)); }