feat: complete Phase 3 — advanced features for Casera web app
Adds sharing (residence share codes, join, user management, .casera file export/import), subscription status with feature comparison, notification preferences with bell icon, profile settings (edit info, change password, theme picker, delete account), onboarding wizard with create/join paths, enhanced dashboard with stats cards, Recharts completion chart, recent activity feed, and task report PDF download. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import Link from "next/link";
|
||||
import { MapPin } from "lucide-react";
|
||||
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import type { MyResidenceResponse } from "@/lib/api/residences";
|
||||
|
||||
interface ResidenceCardProps {
|
||||
data: MyResidenceResponse;
|
||||
}
|
||||
|
||||
export function ResidenceCard({ data }: ResidenceCardProps) {
|
||||
const { residence, task_summary } = data;
|
||||
|
||||
const address = [residence.street_address, residence.city, residence.state_province]
|
||||
.filter(Boolean)
|
||||
.join(", ");
|
||||
|
||||
return (
|
||||
<Link href={`/app/residences/${residence.id}`} className="block">
|
||||
<Card className="transition-colors hover:border-primary/40">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-base">{residence.name}</CardTitle>
|
||||
{address && (
|
||||
<div className="flex items-center gap-1.5 text-sm text-muted-foreground">
|
||||
<MapPin className="size-3.5 shrink-0" />
|
||||
<span className="truncate">{address}</span>
|
||||
</div>
|
||||
)}
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{task_summary.overdue > 0 && (
|
||||
<Badge variant="destructive">
|
||||
{task_summary.overdue} overdue
|
||||
</Badge>
|
||||
)}
|
||||
{task_summary.due_soon > 0 && (
|
||||
<Badge variant="secondary">
|
||||
{task_summary.due_soon} due soon
|
||||
</Badge>
|
||||
)}
|
||||
<Badge variant="outline">
|
||||
{task_summary.total} {task_summary.total === 1 ? "task" : "tasks"}
|
||||
</Badge>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user