Spaces:
Sleeping
Sleeping
| /** | |
| * Composant DatasetCard pour AfriDataHub | |
| * Created by BlackBenAI Team - AfriDataHub Platform | |
| */ | |
| import { motion } from 'framer-motion' | |
| import { Button } from '@/components/ui/button' | |
| import { | |
| Calendar, | |
| Database, | |
| ExternalLink, | |
| TrendingUp, | |
| MapPin | |
| } from 'lucide-react' | |
| const DatasetCard = ({ dataset, onViewDetails }) => { | |
| const getDomainColor = (domain) => { | |
| const colors = { | |
| agriculture: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', | |
| health: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', | |
| economy: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400', | |
| weather: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400', | |
| energy: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400', | |
| education: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', | |
| population: 'bg-pink-100 text-pink-800 dark:bg-pink-900/30 dark:text-pink-400', | |
| environment: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400', | |
| transport: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400', | |
| other: 'bg-muted text-muted-foreground', | |
| } | |
| return colors[domain] || colors.other | |
| } | |
| const formatDate = (dateString) => { | |
| return new Date(dateString).toLocaleDateString('fr-FR', { | |
| year: 'numeric', | |
| month: 'short', | |
| day: 'numeric' | |
| }) | |
| } | |
| return ( | |
| <motion.div | |
| initial={{ opacity: 0, y: 20 }} | |
| animate={{ opacity: 1, y: 0 }} | |
| whileHover={{ y: -4, boxShadow: "0 10px 25px rgba(0,0,0,0.1)" }} | |
| transition={{ duration: 0.2 }} | |
| className="bg-card text-card-foreground rounded-xl border border-border p-6 hover:border-primary/50 transition-all duration-300 relative z-10" | |
| > | |
| {/* En-tête */} | |
| <div className="flex items-start justify-between mb-4"> | |
| <div className="flex-1"> | |
| <h3 className="text-lg font-bold text-foreground mb-2 line-clamp-2"> | |
| {dataset.title} | |
| </h3> | |
| <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getDomainColor(dataset.domain)}`}> | |
| {dataset.domain} | |
| </span> | |
| </div> | |
| </div> | |
| {/* Description */} | |
| <p className="text-muted-foreground text-sm mb-4 line-clamp-3"> | |
| {dataset.description} | |
| </p> | |
| {/* Métadonnées */} | |
| <div className="space-y-2 mb-4"> | |
| <div className="flex items-center text-sm text-muted-foreground"> | |
| <Database className="h-4 w-4 mr-2" /> | |
| <span>{dataset.data_points_count} points de données</span> | |
| </div> | |
| <div className="flex items-center text-sm text-muted-foreground"> | |
| <Calendar className="h-4 w-4 mr-2" /> | |
| <span>Mis à jour le {formatDate(dataset.last_updated)}</span> | |
| </div> | |
| <div className="flex items-center text-sm text-muted-foreground"> | |
| <MapPin className="h-4 w-4 mr-2" /> | |
| <span>Source: {dataset.source_name}</span> | |
| </div> | |
| </div> | |
| {/* Statut */} | |
| <div className="flex items-center justify-between mb-4"> | |
| <div className="flex items-center"> | |
| <div className={`w-2 h-2 rounded-full mr-2 ${dataset.status === 'active' ? 'bg-green-500' : | |
| dataset.status === 'updating' ? 'bg-yellow-500' : 'bg-red-500' | |
| }`} /> | |
| <span className="text-sm text-muted-foreground capitalize"> | |
| {dataset.status} | |
| </span> | |
| </div> | |
| {dataset.latest_data_date && ( | |
| <div className="flex items-center text-sm text-muted-foreground"> | |
| <TrendingUp className="h-4 w-4 mr-1" /> | |
| <span>{formatDate(dataset.latest_data_date)}</span> | |
| </div> | |
| )} | |
| </div> | |
| {/* Actions */} | |
| <div className="flex items-center justify-between"> | |
| <Button | |
| onClick={() => onViewDetails(dataset)} | |
| className="bg-primary hover:bg-primary/90 text-primary-foreground font-bold" | |
| > | |
| Voir les données | |
| </Button> | |
| {dataset.source_url && ( | |
| <Button | |
| variant="ghost" | |
| size="sm" | |
| onClick={() => window.open(dataset.source_url, '_blank')} | |
| className="text-primary hover:text-primary hover:bg-primary/10" | |
| > | |
| <ExternalLink className="h-4 w-4" /> | |
| </Button> | |
| )} | |
| </div> | |
| </motion.div> | |
| ) | |
| } | |
| export default DatasetCard | |