Skip to content

Commit

Permalink
feat(Next > Search): Display index keyword counts sorted most to least
Browse files Browse the repository at this point in the history
  • Loading branch information
danactive committed Aug 7, 2022
1 parent 8eb7123 commit 1c9876e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
15 changes: 11 additions & 4 deletions next/src/lib/__tests__/search.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,29 @@ 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)
})
})
describe('Multiples', () => {
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)
})
})
Expand Down
16 changes: 12 additions & 4 deletions next/src/lib/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down

0 comments on commit 1c9876e

Please sign in to comment.