f833d429fc
Backend altyapısı: - 4 yeni Appwrite tablosu: blog_posts, testimonials, seo_pages, seo_settings - Appwrite Storage bucket: kovak-yazilim-media (görsel yüklemeleri) - Appwrite Auth ile session cookie tabanlı koruma Admin paneli (/admin): - Login akışı (email/password) + protected layout - Dashboard: sayım kartları + hızlı aksiyonlar - Blog CRUD: markdown content, kapak görseli, draft/published, SEO alanları - Services CRUD: lucide ikon seçici - Projects CRUD: teknoloji etiketleri, live URL - Testimonials CRUD: puanlama - SEO yöneticisi: global ayarlar + sayfa bazlı override - Mesaj inbox: status filtreleme + güncelleme - Medya kütüphanesi: Appwrite Storage upload/delete Public: - /blog ve /blog/[slug] sayfaları (markdown render) - Anasayfaya Testimonials bölümü - Tüm public sayfalarda generateMetadata + seo_pages override - Header'a Blog linki Route yapısı: - app/(site)/ — public site, Header/Footer ortak - app/admin/login — auth dışı - app/admin/(protected)/ — requireUser() korumalı 23 route üretiliyor, public static, admin dynamic.
25 lines
589 B
TypeScript
25 lines
589 B
TypeScript
"use client";
|
||
|
||
import { Trash2 } from "lucide-react";
|
||
|
||
export function DeleteButton({
|
||
label = "Sil",
|
||
confirm = "Bu kaydı silmek istediğinize emin misiniz?",
|
||
}: {
|
||
label?: string;
|
||
confirm?: string;
|
||
}) {
|
||
return (
|
||
<button
|
||
type="submit"
|
||
onClick={(e) => {
|
||
if (!window.confirm(confirm)) e.preventDefault();
|
||
}}
|
||
className="inline-flex items-center gap-1 rounded-md border border-red-200 bg-white px-2.5 py-1.5 text-xs font-medium text-red-700 transition hover:bg-red-50"
|
||
>
|
||
<Trash2 className="size-3.5" />
|
||
{label}
|
||
</button>
|
||
);
|
||
}
|