From a0aec13b8c1ed264a17b980f81f4a15f1eb351d2 Mon Sep 17 00:00:00 2001 From: kovakmedya Date: Thu, 7 May 2026 19:47:50 +0300 Subject: [PATCH] =?UTF-8?q?feat(calendar):=20g=C3=B6revleri=20takvimde=20g?= =?UTF-8?q?=C3=B6ster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bitiş tarihi olan ve done olmayan görevler takvimde turuncu pill olarak gösteriliyor - Göreve tıklamak /tasks sayfasına yönlendiriyor, etkinlik formu açmıyor - COLOR_BG'ye 'task' rengi eklendi (orange) --- .../calendar/components/calendar-client.tsx | 63 ++++++++++++------- .../(dashboard)/calendar/components/types.ts | 3 + src/app/(dashboard)/calendar/page.tsx | 45 +++++++++---- 3 files changed, 76 insertions(+), 35 deletions(-) diff --git a/src/app/(dashboard)/calendar/components/calendar-client.tsx b/src/app/(dashboard)/calendar/components/calendar-client.tsx index 0fb01ab..39f628c 100644 --- a/src/app/(dashboard)/calendar/components/calendar-client.tsx +++ b/src/app/(dashboard)/calendar/components/calendar-client.tsx @@ -1,7 +1,8 @@ "use client"; +import Link from "next/link"; import { useMemo, useState, useTransition } from "react"; -import { ChevronLeft, ChevronRight, Loader2, Plus, Trash2 } from "lucide-react"; +import { ChevronLeft, ChevronRight, Loader2, Plus, SquareCheckBig, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; @@ -98,6 +99,7 @@ export function CalendarClient({ events, customers }: Props) { }; const handleEdit = (event: EventRow) => { + if (event.source === "task") return; setEditing(event); setDefaultDate(undefined); setFormOpen(true); @@ -186,28 +188,43 @@ export function CalendarClient({ events, customers }: Props) {
- {dayEvents.slice(0, 3).map((e) => ( - - ))} + {dayEvents.slice(0, 3).map((e) => + e.source === "task" ? ( + + + {e.title} + + ) : ( + + ), + )} {dayEvents.length > 3 && ( +{dayEvents.length - 3} daha diff --git a/src/app/(dashboard)/calendar/components/types.ts b/src/app/(dashboard)/calendar/components/types.ts index 00e2500..ad9dc07 100644 --- a/src/app/(dashboard)/calendar/components/types.ts +++ b/src/app/(dashboard)/calendar/components/types.ts @@ -8,6 +8,8 @@ export type EventRow = { customerId: string; customerName: string; color: string; + source?: "event" | "task"; + taskStatus?: string; }; export type Customer = { id: string; name: string }; @@ -28,5 +30,6 @@ export const COLOR_BG: Record = { red: "bg-red-500/15 text-red-700 dark:text-red-300 border-red-500/30", violet: "bg-violet-500/15 text-violet-700 dark:text-violet-300 border-violet-500/30", slate: "bg-slate-500/15 text-slate-700 dark:text-slate-300 border-slate-500/30", + task: "bg-orange-500/15 text-orange-700 dark:text-orange-300 border-orange-500/30", "": "bg-primary/10 text-primary border-primary/20", }; diff --git a/src/app/(dashboard)/calendar/page.tsx b/src/app/(dashboard)/calendar/page.tsx index 1c83afa..0dc3d11 100644 --- a/src/app/(dashboard)/calendar/page.tsx +++ b/src/app/(dashboard)/calendar/page.tsx @@ -3,6 +3,7 @@ import { redirect } from "next/navigation"; import { listCalendarEvents } from "@/lib/appwrite/calendar-queries"; import { listCustomers } from "@/lib/appwrite/customer-queries"; +import { listTasks } from "@/lib/appwrite/task-queries"; import { requireTenant } from "@/lib/appwrite/tenant-guard"; import { CalendarClient } from "./components/calendar-client"; @@ -18,13 +19,43 @@ export default async function CalendarPage() { redirect("/onboarding"); } - const [events, customers] = await Promise.all([ + const [events, customers, tasks] = await Promise.all([ listCalendarEvents(ctx.tenantId), listCustomers(ctx.tenantId), + listTasks(ctx.tenantId), ]); const customerMap = new Map(customers.map((c) => [c.$id, c.name])); + const mappedEvents = events.map((e) => ({ + id: e.$id, + title: e.title, + description: e.description ?? "", + start: e.start, + end: e.end, + allDay: Boolean(e.allDay), + customerId: e.customerId ?? "", + customerName: e.customerId ? customerMap.get(e.customerId) ?? "" : "", + color: e.color ?? "", + source: "event" as const, + })); + + const mappedTasks = tasks + .filter((t) => t.dueDate && t.status !== "done") + .map((t) => ({ + id: t.$id, + title: t.title, + description: t.description ?? "", + start: t.dueDate!, + end: t.dueDate!, + allDay: true, + customerId: "", + customerName: "", + color: "task", + source: "task" as const, + taskStatus: t.status, + })); + return (
@@ -36,17 +67,7 @@ export default async function CalendarPage() {
({ - id: e.$id, - title: e.title, - description: e.description ?? "", - start: e.start, - end: e.end, - allDay: Boolean(e.allDay), - customerId: e.customerId ?? "", - customerName: e.customerId ? customerMap.get(e.customerId) ?? "" : "", - color: e.color ?? "", - }))} + events={[...mappedEvents, ...mappedTasks]} customers={customers.map((c) => ({ id: c.$id, name: c.name }))} />