diff --git a/next/src/lib/__tests__/search.test.js b/next/src/lib/__tests__/search.test.js index d2e073b35..2d8be37ce 100644 --- a/next/src/lib/__tests__/search.test.js +++ b/next/src/lib/__tests__/search.test.js @@ -10,7 +10,7 @@ describe('Seach hook', () => { test('One word', () => { const keyword = 'keyword' const actual = lib.indexKeywords([{ search: keyword }]) - const expected = { indexedKeywords: [{ label: keyword, value: keyword }] } + const expected = { indexedKeywords: [{ label: `${keyword} (1)`, value: keyword }] } expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords) }) }) @@ -18,14 +18,21 @@ describe('Seach hook', () => { test('Duplicate', () => { const keyword = 'keyword' const actual = lib.indexKeywords([{ search: keyword }, { search: keyword }]) - const expected = { indexedKeywords: [{ label: keyword, value: keyword }] } + const expected = { indexedKeywords: [{ label: `${keyword} (2)`, value: keyword }] } expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords) }) test('Duplicate plus another', () => { const keyword = 'keyword' const keyword2 = 'keyword2' - const actual = lib.indexKeywords([{ search: keyword }, { search: keyword }, { search: keyword2 }, { search: keyword2 }]) - const expected = { indexedKeywords: [{ label: keyword, value: keyword }, { label: keyword2, value: keyword2 }] } + const actual = lib.indexKeywords([{ search: keyword }, { search: keyword }, { search: keyword2 }]) + const expected = { indexedKeywords: [{ label: `${keyword} (2)`, value: keyword }, { label: `${keyword2} (1)`, value: keyword2 }] } + expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords) + }) + test('Order most to least', () => { + const keyword2 = 'keyword' + const keyword1 = 'keyword2' + const actual = lib.indexKeywords([{ search: keyword2 }, { search: keyword1 }, { search: keyword1 }]) + const expected = { indexedKeywords: [{ label: `${keyword1} (2)`, value: keyword1 }, { label: `${keyword2} (1)`, value: keyword2 }] } expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords) }) }) diff --git a/next/src/lib/search.js b/next/src/lib/search.js index 1f4ed96bb..81457ec40 100644 --- a/next/src/lib/search.js +++ b/next/src/lib/search.js @@ -2,16 +2,24 @@ * Index search keywords from search xml element and dedupe * * @param {Object[]} items + * @param {string[]} items.search * @returns {{ indexedKeywords }} */ function indexKeywords(items) { - const indexedKeywords = items.reduce((out, item) => { - item?.search?.split(', ').forEach((i) => out.add(i)) + const summedKeywords = items.reduce((out, item) => { + item?.search?.split(', ').forEach((i) => { + // eslint-disable-next-line no-param-reassign + out[i] = (out[i] || 0) + 1 + }, {}) return out - }, new Set()) + }, {}) + + const sortedKeywords = Object.fromEntries( + Object.entries(summedKeywords).sort(([, a], [, b]) => b - a), + ) // prepare for react-select in useSearch custom hook - return { indexedKeywords: Array.from(indexedKeywords, (i) => ({ label: i, value: i })) } + return { indexedKeywords: Object.keys(sortedKeywords).map((i) => ({ label: `${i} (${sortedKeywords[i]})`, value: i })) } } module.exports = {