From 551279efcbc38d38325118742f4e0b392d00b58d Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 25 Sep 2025 21:44:08 +0200 Subject: [PATCH] feat: add due date filter to KanbanFilters - Introduced `showWithDueDate` option in `KanbanFilters` to filter tasks based on due dates. - Added toggle button in the UI for users to easily enable/disable this filter. - Updated `TasksContext` to handle the new filter state and applied filtering logic in task retrieval. - Ensured user preferences are saved with the new filter option in `user-preferences.ts`. --- src/components/kanban/KanbanFilters.tsx | 41 +++++++++++++++++++++++++ src/contexts/TasksContext.tsx | 8 +++++ src/lib/types.ts | 1 + src/services/core/user-preferences.ts | 3 +- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/components/kanban/KanbanFilters.tsx b/src/components/kanban/KanbanFilters.tsx index 007dfef..e16cc89 100644 --- a/src/components/kanban/KanbanFilters.tsx +++ b/src/components/kanban/KanbanFilters.tsx @@ -24,6 +24,7 @@ export interface KanbanFilters { swimlanesMode?: 'tags' | 'priority'; // Mode des swimlanes pinnedTag?: string; // Tag pour les objectifs principaux sortBy?: string; // Clé de l'option de tri sélectionnée + showWithDueDate?: boolean; // Afficher seulement les tâches avec une date de fin // Filtres spécifiques Jira showJiraOnly?: boolean; // Afficher seulement les tâches Jira hideJiraTasks?: boolean; // Masquer toutes les tâches Jira @@ -189,6 +190,13 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH onFiltersChange({}); }; + const handleDueDateFilterToggle = () => { + onFiltersChange({ + ...filters, + showWithDueDate: !filters.showWithDueDate + }); + }; + // Calculer les compteurs pour les priorités const priorityCounts = useMemo(() => { @@ -388,6 +396,34 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH )} + {/* Filtres généraux */} +
+ +
+ +
+
+ {/* Filtres Jira */} {filters.tags?.filter(Boolean).join(', ')} )} + {filters.showWithDueDate && ( +
+ Affichage: Avec date de fin +
+ )} {filters.showJiraOnly && (
Affichage: Jira seulement diff --git a/src/contexts/TasksContext.tsx b/src/contexts/TasksContext.tsx index a8cbcc9..f7eec76 100644 --- a/src/contexts/TasksContext.tsx +++ b/src/contexts/TasksContext.tsx @@ -60,6 +60,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat compactView: preferences.viewPreferences.compactView || false, swimlanesByTags: preferences.viewPreferences.swimlanesByTags || false, swimlanesMode: preferences.viewPreferences.swimlanesMode || 'tags', + showWithDueDate: preferences.kanbanFilters.showWithDueDate || false, // Filtres Jira showJiraOnly: preferences.kanbanFilters.showJiraOnly || false, hideJiraTasks: preferences.kanbanFilters.hideJiraTasks || false, @@ -80,6 +81,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat priorities: newFilters.priorities, showCompleted: newFilters.showCompleted, sortBy: newFilters.sortBy, + showWithDueDate: newFilters.showWithDueDate, // Filtres Jira showJiraOnly: newFilters.showJiraOnly, hideJiraTasks: newFilters.hideJiraTasks, @@ -138,6 +140,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat return (kanbanFilters.tags?.filter(Boolean).length || 0) + (kanbanFilters.priorities?.filter(Boolean).length || 0) + (kanbanFilters.search ? 1 : 0) + + (kanbanFilters.showWithDueDate ? 1 : 0) + (kanbanFilters.jiraProjects?.filter(Boolean).length || 0) + (kanbanFilters.jiraTypes?.filter(Boolean).length || 0) + (kanbanFilters.showJiraOnly ? 1 : 0) + @@ -212,6 +215,11 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat ); } + // Filtre par date de fin + if (kanbanFilters.showWithDueDate) { + filtered = filtered.filter(task => task.dueDate != null); + } + // Tri des tâches if (kanbanFilters.sortBy) { const sortOption = getSortOption(kanbanFilters.sortBy); diff --git a/src/lib/types.ts b/src/lib/types.ts index 5376b8e..0036174 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -71,6 +71,7 @@ export interface KanbanFilters { priorities?: TaskPriority[]; showCompleted?: boolean; sortBy?: string; + showWithDueDate?: boolean; // Filtres spécifiques Jira showJiraOnly?: boolean; hideJiraTasks?: boolean; diff --git a/src/services/core/user-preferences.ts b/src/services/core/user-preferences.ts index 15753aa..ee65e99 100644 --- a/src/services/core/user-preferences.ts +++ b/src/services/core/user-preferences.ts @@ -17,7 +17,8 @@ const DEFAULT_PREFERENCES: UserPreferences = { tags: [], priorities: [], showCompleted: true, - sortBy: '' + sortBy: '', + showWithDueDate: false }, viewPreferences: { compactView: false,