'use client'; import { useState } from 'react'; import { JiraAnalyticsFilters, AvailableFilters } 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'; interface FilterBarProps { availableFilters: AvailableFilters; activeFilters: Partial; onFiltersChange: (filters: Partial) => void; className?: string; } export default function FilterBar({ availableFilters, activeFilters, onFiltersChange, className = '' }: FilterBarProps) { const [showModal, setShowModal] = useState(false); const hasActiveFilters = JiraAdvancedFiltersService.hasActiveFilters(activeFilters); const activeFiltersCount = JiraAdvancedFiltersService.countActiveFilters(activeFilters); const clearAllFilters = () => { const emptyFilters = JiraAdvancedFiltersService.createEmptyFilters(); onFiltersChange(emptyFilters); }; const removeFilter = (filterType: keyof JiraAnalyticsFilters, value: string) => { const currentValues = activeFilters[filterType]; if (!currentValues || !Array.isArray(currentValues)) return; const newValues = currentValues.filter((v: string) => v !== value); onFiltersChange({ ...activeFilters, [filterType]: newValues }); }; return (
🔍 Filtres {hasActiveFilters && ( {activeFiltersCount} )}
{/* Filtres actifs */} {hasActiveFilters && (
{activeFilters.components?.slice(0, 3).map(comp => ( removeFilter('components', comp)} > 📦 {comp} × ))} {activeFilters.fixVersions?.slice(0, 2).map(version => ( removeFilter('fixVersions', version)} > 🏷️ {version} × ))} {activeFilters.issueTypes?.slice(0, 3).map(type => ( removeFilter('issueTypes', type)} > 📋 {type} × ))} {activeFilters.statuses?.slice(0, 2).map(status => ( removeFilter('statuses', status)} > 🔄 {status} × ))} {activeFilters.assignees?.slice(0, 2).map(assignee => ( removeFilter('assignees', assignee)} > 👤 {assignee} × ))} {/* Indicateur si plus de filtres */} {(() => { const totalVisible = (activeFilters.components?.slice(0, 3).length || 0) + (activeFilters.fixVersions?.slice(0, 2).length || 0) + (activeFilters.issueTypes?.slice(0, 3).length || 0) + (activeFilters.statuses?.slice(0, 2).length || 0) + (activeFilters.assignees?.slice(0, 2).length || 0); const totalActive = activeFiltersCount; if (totalActive > totalVisible) { return ( +{totalActive - totalVisible} autres ); } return null; })()}
)} {!hasActiveFilters && ( Aucun filtre actif )}
{hasActiveFilters && ( )}
{/* Modal de configuration - réutilise la logique du composant existant */} {showModal && ( setShowModal(false)} title="Configuration des filtres" size="lg" >
{/* Types de tickets */}

📋 Types de tickets

{availableFilters.issueTypes.map(option => ( ))}
{/* Statuts */}

🔄 Statuts

{availableFilters.statuses.map(option => ( ))}
{/* Assignés */}

👤 Assignés

{availableFilters.assignees.map(option => ( ))}
{/* Composants */}

📦 Composants

{availableFilters.components.map(option => ( ))}
)}
); }