feat: add reading stats and replace dashboard charts with recharts

Add currently reading, recently read, and reading activity sections to
the dashboard. Replace all custom SVG/CSS charts with recharts library
(donut, area, stacked bar, horizontal bar). Reorganize layout: libraries
and popular series side by side, books added chart full width below.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-22 06:26:45 +01:00
parent 766e3a01b2
commit 08f0397029
8 changed files with 901 additions and 177 deletions

View File

@@ -550,9 +550,32 @@ export type MetadataStats = {
by_provider: ProviderCount[];
};
export type CurrentlyReadingItem = {
book_id: string;
title: string;
series: string | null;
current_page: number;
page_count: number;
};
export type RecentlyReadItem = {
book_id: string;
title: string;
series: string | null;
last_read_at: string;
};
export type MonthlyReading = {
month: string;
books_read: number;
};
export type StatsResponse = {
overview: StatsOverview;
reading_status: ReadingStatusStats;
currently_reading: CurrentlyReadingItem[];
recently_read: RecentlyReadItem[];
reading_over_time: MonthlyReading[];
by_format: FormatCount[];
by_language: LanguageCount[];
by_library: LibraryStatsItem[];

View File

@@ -82,6 +82,12 @@ const en: Record<TranslationKey, string> = {
"dashboard.bookMetadata": "Book metadata",
"dashboard.withSummary": "With summary",
"dashboard.withIsbn": "With ISBN",
"dashboard.currentlyReading": "Currently reading",
"dashboard.recentlyRead": "Recently read",
"dashboard.readingActivity": "Reading activity (last 12 months)",
"dashboard.pageProgress": "p. {{current}} / {{total}}",
"dashboard.noCurrentlyReading": "No books in progress",
"dashboard.noRecentlyRead": "No books read recently",
// Books page
"books.title": "Books",

View File

@@ -80,6 +80,12 @@ const fr = {
"dashboard.bookMetadata": "Métadonnées livres",
"dashboard.withSummary": "Avec résumé",
"dashboard.withIsbn": "Avec ISBN",
"dashboard.currentlyReading": "En cours de lecture",
"dashboard.recentlyRead": "Derniers livres lus",
"dashboard.readingActivity": "Activité de lecture (12 derniers mois)",
"dashboard.pageProgress": "p. {{current}} / {{total}}",
"dashboard.noCurrentlyReading": "Aucun livre en cours",
"dashboard.noRecentlyRead": "Aucun livre lu récemment",
// Books page
"books.title": "Livres",