mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 10:11:13 -05:00
feat: Add operator is owner checkbox
This commit is contained in:
@@ -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<TempCompanyData | null>(null);
|
||||
const [isPropertyOwnerModalOpen, setIsPropertyOwnerModalOpen] = useState(false);
|
||||
|
||||
// Operator is Owner checkbox state
|
||||
const [operatorIsOwner, setOperatorIsOwner] = useState<boolean>(
|
||||
!!(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 }:
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-lg font-semibold">Operator & Property Owner</h3>
|
||||
|
||||
<div className="flex items-center space-x-2 mb-4">
|
||||
<Checkbox
|
||||
id="operator-is-owner"
|
||||
checked={operatorIsOwner}
|
||||
onCheckedChange={(checked) => {
|
||||
setOperatorIsOwner(checked as boolean);
|
||||
if (checked && selectedOperatorId) {
|
||||
setSelectedPropertyOwnerId(selectedOperatorId);
|
||||
setValue('property_owner_id', selectedOperatorId);
|
||||
setTempNewPropertyOwner(null);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<Label htmlFor="operator-is-owner" className="text-sm font-normal cursor-pointer">
|
||||
Operator is also the property owner
|
||||
</Label>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
{/* Operator Column */}
|
||||
<div className="space-y-2">
|
||||
@@ -384,10 +422,11 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }:
|
||||
) : (
|
||||
<Combobox
|
||||
options={operators}
|
||||
value={watch('operator_id')}
|
||||
value={watch('operator_id') || ''}
|
||||
onValueChange={(value) => {
|
||||
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 }:
|
||||
</div>
|
||||
|
||||
{/* Property Owner Column */}
|
||||
{!operatorIsOwner && (
|
||||
<div className="space-y-2">
|
||||
<Label>Property Owner</Label>
|
||||
|
||||
@@ -430,10 +470,11 @@ export function ParkForm({ onSubmit, onCancel, initialData, isEditing = false }:
|
||||
) : (
|
||||
<Combobox
|
||||
options={propertyOwners}
|
||||
value={watch('property_owner_id')}
|
||||
value={watch('property_owner_id') || ''}
|
||||
onValueChange={(value) => {
|
||||
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 }:
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user