Skip to content

Commit

Permalink
feat(Next > Search): Sort by keyword count then name
Browse files Browse the repository at this point in the history
  • Loading branch information
danactive committed Nov 12, 2023
1 parent ad0d764 commit a538734
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 11 deletions.
2 changes: 1 addition & 1 deletion next/src/components/OrganizePreviews/ActionButtons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export default function ActionButtons(
},
method: 'POST',
body: JSON.stringify(postBody),
};
}
/*
curl -d '{"filenames":["a.jpg","b.jpg"], "prefix": "2020-06-13",
"source_folder": "/todo/doit", "preview": "false", "raw": "true", "rename_associated": "true"}'
Expand Down
2 changes: 1 addition & 1 deletion next/src/lib/__tests__/albums.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('Albums library', () => {
version: '1.8',
thumbPath: '/galleries/demo/media/thumbs/2004/2004-01-04-01.jpg',
year: '2001-2005',
search: null,
search: '2001, 2004, British Columbia',
},
],
}
Expand Down
76 changes: 76 additions & 0 deletions next/src/lib/__tests__/search.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,80 @@ describe('Search hook', () => {
expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords)
})
})

describe('Numbers and alphabet', () => {
test('Sort by count for years', () => {
const keywordYear1 = '1999'
const keywordYear23 = '2023'
const keywordYear22 = '2022'
const actual = indexKeywords([{
...mockItem,
search: keywordYear23,
}, {
...mockItem,
search: keywordYear1,
}, {
...mockItem,
search: keywordYear23,
}, {
...mockItem,
search: keywordYear1,
}, {
...mockItem,
search: keywordYear1,
}, {
...mockItem,
search: keywordYear22,
}, {
...mockItem,
search: keywordYear22,
}, {
...mockItem,
search: keywordYear22,
}, {
...mockItem,
search: keywordYear23,
}])
const expected = {
indexedKeywords: [
{ label: `${keywordYear23} (3)`, value: keywordYear23 },
{ label: `${keywordYear22} (3)`, value: keywordYear22 },
{ label: `${keywordYear1} (3)`, value: keywordYear1 },
],
}
expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords)
})

test('Year latest, then asc', () => {
const keywordYear1 = '1999'
const keywordYear2 = '2023'
const keywordAlpha = 'Apple'
const keywordBeta = 'Banana'
const actual = indexKeywords([{
...mockItem,
search: keywordAlpha,
}, {
...mockItem,
search: keywordYear1,
}, {
...mockItem,
search: keywordBeta,
}, {
...mockItem,
search: keywordAlpha,
}, {
...mockItem,
search: keywordYear2,
}])
const expected = {
indexedKeywords: [
{ label: `${keywordAlpha} (2)`, value: keywordAlpha },
{ label: `${keywordYear2} (1)`, value: keywordYear2 },
{ label: `${keywordYear1} (1)`, value: keywordYear1 },
{ label: `${keywordBeta} (1)`, value: keywordBeta },
],
}
expect(actual.indexedKeywords).toStrictEqual(expected.indexedKeywords)
})
})
})
26 changes: 17 additions & 9 deletions next/src/lib/search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,26 @@ function indexKeywords(items: { search: Item['search'] | GalleryAlbum['search']
return out
}, {} as Record<string, number>)

const sortedKeywords = Object.fromEntries(
Object.entries(summedKeywords).sort(([, a], [, b]) => {
if (b < a) return -1
if (a < b) return 1
return 0
}),
)
function isNum(n: string) {
return Number.isFinite(Number(n))
}

const sortedKeywords = Object.entries(summedKeywords).sort(([nameA, numA], [nameB, numB]) => {
if (numB - numA !== 0) {
return numB - numA
}

if (isNum(nameA) && isNum(nameB)) {
return Number(nameB) - Number(nameA)
}

return nameA.localeCompare(nameB)
})

// prepare for react-select in useSearch custom hook
return {
indexedKeywords: Object.keys(sortedKeywords).map((key) => ({
label: `${key} (${sortedKeywords[key]})`,
indexedKeywords: sortedKeywords.map(([key, count]) => ({
label: `${key} (${count})`,
value: key,
})),
}
Expand Down

0 comments on commit a538734

Please sign in to comment.