feat(ui): planlı işlemler sayfası, kural formu ve vadesi geçmiş uyarısı

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 10:55:05 +03:00
parent 04a17d2775
commit cfc2b2c974
8 changed files with 1187 additions and 5 deletions
+4
View File
@@ -3,6 +3,7 @@ import { Suspense } from "react";
import { PageHeader } from "@/components/page-header";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { SummaryCardsSkeleton } from "@/features/dashboard/components/summary-cards-skeleton";
import { OverdueBanner } from "@/features/recurring/components/overdue-banner";
import { tr } from "@/i18n/tr";
import { requireActiveHousehold } from "@/lib/dal";
import { cn } from "@/lib/utils";
@@ -59,6 +60,9 @@ export default async function DashboardPage() {
title={tr.dashboard.welcome(user.name.split(" ")[0] ?? user.name)}
description={`${household.name} · ${tr.dashboard.welcomeDescription}`}
/>
<Suspense fallback={null}>
<OverdueBanner userId={user.id} householdId={household.id} />
</Suspense>
<Suspense fallback={<SummaryCardsSkeleton />}>
<SummaryCards />
</Suspense>
+22
View File
@@ -0,0 +1,22 @@
import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { PageHeader } from "@/components/page-header";
import { hasHouseholdRole } from "@/features/households/roles";
import { PlannedView } from "@/features/recurring/components/planned-view";
import { getPlannedOverview } from "@/features/recurring/service";
import { tr } from "@/i18n/tr";
import { requireActiveHousehold } from "@/lib/dal";
export const metadata: Metadata = { title: tr.recurring.title };
export default async function PlannedPage() {
const { user, household } = await requireActiveHousehold("viewer");
const data = await getPlannedOverview(user.id, household.id);
if (!data) notFound();
return (
<>
<PageHeader title={tr.recurring.title} description={tr.recurring.description} />
<PlannedView data={data} canWrite={hasHouseholdRole(household.role, "member")} />
</>
);
}