diff --git a/src/pages/OperatorDetail.tsx b/src/pages/OperatorDetail.tsx index 962385df..5daab76f 100644 --- a/src/pages/OperatorDetail.tsx +++ b/src/pages/OperatorDetail.tsx @@ -6,7 +6,7 @@ import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Dialog, DialogContent } from '@/components/ui/dialog'; -import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, FerrisWheel } from 'lucide-react'; +import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, FerrisWheel, Gauge } from 'lucide-react'; import { Company } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { OperatorForm } from '@/components/admin/OperatorForm'; @@ -27,6 +27,9 @@ export default function OperatorDetail() { const [loading, setLoading] = useState(true); const [parksLoading, setParksLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [totalParks, setTotalParks] = useState(0); + const [operatingRides, setOperatingRides] = useState(0); + const [statsLoading, setStatsLoading] = useState(true); const { user } = useAuth(); const { isModerator } = useUserRole(); @@ -51,6 +54,7 @@ export default function OperatorDetail() { // Fetch parks operated by this operator if (data) { fetchParks(data.id); + fetchStatistics(data.id); } } catch (error) { console.error('Error fetching operator:', error); @@ -80,6 +84,33 @@ export default function OperatorDetail() { } }; + const fetchStatistics = async (operatorId: string) => { + try { + // Get total parks count + const { count: parksCount, error: parksError } = await supabase + .from('parks') + .select('id', { count: 'exact', head: true }) + .eq('operator_id', operatorId); + + if (parksError) throw parksError; + setTotalParks(parksCount || 0); + + // Get operating rides count across all parks + const { data: ridesData, error: ridesError } = await supabase + .from('rides') + .select('id, parks!inner(operator_id)') + .eq('parks.operator_id', operatorId) + .eq('status', 'operating'); + + if (ridesError) throw ridesError; + setOperatingRides(ridesData?.length || 0); + } catch (error) { + console.error('Error fetching statistics:', error); + } finally { + setStatsLoading(false); + } + }; + const handleEditSubmit = async (data: any) => { try { await submitCompanyUpdate( @@ -227,7 +258,31 @@ export default function OperatorDetail() { {/* Company Info */} -
+
+ {!statsLoading && totalParks > 0 && ( + + + +
{totalParks}
+
+ {totalParks === 1 ? 'Park Operated' : 'Parks Operated'} +
+
+
+ )} + + {!statsLoading && operatingRides > 0 && ( + + + +
{operatingRides}
+
+ Operating {operatingRides === 1 ? 'Ride' : 'Rides'} +
+
+
+ )} + {operator.founded_year && ( @@ -237,6 +292,7 @@ export default function OperatorDetail() { )} + {operator.website_url && ( diff --git a/src/pages/PropertyOwnerDetail.tsx b/src/pages/PropertyOwnerDetail.tsx index d9bfedf7..da3f6704 100644 --- a/src/pages/PropertyOwnerDetail.tsx +++ b/src/pages/PropertyOwnerDetail.tsx @@ -6,7 +6,7 @@ import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Dialog, DialogContent } from '@/components/ui/dialog'; -import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, Building2 } from 'lucide-react'; +import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, Building2, Gauge } from 'lucide-react'; import { Company } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { PropertyOwnerForm } from '@/components/admin/PropertyOwnerForm'; @@ -27,6 +27,9 @@ export default function PropertyOwnerDetail() { const [loading, setLoading] = useState(true); const [parksLoading, setParksLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const [totalParks, setTotalParks] = useState(0); + const [operatingRides, setOperatingRides] = useState(0); + const [statsLoading, setStatsLoading] = useState(true); const { user } = useAuth(); const { isModerator } = useUserRole(); @@ -51,6 +54,7 @@ export default function PropertyOwnerDetail() { // Fetch parks owned by this property owner if (data) { fetchParks(data.id); + fetchStatistics(data.id); } } catch (error) { console.error('Error fetching property owner:', error); @@ -80,6 +84,33 @@ export default function PropertyOwnerDetail() { } }; + const fetchStatistics = async (ownerId: string) => { + try { + // Get total parks count + const { count: parksCount, error: parksError } = await supabase + .from('parks') + .select('id', { count: 'exact', head: true }) + .eq('property_owner_id', ownerId); + + if (parksError) throw parksError; + setTotalParks(parksCount || 0); + + // Get operating rides count across all owned parks + const { data: ridesData, error: ridesError } = await supabase + .from('rides') + .select('id, parks!inner(property_owner_id)') + .eq('parks.property_owner_id', ownerId) + .eq('status', 'operating'); + + if (ridesError) throw ridesError; + setOperatingRides(ridesData?.length || 0); + } catch (error) { + console.error('Error fetching statistics:', error); + } finally { + setStatsLoading(false); + } + }; + const handleEditSubmit = async (data: any) => { try { await submitCompanyUpdate( @@ -227,7 +258,31 @@ export default function PropertyOwnerDetail() {
{/* Company Info */} -
+
+ {!statsLoading && totalParks > 0 && ( + + + +
{totalParks}
+
+ {totalParks === 1 ? 'Park Owned' : 'Parks Owned'} +
+
+
+ )} + + {!statsLoading && operatingRides > 0 && ( + + + +
{operatingRides}
+
+ Operating {operatingRides === 1 ? 'Ride' : 'Rides'} +
+
+
+ )} + {owner.founded_year && ( @@ -237,6 +292,7 @@ export default function PropertyOwnerDetail() { )} + {owner.website_url && (