diff --git a/src/components/admin/ParkForm.tsx b/src/components/admin/ParkForm.tsx index dc2c1de6..5e51420b 100644 --- a/src/components/admin/ParkForm.tsx +++ b/src/components/admin/ParkForm.tsx @@ -29,6 +29,7 @@ import type { TempCompanyData } from '@/types/company'; import { LocationSearch } from './LocationSearch'; import { OperatorForm } from './OperatorForm'; import { PropertyOwnerForm } from './PropertyOwnerForm'; +import { Checkbox } from '@/components/ui/checkbox'; const parkSchema = z.object({ name: z.string().min(1, 'Park name is required'), @@ -55,8 +56,8 @@ const parkSchema = z.object({ website_url: z.string().url().optional().or(z.literal('')), phone: z.string().optional(), email: z.string().email().optional().or(z.literal('')), - operator_id: z.string().uuid().optional(), - property_owner_id: z.string().uuid().optional(), + operator_id: z.string().uuid().optional().or(z.literal('')).transform(val => val || undefined), + property_owner_id: z.string().uuid().optional().or(z.literal('')).transform(val => val || undefined), images: z.object({ uploaded: z.array(z.object({ url: z.string(), @@ -148,6 +149,12 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: const [tempNewPropertyOwner, setTempNewPropertyOwner] = useState(null); const [isPropertyOwnerModalOpen, setIsPropertyOwnerModalOpen] = useState(false); + // Operator is Owner checkbox state + const [operatorIsOwner, setOperatorIsOwner] = useState( + !!(initialData?.operator_id && initialData?.property_owner_id && + initialData?.operator_id === initialData?.property_owner_id) + ); + // Fetch data const { operators, loading: operatorsLoading } = useOperators(); const { propertyOwners, loading: ownersLoading } = usePropertyOwners(); @@ -178,6 +185,14 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: } }); + // Sync property owner with operator when checkbox is enabled + useEffect(() => { + if (operatorIsOwner && selectedOperatorId) { + setSelectedPropertyOwnerId(selectedOperatorId); + setValue('property_owner_id', selectedOperatorId); + } + }, [operatorIsOwner, selectedOperatorId, setValue]); + const handleFormSubmit = async (data: ParkFormData) => { try { @@ -198,10 +213,15 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: submissionContent.park.property_owner_id = null; } + const finalOperatorId = tempNewOperator ? undefined : (selectedOperatorId || undefined); + const finalPropertyOwnerId = operatorIsOwner + ? finalOperatorId + : (tempNewPropertyOwner ? undefined : (selectedPropertyOwnerId || undefined)); + await onSubmit({ ...data, - operator_id: tempNewOperator ? undefined : (selectedOperatorId || undefined), - property_owner_id: tempNewPropertyOwner ? undefined : (selectedPropertyOwnerId || undefined), + operator_id: finalOperatorId, + property_owner_id: finalPropertyOwnerId, _compositeSubmission: (tempNewOperator || tempNewPropertyOwner) ? submissionContent : undefined }); @@ -363,6 +383,24 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }:

Operator & Property Owner

+
+ { + setOperatorIsOwner(checked as boolean); + if (checked && selectedOperatorId) { + setSelectedPropertyOwnerId(selectedOperatorId); + setValue('property_owner_id', selectedOperatorId); + setTempNewPropertyOwner(null); + } + }} + /> + +
+
{/* Operator Column */}
@@ -384,10 +422,11 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: ) : ( { - setValue('operator_id', value); - setSelectedOperatorId(value); + const cleanValue = value || undefined; + setValue('operator_id', cleanValue); + setSelectedOperatorId(cleanValue || ''); }} placeholder="Select operator" searchPlaceholder="Search operators..." @@ -411,6 +450,7 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }:
{/* Property Owner Column */} + {!operatorIsOwner && (
@@ -430,10 +470,11 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: ) : ( { - setValue('property_owner_id', value); - setSelectedPropertyOwnerId(value); + const cleanValue = value || undefined; + setValue('property_owner_id', cleanValue); + setSelectedPropertyOwnerId(cleanValue || ''); }} placeholder="Select property owner" searchPlaceholder="Search property owners..." @@ -455,6 +496,7 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }: )}
+ )}
diff --git a/src/lib/entityValidationSchemas.ts b/src/lib/entityValidationSchemas.ts index f5391141..4f4f3d1d 100644 --- a/src/lib/entityValidationSchemas.ts +++ b/src/lib/entityValidationSchemas.ts @@ -46,8 +46,8 @@ export const parkValidationSchema = z.object({ if (!val || val === '') return true; return z.string().email().safeParse(val).success; }, 'Invalid email format'), - operator_id: z.string().uuid().optional().nullable(), - property_owner_id: z.string().uuid().optional().nullable(), + operator_id: z.string().uuid().optional().nullable().or(z.literal('')).transform(val => val || undefined), + property_owner_id: z.string().uuid().optional().nullable().or(z.literal('')).transform(val => val || undefined), banner_image_id: z.string().optional(), banner_image_url: z.string().optional(), card_image_id: z.string().optional(),