diff --git a/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/add-product-form.tsx b/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/add-product-form.tsx new file mode 100644 index 00000000..7b5a88e7 --- /dev/null +++ b/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/add-product-form.tsx @@ -0,0 +1,69 @@ +"use client" + +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import { Save } from "lucide-react" + +import type { AddProductFormType } from "../../types" + +import { AddProductSchema } from "../_schemas/add-product-schema" + +import { ButtonLoading } from "@/components/ui/button" +import { Form } from "@/components/ui/form" +import { GeneralInformationCard } from "./general-information-card" +import { InventoryCard } from "./inventory-card" +import { MediaCard } from "./media-card" +import { PricingCard } from "./pricing-card" + +export function AddProductForm() { + const form = useForm({ + resolver: zodResolver(AddProductSchema), + defaultValues: { + title: "", + sku: "", + description: "", + category: "", + price: undefined, + compareAtPrice: undefined, + stock: undefined, + status: "Active", + tags: [], + }, + }) + + const { isSubmitting, isDirty } = form.formState + const isDisabled = isSubmitting || !isDirty + + function onSubmit(data: AddProductFormType) { + // Demo only — no backend + console.log("Product data:", data) + } + + return ( +
+ +
+ +
+
+ +
+ + +
+ + Save Product + +
+ + + ) +} diff --git a/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/general-information-card.tsx b/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/general-information-card.tsx new file mode 100644 index 00000000..3261f6ab --- /dev/null +++ b/full-kit/src/app/[lang]/(dashboard-layout)/pages/products/add/_components/general-information-card.tsx @@ -0,0 +1,129 @@ +"use client" + +import type { UseFormReturn } from "react-hook-form" +import type { AddProductFormType } from "../../types" + +import { categoryOptionsData, tagSuggestionsData } from "../_data/categories" + +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form" +import { Input } from "@/components/ui/input" +import { InputTagsWithSuggestions } from "@/components/ui/input-tags" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { Textarea } from "@/components/ui/textarea" + +interface GeneralInformationCardProps { + form: UseFormReturn +} + +export function GeneralInformationCard({ form }: GeneralInformationCardProps) { + return ( + + + General Information + + +
+ ( + + Title + + + + + + )} + /> + ( + + SKU + + + + + + )} + /> +
+ ( + + Description + +