refactor: update filters to use filteredTasks instead of regularTasks

- Modified `JiraFilters`, `PriorityFilters`, `TagFilters`, and `TfsFilters` components to utilize `filteredTasks` for better accuracy in task filtering.
- Adjusted logic to ensure that available projects, types, and counts are based on the currently filtered tasks, enhancing the relevance of displayed options.
This commit is contained in:
Julien Froidefond
2025-09-26 08:54:15 +02:00
parent 2e9cc4e667
commit 0253555fa4
4 changed files with 42 additions and 24 deletions

View File

@@ -11,31 +11,31 @@ interface JiraFiltersProps {
} }
export function JiraFilters({ filters, onFiltersChange }: JiraFiltersProps) { export function JiraFilters({ filters, onFiltersChange }: JiraFiltersProps) {
const { regularTasks } = useTasksContext(); const { regularTasks, filteredTasks } = useTasksContext();
// Vérifier s'il y a des tâches Jira dans le système (même masquées) // Vérifier s'il y a des tâches Jira dans le système (même masquées)
const hasJiraTasks = regularTasks.some(task => task.source === 'jira'); const hasJiraTasks = regularTasks.some(task => task.source === 'jira');
// Récupérer les projets et types Jira disponibles dans TOUTES les tâches // Récupérer les projets et types Jira disponibles dans les tâches filtrées
const availableJiraProjects = useMemo(() => { const availableJiraProjects = useMemo(() => {
const projects = new Set<string>(); const projects = new Set<string>();
regularTasks.forEach(task => { filteredTasks.forEach(task => {
if (task.source === 'jira' && task.jiraProject) { if (task.source === 'jira' && task.jiraProject) {
projects.add(task.jiraProject); projects.add(task.jiraProject);
} }
}); });
return Array.from(projects).sort(); return Array.from(projects).sort();
}, [regularTasks]); }, [filteredTasks]);
const availableJiraTypes = useMemo(() => { const availableJiraTypes = useMemo(() => {
const types = new Set<string>(); const types = new Set<string>();
regularTasks.forEach(task => { filteredTasks.forEach(task => {
if (task.source === 'jira' && task.jiraType) { if (task.source === 'jira' && task.jiraType) {
types.add(task.jiraType); types.add(task.jiraType);
} }
}); });
return Array.from(types).sort(); return Array.from(types).sort();
}, [regularTasks]); }, [filteredTasks]);
const handleJiraToggle = (mode: 'show' | 'hide' | 'all') => { const handleJiraToggle = (mode: 'show' | 'hide' | 'all') => {
const updates: Partial<KanbanFilters> = {}; const updates: Partial<KanbanFilters> = {};

View File

@@ -11,16 +11,16 @@ interface PriorityFiltersProps {
} }
export function PriorityFilters({ selectedPriorities = [], onPriorityToggle }: PriorityFiltersProps) { export function PriorityFilters({ selectedPriorities = [], onPriorityToggle }: PriorityFiltersProps) {
const { regularTasks } = useTasksContext(); const { filteredTasks } = useTasksContext();
// Calculer les compteurs pour les priorités // Calculer les compteurs pour les priorités basés sur les tâches filtrées
const priorityCounts = useMemo(() => { const priorityCounts = useMemo(() => {
const counts: Record<string, number> = {}; const counts: Record<string, number> = {};
getAllPriorities().forEach(priority => { getAllPriorities().forEach(priority => {
counts[priority.key] = regularTasks.filter(task => task.priority === priority.key).length; counts[priority.key] = filteredTasks.filter(task => task.priority === priority.key).length;
}); });
return counts; return counts;
}, [regularTasks]); }, [filteredTasks]);
const priorityOptions = getAllPriorities().map(priorityConfig => ({ const priorityOptions = getAllPriorities().map(priorityConfig => ({
value: priorityConfig.key, value: priorityConfig.key,
@@ -29,13 +29,21 @@ export function PriorityFilters({ selectedPriorities = [], onPriorityToggle }: P
count: priorityCounts[priorityConfig.key] || 0 count: priorityCounts[priorityConfig.key] || 0
})); }));
// Filtrer les priorités qui ont des tâches visibles
const visiblePriorities = priorityOptions.filter(priority => priority.count > 0);
return ( return (
<div className="space-y-2"> <div className="space-y-2">
<label className="block text-xs font-mono font-medium text-[var(--muted-foreground)] uppercase tracking-wider"> <label className="block text-xs font-mono font-medium text-[var(--muted-foreground)] uppercase tracking-wider">
Priorités Priorités
</label> </label>
<div className="flex flex-wrap gap-1"> {visiblePriorities.length === 0 ? (
{priorityOptions.filter(priority => priority.count > 0).map((priority) => ( <div className="text-xs text-[var(--muted-foreground)] italic">
Aucune priorité disponible dans les tâches filtrées
</div>
) : (
<div className="flex flex-wrap gap-1">
{visiblePriorities.map((priority) => (
<button <button
key={priority.value} key={priority.value}
onClick={() => onPriorityToggle(priority.value)} onClick={() => onPriorityToggle(priority.value)}
@@ -52,7 +60,8 @@ export function PriorityFilters({ selectedPriorities = [], onPriorityToggle }: P
{priority.label} ({priority.count}) {priority.label} ({priority.count})
</button> </button>
))} ))}
</div> </div>
)}
</div> </div>
); );
} }

View File

@@ -9,16 +9,16 @@ interface TagFiltersProps {
} }
export function TagFilters({ selectedTags = [], onTagToggle }: TagFiltersProps) { export function TagFilters({ selectedTags = [], onTagToggle }: TagFiltersProps) {
const { tags: availableTags, regularTasks } = useTasksContext(); const { tags: availableTags, filteredTasks } = useTasksContext();
// Calculer les compteurs pour les tags // Calculer les compteurs pour les tags basés sur les tâches filtrées
const tagCounts = useMemo(() => { const tagCounts = useMemo(() => {
const counts: Record<string, number> = {}; const counts: Record<string, number> = {};
availableTags.forEach(tag => { availableTags.forEach(tag => {
counts[tag.name] = regularTasks.filter(task => task.tags?.includes(tag.name)).length; counts[tag.name] = filteredTasks.filter(task => task.tags?.includes(tag.name)).length;
}); });
return counts; return counts;
}, [regularTasks, availableTags]); }, [filteredTasks, availableTags]);
// Trier les tags par nombre d'utilisation (décroissant) // Trier les tags par nombre d'utilisation (décroissant)
const sortedTags = useMemo(() => { const sortedTags = useMemo(() => {
@@ -29,6 +29,9 @@ export function TagFilters({ selectedTags = [], onTagToggle }: TagFiltersProps)
}); });
}, [availableTags, tagCounts]); }, [availableTags, tagCounts]);
// Filtrer les tags qui ont des tâches visibles
const visibleTags = sortedTags.filter(tag => (tagCounts[tag.name] || 0) > 0);
if (availableTags.length === 0) { if (availableTags.length === 0) {
return null; return null;
} }
@@ -38,8 +41,13 @@ export function TagFilters({ selectedTags = [], onTagToggle }: TagFiltersProps)
<label className="block text-xs font-mono font-medium text-[var(--muted-foreground)] uppercase tracking-wider"> <label className="block text-xs font-mono font-medium text-[var(--muted-foreground)] uppercase tracking-wider">
Tags Tags
</label> </label>
<div className="flex flex-wrap gap-1 max-h-32 overflow-y-auto"> {visibleTags.length === 0 ? (
{sortedTags.filter(tag => (tagCounts[tag.name] || 0) > 0).map((tag) => ( <div className="text-xs text-[var(--muted-foreground)] italic">
Aucun tag disponible dans les tâches filtrées
</div>
) : (
<div className="flex flex-wrap gap-1 max-h-32 overflow-y-auto">
{visibleTags.map((tag) => (
<button <button
key={tag.id} key={tag.id}
onClick={() => onTagToggle(tag.name)} onClick={() => onTagToggle(tag.name)}
@@ -56,7 +64,8 @@ export function TagFilters({ selectedTags = [], onTagToggle }: TagFiltersProps)
{tag.name} ({tagCounts[tag.name]}) {tag.name} ({tagCounts[tag.name]})
</button> </button>
))} ))}
</div> </div>
)}
</div> </div>
); );
} }

View File

@@ -11,21 +11,21 @@ interface TfsFiltersProps {
} }
export function TfsFilters({ filters, onFiltersChange }: TfsFiltersProps) { export function TfsFilters({ filters, onFiltersChange }: TfsFiltersProps) {
const { regularTasks } = useTasksContext(); const { regularTasks, filteredTasks } = useTasksContext();
// Vérifier s'il y a des tâches TFS dans le système (même masquées) // Vérifier s'il y a des tâches TFS dans le système (même masquées)
const hasTfsTasks = regularTasks.some(task => task.source === 'tfs'); const hasTfsTasks = regularTasks.some(task => task.source === 'tfs');
// Récupérer les projets TFS disponibles dans TOUTES les tâches // Récupérer les projets TFS disponibles dans les tâches filtrées
const availableTfsProjects = useMemo(() => { const availableTfsProjects = useMemo(() => {
const projects = new Set<string>(); const projects = new Set<string>();
regularTasks.forEach(task => { filteredTasks.forEach(task => {
if (task.source === 'tfs' && task.tfsProject) { if (task.source === 'tfs' && task.tfsProject) {
projects.add(task.tfsProject); projects.add(task.tfsProject);
} }
}); });
return Array.from(projects).sort(); return Array.from(projects).sort();
}, [regularTasks]); }, [filteredTasks]);
const handleTfsToggle = (mode: 'show' | 'hide' | 'all') => { const handleTfsToggle = (mode: 'show' | 'hide' | 'all') => {
const updates: Partial<KanbanFilters> = {}; const updates: Partial<KanbanFilters> = {};