feat: Add category-specific ride fields

This commit is contained in:
gpt-engineer-app[bot]
2025-10-30 12:24:28 +00:00
parent 5bdab42211
commit 8795e756ce
5 changed files with 909 additions and 0 deletions

View File

@@ -694,6 +694,380 @@ export function RideForm({ onSubmit, onCancel, initialData, isEditing = false }:
</div>
)}
{/* Water Ride Specific Fields */}
{selectedCategory === 'water_ride' && (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Water Ride Details</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="space-y-2">
<Label htmlFor="water_depth_cm">Water Depth ({getHeightUnit(measurementSystem)})</Label>
<Input
id="water_depth_cm"
type="number"
min="0"
step="0.1"
{...register('water_depth_cm', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder={measurementSystem === 'imperial' ? 'e.g. 47' : 'e.g. 120'}
/>
</div>
<div className="space-y-2">
<Label htmlFor="splash_height_meters">Splash Height ({getDistanceUnit(measurementSystem)})</Label>
<Input
id="splash_height_meters"
type="number"
min="0"
step="0.1"
{...register('splash_height_meters', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder={measurementSystem === 'imperial' ? 'e.g. 16' : 'e.g. 5'}
/>
</div>
<div className="space-y-2">
<Label>Wetness Level</Label>
<Select onValueChange={(value) => setValue('wetness_level', value as 'dry' | 'light' | 'moderate' | 'soaked')} defaultValue={initialData?.wetness_level}>
<SelectTrigger>
<SelectValue placeholder="Select wetness level" />
</SelectTrigger>
<SelectContent>
<SelectItem value="dry">Dry</SelectItem>
<SelectItem value="light">Light</SelectItem>
<SelectItem value="moderate">Moderate</SelectItem>
<SelectItem value="soaked">Soaked</SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label htmlFor="flume_type">Flume Type</Label>
<Input
id="flume_type"
{...register('flume_type')}
placeholder="e.g. Log Flume, Shoot the Chute"
/>
</div>
<div className="space-y-2">
<Label htmlFor="boat_capacity">Boat Capacity</Label>
<Input
id="boat_capacity"
type="number"
min="1"
{...register('boat_capacity', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 8"
/>
</div>
</div>
</div>
)}
{/* Dark Ride Specific Fields */}
{selectedCategory === 'dark_ride' && (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Dark Ride Details</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="space-y-2">
<Label htmlFor="theme_name">Theme Name</Label>
<Input
id="theme_name"
{...register('theme_name')}
placeholder="e.g. Haunted Mansion, Pirates"
/>
</div>
<div className="space-y-2">
<Label htmlFor="show_duration_seconds">Show Duration (seconds)</Label>
<Input
id="show_duration_seconds"
type="number"
min="0"
{...register('show_duration_seconds', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 420"
/>
</div>
<div className="space-y-2">
<Label htmlFor="animatronics_count">Animatronics Count</Label>
<Input
id="animatronics_count"
type="number"
min="0"
{...register('animatronics_count', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 15"
/>
</div>
<div className="space-y-2">
<Label htmlFor="projection_type">Projection Type</Label>
<Input
id="projection_type"
{...register('projection_type')}
placeholder="e.g. 3D, 4D, LED, Projection Mapping"
/>
</div>
<div className="space-y-2">
<Label htmlFor="ride_system">Ride System</Label>
<Input
id="ride_system"
{...register('ride_system')}
placeholder="e.g. Omnimover, Dark Coaster, Trackless"
/>
</div>
<div className="space-y-2">
<Label htmlFor="scenes_count">Number of Scenes</Label>
<Input
id="scenes_count"
type="number"
min="0"
{...register('scenes_count', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 12"
/>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="story_description">Story Description</Label>
<Textarea
id="story_description"
{...register('story_description')}
placeholder="Describe the storyline and narrative..."
rows={3}
/>
</div>
</div>
)}
{/* Flat Ride Specific Fields */}
{selectedCategory === 'flat_ride' && (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Flat Ride Details</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="space-y-2">
<Label>Rotation Type</Label>
<Select onValueChange={(value) => setValue('rotation_type', value as 'horizontal' | 'vertical' | 'multi_axis' | 'pendulum' | 'none')} defaultValue={initialData?.rotation_type}>
<SelectTrigger>
<SelectValue placeholder="Select rotation type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="horizontal">Horizontal</SelectItem>
<SelectItem value="vertical">Vertical</SelectItem>
<SelectItem value="multi_axis">Multi-Axis</SelectItem>
<SelectItem value="pendulum">Pendulum</SelectItem>
<SelectItem value="none">None</SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label htmlFor="platform_count">Platform/Gondola Count</Label>
<Input
id="platform_count"
type="number"
min="1"
{...register('platform_count', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 8"
/>
</div>
<div className="space-y-2">
<Label htmlFor="swing_angle_degrees">Swing Angle (degrees)</Label>
<Input
id="swing_angle_degrees"
type="number"
min="0"
max="360"
step="0.1"
{...register('swing_angle_degrees', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder="e.g. 120"
/>
</div>
<div className="space-y-2">
<Label htmlFor="rotation_speed_rpm">Rotation Speed (RPM)</Label>
<Input
id="rotation_speed_rpm"
type="number"
min="0"
step="0.1"
{...register('rotation_speed_rpm', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder="e.g. 12"
/>
</div>
<div className="space-y-2">
<Label htmlFor="arm_length_meters">Arm Length ({getDistanceUnit(measurementSystem)})</Label>
<Input
id="arm_length_meters"
type="number"
min="0"
step="0.1"
{...register('arm_length_meters', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder={measurementSystem === 'imperial' ? 'e.g. 33' : 'e.g. 10'}
/>
</div>
<div className="space-y-2">
<Label htmlFor="max_height_reached_meters">Max Height Reached ({getDistanceUnit(measurementSystem)})</Label>
<Input
id="max_height_reached_meters"
type="number"
min="0"
step="0.1"
{...register('max_height_reached_meters', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder={measurementSystem === 'imperial' ? 'e.g. 98' : 'e.g. 30'}
/>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="motion_pattern">Motion Pattern</Label>
<Input
id="motion_pattern"
{...register('motion_pattern')}
placeholder="e.g. Circular, Wave, Pendulum swing"
/>
</div>
</div>
)}
{/* Kiddie Ride Specific Fields */}
{selectedCategory === 'kiddie_ride' && (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Kiddie Ride Details</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="space-y-2">
<Label htmlFor="min_age">Minimum Age</Label>
<Input
id="min_age"
type="number"
min="0"
max="18"
{...register('min_age', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 2"
/>
</div>
<div className="space-y-2">
<Label htmlFor="max_age">Maximum Age</Label>
<Input
id="max_age"
type="number"
min="0"
max="18"
{...register('max_age', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 12"
/>
</div>
<div className="space-y-2">
<Label htmlFor="educational_theme">Educational Theme</Label>
<Input
id="educational_theme"
{...register('educational_theme')}
placeholder="e.g. Learning colors, Numbers"
/>
</div>
<div className="space-y-2">
<Label htmlFor="character_theme">Character Theme</Label>
<Input
id="character_theme"
{...register('character_theme')}
placeholder="e.g. Mickey Mouse, Dinosaurs"
/>
</div>
</div>
</div>
)}
{/* Transportation Ride Specific Fields */}
{selectedCategory === 'transportation' && (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Transportation Ride Details</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="space-y-2">
<Label>Transport Type</Label>
<Select onValueChange={(value) => setValue('transport_type', value as 'train' | 'monorail' | 'skylift' | 'ferry' | 'peoplemover' | 'cable_car')} defaultValue={initialData?.transport_type}>
<SelectTrigger>
<SelectValue placeholder="Select transport type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="train">Train</SelectItem>
<SelectItem value="monorail">Monorail</SelectItem>
<SelectItem value="skylift">Skylift / Chairlift</SelectItem>
<SelectItem value="ferry">Ferry / Boat</SelectItem>
<SelectItem value="peoplemover">PeopleMover</SelectItem>
<SelectItem value="cable_car">Cable Car</SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label htmlFor="route_length_meters">Route Length ({getDistanceUnit(measurementSystem)})</Label>
<Input
id="route_length_meters"
type="number"
min="0"
step="0.1"
{...register('route_length_meters', { setValueAs: (v) => v === "" ? undefined : parseFloat(v) })}
placeholder={measurementSystem === 'imperial' ? 'e.g. 3280' : 'e.g. 1000'}
/>
</div>
<div className="space-y-2">
<Label htmlFor="stations_count">Number of Stations</Label>
<Input
id="stations_count"
type="number"
min="2"
{...register('stations_count', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 4"
/>
</div>
<div className="space-y-2">
<Label htmlFor="vehicle_capacity">Vehicle Capacity</Label>
<Input
id="vehicle_capacity"
type="number"
min="1"
{...register('vehicle_capacity', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 40"
/>
</div>
<div className="space-y-2">
<Label htmlFor="vehicles_count">Number of Vehicles</Label>
<Input
id="vehicles_count"
type="number"
min="1"
{...register('vehicles_count', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 6"
/>
</div>
<div className="space-y-2">
<Label htmlFor="round_trip_duration_seconds">Round Trip Duration (seconds)</Label>
<Input
id="round_trip_duration_seconds"
type="number"
min="0"
{...register('round_trip_duration_seconds', { setValueAs: (v) => v === "" ? undefined : parseInt(v) })}
placeholder="e.g. 600"
/>
</div>
</div>
</div>
)}
{/* Technical Specifications */}
<div className="space-y-4">
<h3 className="text-lg font-semibold">Technical Specifications</h3>