feat: enhance Kanban filtering and integrate filters in BoardContainer

- Marked multiple tasks as completed in TODO.md related to Kanban filtering features.
- Added `KanbanFilters` component to `BoardContainer` for improved task filtering.
- Updated `TasksContext` to manage Kanban filters and provide filtered tasks to the board.
- Implemented real-time filtering logic based on search, tags, and priorities.
This commit is contained in:
Julien Froidefond
2025-09-14 16:48:41 +02:00
parent c5a7d16425
commit 5e09759c2b
4 changed files with 270 additions and 8 deletions

View File

@@ -1,10 +1,11 @@
'use client';
import { createContext, useContext, ReactNode } from 'react';
import { createContext, useContext, ReactNode, useState, useMemo } from 'react';
import { useTasks } from '@/hooks/useTasks';
import { useTags } from '@/hooks/useTags';
import { Task, Tag } from '@/lib/types';
import { CreateTaskData, UpdateTaskData, TaskFilters } from '@/clients/tasks-client';
import { KanbanFilters } from '@/components/kanban/KanbanFilters';
interface TasksContextType {
tasks: Task[];
@@ -24,6 +25,10 @@ interface TasksContextType {
deleteTask: (taskId: string) => Promise<void>;
refreshTasks: () => Promise<void>;
setFilters: (filters: TaskFilters) => void;
// Kanban filters
kanbanFilters: KanbanFilters;
setKanbanFilters: (filters: KanbanFilters) => void;
filteredTasks: Task[];
// Tags
tags: Tag[];
tagsLoading: boolean;
@@ -45,12 +50,51 @@ export function TasksProvider({ children, initialTasks, initialStats }: TasksPro
);
const { tags, loading: tagsLoading, error: tagsError } = useTags();
// État des filtres Kanban
const [kanbanFilters, setKanbanFilters] = useState<KanbanFilters>({});
// Filtrage des tâches
const filteredTasks = useMemo(() => {
let filtered = tasksState.tasks;
// Filtre par recherche
if (kanbanFilters.search) {
const searchLower = kanbanFilters.search.toLowerCase();
filtered = filtered.filter(task =>
task.title.toLowerCase().includes(searchLower) ||
task.description?.toLowerCase().includes(searchLower) ||
task.tags?.some(tag => tag.toLowerCase().includes(searchLower))
);
}
// Filtre par tags
if (kanbanFilters.tags?.length) {
filtered = filtered.filter(task =>
kanbanFilters.tags!.some(filterTag =>
task.tags?.includes(filterTag)
)
);
}
// Filtre par priorités
if (kanbanFilters.priorities?.length) {
filtered = filtered.filter(task =>
kanbanFilters.priorities!.includes(task.priority)
);
}
return filtered;
}, [tasksState.tasks, kanbanFilters]);
const contextValue: TasksContextType = {
...tasksState,
tags,
tagsLoading,
tagsError
tagsError,
kanbanFilters,
setKanbanFilters,
filteredTasks
};
return (