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];
const primaryComparator = ((): ((a: Manga, b: Manga) => number) => {
switch (sort) { switch (sort) {
case 'alphabetically': case 'alphabetically':
result.sort((a, b) => sortByString(a.title, b.title)); return (a, b) => sortByString(a.title, b.title);
break;
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':
result.sort((a, b) => sortByNumber(a.unreadCount, b.unreadCount)); return (a, b) => sortByNumber(a.unreadCount, b.unreadCount);
break;
case 'lastRead': case 'lastRead':
result.sort((a, b) => sortByNumber(a.lastReadChapter?.lastReadAt, b.lastReadChapter?.lastReadAt)); return (a, b) => sortByNumber(a.lastReadChapter?.lastReadAt, b.lastReadChapter?.lastReadAt);
break;
case 'latestUploadedChapter': case 'latestUploadedChapter':
result.sort((a, b) => return (a, b) => sortByNumber(a.latestUploadedChapter?.uploadDate, b.latestUploadedChapter?.uploadDate);
sortByNumber(a.latestUploadedChapter?.uploadDate, b.latestUploadedChapter?.uploadDate),
);
break;
case 'latestFetchedChapter': case 'latestFetchedChapter':
result.sort((a, b) => sortByNumber(a.latestFetchedChapter?.fetchedAt, b.latestFetchedChapter?.fetchedAt)); return (a, b) => sortByNumber(a.latestFetchedChapter?.fetchedAt, b.latestFetchedChapter?.fetchedAt);
break;
case 'totalChapters': case 'totalChapters':
result.sort((a, b) => sortByNumber(a.chapters.totalCount, b.chapters.totalCount)); return (a, b) => sortByNumber(a.chapters.totalCount, b.chapters.totalCount);
break;
default: default:
break; return () => 0;
}
})();
result.sort((a, b) => {
const cmp = primaryComparator(a, b);
if (cmp !== 0) {
if (desc) {
return -cmp;
}
return cmp;
} }
if (desc) { return sortByString(a.title, b.title);
result.reverse(); });
}
return result; return result;
}; };