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:
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user