From 504b1e2c8ecce8edc1c8f60f6c525f2c262eb6c8 Mon Sep 17 00:00:00 2001 From: AmirmahdiNourkazemi Date: Sat, 13 Jun 2026 19:21:23 +0330 Subject: [PATCH] feat: musci category image --- app/dashboard/music/categories/page.tsx | 54 ++++++++++++++++--------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/app/dashboard/music/categories/page.tsx b/app/dashboard/music/categories/page.tsx index 59864ab..d36d4bb 100644 --- a/app/dashboard/music/categories/page.tsx +++ b/app/dashboard/music/categories/page.tsx @@ -17,6 +17,9 @@ import { PageHeader, } from "@/components/ui"; import { EditIcon, PlusIcon, TrashIcon } from "@/components/icons"; +import { ImagePicker } from "@/components/ImagePicker"; +import { MediaPreview } from "@/components/MediaPreview"; +import { pickUrl, IMAGE_KEYS } from "@/lib/media"; import { toFa } from "@/lib/utils"; interface MusicCategory { @@ -25,6 +28,8 @@ interface MusicCategory { description?: string; order?: number; is_active?: boolean; + image_id?: number | null; + image?: unknown; } export default function MusicCategoriesPage() { @@ -39,7 +44,8 @@ export default function MusicCategoriesPage() { const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [order, setOrder] = useState(""); - const [imageId, setImageId] = useState(""); + const [imageId, setImageId] = useState(null); + const [imageFile, setImageFile] = useState(null); const [isActive, setIsActive] = useState(true); const [deleting, setDeleting] = useState(null); @@ -50,7 +56,8 @@ export default function MusicCategoriesPage() { setName(""); setDescription(""); setOrder(""); - setImageId(""); + setImageId(null); + setImageFile(null); setIsActive(true); setOpen(true); } @@ -59,7 +66,8 @@ export default function MusicCategoriesPage() { setName(row.name ?? ""); setDescription(row.description ?? ""); setOrder(row.order != null ? String(row.order) : ""); - setImageId(""); + setImageId(row.image_id ?? null); + setImageFile(null); setIsActive(row.is_active ?? true); setOpen(true); } @@ -69,15 +77,17 @@ export default function MusicCategoriesPage() { setSaving(true); try { if (editing) { - // Update is JSON on /music-categories/:id + // Update is multipart (POST) so an image file can be uploaded. await apiFetch(`/music-categories/${editing.id}`, { - method: "PUT", - body: { + method: "POST", + body: toFormData({ name, description, order: order === "" ? undefined : Number(order), is_active: isActive, - }, + image_id: imageId, + image: imageFile, + }), }); toast.success("دسته‌بندی ویرایش شد."); } else { @@ -88,8 +98,9 @@ export default function MusicCategoriesPage() { name, description, order, - image_id: imageId, is_active: isActive, + image_id: imageId, + image: imageFile, }), }); toast.success("دسته‌بندی افزوده شد."); @@ -120,6 +131,14 @@ export default function MusicCategoriesPage() { const columns: Column[] = [ { key: "id", header: "شناسه", render: (r) => toFa(r.id), className: "w-24" }, + { + key: "image", + header: "تصویر", + className: "w-20", + render: (r) => ( + + ), + }, { key: "name", header: "نام" }, { key: "description", @@ -223,16 +242,15 @@ export default function MusicCategoriesPage() { dir="ltr" /> - {!editing && ( - - setImageId(e.target.value)} - dir="ltr" - placeholder="image_id" - /> - - )} + + +