mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 05:51:12 -05:00
feat: Implement phases 5, 6, and 7
This commit is contained in:
@@ -3,6 +3,7 @@ import { useForm } from 'react-hook-form';
|
||||
import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import * as z from 'zod';
|
||||
import { validateSubmissionHandler } from '@/lib/entityFormValidation';
|
||||
import { entitySchemas } from '@/lib/entityValidationSchemas';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Input } from '@/components/ui/input';
|
||||
@@ -34,47 +35,7 @@ import {
|
||||
getHeightUnit
|
||||
} from '@/lib/units';
|
||||
|
||||
const rideSchema = z.object({
|
||||
name: z.string().min(1, 'Ride name is required'),
|
||||
slug: z.string().min(1, 'Slug is required'),
|
||||
description: z.string().optional(),
|
||||
category: z.string().min(1, 'Category is required'),
|
||||
ride_sub_type: z.string().optional(),
|
||||
status: z.string().min(1, 'Status is required'),
|
||||
opening_date: z.string().optional(),
|
||||
closing_date: z.string().optional(),
|
||||
height_requirement: z.number().optional(),
|
||||
age_requirement: z.number().optional(),
|
||||
capacity_per_hour: z.number().optional(),
|
||||
duration_seconds: z.number().optional(),
|
||||
max_speed_kmh: z.number().optional(),
|
||||
max_height_meters: z.number().optional(),
|
||||
length_meters: z.number().optional(),
|
||||
inversions: z.number().optional(),
|
||||
// New roller coaster specific fields
|
||||
coaster_type: z.string().optional(),
|
||||
seating_type: z.string().optional(),
|
||||
intensity_level: z.string().optional(),
|
||||
drop_height_meters: z.number().optional(),
|
||||
max_g_force: z.number().optional(),
|
||||
// Manufacturer and model
|
||||
manufacturer_id: z.string().uuid().optional(),
|
||||
ride_model_id: z.string().uuid().optional(),
|
||||
// Images
|
||||
images: z.object({
|
||||
uploaded: z.array(z.object({
|
||||
url: z.string(),
|
||||
cloudflare_id: z.string().optional(),
|
||||
file: z.any().optional(),
|
||||
isLocal: z.boolean().optional(),
|
||||
caption: z.string().optional(),
|
||||
})),
|
||||
banner_assignment: z.number().nullable().optional(),
|
||||
card_assignment: z.number().nullable().optional(),
|
||||
}).optional()
|
||||
});
|
||||
|
||||
type RideFormData = z.infer<typeof rideSchema>;
|
||||
type RideFormData = z.infer<typeof entitySchemas.ride>;
|
||||
|
||||
interface RideFormProps {
|
||||
onSubmit: (data: RideFormData) => Promise<void>;
|
||||
@@ -186,7 +147,7 @@ export function RideForm({ onSubmit, onCancel, initialData, isEditing = false }:
|
||||
watch,
|
||||
formState: { errors }
|
||||
} = useForm<RideFormData>({
|
||||
resolver: zodResolver(rideSchema),
|
||||
resolver: zodResolver(entitySchemas.ride),
|
||||
defaultValues: {
|
||||
name: initialData?.name || '',
|
||||
slug: initialData?.slug || '',
|
||||
|
||||
Reference in New Issue
Block a user