From 2e209e9f1ab1571d2333504da59f097fd4844089 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 29 Mar 2025 15:25:47 -0700 Subject: feat(Anime): Add additional sort options --- src/lib/Data/AniList/media.ts | 6 +++-- src/lib/List/Anime/CompletedAnimeList.svelte | 28 +++++++++++++++++++--- src/lib/List/Anime/DueAnimeList.svelte | 35 ++++++++++++++++++++-------- src/lib/Settings/Categories/Display.svelte | 17 +++++++------- src/stores/settings.ts | 4 ++-- 5 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/lib/Data/AniList/media.ts b/src/lib/Data/AniList/media.ts index b9e70a7d..c032edaa 100644 --- a/src/lib/Data/AniList/media.ts +++ b/src/lib/Data/AniList/media.ts @@ -78,9 +78,11 @@ export interface Media { }; startDate: { year: number; + month: number; }; endDate: { year: number; + month: number; }; coverImage: { extraLarge: string; @@ -154,8 +156,8 @@ const collectionQueryTemplate = (type: Type, userId: number, options: Collection progress progressVolumes status repeat createdAt updatedAt score(format: POINT_100) startedAt { year month day } completedAt { year month day } } - startDate { year } - endDate { year } + startDate { year month } + endDate { year month } coverImage { extraLarge medium } ${ options.includeRelations diff --git a/src/lib/List/Anime/CompletedAnimeList.svelte b/src/lib/List/Anime/CompletedAnimeList.svelte index 76ec7207..1fa775c4 100644 --- a/src/lib/List/Anime/CompletedAnimeList.svelte +++ b/src/lib/List/Anime/CompletedAnimeList.svelte @@ -85,10 +85,32 @@ ); outdatedCompletedAnime.sort((a: Media, b: Media) => { - const difference = (anime: Media) => - anime.episodes - (anime.mediaListEntry || { progress: 0 }).progress; + switch ($settings.displayAnimeSort) { + case 'difference': { + const difference = (anime: Media) => + (anime.nextAiringEpisode?.episode === -1 + ? 99999 + : anime.nextAiringEpisode?.episode || -1) - + (anime.mediaListEntry || { progress: 0 }).progress; - return difference(a) - difference(b); + return difference(a) - difference(b); + } + + case 'end_date': + return ( + new Date(a.endDate.year, a.endDate.month - 1).getTime() - + new Date(b.endDate.year, b.endDate.month - 1).getTime() + ); + + case 'start_date': + return ( + new Date(a.startDate.year, a.startDate.month - 1).getTime() - + new Date(b.startDate.year, b.startDate.month - 1).getTime() + ); + + case 'time_remaining': + return (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999); + } }); if (!endTime) endTime = performance.now() - startTime; diff --git a/src/lib/List/Anime/DueAnimeList.svelte b/src/lib/List/Anime/DueAnimeList.svelte index 1453baeb..8650590b 100644 --- a/src/lib/List/Anime/DueAnimeList.svelte +++ b/src/lib/List/Anime/DueAnimeList.svelte @@ -73,16 +73,31 @@ dueAnime = dueAnime.filter((media: Media) => media.nextAiringEpisode?.episode !== -1); dueAnime.sort((a: Media, b: Media) => { - if ($settings.displaySortedByDifference === true) { - const difference = (anime: Media) => - (anime.nextAiringEpisode?.episode === -1 - ? 99999 - : anime.nextAiringEpisode?.episode || -1) - - (anime.mediaListEntry || { progress: 0 }).progress; - - return difference(a) - difference(b); - } else { - return (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999); + switch ($settings.displayAnimeSort) { + case 'difference': { + const difference = (anime: Media) => + (anime.nextAiringEpisode?.episode === -1 + ? 99999 + : anime.nextAiringEpisode?.episode || -1) - + (anime.mediaListEntry || { progress: 0 }).progress; + + return difference(a) - difference(b); + } + + case 'end_date': + return ( + new Date(a.endDate.year, a.endDate.month - 1).getTime() - + new Date(b.endDate.year, b.endDate.month - 1).getTime() + ); + + case 'start_date': + return ( + new Date(a.startDate.year, a.startDate.month - 1).getTime() - + new Date(b.startDate.year, b.startDate.month - 1).getTime() + ); + + case 'time_remaining': + return (a.nextAiringEpisode?.airingAt || 9999) - (b.nextAiringEpisode?.airingAt || 9999); } }); diff --git a/src/lib/Settings/Categories/Display.svelte b/src/lib/Settings/Categories/Display.svelte index e47bf2ae..a2803d98 100644 --- a/src/lib/Settings/Categories/Display.svelte +++ b/src/lib/Settings/Categories/Display.svelte @@ -316,16 +316,15 @@

List sort
- + +Anime sort order
- - - {$locale().settings.display.categories.media.fields.sortBy.hint} - - +
{$locale().settings.display.categories.media.title}
diff --git a/src/stores/settings.ts b/src/stores/settings.ts index 4ccb5ca0..df2691b5 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -16,7 +16,6 @@ export interface Settings { displayNotStarted: boolean; displayUnresolved: boolean; calculateChaptersRoundedDown: boolean; - displaySortedByDifference: boolean; displayOutboundLinksTo: 'anilist' | 'livechartme' | 'animeschedule' | 'myanimelist'; displayPausedMedia: boolean; displayLimitListHeight: boolean; @@ -68,6 +67,7 @@ export interface Settings { debugDummyLists: boolean; displayScheduleFilterList: boolean; displayReverseSort: boolean; + displayAnimeSort: 'difference' | 'start_date' | 'end_date' | 'time_remaining'; } const defaultSettings: Settings = { @@ -85,7 +85,6 @@ const defaultSettings: Settings = { displayUpcomingAnimeCollapsed: false, displayAnimeCollapsed: false, displayMangaCollapsed: false, - displaySortedByDifference: false, displayAoButa: 'none', disableManga: false, disableAnime: false, @@ -112,6 +111,7 @@ const defaultSettings: Settings = { displayDataSaver: false, displayScheduleFilterList: false, displayReverseSort: false, + displayAnimeSort: 'time_remaining', // Debug debugDummyLists: false, -- cgit v1.2.3