"use client" import { AlertTriangle, Plus, Save } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { Alert, AlertTitle } from "@/shared/components/ui/alert" import { FieldGroup } from "@/shared/components/ui/field" import { Rhform, RhfTextField, RhfTextareaField, RhfAsyncSelectField, } from "@/shared/components/form" import { ShopTypeInlineForm } from "@/modules/vehicles/inline-forms/shop-type-inline-form" import { InventoryCategoryInlineForm } from "@/modules/services/inline-forms/inventory-category-inline-form" import { UnitTypeInlineForm } from "@/modules/services/inline-forms/unit-type-inline-form" import { DepartmentInlineForm } from "@/modules/services/inline-forms/department-inline-form" import { toast } from "sonner" import { useAuthApi } from "@/shared/useApi" import { useResourceForm } from "@/shared/hooks/use-resource-form" import { useFormMutation } from "@/shared/hooks/use-form-mutation" import { toId } from "@/shared/lib/utils" import { partFormSchema, type PartFormValues } from "./part.schema" import { CrudListItem, PARTS_ROUTES, PartsClient } from "@garage/api" // ── Props ── export type PartFormProps = { resourceId?: string | null initialData?: CrudListItem | null onSuccess?: () => void } // ── Default values ── const DEFAULT_VALUES: PartFormValues = { shop_type: null, category: null, unit_type: null, department: null, title: "", sku: "", description: "", selling_price: undefined, purchase_price: undefined, opening_stock: undefined, } // ── Mapping helpers ── const mapLookupOption = (item: any) => ({ value: String(item.id), label: item.name ?? item.title ?? String(item.id), }) const STORE_OBJECT = { getOptionValue: (o: any) => o, getOptionLabel: (o: any) => o.label } function mapToFormValues(data: unknown): PartFormValues { const d = (data as any)?.data ?? data ?? {} return { shop_type: null, category: null, unit_type: null, department: null, title: d.title ?? d.name ?? "", sku: d.sku ?? "", description: d.description ?? "", selling_price: d.selling_price ?? undefined, purchase_price: d.purchase_price ?? undefined, opening_stock: d.opening_stock ?? undefined, } } function mapCreatePayload(values: PartFormValues) { return { shop_type_id: toId(values.shop_type), category_id: toId(values.category), unit_type_id: toId(values.unit_type), department_id: toId(values.department), title: values.title, sku: values.sku || undefined, description: values.description || undefined, selling_price: values.selling_price, purchase_price: values.purchase_price, opening_stock: values.opening_stock, available_stock: values.opening_stock, } } function mapUpdatePayload(values: PartFormValues) { return { title: values.title, selling_price: values.selling_price, } } // ── Component ── export function PartForm({ resourceId, initialData, onSuccess }: PartFormProps) { const api = useAuthApi() const { form, isEditing } = useResourceForm({ schema: partFormSchema, defaultValues: DEFAULT_VALUES, resourceId, initialData, mapToFormValues, }) const { mutate, error, isPending } = useFormMutation(form, { mutationFn: (values: PartFormValues) => { const promise = isEditing && resourceId ? api.parts.update(resourceId, mapUpdatePayload(values)) : api.parts.create(mapCreatePayload(values)) toast.promise(promise, { loading: isEditing ? "Updating part..." : "Creating part...", success: isEditing ? "Part updated successfully" : "Part created successfully", error: isEditing ? "Failed to update part" : "Failed to create part", }) return promise }, onSuccess: () => { form.reset() onSuccess?.() }, }) return ( mutate(values)}> {error && ( {isEditing ? "Failed to update part" : "Failed to create part"} {error.message} )}
<>
api.shopTypes.list()} mapOption={mapLookupOption} createForm={(props) => } createLabel="Shop Type" {...STORE_OBJECT} /> api.inventory.listCategories()} mapOption={mapLookupOption} createForm={(props) => } createLabel="Category" {...STORE_OBJECT} />
api.inventory.listUnitTypes()} mapOption={mapLookupOption} createForm={(props) => } createLabel="Unit Type" {...STORE_OBJECT} /> api.departments.list()} mapOption={(item: any) => ({ value: String(item.id), label: item.name ?? String(item.id) })} createForm={(props) => } createLabel="Department" {...STORE_OBJECT} />
{!isEditing && (
)}
) }