feat(ui): dashboard ana grafiği ve rapor sayfaları

- dashboard: periyot seçici ve kümülatif/dönemsel görünüm, tablo; günlük plan kartı sadeleşti
- /raporlar özet ve kategori, trend, kişi/hesap, bütçe sayfaları; ay seçici ve CSV indirme

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 00:29:25 +03:00
parent bc2a8a3bde
commit 29d7b29cfa
19 changed files with 1488 additions and 108 deletions
+6 -1
View File
@@ -3,6 +3,8 @@ import Link from "next/link";
import { Suspense } from "react";
import { PageHeader } from "@/components/page-header";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Skeleton } from "@/components/ui/skeleton";
import { OverviewCard } from "@/features/dashboard/components/overview-card";
import { SummaryCardsSkeleton } from "@/features/dashboard/components/summary-cards-skeleton";
import { DailyPlanCard } from "@/features/budgets/components/daily-plan-card";
import { BudgetWarningBanner } from "@/features/budgets/components/warning-banner";
@@ -84,7 +86,7 @@ async function SummaryCards({ userId, householdId }: { userId: string; household
);
}
export default async function DashboardPage() {
export default async function DashboardPage({ searchParams }: PageProps<"/dashboard">) {
const { user, household } = await requireActiveHousehold("viewer");
return (
<>
@@ -104,6 +106,9 @@ export default async function DashboardPage() {
<Suspense fallback={<SummaryCardsSkeleton />}>
<SummaryCards userId={user.id} householdId={household.id} />
</Suspense>
<Suspense fallback={<Skeleton className="h-96 rounded-xl" />}>
<OverviewCard userId={user.id} householdId={household.id} searchParams={searchParams} />
</Suspense>
<Suspense fallback={null}>
<DailyPlanCard userId={user.id} householdId={household.id} />
</Suspense>