diff --git a/src/components/library/PaginatedSeriesGrid.tsx b/src/components/library/PaginatedSeriesGrid.tsx index e0af2c4..3238f0d 100644 --- a/src/components/library/PaginatedSeriesGrid.tsx +++ b/src/components/library/PaginatedSeriesGrid.tsx @@ -1,6 +1,7 @@ "use client"; import { SeriesGrid } from "./SeriesGrid"; +import { SeriesList } from "./SeriesList"; import { Pagination } from "@/components/ui/Pagination"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { useState, useEffect, useCallback } from "react"; @@ -10,6 +11,7 @@ import { useTranslate } from "@/hooks/useTranslate"; import { useDisplayPreferences } from "@/hooks/useDisplayPreferences"; import { PageSizeSelect } from "@/components/common/PageSizeSelect"; import { CompactModeButton } from "@/components/common/CompactModeButton"; +import { ViewModeButton } from "@/components/common/ViewModeButton"; import { UnreadFilterButton } from "@/components/common/UnreadFilterButton"; interface PaginatedSeriesGridProps { @@ -35,7 +37,7 @@ export function PaginatedSeriesGrid({ const pathname = usePathname(); const searchParams = useSearchParams(); const [showOnlyUnread, setShowOnlyUnread] = useState(initialShowOnlyUnread); - const { isCompact, itemsPerPage: displayItemsPerPage } = useDisplayPreferences(); + const { isCompact, itemsPerPage: displayItemsPerPage, viewMode } = useDisplayPreferences(); // Utiliser la taille de page effective (depuis l'URL ou les préférences) const effectivePageSize = pageSize || displayItemsPerPage; @@ -119,13 +121,18 @@ export function PaginatedSeriesGrid({
diff --git a/src/components/library/SeriesList.tsx b/src/components/library/SeriesList.tsx new file mode 100644 index 0000000..9d5af38 --- /dev/null +++ b/src/components/library/SeriesList.tsx @@ -0,0 +1,193 @@ +"use client"; + +import type { KomgaSeries } from "@/types/komga"; +import { SeriesCover } from "@/components/ui/series-cover"; +import { useRouter } from "next/navigation"; +import { useTranslate } from "@/hooks/useTranslate"; +import { cn } from "@/lib/utils"; +import { Progress } from "@/components/ui/progress"; +import { BookOpen, Calendar, Tag, User } from "lucide-react"; +import { formatDate } from "@/lib/utils"; + +interface SeriesListProps { + series: KomgaSeries[]; +} + +interface SeriesListItemProps { + series: KomgaSeries; +} + +// Utility function to get reading status info +const getReadingStatusInfo = (series: KomgaSeries, t: (key: string, options?: any) => string) => { + if (series.booksCount === 0) { + return { + label: t("series.status.noBooks"), + className: "bg-yellow-500/10 text-yellow-500", + }; + } + + if (series.booksCount === series.booksReadCount) { + return { + label: t("series.status.read"), + className: "bg-green-500/10 text-green-500", + }; + } + + if (series.booksReadCount > 0) { + return { + label: t("series.status.progress", { + read: series.booksReadCount, + total: series.booksCount, + }), + className: "bg-blue-500/10 text-blue-500", + }; + } + + return { + label: t("series.status.unread"), + className: "bg-yellow-500/10 text-yellow-500", + }; +}; + +function SeriesListItem({ series }: SeriesListItemProps) { + const router = useRouter(); + const { t } = useTranslate(); + + const handleClick = () => { + router.push(`/series/${series.id}`); + }; + + const isCompleted = series.booksCount === series.booksReadCount; + const progressPercentage = series.booksCount > 0 + ? (series.booksReadCount / series.booksCount) * 100 + : 0; + + const statusInfo = getReadingStatusInfo(series, t); + + return ( +
+ {series.metadata.summary} +
+ )} + + {/* Métadonnées */} ++ {Math.round(progressPercentage)}% {t("series.completed")} +
+{t("series.empty")}
+