'use client'; import { useState } from 'react'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; export interface CollapsibleItem { id: string; title: string; subtitle?: string; metadata?: string; isChecked?: boolean; isArchived?: boolean; icon?: string; actions?: Array<{ label: string; icon: string; onClick: () => void; variant?: 'primary' | 'secondary' | 'destructive'; disabled?: boolean; }>; } interface CollapsibleSectionProps { title: string; items: CollapsibleItem[]; icon?: string; defaultCollapsed?: boolean; loading?: boolean; emptyMessage?: string; filters?: Array<{ label: string; value: string; options: Array<{ value: string; label: string }>; onChange: (value: string) => void; }>; onRefresh?: () => void; onItemToggle?: (itemId: string) => void; className?: string; } export function CollapsibleSection({ title, items, icon = '📋', defaultCollapsed = false, loading = false, emptyMessage = 'Aucun élément', filters = [], onRefresh, onItemToggle, className = '' }: CollapsibleSectionProps) { const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed); const handleItemToggle = (itemId: string) => { onItemToggle?.(itemId); }; const getItemClasses = (item: CollapsibleItem) => { let classes = 'flex items-center gap-3 p-3 rounded-lg border border-[var(--border)]'; if (item.isArchived) { classes += ' opacity-60 bg-[var(--muted)]/20'; } else { classes += ' bg-[var(--card)]'; } return classes; }; const getCheckboxClasses = (item: CollapsibleItem) => { let classes = 'w-5 h-5 rounded border-2 flex items-center justify-center transition-colors'; if (item.isArchived) { classes += ' border-[var(--muted)] cursor-not-allowed'; } else { classes += ' border-[var(--border)] hover:border-[var(--primary)]'; } return classes; }; const getActionClasses = (action: NonNullable[0]) => { let classes = 'text-xs px-2 py-1'; switch (action.variant) { case 'destructive': classes += ' text-[var(--destructive)] hover:text-[var(--destructive)]'; break; case 'primary': classes += ' text-[var(--primary)] hover:text-[var(--primary)]'; break; default: classes += ' text-[var(--foreground)]'; } return classes; }; return (
{!isCollapsed && (
{/* Filtres */} {filters.map((filter, index) => ( ))} {/* Bouton refresh */} {onRefresh && ( )}
)}
{!isCollapsed && ( {loading ? (
Chargement...
) : items.length === 0 ? (
🎉 {emptyMessage} ! Excellent travail.
) : (
{items.map((item) => (
{/* Checkbox */} {item.isChecked !== undefined && ( )} {/* Contenu */}
{item.icon && {item.icon}} {item.title}
{(item.subtitle || item.metadata) && (
{item.subtitle && {item.subtitle}} {item.metadata && {item.metadata}}
)}
{/* Actions */} {item.actions && (
{item.actions.map((action, index) => ( ))}
)}
))}
)}
)}
); }