diff --git a/src/components/kanban/KanbanFilters.tsx b/src/components/kanban/KanbanFilters.tsx index 794b836..7ac40b4 100644 --- a/src/components/kanban/KanbanFilters.tsx +++ b/src/components/kanban/KanbanFilters.tsx @@ -11,6 +11,8 @@ import { SORT_OPTIONS } from '@/lib/sort-config'; import { useUserPreferences } from '@/contexts/UserPreferencesContext'; import { ColumnVisibilityToggle } from './ColumnVisibilityToggle'; import { useIsMobile } from '@/hooks/useIsMobile'; +import { JiraFilters } from './filters/JiraFilters'; +import { TfsFilters } from './filters/TfsFilters'; export interface KanbanFilters { search?: string; @@ -145,126 +147,11 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH setIsSortExpanded(!isSortExpanded); }; - const handleJiraToggle = (mode: 'show' | 'hide' | 'all') => { - const updates: Partial = {}; - - switch (mode) { - case 'show': - updates.showJiraOnly = true; - updates.hideJiraTasks = false; - break; - case 'hide': - updates.showJiraOnly = false; - updates.hideJiraTasks = true; - break; - case 'all': - updates.showJiraOnly = false; - updates.hideJiraTasks = false; - break; - } - - onFiltersChange({ ...filters, ...updates }); - }; - - const handleTfsToggle = (mode: 'show' | 'hide' | 'all') => { - const updates: Partial = {}; - - switch (mode) { - case 'show': - updates.showTfsOnly = true; - updates.hideTfsTasks = false; - break; - case 'hide': - updates.showTfsOnly = false; - updates.hideTfsTasks = true; - break; - case 'all': - updates.showTfsOnly = false; - updates.hideTfsTasks = false; - break; - } - - onFiltersChange({ ...filters, ...updates }); - }; - - const handleJiraProjectToggle = (project: string) => { - const currentProjects = filters.jiraProjects || []; - const newProjects = currentProjects.includes(project) - ? currentProjects.filter(p => p !== project) - : [...currentProjects, project]; - - onFiltersChange({ - ...filters, - jiraProjects: newProjects - }); - }; - - const handleJiraTypeToggle = (type: string) => { - const currentTypes = filters.jiraTypes || []; - const newTypes = currentTypes.includes(type) - ? currentTypes.filter(t => t !== type) - : [...currentTypes, type]; - - onFiltersChange({ - ...filters, - jiraTypes: newTypes - }); - }; - - const handleTfsProjectToggle = (project: string) => { - const currentProjects = filters.tfsProjects || []; - const newProjects = currentProjects.includes(project) - ? currentProjects.filter(p => p !== project) - : [...currentProjects, project]; - - onFiltersChange({ - ...filters, - tfsProjects: newProjects - }); - }; const handleClearFilters = () => { onFiltersChange({}); }; - // Récupérer les projets et types Jira disponibles dans TOUTES les tâches (pas seulement les filtrées) - // regularTasks est déjà disponible depuis la ligne 39 - const availableJiraProjects = useMemo(() => { - const projects = new Set(); - regularTasks.forEach(task => { - if (task.source === 'jira' && task.jiraProject) { - projects.add(task.jiraProject); - } - }); - return Array.from(projects).sort(); - }, [regularTasks]); - - const availableJiraTypes = useMemo(() => { - const types = new Set(); - regularTasks.forEach(task => { - if (task.source === 'jira' && task.jiraType) { - types.add(task.jiraType); - } - }); - return Array.from(types).sort(); - }, [regularTasks]); - - // Vérifier s'il y a des tâches Jira dans le système (même masquées) - const hasJiraTasks = regularTasks.some(task => task.source === 'jira'); - - // Récupérer les projets TFS disponibles dans TOUTES les tâches - const availableTfsProjects = useMemo(() => { - const projects = new Set(); - regularTasks.forEach(task => { - if (task.source === 'tfs' && task.tfsProject) { - projects.add(task.tfsProject); - } - }); - return Array.from(projects).sort(); - }, [regularTasks]); - - // Vérifier s'il y a des tâches TFS dans le système (même masquées) - const hasTfsTasks = regularTasks.some(task => task.source === 'tfs'); // Calculer les compteurs pour les priorités const priorityCounts = useMemo(() => { @@ -464,164 +351,17 @@ export function KanbanFilters({ filters, onFiltersChange, hiddenStatuses: propsH )} - {/* Filtres Jira - Ligne séparée mais intégrée */} - {hasJiraTasks && ( -
-
- - - {/* Toggle Jira Show/Hide - inline avec le titre */} -
- - - -
-
+ {/* Filtres Jira */} + - {/* Projets et Types en 2 colonnes */} -
- {/* Projets Jira */} - {availableJiraProjects.length > 0 && ( -
- -
- {availableJiraProjects.map((project) => ( - - ))} -
-
- )} - - {/* Types Jira */} - {availableJiraTypes.length > 0 && ( -
- -
- {availableJiraTypes.map((type) => ( - - ))} -
-
- )} -
-
- )} - - {/* Filtres TFS - Ligne séparée mais intégrée */} - {hasTfsTasks && ( -
-
- - - {/* Toggle TFS Show/Hide - inline avec le titre */} -
- - - -
-
- - {/* Projets TFS */} - {availableTfsProjects.length > 0 && ( -
- -
- {availableTfsProjects.map((project) => ( - - ))} -
-
- )} -
- )} + {/* Filtres TFS */} + {/* Visibilité des colonnes */}
diff --git a/src/components/kanban/filters/JiraFilters.tsx b/src/components/kanban/filters/JiraFilters.tsx new file mode 100644 index 0000000..11831ee --- /dev/null +++ b/src/components/kanban/filters/JiraFilters.tsx @@ -0,0 +1,185 @@ +'use client'; + +import { useMemo } from 'react'; +import { Button } from '@/components/ui/Button'; +import { useTasksContext } from '@/contexts/TasksContext'; +import { KanbanFilters } from '../KanbanFilters'; + +interface JiraFiltersProps { + filters: KanbanFilters; + onFiltersChange: (filters: KanbanFilters) => void; +} + +export function JiraFilters({ filters, onFiltersChange }: JiraFiltersProps) { + const { regularTasks } = useTasksContext(); + + // Vérifier s'il y a des tâches Jira dans le système (même masquées) + const hasJiraTasks = regularTasks.some(task => task.source === 'jira'); + + // Récupérer les projets et types Jira disponibles dans TOUTES les tâches + const availableJiraProjects = useMemo(() => { + const projects = new Set(); + regularTasks.forEach(task => { + if (task.source === 'jira' && task.jiraProject) { + projects.add(task.jiraProject); + } + }); + return Array.from(projects).sort(); + }, [regularTasks]); + + const availableJiraTypes = useMemo(() => { + const types = new Set(); + regularTasks.forEach(task => { + if (task.source === 'jira' && task.jiraType) { + types.add(task.jiraType); + } + }); + return Array.from(types).sort(); + }, [regularTasks]); + + const handleJiraToggle = (mode: 'show' | 'hide' | 'all') => { + const updates: Partial = {}; + + switch (mode) { + case 'show': + updates.showJiraOnly = true; + updates.hideJiraTasks = false; + break; + case 'hide': + updates.showJiraOnly = false; + updates.hideJiraTasks = true; + break; + case 'all': + updates.showJiraOnly = false; + updates.hideJiraTasks = false; + break; + } + + onFiltersChange({ ...filters, ...updates }); + }; + + const handleJiraProjectToggle = (project: string) => { + const currentProjects = filters.jiraProjects || []; + const newProjects = currentProjects.includes(project) + ? currentProjects.filter(p => p !== project) + : [...currentProjects, project]; + + onFiltersChange({ + ...filters, + jiraProjects: newProjects + }); + }; + + const handleJiraTypeToggle = (type: string) => { + const currentTypes = filters.jiraTypes || []; + const newTypes = currentTypes.includes(type) + ? currentTypes.filter(t => t !== type) + : [...currentTypes, type]; + + onFiltersChange({ + ...filters, + jiraTypes: newTypes + }); + }; + + // Si pas de tâches Jira, on n'affiche rien + if (!hasJiraTasks) { + return null; + } + + return ( +
+
+ + + {/* Toggle Jira Show/Hide - inline avec le titre */} +
+ + + +
+
+ + {/* Projets et Types en 2 colonnes */} +
+ {/* Projets Jira */} + {availableJiraProjects.length > 0 && ( +
+ +
+ {availableJiraProjects.map((project) => ( + + ))} +
+
+ )} + + {/* Types Jira */} + {availableJiraTypes.length > 0 && ( +
+ +
+ {availableJiraTypes.map((type) => ( + + ))} +
+
+ )} +
+
+ ); +} + diff --git a/src/components/kanban/filters/TfsFilters.tsx b/src/components/kanban/filters/TfsFilters.tsx new file mode 100644 index 0000000..8cc7411 --- /dev/null +++ b/src/components/kanban/filters/TfsFilters.tsx @@ -0,0 +1,130 @@ +'use client'; + +import { useMemo } from 'react'; +import { Button } from '@/components/ui/Button'; +import { useTasksContext } from '@/contexts/TasksContext'; +import { KanbanFilters } from '../KanbanFilters'; + +interface TfsFiltersProps { + filters: KanbanFilters; + onFiltersChange: (filters: KanbanFilters) => void; +} + +export function TfsFilters({ filters, onFiltersChange }: TfsFiltersProps) { + const { regularTasks } = useTasksContext(); + + // Vérifier s'il y a des tâches TFS dans le système (même masquées) + const hasTfsTasks = regularTasks.some(task => task.source === 'tfs'); + + // Récupérer les projets TFS disponibles dans TOUTES les tâches + const availableTfsProjects = useMemo(() => { + const projects = new Set(); + regularTasks.forEach(task => { + if (task.source === 'tfs' && task.tfsProject) { + projects.add(task.tfsProject); + } + }); + return Array.from(projects).sort(); + }, [regularTasks]); + + const handleTfsToggle = (mode: 'show' | 'hide' | 'all') => { + const updates: Partial = {}; + + switch (mode) { + case 'show': + updates.showTfsOnly = true; + updates.hideTfsTasks = false; + break; + case 'hide': + updates.showTfsOnly = false; + updates.hideTfsTasks = true; + break; + case 'all': + updates.showTfsOnly = false; + updates.hideTfsTasks = false; + break; + } + + onFiltersChange({ ...filters, ...updates }); + }; + + const handleTfsProjectToggle = (project: string) => { + const currentProjects = filters.tfsProjects || []; + const newProjects = currentProjects.includes(project) + ? currentProjects.filter(p => p !== project) + : [...currentProjects, project]; + + onFiltersChange({ + ...filters, + tfsProjects: newProjects + }); + }; + + // Si pas de tâches TFS, on n'affiche rien + if (!hasTfsTasks) { + return null; + } + + return ( +
+
+ + + {/* Toggle TFS Show/Hide - inline avec le titre */} +
+ + + +
+
+ + {/* Projets TFS */} + {availableTfsProjects.length > 0 && ( +
+ +
+ {availableTfsProjects.map((project) => ( + + ))} +
+
+ )} +
+ ); +} +