'use client'; import { useState, useEffect } from 'react'; import { JiraAnalyticsFilters, AvailableFilters, FilterOption } from '@/lib/types'; import { JiraAdvancedFiltersService } from '@/services/jira-advanced-filters'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { Modal } from '@/components/ui/Modal'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; interface AdvancedFiltersPanelProps { availableFilters: AvailableFilters; activeFilters: Partial; onFiltersChange: (filters: Partial) => void; className?: string; } interface FilterSectionProps { title: string; icon: string; options: FilterOption[]; selectedValues: string[]; onSelectionChange: (values: string[]) => void; maxDisplay?: number; } function FilterSection({ title, icon, options, selectedValues, onSelectionChange, maxDisplay = 10 }: FilterSectionProps) { const [showAll, setShowAll] = useState(false); const displayOptions = showAll ? options : options.slice(0, maxDisplay); const hasMore = options.length > maxDisplay; const handleToggle = (value: string) => { const newValues = selectedValues.includes(value) ? selectedValues.filter(v => v !== value) : [...selectedValues, value]; onSelectionChange(newValues); }; const selectAll = () => { onSelectionChange(options.map(opt => opt.value)); }; const clearAll = () => { onSelectionChange([]); }; return (

{icon} {title} {selectedValues.length > 0 && ( {selectedValues.length} )}

{options.length > 0 && (
|
)}
{options.length === 0 ? (

Aucune option disponible

) : ( <>
{displayOptions.map(option => ( ))}
{hasMore && ( )} )}
); } export default function AdvancedFiltersPanel({ availableFilters, activeFilters, onFiltersChange, className = '' }: AdvancedFiltersPanelProps) { const [showModal, setShowModal] = useState(false); const [tempFilters, setTempFilters] = useState>(activeFilters); useEffect(() => { setTempFilters(activeFilters); }, [activeFilters]); const hasActiveFilters = JiraAdvancedFiltersService.hasActiveFilters(activeFilters); const activeFiltersCount = JiraAdvancedFiltersService.countActiveFilters(activeFilters); const filtersSummary = JiraAdvancedFiltersService.getFiltersSummary(activeFilters); const applyFilters = () => { onFiltersChange(tempFilters); setShowModal(false); }; const clearAllFilters = () => { const emptyFilters = JiraAdvancedFiltersService.createEmptyFilters(); setTempFilters(emptyFilters); onFiltersChange(emptyFilters); setShowModal(false); }; const updateTempFilter = ( key: K, value: JiraAnalyticsFilters[K] ) => { setTempFilters(prev => ({ ...prev, [key]: value })); }; return (

🔍 Filtres avancés

{hasActiveFilters && ( {activeFiltersCount} actif{activeFiltersCount > 1 ? 's' : ''} )}
{hasActiveFilters && ( )}

{filtersSummary}

{/* Aperçu rapide des filtres actifs */} {hasActiveFilters && (
{activeFilters.components?.map(comp => ( 📦 {comp} ))} {activeFilters.fixVersions?.map(version => ( 🏷️ {version} ))} {activeFilters.issueTypes?.map(type => ( 📋 {type} ))} {activeFilters.statuses?.map(status => ( 🔄 {status} ))} {activeFilters.assignees?.map(assignee => ( 👤 {assignee} ))} {activeFilters.labels?.map(label => ( 🏷️ {label} ))} {activeFilters.priorities?.map(priority => ( ⚡ {priority} ))}
)} {/* Modal de configuration des filtres */} setShowModal(false)} title="Configuration des filtres avancés" size="lg" >
updateTempFilter('components', values)} /> updateTempFilter('fixVersions', values)} /> updateTempFilter('issueTypes', values)} /> updateTempFilter('statuses', values)} /> updateTempFilter('assignees', values)} /> updateTempFilter('labels', values)} /> updateTempFilter('priorities', values)} />
); }