diff --git a/public/locales/en.json b/public/locales/en.json index 950ce3c9..65345ac4 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -514,6 +514,7 @@ "by_last_read": "Recently read", "by_latest_fetched_chapter": "Latest fetched chapter", "by_latest_uploaded_chapter": "Latest uploaded chapter", + "by_total_chapters": "Total chapters", "by_unread_chapters": "Unread chapters" } } @@ -707,10 +708,10 @@ "status": { "cancelled": "Cancelled", "completed": "Completed", - "publishing_finished": "Publishing finished", "hiatus": "Hiatus", "licensed": "Licensed", "ongoing": "Ongoing", + "publishing_finished": "Publishing finished", "unknown": "$t(global.label.unknown)" }, "title_one": "Manga", diff --git a/src/components/context/LibraryOptionsContext.tsx b/src/components/context/LibraryOptionsContext.tsx index c2e9d706..56670a3f 100644 --- a/src/components/context/LibraryOptionsContext.tsx +++ b/src/components/context/LibraryOptionsContext.tsx @@ -21,22 +21,26 @@ export enum GridLayout { } export const DefaultLibraryOptions: LibraryOptions = { + // display options showContinueReadingButton: false, showDownloadBadge: false, showUnreadBadge: false, gridLayout: GridLayout.Compact, SourcegridLayout: GridLayout.Compact, - downloaded: undefined, - bookmarked: undefined, + showTabSize: false, + + // sort options sortDesc: undefined, sorts: undefined, + + // filter options + downloaded: undefined, + bookmarked: undefined, unread: undefined, hasDuplicateChapters: undefined, tracker: {}, status: {} as LibraryOptions['status'], - - showTabSize: false, }; export const LibraryOptionsContext = React.createContext({ diff --git a/src/components/library/LibraryOptionsPanel.tsx b/src/components/library/LibraryOptionsPanel.tsx index 6e3c7125..4fa3a60b 100644 --- a/src/components/library/LibraryOptionsPanel.tsx +++ b/src/components/library/LibraryOptionsPanel.tsx @@ -31,6 +31,7 @@ const TITLES: { [key in 'filter' | 'sort' | 'display']: TranslationKey } = { const SORT_OPTIONS: [LibrarySortMode, TranslationKey][] = [ ['sortToRead', 'library.option.sort.label.by_unread_chapters'], + ['sortTotalChapters', 'library.option.sort.label.by_total_chapters'], ['sortAlph', 'library.option.sort.label.alphabetically'], ['sortDateAdded', 'library.option.sort.label.by_date_added'], ['sortLastRead', 'library.option.sort.label.by_last_read'], diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index be2b66db..19c64d61 100644 --- a/src/components/library/useGetVisibleLibraryMangas.ts +++ b/src/components/library/useGetVisibleLibraryMangas.ts @@ -12,7 +12,7 @@ import { LibraryOptions, LibrarySortMode, NullAndUndefined } from '@/typings.ts' import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsContext.tsx'; import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { ChapterType, MangaType, SourceType, TrackRecordType } from '@/lib/graphql/generated/graphql.ts'; -import { MangaIdInfo } from '@/lib/data/Mangas.ts'; +import { MangaChapterCountInfo, MangaIdInfo } from '@/lib/data/Mangas.ts'; import { enhancedCleanup } from '@/lib/data/Strings.ts'; const triStateFilter = ( @@ -136,11 +136,12 @@ const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number( const sortByString = (a: string, b: string): number => a.localeCompare(b); -type TMangaSort = Pick & { - lastReadChapter?: Pick | null; - latestUploadedChapter?: Pick | null; - latestFetchedChapter?: Pick | null; -}; +type TMangaSort = Pick & + MangaChapterCountInfo & { + lastReadChapter?: Pick | null; + latestUploadedChapter?: Pick | null; + latestFetchedChapter?: Pick | null; + }; const sortManga = ( manga: Manga[], sort: NullAndUndefined, @@ -169,6 +170,9 @@ const sortManga = ( case 'sortLatestFetchedChapter': result.sort((a, b) => sortByNumber(a.latestFetchedChapter?.fetchedAt, b.latestFetchedChapter?.fetchedAt)); break; + case 'sortTotalChapters': + result.sort((a, b) => sortByNumber(a.chapters.totalCount, b.chapters.totalCount)); + break; default: break; } diff --git a/src/typings.ts b/src/typings.ts index 361d1715..aadbc095 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -257,7 +257,8 @@ export type LibrarySortMode = | 'sortDateAdded' | 'sortLastRead' | 'sortLatestFetchedChapter' - | 'sortLatestUploadedChapter'; + | 'sortLatestUploadedChapter' + | 'sortTotalChapters'; enum GridLayout { Compact = 0, @@ -273,13 +274,15 @@ export interface LibraryOptions { gridLayout: GridLayout; SourcegridLayout: GridLayout; + // sort options + sorts: NullAndUndefined; + sortDesc: NullAndUndefined; + // filter options downloaded: NullAndUndefined; bookmarked: NullAndUndefined; unread: NullAndUndefined; hasDuplicateChapters: NullAndUndefined; - sorts: NullAndUndefined; - sortDesc: NullAndUndefined; showTabSize: boolean; tracker: Record>; status: Record>;