From 1c9c09628acac95e0dcae4968ef86316dc3bd7a4 Mon Sep 17 00:00:00 2001 From: "aditya.chandel" Date: Wed, 2 Jul 2025 23:12:43 -0600 Subject: [PATCH] Display first book in series when collapsed --- .github/release-drafter.yml | 4 +- .../filters/SeriesCollapseFilter.ts | 38 +++++++++++++------ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 5ba79c34..f43bbd6e 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -2,9 +2,11 @@ name-template: 'v$NEXT_PATCH_VERSION 🌟' tag-template: 'v$NEXT_PATCH_VERSION' categories: - - title: '🚀 Features' + - title: '🚀 New Features' labels: - 'feature' + - title: '✨ Enhancements' + labels: - 'enhancement' - title: '🐛 Bug Fixes' labels: diff --git a/booklore-ui/src/app/book/components/book-browser/filters/SeriesCollapseFilter.ts b/booklore-ui/src/app/book/components/book-browser/filters/SeriesCollapseFilter.ts index a32acd81..a6cd7bc9 100644 --- a/booklore-ui/src/app/book/components/book-browser/filters/SeriesCollapseFilter.ts +++ b/booklore-ui/src/app/book/components/book-browser/filters/SeriesCollapseFilter.ts @@ -49,24 +49,38 @@ export class SeriesCollapseFilter implements BookFilter { map(isCollapsed => { if (!isCollapsed || !bookState.books) return bookState; - const seenSeries = new Set(); + const books = [...bookState.books]; + + const seriesMap = new Map(); const collapsedBooks: Book[] = []; - for (const book of bookState.books) { - const name = book.metadata?.seriesName?.trim(); - if (name && !seenSeries.has(name)) { - const count = bookState.books.filter(b => b.metadata?.seriesName?.trim() === name).length; - collapsedBooks.push({ - ...book, - seriesCount: count, - }); - seenSeries.add(name); - } else if (!name) { + for (const book of books) { + const seriesName = book.metadata?.seriesName?.trim(); + if (seriesName) { + if (!seriesMap.has(seriesName)) { + seriesMap.set(seriesName, []); + } + seriesMap.get(seriesName)!.push(book); + } else { collapsedBooks.push(book); } } + + for (const [seriesName, group] of seriesMap.entries()) { + const sortedGroup = group.slice().sort((a, b) => { + const aNum = a.metadata?.seriesNumber ?? Number.MAX_VALUE; + const bNum = b.metadata?.seriesNumber ?? Number.MAX_VALUE; + return aNum - bNum; + }); - return {...bookState, books: collapsedBooks}; + const firstBook = sortedGroup[0]; + collapsedBooks.push({ + ...firstBook, + seriesCount: group.length + }); + } + + return { ...bookState, books: collapsedBooks }; }) ); }