Improve library manga sorting (#1051)

* Improve library manga sorting

* Update CHANGELOG.md

* Revert unread count sort change
This commit is contained in:
Bartu Özen
2026-01-10 18:44:01 +03:00
committed by GitHub
parent 9642c85007
commit f7f1a15e7e
2 changed files with 33 additions and 31 deletions

View File

@@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- (**Theme**) Improve automatic theme background colors - (**Theme**) Improve automatic theme background colors
- (**Theme**) Adjust "primary color" of dynamic color theme on manga pages - (**Theme**) Adjust "primary color" of dynamic color theme on manga pages
- (**Theme**) Increase max length of custom theme names to 32 (previously 16) - (**Theme**) Increase max length of custom theme names to 32 (previously 16)
- (**Library**) Improve library manga sorting
### Fixed ### Fixed
- (**Library**) Fix total library size chip color in light mode - (**Library**) Fix total library size chip color in light mode

View File

@@ -161,7 +161,7 @@ const filterMangas = <Manga extends TMangasFilter>(
const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number(a) - Number(b); const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number(a) - Number(b);
const sortByString = (a: string, b: string): number => a.localeCompare(b); const sortByString = (a: string, b: string): number => a.localeCompare(b, undefined, { sensitivity: 'base' });
type TMangaSort = Pick<MangaType, 'title' | 'inLibraryAt' | 'unreadCount'> & type TMangaSort = Pick<MangaType, 'title' | 'inLibraryAt' | 'unreadCount'> &
MangaChapterCountInfo & { MangaChapterCountInfo & {
@@ -176,37 +176,38 @@ const sortManga = <Manga extends TMangaSort>(
): Manga[] => { ): Manga[] => {
const result = [...manga]; const result = [...manga];
switch (sort) { const primaryComparator = ((): ((a: Manga, b: Manga) => number) => {
case 'alphabetically': switch (sort) {
result.sort((a, b) => sortByString(a.title, b.title)); case 'alphabetically':
break; return (a, b) => sortByString(a.title, b.title);
case 'dateAdded': case 'dateAdded':
result.sort((a, b) => sortByNumber(a.inLibraryAt, b.inLibraryAt)); return (a, b) => sortByNumber(a.inLibraryAt, b.inLibraryAt);
break; case 'unreadChapters':
case 'unreadChapters': return (a, b) => sortByNumber(a.unreadCount, b.unreadCount);
result.sort((a, b) => sortByNumber(a.unreadCount, b.unreadCount)); case 'lastRead':
break; return (a, b) => sortByNumber(a.lastReadChapter?.lastReadAt, b.lastReadChapter?.lastReadAt);
case 'lastRead': case 'latestUploadedChapter':
result.sort((a, b) => sortByNumber(a.lastReadChapter?.lastReadAt, b.lastReadChapter?.lastReadAt)); return (a, b) => sortByNumber(a.latestUploadedChapter?.uploadDate, b.latestUploadedChapter?.uploadDate);
break; case 'latestFetchedChapter':
case 'latestUploadedChapter': return (a, b) => sortByNumber(a.latestFetchedChapter?.fetchedAt, b.latestFetchedChapter?.fetchedAt);
result.sort((a, b) => case 'totalChapters':
sortByNumber(a.latestUploadedChapter?.uploadDate, b.latestUploadedChapter?.uploadDate), return (a, b) => sortByNumber(a.chapters.totalCount, b.chapters.totalCount);
); default:
break; return () => 0;
case 'latestFetchedChapter': }
result.sort((a, b) => sortByNumber(a.latestFetchedChapter?.fetchedAt, b.latestFetchedChapter?.fetchedAt)); })();
break;
case 'totalChapters':
result.sort((a, b) => sortByNumber(a.chapters.totalCount, b.chapters.totalCount));
break;
default:
break;
}
if (desc) { result.sort((a, b) => {
result.reverse(); const cmp = primaryComparator(a, b);
} if (cmp !== 0) {
if (desc) {
return -cmp;
}
return cmp;
}
return sortByString(a.title, b.title);
});
return result; return result;
}; };