diff --git a/src/components/kanban/KanbanFilters.tsx b/src/components/kanban/KanbanFilters.tsx index 113e02a..00dc4b6 100644 --- a/src/components/kanban/KanbanFilters.tsx +++ b/src/components/kanban/KanbanFilters.tsx @@ -39,7 +39,8 @@ export function KanbanFilters({ hiddenStatuses: propsHiddenStatuses, onToggleStatusVisibility, }: KanbanFiltersProps) { - const { regularTasks, activeFiltersCount } = useTasksContext(); + const { regularTasks, activeFiltersCount, oldCompletedTasksCount } = + useTasksContext(); const { preferences, toggleColumnVisibility } = useUserPreferences(); // Utiliser les props si disponibles, sinon utiliser le context @@ -130,6 +131,13 @@ export function KanbanFilters({ }); }; + const handleHideCompletedOlderThan15DaysFilterToggle = () => { + onFiltersChange({ + ...filters, + hideCompletedOlderThan15Days: !filters.hideCompletedOlderThan15Days, + }); + }; + return (
@@ -219,10 +227,17 @@ export function KanbanFilters({
diff --git a/src/components/kanban/filters/GeneralFilters.tsx b/src/components/kanban/filters/GeneralFilters.tsx index 7e07aa7..52ee6fa 100644 --- a/src/components/kanban/filters/GeneralFilters.tsx +++ b/src/components/kanban/filters/GeneralFilters.tsx @@ -1,21 +1,29 @@ 'use client'; import { FilterChip } from '@/components/ui'; -import { Calendar, CheckCircle } from 'lucide-react'; +import { Calendar, CheckCircle, Clock } from 'lucide-react'; interface GeneralFiltersProps { showWithDueDate?: boolean; showCompletedLast7Days?: boolean; + hideCompletedOlderThan15Days?: boolean; + oldCompletedTasksCount?: number; onDueDateFilterToggle: () => void; onCompletedLast7DaysFilterToggle: () => void; + onHideCompletedOlderThan15DaysFilterToggle: () => void; } export function GeneralFilters({ showWithDueDate = false, showCompletedLast7Days = false, + hideCompletedOlderThan15Days = false, + oldCompletedTasksCount = 0, onDueDateFilterToggle, onCompletedLast7DaysFilterToggle, + onHideCompletedOlderThan15DaysFilterToggle, }: GeneralFiltersProps) { + console.log('GeneralFilters render:', { oldCompletedTasksCount }); + return (
); diff --git a/src/contexts/TasksContext.tsx b/src/contexts/TasksContext.tsx index 0284dc2..db4d3e1 100644 --- a/src/contexts/TasksContext.tsx +++ b/src/contexts/TasksContext.tsx @@ -34,6 +34,7 @@ interface TasksContextType { filteredTasks: Task[]; pinnedTasks: Task[]; // Tâches avec tags épinglés (objectifs) activeFiltersCount: number; // Nombre de filtres actifs + oldCompletedTasksCount: number; // Nombre de tâches terminées depuis +15j // Tags tags: Tag[]; tagsLoading: boolean; @@ -64,6 +65,11 @@ export function TasksProvider({ const { preferences, updateKanbanFilters, updateViewPreferences } = useUserPreferences(); + // Fonction utilitaire pour identifier les statuts terminés + const isCompletedStatus = (status: TaskStatus): boolean => { + return ['done', 'cancelled', 'archived'].includes(status); + }; + // Construire l'objet KanbanFilters à partir des préférences const kanbanFilters: KanbanFilters = useMemo( () => ({ @@ -79,6 +85,8 @@ export function TasksProvider({ showWithDueDate: preferences.kanbanFilters.showWithDueDate || false, showCompletedLast7Days: preferences.kanbanFilters.showCompletedLast7Days || false, + hideCompletedOlderThan15Days: + preferences.kanbanFilters.hideCompletedOlderThan15Days || false, // Filtres Jira showJiraOnly: preferences.kanbanFilters.showJiraOnly || false, hideJiraTasks: preferences.kanbanFilters.hideJiraTasks || false, @@ -106,6 +114,7 @@ export function TasksProvider({ sortBy: newFilters.sortBy, showWithDueDate: newFilters.showWithDueDate, showCompletedLast7Days: newFilters.showCompletedLast7Days, + hideCompletedOlderThan15Days: newFilters.hideCompletedOlderThan15Days, // Filtres Jira showJiraOnly: newFilters.showJiraOnly, hideJiraTasks: newFilters.hideJiraTasks, @@ -277,12 +286,25 @@ export function TasksProvider({ filtered = filtered.filter( (task) => - task.status === 'done' && + isCompletedStatus(task.status) && task.completedAt && task.completedAt >= sevenDaysAgo ); } + // Filtre pour masquer les tâches terminées depuis plus de 7 jours + if (kanbanFilters.hideCompletedOlderThan15Days) { + const sevenDaysAgo = new Date(); + sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); + + filtered = filtered.filter( + (task) => + !isCompletedStatus(task.status) || + !task.completedAt || + task.completedAt >= sevenDaysAgo + ); + } + // Tri des tâches if (kanbanFilters.sortBy) { const sortOption = getSortOption(kanbanFilters.sortBy); @@ -302,6 +324,33 @@ export function TasksProvider({ return filtered; }, [regularTasks, kanbanFilters]); + // Calculer le nombre de tickets terminés depuis plus de 7 jours + const oldCompletedTasksCount = useMemo(() => { + if (!regularTasks || regularTasks.length === 0) return 0; + + const sevenDaysAgo = new Date(); + sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); + + const oldTasks = regularTasks.filter( + (task) => + isCompletedStatus(task.status) && + task.completedAt && + task.completedAt < sevenDaysAgo + ); + + console.log('Debug old completed tasks:', { + sevenDaysAgo: sevenDaysAgo.toISOString(), + oldTasks: oldTasks.map((t) => ({ + title: t.title, + status: t.status, + completedAt: t.completedAt, + isOld: t.completedAt ? t.completedAt < sevenDaysAgo : false, + })), + }); + + return oldTasks.length; + }, [regularTasks]); + const contextValue: TasksContextType = { ...tasksState, regularTasks, @@ -313,6 +362,7 @@ export function TasksProvider({ filteredTasks, pinnedTasks, activeFiltersCount, + oldCompletedTasksCount, }; return ( diff --git a/src/lib/types.ts b/src/lib/types.ts index bbc834c..f346afa 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -85,6 +85,7 @@ export interface KanbanFilters { sortBy?: string; showWithDueDate?: boolean; showCompletedLast7Days?: boolean; + hideCompletedOlderThan15Days?: boolean; // Filtres spécifiques Jira showJiraOnly?: boolean; hideJiraTasks?: boolean;