import { useState, useMemo } from 'react'; import { Link } from 'react-router-dom'; import { formatDistanceToNow } from 'date-fns'; import { Building2, Bike, Factory, Box, MapPin, Calendar, Image, Download, Search } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import type { RecentAddition } from '@/types/database-stats'; interface RecentAdditionsTableProps { additions: RecentAddition[]; isLoading: boolean; } const entityTypeConfig = { park: { icon: Building2, label: 'Park', color: 'bg-blue-500' }, ride: { icon: Bike, label: 'Ride', color: 'bg-purple-500' }, company: { icon: Factory, label: 'Company', color: 'bg-orange-500' }, ride_model: { icon: Box, label: 'Model', color: 'bg-green-500' }, location: { icon: MapPin, label: 'Location', color: 'bg-yellow-500' }, timeline_event: { icon: Calendar, label: 'Event', color: 'bg-pink-500' }, photo: { icon: Image, label: 'Photo', color: 'bg-teal-500' }, }; export function RecentAdditionsTable({ additions, isLoading }: RecentAdditionsTableProps) { const [entityTypeFilter, setEntityTypeFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const filteredAdditions = useMemo(() => { let filtered = additions; if (entityTypeFilter !== 'all') { filtered = filtered.filter(item => item.entity_type === entityTypeFilter); } if (searchQuery) { const query = searchQuery.toLowerCase(); filtered = filtered.filter(item => item.entity_name.toLowerCase().includes(query) || item.created_by_username?.toLowerCase().includes(query) ); } return filtered; }, [additions, entityTypeFilter, searchQuery]); const exportToCSV = () => { const headers = ['Type', 'Name', 'Added By', 'Added At']; const rows = filteredAdditions.map(item => [ entityTypeConfig[item.entity_type].label, item.entity_name, item.created_by_username || 'System', new Date(item.created_at).toISOString(), ]); const csv = [headers, ...rows].map(row => row.join(',')).join('\n'); const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `recent-additions-${new Date().toISOString()}.csv`; a.click(); URL.revokeObjectURL(url); }; const getEntityLink = (item: RecentAddition) => { if (item.entity_type === 'park' && item.entity_slug) { return `/parks/${item.entity_slug}`; } if (item.entity_type === 'ride' && item.park_slug && item.entity_slug) { return `/parks/${item.park_slug}/rides/${item.entity_slug}`; } if (item.entity_type === 'company' && item.entity_slug) { return `/manufacturers/${item.entity_slug}`; } if (item.entity_type === 'ride_model' && item.entity_slug) { return `/models/${item.entity_slug}`; } return null; }; if (isLoading) { return ( Latest Additions
); } return (
Latest Additions (Newest First)
setSearchQuery(e.target.value)} className="pl-9" />
{filteredAdditions.length === 0 ? (
No additions found matching your filters.
) : ( filteredAdditions.map((item) => { const config = entityTypeConfig[item.entity_type]; const Icon = config.icon; const link = getEntityLink(item); return (
{item.image_url && ( {item.entity_name} )}
{config.label} {link ? ( {item.entity_name} ) : ( {item.entity_name} )}
{item.created_by_username ? ( <> {item.created_by_username[0].toUpperCase()} @{item.created_by_username} ) : ( System )} {formatDistanceToNow(new Date(item.created_at), { addSuffix: true })}
); }) )}
); }