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`.
This commit is contained in:
@@ -24,6 +24,7 @@ export interface KanbanFilters {
|
|||||||
swimlanesMode?: 'tags' | 'priority'; // Mode des swimlanes
|
swimlanesMode?: 'tags' | 'priority'; // Mode des swimlanes
|
||||||
pinnedTag?: string; // Tag pour les objectifs principaux
|
pinnedTag?: string; // Tag pour les objectifs principaux
|
||||||
sortBy?: string; // Clé de l'option de tri sélectionnée
|
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
|
// Filtres spécifiques Jira
|
||||||
showJiraOnly?: boolean; // Afficher seulement les tâches Jira
|
showJiraOnly?: boolean; // Afficher seulement les tâches Jira
|
||||||
hideJiraTasks?: boolean; // Masquer toutes les tâches Jira
|
hideJiraTasks?: boolean; // Masquer toutes les tâches Jira
|
||||||
@@ -189,6 +190,13 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH
|
|||||||
onFiltersChange({});
|
onFiltersChange({});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDueDateFilterToggle = () => {
|
||||||
|
onFiltersChange({
|
||||||
|
...filters,
|
||||||
|
showWithDueDate: !filters.showWithDueDate
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Calculer les compteurs pour les priorités
|
// Calculer les compteurs pour les priorités
|
||||||
const priorityCounts = useMemo(() => {
|
const priorityCounts = useMemo(() => {
|
||||||
@@ -388,6 +396,34 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Filtres généraux */}
|
||||||
|
<div className="border-t border-[var(--border)]/30 pt-4 mt-4">
|
||||||
|
<label className="block text-xs font-mono font-medium text-[var(--muted-foreground)] uppercase tracking-wider mb-3">
|
||||||
|
Filtres généraux
|
||||||
|
</label>
|
||||||
|
<div className="flex flex-wrap gap-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleDueDateFilterToggle}
|
||||||
|
className={`flex items-center gap-2 px-3 py-2 rounded-lg border transition-all text-xs font-medium cursor-pointer ${
|
||||||
|
filters.showWithDueDate
|
||||||
|
? 'border-cyan-400 bg-cyan-400/10 text-cyan-400'
|
||||||
|
: 'border-[var(--border)] bg-[var(--card)] text-[var(--muted-foreground)] hover:border-[var(--border)] hover:bg-[var(--card)]/80'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
className="w-4 h-4"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
|
||||||
|
</svg>
|
||||||
|
Avec date de fin
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Filtres Jira */}
|
{/* Filtres Jira */}
|
||||||
<JiraFilters
|
<JiraFilters
|
||||||
filters={filters}
|
filters={filters}
|
||||||
@@ -432,6 +468,11 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH
|
|||||||
Tags: <span className="text-cyan-400">{filters.tags?.filter(Boolean).join(', ')}</span>
|
Tags: <span className="text-cyan-400">{filters.tags?.filter(Boolean).join(', ')}</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{filters.showWithDueDate && (
|
||||||
|
<div className="text-[var(--muted-foreground)]">
|
||||||
|
Affichage: <span className="text-green-400">Avec date de fin</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
{filters.showJiraOnly && (
|
{filters.showJiraOnly && (
|
||||||
<div className="text-[var(--muted-foreground)]">
|
<div className="text-[var(--muted-foreground)]">
|
||||||
Affichage: <span className="text-blue-400">Jira seulement</span>
|
Affichage: <span className="text-blue-400">Jira seulement</span>
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat
|
|||||||
compactView: preferences.viewPreferences.compactView || false,
|
compactView: preferences.viewPreferences.compactView || false,
|
||||||
swimlanesByTags: preferences.viewPreferences.swimlanesByTags || false,
|
swimlanesByTags: preferences.viewPreferences.swimlanesByTags || false,
|
||||||
swimlanesMode: preferences.viewPreferences.swimlanesMode || 'tags',
|
swimlanesMode: preferences.viewPreferences.swimlanesMode || 'tags',
|
||||||
|
showWithDueDate: preferences.kanbanFilters.showWithDueDate || false,
|
||||||
// Filtres Jira
|
// Filtres Jira
|
||||||
showJiraOnly: preferences.kanbanFilters.showJiraOnly || false,
|
showJiraOnly: preferences.kanbanFilters.showJiraOnly || false,
|
||||||
hideJiraTasks: preferences.kanbanFilters.hideJiraTasks || false,
|
hideJiraTasks: preferences.kanbanFilters.hideJiraTasks || false,
|
||||||
@@ -80,6 +81,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat
|
|||||||
priorities: newFilters.priorities,
|
priorities: newFilters.priorities,
|
||||||
showCompleted: newFilters.showCompleted,
|
showCompleted: newFilters.showCompleted,
|
||||||
sortBy: newFilters.sortBy,
|
sortBy: newFilters.sortBy,
|
||||||
|
showWithDueDate: newFilters.showWithDueDate,
|
||||||
// Filtres Jira
|
// Filtres Jira
|
||||||
showJiraOnly: newFilters.showJiraOnly,
|
showJiraOnly: newFilters.showJiraOnly,
|
||||||
hideJiraTasks: newFilters.hideJiraTasks,
|
hideJiraTasks: newFilters.hideJiraTasks,
|
||||||
@@ -138,6 +140,7 @@ export function TasksProvider({ children, initialTasks, initialTags, initialStat
|
|||||||
return (kanbanFilters.tags?.filter(Boolean).length || 0) +
|
return (kanbanFilters.tags?.filter(Boolean).length || 0) +
|
||||||
(kanbanFilters.priorities?.filter(Boolean).length || 0) +
|
(kanbanFilters.priorities?.filter(Boolean).length || 0) +
|
||||||
(kanbanFilters.search ? 1 : 0) +
|
(kanbanFilters.search ? 1 : 0) +
|
||||||
|
(kanbanFilters.showWithDueDate ? 1 : 0) +
|
||||||
(kanbanFilters.jiraProjects?.filter(Boolean).length || 0) +
|
(kanbanFilters.jiraProjects?.filter(Boolean).length || 0) +
|
||||||
(kanbanFilters.jiraTypes?.filter(Boolean).length || 0) +
|
(kanbanFilters.jiraTypes?.filter(Boolean).length || 0) +
|
||||||
(kanbanFilters.showJiraOnly ? 1 : 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
|
// Tri des tâches
|
||||||
if (kanbanFilters.sortBy) {
|
if (kanbanFilters.sortBy) {
|
||||||
const sortOption = getSortOption(kanbanFilters.sortBy);
|
const sortOption = getSortOption(kanbanFilters.sortBy);
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ export interface KanbanFilters {
|
|||||||
priorities?: TaskPriority[];
|
priorities?: TaskPriority[];
|
||||||
showCompleted?: boolean;
|
showCompleted?: boolean;
|
||||||
sortBy?: string;
|
sortBy?: string;
|
||||||
|
showWithDueDate?: boolean;
|
||||||
// Filtres spécifiques Jira
|
// Filtres spécifiques Jira
|
||||||
showJiraOnly?: boolean;
|
showJiraOnly?: boolean;
|
||||||
hideJiraTasks?: boolean;
|
hideJiraTasks?: boolean;
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ const DEFAULT_PREFERENCES: UserPreferences = {
|
|||||||
tags: [],
|
tags: [],
|
||||||
priorities: [],
|
priorities: [],
|
||||||
showCompleted: true,
|
showCompleted: true,
|
||||||
sortBy: ''
|
sortBy: '',
|
||||||
|
showWithDueDate: false
|
||||||
},
|
},
|
||||||
viewPreferences: {
|
viewPreferences: {
|
||||||
compactView: false,
|
compactView: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user