feat: full site build — Project/Melody schema (Option A), admin CRUD, public sections, uploads, email+SMTP, internal analytics, legal pages, docs
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
import Link from "next/link";
|
||||
import { notFound } from "next/navigation";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import AdminPageHeader from "@/components/admin/admin-page-header";
|
||||
import MelodyForm from "@/components/admin/melody-form";
|
||||
import { prisma } from "@/lib/db";
|
||||
import type { MelodyInput } from "@/lib/validations/melody";
|
||||
|
||||
export default async function EditMelodyPage({ params }: { params: { id: string } }) {
|
||||
const [melody, categories] = await Promise.all([
|
||||
prisma.melody.findUnique({ where: { id: params.id } }),
|
||||
prisma.category.findMany({ where: { kind: "MELODY" }, orderBy: [{ order: "asc" }, { nameEn: "asc" }], select: { id: true, nameAr: true, nameEn: true } }),
|
||||
]);
|
||||
if (!melody) notFound();
|
||||
const defaultValues: MelodyInput = {
|
||||
slug: melody.slug, titleAr: melody.titleAr, titleEn: melody.titleEn, descAr: melody.descAr ?? "", descEn: melody.descEn ?? "",
|
||||
audioFile: melody.audioFile, coverImage: melody.coverImage ?? "", durationSec: melody.durationSec, isDownloadable: melody.isDownloadable,
|
||||
status: melody.status, isFeatured: melody.isFeatured, sortOrder: melody.sortOrder, categoryId: melody.categoryId,
|
||||
};
|
||||
return <div className="mx-auto w-full max-w-7xl"><AdminPageHeader title={`Edit ${melody.titleEn}`} description="Update the audio, artwork, category, and public visibility settings." actions={<Button asChild variant="outline"><Link href="/admin/melodies">Back to melodies</Link></Button>} /><MelodyForm mode="edit" melodyId={melody.id} categories={categories} defaultValues={defaultValues} /></div>;
|
||||
}
|
||||
Reference in New Issue
Block a user