From 2e9cc4e6673884cdfa06d4788f99a90b3b6c0dfc Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 26 Sep 2025 08:44:05 +0200 Subject: [PATCH] feat: add search functionality and due date filter toggle in DesktopControls - Implemented a debounced search input for filtering tasks, enhancing user experience with smooth input handling. - Added a toggle button for filtering tasks by due date, improving task visibility options. - Updated layout for better responsiveness and integrated new input components for a cleaner UI. --- src/components/kanban/DesktopControls.tsx | 106 ++++++++++++++++++---- 1 file changed, 89 insertions(+), 17 deletions(-) diff --git a/src/components/kanban/DesktopControls.tsx b/src/components/kanban/DesktopControls.tsx index 047d3ec..88dbdd8 100644 --- a/src/components/kanban/DesktopControls.tsx +++ b/src/components/kanban/DesktopControls.tsx @@ -1,6 +1,8 @@ 'use client'; +import { useState, useEffect, useRef, useCallback } from 'react'; import { Button } from '@/components/ui/Button'; +import { Input } from '@/components/ui/Input'; import { JiraQuickFilter } from '@/components/kanban/JiraQuickFilter'; import { TfsQuickFilter } from '@/components/kanban/TfsQuickFilter'; import { FontSizeToggle } from '@/components/ui/FontSizeToggle'; @@ -35,11 +37,64 @@ export function DesktopControls({ onFiltersChange, onCreateTask, }: DesktopControlsProps) { + // État local pour la recherche pour une saisie fluide + const [localSearch, setLocalSearch] = useState(kanbanFilters.search || ''); + const searchTimeoutRef = useRef(undefined); + + // Fonction debouncée pour mettre à jour les filtres + const debouncedSearchChange = useCallback((search: string) => { + if (searchTimeoutRef.current) { + window.clearTimeout(searchTimeoutRef.current); + } + + searchTimeoutRef.current = window.setTimeout(() => { + onFiltersChange({ ...kanbanFilters, search: search || undefined }); + }, 300); + }, [kanbanFilters, onFiltersChange]); + + const handleSearchChange = (search: string) => { + setLocalSearch(search); + debouncedSearchChange(search); + }; + + // Synchroniser l'état local quand les filtres changent de l'extérieur + useEffect(() => { + setLocalSearch(kanbanFilters.search || ''); + }, [kanbanFilters.search]); + + // Nettoyer le timeout au démontage + useEffect(() => { + return () => { + if (searchTimeoutRef.current) { + window.clearTimeout(searchTimeoutRef.current); + } + }; + }, []); + + const handleDueDateFilterToggle = () => { + onFiltersChange({ + ...kanbanFilters, + showWithDueDate: !kanbanFilters.showWithDueDate + }); + }; return ( -
-
-
+
+
+ {/* Layout responsive : deux lignes sur tablette, une ligne sur desktop */} +
+ {/* Section gauche : Recherche + Boutons principaux */}
+ {/* Champ de recherche */} +
+ handleSearchChange(e.target.value)} + placeholder="Rechercher des tâches..." + className="bg-[var(--card)] border-[var(--border)] w-full" + /> +
+
+ +
- +
+ + {/* Section droite : Raccourcis + Bouton Nouvelle tâche */} +
{/* Raccourcis Jira */}
- -
- {/* Bouton d'ajout de tâche */} - + {/* Bouton d'ajout de tâche */} + +