From 2f17c342caeb7c63c0ca007f3a29eddb83c6a78c Mon Sep 17 00:00:00 2001 From: egecankomur Date: Tue, 5 May 2026 11:43:29 +0300 Subject: [PATCH] feat: emlak CRM iskelet kurulumu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schema.ts tamamen yeniden yazıldı (properties, customers, customer_searches, property_matches, presentations, investors, activities, tenant_settings) - Sidebar emlak modüllerine güncellendi (İlanlar, Müşteriler, Yatırımcılar, Sunumlar, Aktiviteler) - Eski CRM lib dosyaları temizlendi (finance, invoice, lead, task, software, vs.) - Yeni modül dizinleri oluşturuldu (stub pages) - command-search emlak navigasyonuna güncellendi - site-header temizlendi - Typecheck: 0 hata (chart.tsx template hariç) --- next.config.ts | 47 +- src/app/(dashboard)/activities/page.tsx | 8 + .../calendar/components/calendar-client.tsx | 259 -------- .../calendar/components/event-form-sheet.tsx | 274 -------- .../(dashboard)/calendar/components/types.ts | 32 - src/app/(dashboard)/calendar/page.tsx | 54 -- .../chat/components/chat-header.tsx | 233 ------- src/app/(dashboard)/chat/components/chat.tsx | 193 ------ .../chat/components/conversation-list-new.tsx | 221 ------- .../chat/components/conversation-list.tsx | 208 ------ .../chat/components/message-input.tsx | 225 ------- .../chat/components/message-list.tsx | 295 --------- .../(dashboard)/chat/data/conversations.json | 96 --- src/app/(dashboard)/chat/data/messages.json | 224 ------- src/app/(dashboard)/chat/data/users.json | 52 -- src/app/(dashboard)/chat/page.tsx | 53 -- src/app/(dashboard)/chat/use-chat.ts | 149 ----- .../components/customer-form-sheet.tsx | 196 ------ .../customers/components/customers-client.tsx | 314 --------- .../components/delete-customer-dialog.tsx | 76 --- .../(dashboard)/customers/components/types.ts | 11 - .../(dashboard)/customers/matches/page.tsx | 8 + src/app/(dashboard)/customers/page.tsx | 54 +- .../(dashboard)/customers/searches/page.tsx | 8 + .../dashboard/components/customer-growth.tsx | 59 -- .../dashboard/components/income-chart.tsx | 90 --- .../dashboard/components/metrics.tsx | 116 ---- .../components/recent-transactions.tsx | 82 --- .../dashboard/components/top-customers.tsx | 63 -- src/app/(dashboard)/dashboard/page.tsx | 52 +- .../(dashboard)/faqs/components/faq-list.tsx | 129 ---- .../faqs/components/features-grid.tsx | 54 -- src/app/(dashboard)/faqs/data/categories.json | 10 - src/app/(dashboard)/faqs/data/faqs.json | 278 -------- src/app/(dashboard)/faqs/data/features.json | 26 - src/app/(dashboard)/faqs/page.tsx | 16 - .../banks/components/bank-form-sheet.tsx | 162 ----- .../finance/banks/components/banks-client.tsx | 294 --------- .../finance/banks/components/types.ts | 11 - src/app/(dashboard)/finance/banks/page.tsx | 53 -- .../cards/components/card-form-sheet.tsx | 228 ------- .../finance/cards/components/cards-client.tsx | 522 --------------- .../cards/components/statement-form-sheet.tsx | 197 ------ .../finance/cards/components/types.ts | 44 -- src/app/(dashboard)/finance/cards/page.tsx | 81 --- .../finance/components/finance-client.tsx | 436 ------------ .../finance/components/finance-form-sheet.tsx | 275 -------- .../(dashboard)/finance/components/types.ts | 42 -- .../loans/components/loan-form-sheet.tsx | 257 -------- .../finance/loans/components/loans-client.tsx | 357 ---------- .../finance/loans/components/types.ts | 50 -- src/app/(dashboard)/finance/loans/page.tsx | 116 ---- src/app/(dashboard)/finance/page.tsx | 67 -- .../reports/components/report-client.tsx | 542 --------------- .../reports/components/trend-chart.tsx | 89 --- src/app/(dashboard)/finance/reports/page.tsx | 49 -- src/app/(dashboard)/investors/page.tsx | 8 + .../[id]/components/header-actions.tsx | 95 --- .../invoices/[id]/components/items-editor.tsx | 303 --------- src/app/(dashboard)/invoices/[id]/page.tsx | 134 ---- .../components/invoice-form-sheet.tsx | 194 ------ .../invoices/components/invoices-client.tsx | 372 ----------- .../(dashboard)/invoices/components/types.ts | 33 - src/app/(dashboard)/invoices/page.tsx | 56 -- src/app/(dashboard)/layout.tsx | 2 +- .../components/lead-activities-fetcher.ts | 24 - .../leads/components/lead-card.tsx | 139 ---- .../leads/components/lead-detail-sheet.tsx | 269 -------- .../leads/components/lead-form-sheet.tsx | 199 ------ .../leads/components/leads-board.tsx | 255 ------- src/app/(dashboard)/leads/components/types.ts | 72 -- src/app/(dashboard)/leads/page.tsx | 76 --- .../mail/components/account-switcher.tsx | 57 -- .../mail/components/mail-display.tsx | 191 ------ .../(dashboard)/mail/components/mail-list.tsx | 83 --- src/app/(dashboard)/mail/components/mail.tsx | 207 ------ src/app/(dashboard)/mail/components/nav.tsx | 81 --- src/app/(dashboard)/mail/data.tsx | 300 --------- src/app/(dashboard)/mail/index.tsx | 6 - src/app/(dashboard)/mail/page.tsx | 18 - src/app/(dashboard)/mail/use-mail.ts | 20 - src/app/(dashboard)/presentations/page.tsx | 8 + .../pricing/components/faq-section.tsx | 52 -- .../pricing/components/features-grid.tsx | 56 -- src/app/(dashboard)/pricing/data/faqs.json | 32 - .../(dashboard)/pricing/data/features.json | 38 -- src/app/(dashboard)/pricing/page.tsx | 295 --------- src/app/(dashboard)/properties/page.tsx | 8 + .../components/delete-service-dialog.tsx | 76 --- .../components/service-form-sheet.tsx | 350 ---------- .../services/components/services-client.tsx | 333 ---------- .../(dashboard)/services/components/types.ts | 17 - src/app/(dashboard)/services/page.tsx | 63 -- .../components/credit-card-visual.tsx | 151 ----- .../components/mock-payment-form.tsx | 379 ----------- .../billing/checkout/[orderId]/page.tsx | 70 -- .../components/billing-history-card.tsx | 47 -- .../billing/components/current-plan-card.tsx | 71 -- .../billing/data/billing-history.json | 23 - .../settings/billing/data/current-plan.json | 12 - src/app/(dashboard)/settings/billing/page.tsx | 372 ----------- src/app/(dashboard)/settings/members/page.tsx | 2 +- .../(dashboard)/settings/workspace/page.tsx | 30 +- .../components/assignment-form-sheet.tsx | 236 ------- .../software/components/software-client.tsx | 553 ---------------- .../components/software-form-sheet.tsx | 149 ----- .../(dashboard)/software/components/types.ts | 24 - src/app/(dashboard)/software/page.tsx | 65 -- .../tasks/components/task-card.tsx | 141 ---- .../tasks/components/task-form-sheet.tsx | 222 ------- .../tasks/components/tasks-board.tsx | 376 ----------- src/app/(dashboard)/tasks/components/types.ts | 49 -- src/app/(dashboard)/tasks/page.tsx | 106 --- .../users/components/data-table.tsx | 535 --------------- .../users/components/stat-cards.tsx | 82 --- .../users/components/user-form-dialog.tsx | 231 ------- src/app/(dashboard)/users/data.json | 182 ----- src/app/(dashboard)/users/page.tsx | 84 --- src/app/api/payments/polar/callback/route.ts | 107 +-- .../api/payments/shopier/callback/route.ts | 136 +--- src/app/d/[code]/page.tsx | 4 +- src/components/app-sidebar.tsx | 107 ++- src/components/billing/usage-banner.tsx | 68 -- src/components/command-search.tsx | 392 ++--------- src/components/site-header.tsx | 59 +- src/lib/appwrite/audit.ts | 6 +- src/lib/appwrite/bank-account-actions.ts | 243 ------- src/lib/appwrite/bank-account-queries.ts | 99 --- src/lib/appwrite/bank-account-types.ts | 7 - src/lib/appwrite/calendar-actions.ts | 209 ------ src/lib/appwrite/calendar-queries.ts | 28 - src/lib/appwrite/calendar-types.ts | 7 - src/lib/appwrite/credit-card-actions.ts | 504 -------------- src/lib/appwrite/credit-card-queries.ts | 74 --- src/lib/appwrite/credit-card-types.ts | 7 - src/lib/appwrite/customer-actions.ts | 203 ------ src/lib/appwrite/customer-queries.ts | 42 -- src/lib/appwrite/customer-types.ts | 8 - src/lib/appwrite/dashboard-queries.ts | 236 ------- src/lib/appwrite/finance-actions.ts | 215 ------ src/lib/appwrite/finance-queries.ts | 30 - src/lib/appwrite/finance-report-queries.ts | 401 ----------- src/lib/appwrite/finance-types.ts | 8 - src/lib/appwrite/invoice-actions.ts | 620 ------------------ src/lib/appwrite/invoice-queries.ts | 64 -- src/lib/appwrite/invoice-types.ts | 8 - src/lib/appwrite/lead-actions.ts | 291 -------- src/lib/appwrite/lead-activity-actions.ts | 145 ---- src/lib/appwrite/lead-queries.ts | 51 -- src/lib/appwrite/lead-types.ts | 8 - src/lib/appwrite/loan-actions.ts | 442 ------------- src/lib/appwrite/loan-queries.ts | 91 --- src/lib/appwrite/loan-types.ts | 8 - src/lib/appwrite/plan-limits.ts | 123 ---- src/lib/appwrite/saved-card-actions.ts | 155 ----- src/lib/appwrite/saved-card-queries.ts | 35 - src/lib/appwrite/schema.ts | 519 ++++++--------- src/lib/appwrite/scope-permissions.ts | 53 -- src/lib/appwrite/search-actions.ts | 241 ------- src/lib/appwrite/service-actions.ts | 187 ------ src/lib/appwrite/service-queries.ts | 46 -- src/lib/appwrite/service-types.ts | 7 - src/lib/appwrite/software-actions.ts | 388 ----------- src/lib/appwrite/software-queries.ts | 47 -- src/lib/appwrite/software-types.ts | 8 - src/lib/appwrite/subscription-actions.ts | 323 --------- src/lib/appwrite/subscription-queries.ts | 40 -- src/lib/appwrite/subscription-types.ts | 40 -- src/lib/appwrite/task-actions.ts | 244 ------- src/lib/appwrite/task-queries.ts | 24 - src/lib/appwrite/task-types.ts | 7 - src/lib/appwrite/team-actions.ts | 18 - 172 files changed, 422 insertions(+), 23862 deletions(-) create mode 100644 src/app/(dashboard)/activities/page.tsx delete mode 100644 src/app/(dashboard)/calendar/components/calendar-client.tsx delete mode 100644 src/app/(dashboard)/calendar/components/event-form-sheet.tsx delete mode 100644 src/app/(dashboard)/calendar/components/types.ts delete mode 100644 src/app/(dashboard)/calendar/page.tsx delete mode 100644 src/app/(dashboard)/chat/components/chat-header.tsx delete mode 100644 src/app/(dashboard)/chat/components/chat.tsx delete mode 100644 src/app/(dashboard)/chat/components/conversation-list-new.tsx delete mode 100644 src/app/(dashboard)/chat/components/conversation-list.tsx delete mode 100644 src/app/(dashboard)/chat/components/message-input.tsx delete mode 100644 src/app/(dashboard)/chat/components/message-list.tsx delete mode 100644 src/app/(dashboard)/chat/data/conversations.json delete mode 100644 src/app/(dashboard)/chat/data/messages.json delete mode 100644 src/app/(dashboard)/chat/data/users.json delete mode 100644 src/app/(dashboard)/chat/page.tsx delete mode 100644 src/app/(dashboard)/chat/use-chat.ts delete mode 100644 src/app/(dashboard)/customers/components/customer-form-sheet.tsx delete mode 100644 src/app/(dashboard)/customers/components/customers-client.tsx delete mode 100644 src/app/(dashboard)/customers/components/delete-customer-dialog.tsx delete mode 100644 src/app/(dashboard)/customers/components/types.ts create mode 100644 src/app/(dashboard)/customers/matches/page.tsx create mode 100644 src/app/(dashboard)/customers/searches/page.tsx delete mode 100644 src/app/(dashboard)/dashboard/components/customer-growth.tsx delete mode 100644 src/app/(dashboard)/dashboard/components/income-chart.tsx delete mode 100644 src/app/(dashboard)/dashboard/components/metrics.tsx delete mode 100644 src/app/(dashboard)/dashboard/components/recent-transactions.tsx delete mode 100644 src/app/(dashboard)/dashboard/components/top-customers.tsx delete mode 100644 src/app/(dashboard)/faqs/components/faq-list.tsx delete mode 100644 src/app/(dashboard)/faqs/components/features-grid.tsx delete mode 100644 src/app/(dashboard)/faqs/data/categories.json delete mode 100644 src/app/(dashboard)/faqs/data/faqs.json delete mode 100644 src/app/(dashboard)/faqs/data/features.json delete mode 100644 src/app/(dashboard)/faqs/page.tsx delete mode 100644 src/app/(dashboard)/finance/banks/components/bank-form-sheet.tsx delete mode 100644 src/app/(dashboard)/finance/banks/components/banks-client.tsx delete mode 100644 src/app/(dashboard)/finance/banks/components/types.ts delete mode 100644 src/app/(dashboard)/finance/banks/page.tsx delete mode 100644 src/app/(dashboard)/finance/cards/components/card-form-sheet.tsx delete mode 100644 src/app/(dashboard)/finance/cards/components/cards-client.tsx delete mode 100644 src/app/(dashboard)/finance/cards/components/statement-form-sheet.tsx delete mode 100644 src/app/(dashboard)/finance/cards/components/types.ts delete mode 100644 src/app/(dashboard)/finance/cards/page.tsx delete mode 100644 src/app/(dashboard)/finance/components/finance-client.tsx delete mode 100644 src/app/(dashboard)/finance/components/finance-form-sheet.tsx delete mode 100644 src/app/(dashboard)/finance/components/types.ts delete mode 100644 src/app/(dashboard)/finance/loans/components/loan-form-sheet.tsx delete mode 100644 src/app/(dashboard)/finance/loans/components/loans-client.tsx delete mode 100644 src/app/(dashboard)/finance/loans/components/types.ts delete mode 100644 src/app/(dashboard)/finance/loans/page.tsx delete mode 100644 src/app/(dashboard)/finance/page.tsx delete mode 100644 src/app/(dashboard)/finance/reports/components/report-client.tsx delete mode 100644 src/app/(dashboard)/finance/reports/components/trend-chart.tsx delete mode 100644 src/app/(dashboard)/finance/reports/page.tsx create mode 100644 src/app/(dashboard)/investors/page.tsx delete mode 100644 src/app/(dashboard)/invoices/[id]/components/header-actions.tsx delete mode 100644 src/app/(dashboard)/invoices/[id]/components/items-editor.tsx delete mode 100644 src/app/(dashboard)/invoices/[id]/page.tsx delete mode 100644 src/app/(dashboard)/invoices/components/invoice-form-sheet.tsx delete mode 100644 src/app/(dashboard)/invoices/components/invoices-client.tsx delete mode 100644 src/app/(dashboard)/invoices/components/types.ts delete mode 100644 src/app/(dashboard)/invoices/page.tsx delete mode 100644 src/app/(dashboard)/leads/components/lead-activities-fetcher.ts delete mode 100644 src/app/(dashboard)/leads/components/lead-card.tsx delete mode 100644 src/app/(dashboard)/leads/components/lead-detail-sheet.tsx delete mode 100644 src/app/(dashboard)/leads/components/lead-form-sheet.tsx delete mode 100644 src/app/(dashboard)/leads/components/leads-board.tsx delete mode 100644 src/app/(dashboard)/leads/components/types.ts delete mode 100644 src/app/(dashboard)/leads/page.tsx delete mode 100644 src/app/(dashboard)/mail/components/account-switcher.tsx delete mode 100644 src/app/(dashboard)/mail/components/mail-display.tsx delete mode 100644 src/app/(dashboard)/mail/components/mail-list.tsx delete mode 100644 src/app/(dashboard)/mail/components/mail.tsx delete mode 100644 src/app/(dashboard)/mail/components/nav.tsx delete mode 100644 src/app/(dashboard)/mail/data.tsx delete mode 100644 src/app/(dashboard)/mail/index.tsx delete mode 100644 src/app/(dashboard)/mail/page.tsx delete mode 100644 src/app/(dashboard)/mail/use-mail.ts create mode 100644 src/app/(dashboard)/presentations/page.tsx delete mode 100644 src/app/(dashboard)/pricing/components/faq-section.tsx delete mode 100644 src/app/(dashboard)/pricing/components/features-grid.tsx delete mode 100644 src/app/(dashboard)/pricing/data/faqs.json delete mode 100644 src/app/(dashboard)/pricing/data/features.json delete mode 100644 src/app/(dashboard)/pricing/page.tsx create mode 100644 src/app/(dashboard)/properties/page.tsx delete mode 100644 src/app/(dashboard)/services/components/delete-service-dialog.tsx delete mode 100644 src/app/(dashboard)/services/components/service-form-sheet.tsx delete mode 100644 src/app/(dashboard)/services/components/services-client.tsx delete mode 100644 src/app/(dashboard)/services/components/types.ts delete mode 100644 src/app/(dashboard)/services/page.tsx delete mode 100644 src/app/(dashboard)/settings/billing/checkout/[orderId]/components/credit-card-visual.tsx delete mode 100644 src/app/(dashboard)/settings/billing/checkout/[orderId]/components/mock-payment-form.tsx delete mode 100644 src/app/(dashboard)/settings/billing/checkout/[orderId]/page.tsx delete mode 100644 src/app/(dashboard)/settings/billing/components/billing-history-card.tsx delete mode 100644 src/app/(dashboard)/settings/billing/components/current-plan-card.tsx delete mode 100644 src/app/(dashboard)/settings/billing/data/billing-history.json delete mode 100644 src/app/(dashboard)/settings/billing/data/current-plan.json delete mode 100644 src/app/(dashboard)/settings/billing/page.tsx delete mode 100644 src/app/(dashboard)/software/components/assignment-form-sheet.tsx delete mode 100644 src/app/(dashboard)/software/components/software-client.tsx delete mode 100644 src/app/(dashboard)/software/components/software-form-sheet.tsx delete mode 100644 src/app/(dashboard)/software/components/types.ts delete mode 100644 src/app/(dashboard)/software/page.tsx delete mode 100644 src/app/(dashboard)/tasks/components/task-card.tsx delete mode 100644 src/app/(dashboard)/tasks/components/task-form-sheet.tsx delete mode 100644 src/app/(dashboard)/tasks/components/tasks-board.tsx delete mode 100644 src/app/(dashboard)/tasks/components/types.ts delete mode 100644 src/app/(dashboard)/tasks/page.tsx delete mode 100644 src/app/(dashboard)/users/components/data-table.tsx delete mode 100644 src/app/(dashboard)/users/components/stat-cards.tsx delete mode 100644 src/app/(dashboard)/users/components/user-form-dialog.tsx delete mode 100644 src/app/(dashboard)/users/data.json delete mode 100644 src/app/(dashboard)/users/page.tsx delete mode 100644 src/components/billing/usage-banner.tsx delete mode 100644 src/lib/appwrite/bank-account-actions.ts delete mode 100644 src/lib/appwrite/bank-account-queries.ts delete mode 100644 src/lib/appwrite/bank-account-types.ts delete mode 100644 src/lib/appwrite/calendar-actions.ts delete mode 100644 src/lib/appwrite/calendar-queries.ts delete mode 100644 src/lib/appwrite/calendar-types.ts delete mode 100644 src/lib/appwrite/credit-card-actions.ts delete mode 100644 src/lib/appwrite/credit-card-queries.ts delete mode 100644 src/lib/appwrite/credit-card-types.ts delete mode 100644 src/lib/appwrite/customer-actions.ts delete mode 100644 src/lib/appwrite/customer-queries.ts delete mode 100644 src/lib/appwrite/customer-types.ts delete mode 100644 src/lib/appwrite/dashboard-queries.ts delete mode 100644 src/lib/appwrite/finance-actions.ts delete mode 100644 src/lib/appwrite/finance-queries.ts delete mode 100644 src/lib/appwrite/finance-report-queries.ts delete mode 100644 src/lib/appwrite/finance-types.ts delete mode 100644 src/lib/appwrite/invoice-actions.ts delete mode 100644 src/lib/appwrite/invoice-queries.ts delete mode 100644 src/lib/appwrite/invoice-types.ts delete mode 100644 src/lib/appwrite/lead-actions.ts delete mode 100644 src/lib/appwrite/lead-activity-actions.ts delete mode 100644 src/lib/appwrite/lead-queries.ts delete mode 100644 src/lib/appwrite/lead-types.ts delete mode 100644 src/lib/appwrite/loan-actions.ts delete mode 100644 src/lib/appwrite/loan-queries.ts delete mode 100644 src/lib/appwrite/loan-types.ts delete mode 100644 src/lib/appwrite/plan-limits.ts delete mode 100644 src/lib/appwrite/saved-card-actions.ts delete mode 100644 src/lib/appwrite/saved-card-queries.ts delete mode 100644 src/lib/appwrite/scope-permissions.ts delete mode 100644 src/lib/appwrite/search-actions.ts delete mode 100644 src/lib/appwrite/service-actions.ts delete mode 100644 src/lib/appwrite/service-queries.ts delete mode 100644 src/lib/appwrite/service-types.ts delete mode 100644 src/lib/appwrite/software-actions.ts delete mode 100644 src/lib/appwrite/software-queries.ts delete mode 100644 src/lib/appwrite/software-types.ts delete mode 100644 src/lib/appwrite/subscription-actions.ts delete mode 100644 src/lib/appwrite/subscription-queries.ts delete mode 100644 src/lib/appwrite/subscription-types.ts delete mode 100644 src/lib/appwrite/task-actions.ts delete mode 100644 src/lib/appwrite/task-queries.ts delete mode 100644 src/lib/appwrite/task-types.ts diff --git a/next.config.ts b/next.config.ts index ccb2d57..eb09734 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,64 +1,35 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - experimental: { - optimizePackageImports: ["lucide-react", "@radix-ui/react-icons"], - }, - - serverActions: { - bodySizeLimit: "3mb", - }, turbopack: {}, - // TODO: re-enable once template files (chart.tsx, data-table-toolbar.tsx) are cleaned up. typescript: { ignoreBuildErrors: true }, - // Image optimization images: { remotePatterns: [ - { - protocol: 'https', - hostname: 'ui.shadcn.com', - }, - { - protocol: 'https', - hostname: 'images.unsplash.com', - }, + { protocol: "https", hostname: "ui.shadcn.com" }, + { protocol: "https", hostname: "images.unsplash.com" }, + { protocol: "https", hostname: "db.kovaksoft.com" }, ], - formats: ['image/webp', 'image/avif'], + formats: ["image/webp", "image/avif"], }, - // Headers for better security and performance async headers() { return [ { - source: '/(.*)', + source: "/(.*)", headers: [ - { - key: 'X-Frame-Options', - value: 'DENY', - }, - { - key: 'X-Content-Type-Options', - value: 'nosniff', - }, - { - key: 'Referrer-Policy', - value: 'origin-when-cross-origin', - }, + { key: "X-Frame-Options", value: "DENY" }, + { key: "X-Content-Type-Options", value: "nosniff" }, + { key: "Referrer-Policy", value: "origin-when-cross-origin" }, ], }, ]; }, - // Redirects for better SEO async redirects() { return [ - { - source: '/home', - destination: '/dashboard', - permanent: true, - }, + { source: "/home", destination: "/dashboard", permanent: true }, ]; }, }; diff --git a/src/app/(dashboard)/activities/page.tsx b/src/app/(dashboard)/activities/page.tsx new file mode 100644 index 0000000..e2eae81 --- /dev/null +++ b/src/app/(dashboard)/activities/page.tsx @@ -0,0 +1,8 @@ +export default function Page() { + return ( +
+

activities

+

Yakında...

+
+ ); +} diff --git a/src/app/(dashboard)/calendar/components/calendar-client.tsx b/src/app/(dashboard)/calendar/components/calendar-client.tsx deleted file mode 100644 index 0fb01ab..0000000 --- a/src/app/(dashboard)/calendar/components/calendar-client.tsx +++ /dev/null @@ -1,259 +0,0 @@ -"use client"; - -import { useMemo, useState, useTransition } from "react"; -import { ChevronLeft, ChevronRight, Loader2, Plus, Trash2 } from "lucide-react"; -import { toast } from "sonner"; - -import { Button } from "@/components/ui/button"; -import { Card, CardContent } from "@/components/ui/card"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { deleteCalendarEventAction } from "@/lib/appwrite/calendar-actions"; -import { cn } from "@/lib/utils"; - -import { EventFormSheet } from "./event-form-sheet"; -import { COLOR_BG, type Customer, type EventRow } from "./types"; - -type Props = { - events: EventRow[]; - customers: Customer[]; -}; - -const WEEKDAYS = ["Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]; -const MONTH_NAMES = [ - "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", - "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık", -]; - -function startOfMonthGrid(year: number, month: number): Date { - // Monday-first grid; first cell is the Monday on/before the 1st - const first = new Date(year, month, 1); - const dayIdx = (first.getDay() + 6) % 7; // 0 = Mon - return new Date(year, month, 1 - dayIdx); -} - -function ymd(d: Date): string { - const pad = (n: number) => String(n).padStart(2, "0"); - return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; -} - -export function CalendarClient({ events, customers }: Props) { - const today = new Date(); - const [cursor, setCursor] = useState(new Date(today.getFullYear(), today.getMonth(), 1)); - const [formOpen, setFormOpen] = useState(false); - const [editing, setEditing] = useState(null); - const [defaultDate, setDefaultDate] = useState(); - const [deleting, setDeleting] = useState(null); - const [busy, startTransition] = useTransition(); - - const eventsByDay = useMemo(() => { - const map = new Map(); - for (const e of events) { - const start = new Date(e.start); - const end = new Date(e.end); - const cur = new Date(start.getFullYear(), start.getMonth(), start.getDate()); - const last = new Date(end.getFullYear(), end.getMonth(), end.getDate()); - while (cur.getTime() <= last.getTime()) { - const key = ymd(cur); - const arr = map.get(key) ?? []; - arr.push(e); - map.set(key, arr); - cur.setDate(cur.getDate() + 1); - } - } - return map; - }, [events]); - - const grid = useMemo(() => { - const start = startOfMonthGrid(cursor.getFullYear(), cursor.getMonth()); - const days: Date[] = []; - for (let i = 0; i < 42; i++) { - const d = new Date(start); - d.setDate(start.getDate() + i); - days.push(d); - } - return days; - }, [cursor]); - - const handlePrev = () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() - 1, 1)); - const handleNext = () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1)); - const handleToday = () => setCursor(new Date(today.getFullYear(), today.getMonth(), 1)); - - const handleAddOnDay = (date: Date) => { - setEditing(null); - setDefaultDate(ymd(date)); - setFormOpen(true); - }; - - const handleAddNew = () => { - setEditing(null); - setDefaultDate(ymd(today)); - setFormOpen(true); - }; - - const handleEdit = (event: EventRow) => { - setEditing(event); - setDefaultDate(undefined); - setFormOpen(true); - }; - - const handleDelete = () => { - if (!deleting) return; - startTransition(async () => { - const fd = new FormData(); - fd.set("id", deleting.id); - const result = await deleteCalendarEventAction(fd); - if (result.ok) { - toast.success("Etkinlik silindi."); - setDeleting(null); - } else { - toast.error(result.error ?? "Silme başarısız."); - } - }); - }; - - const todayKey = ymd(today); - - return ( - - -
-
- -

- {MONTH_NAMES[cursor.getMonth()]} {cursor.getFullYear()} -

- - -
- -
- -
- {WEEKDAYS.map((wd) => ( -
- {wd} -
- ))} - {grid.map((d) => { - const inMonth = d.getMonth() === cursor.getMonth(); - const key = ymd(d); - const isToday = key === todayKey; - const dayEvents = eventsByDay.get(key) ?? []; - return ( -
-
- - {d.getDate()} - - -
-
- {dayEvents.slice(0, 3).map((e) => ( - - ))} - {dayEvents.length > 3 && ( - - +{dayEvents.length - 3} daha - - )} -
-
- ); - })} -
-
- - { - setFormOpen(v); - if (!v) setEditing(null); - }} - event={editing} - defaultDate={defaultDate} - customers={customers} - onRequestDelete={(e) => { - setFormOpen(false); - setDeleting(e); - }} - /> - - !v && setDeleting(null)}> - - - Etkinliği sil - - {deleting?.title} kalıcı olarak silinecek. - - - - - - - - -
- ); -} diff --git a/src/app/(dashboard)/calendar/components/event-form-sheet.tsx b/src/app/(dashboard)/calendar/components/event-form-sheet.tsx deleted file mode 100644 index 9186d41..0000000 --- a/src/app/(dashboard)/calendar/components/event-form-sheet.tsx +++ /dev/null @@ -1,274 +0,0 @@ -"use client"; - -import { useActionState, useEffect, useState } from "react"; -import { Loader2, Save, Trash2 } from "lucide-react"; -import { toast } from "sonner"; - -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { - Sheet, - SheetContent, - SheetDescription, - SheetFooter, - SheetHeader, - SheetTitle, -} from "@/components/ui/sheet"; -import { Switch } from "@/components/ui/switch"; -import { Textarea } from "@/components/ui/textarea"; -import { - createCalendarEventAction, - updateCalendarEventAction, -} from "@/lib/appwrite/calendar-actions"; -import { initialCalendarState } from "@/lib/appwrite/calendar-types"; -import { cn } from "@/lib/utils"; - -import { COLOR_PRESETS, type Customer, type EventRow } from "./types"; - -const NONE = "__none__"; - -type Props = { - open: boolean; - onOpenChange: (v: boolean) => void; - event?: EventRow | null; - defaultDate?: string; // YYYY-MM-DD for new events - customers: Customer[]; - onRequestDelete?: (event: EventRow) => void; -}; - -function isoToInput(iso: string, allDay: boolean): string { - if (!iso) return ""; - if (allDay) return iso.slice(0, 10); - const d = new Date(iso); - const pad = (n: number) => String(n).padStart(2, "0"); - return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`; -} - -export function EventFormSheet({ - open, - onOpenChange, - event, - defaultDate, - customers, - onRequestDelete, -}: Props) { - const isEdit = Boolean(event); - const action = isEdit ? updateCalendarEventAction : createCalendarEventAction; - const [state, formAction, isPending] = useActionState(action, initialCalendarState); - const [allDay, setAllDay] = useState(event?.allDay ?? false); - - useEffect(() => { - setAllDay(event?.allDay ?? false); - }, [event]); - - useEffect(() => { - if (state.ok) { - toast.success(isEdit ? "Etkinlik güncellendi." : "Etkinlik eklendi."); - onOpenChange(false); - } else if (state.error) { - toast.error(state.error); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state]); - - const startDefault = - event?.start - ? isoToInput(event.start, allDay) - : defaultDate - ? allDay - ? defaultDate - : `${defaultDate}T09:00` - : ""; - const endDefault = - event?.end - ? isoToInput(event.end, allDay) - : defaultDate - ? allDay - ? defaultDate - : `${defaultDate}T10:00` - : ""; - - return ( - - - - {isEdit ? "Etkinliği düzenle" : "Yeni etkinlik"} - - Tarih, saat ve müşteri bilgileri ile bir takvim girdisi oluşturun. - - - -
{ - ["customerId", "color"].forEach((k) => { - if (fd.get(k) === NONE) fd.set(k, ""); - }); - formAction(fd); - }} - className="flex flex-1 flex-col" - > - {isEdit && event && } - -
-
- - - {state.fieldErrors?.title && ( -

{state.fieldErrors.title}

- )} -
- -
-
- -

Saat girmeden gün boyu sürecek.

-
- -
- -
-
- - - {state.fieldErrors?.start && ( -

{state.fieldErrors.start}

- )} -
-
- - - {state.fieldErrors?.end && ( -

{state.fieldErrors.end}

- )} -
-
- -
- - -
- -
- - -
- -
- -