feat: MediaPicker — sürükle-bırak + progress bar + kütüphane modal
Mevcut sorun: - Her görsel için medya sayfasına git, yükle, URL kopyala, forma yapıştır → 4 adım - Sürükle-bırak yok, progress yok, hangi dosyanın yüklendiği belirsiz Çözüm: MediaPicker component (tek/çoklu mode) API route'ları: - POST /api/admin/media/upload — session auth + Appwrite Storage upload - GET /api/admin/media/list — kütüphane modal için dosya listesi Component özellikleri: - Sürükle-bırak drop zone (hover state ile) - Multiple file upload (çoklu mode) - XHR ile gerçek progress bar (%) — Server Action ile alınamazdı - Görsel preview (single: aspect-video, multiple: aspect-square grid) - Hover'da × ile kaldırma - Multiple mode'da sırasını değiştirme - 'Kütüphaneden seç' modal — daha önce yüklenmiş görselleri grid'de göster, tıklayınca seç - Error handling (dosya boyutu, ağ hatası vb.) - Başarılı yüklemeyi 2 saniye gösterip kaybetme Form alanları → MediaPicker (URL field'ları kaldırıldı): - Blog: cover_image, seo_image - Hizmet: hero_image - Proje: image_url (kapak), gallery (çoklu) - Referans: image_url - Sektör: hero_image - Ekip: photo_url - SEO sayfa: og_image - SEO global: default_og_image - Site Settings: client_logos (çoklu) Backward compat: form data formatı aynı kalıyor — hidden input ile URL satır satır. admin-actions değişmedi. URL elle yapıştırmak hala mümkün (kütüphaneden URL kopyala).
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
||||
} from "@/components/admin/form";
|
||||
import { getSiteSettings } from "@/lib/data";
|
||||
import { saveSiteSettings } from "@/lib/admin-actions";
|
||||
import { MediaPicker } from "@/components/admin/media-picker";
|
||||
import type {
|
||||
FaqItem,
|
||||
ProcessStep,
|
||||
@@ -407,13 +408,13 @@ export default async function SiteSettingsPage() {
|
||||
help='Her satır: "İkonAdı | Değer | Etiket" (örn. Star | 4.9 | Google yıldızı)'
|
||||
/>
|
||||
|
||||
<Textarea
|
||||
<MediaPicker
|
||||
label="Müşteri logoları"
|
||||
name="client_logos"
|
||||
rows={4}
|
||||
defaultValue={s?.client_logos?.join("\n")}
|
||||
placeholder={"https://example.com/logo1.png\nhttps://example.com/logo2.png"}
|
||||
help="Her satıra bir URL. Logoların grayscale + opaque versiyonu gösterilir."
|
||||
multiple
|
||||
defaultValue={s?.client_logos ?? []}
|
||||
maxSizeMB={3}
|
||||
help="Anasayfada grayscale logo şeridi olarak gösterilir. Tercihen şeffaf PNG."
|
||||
/>
|
||||
|
||||
<div className="grid gap-5 md:grid-cols-3">
|
||||
|
||||
Reference in New Issue
Block a user