Files
towercontrol/src/app/kanban/KanbanPageClient.tsx
Julien Froidefond 749f69680b feat: integrate global keyboard shortcuts across multiple components
- Added `KeyboardShortcutsProvider` to `RootLayout` for centralized keyboard shortcut management.
- Implemented `useGlobalKeyboardShortcuts` in `DailyPageClient`, `KanbanPageClient`, and `HomePageClient` to enhance navigation and task management with keyboard shortcuts.
- Updated `KeyboardShortcuts` component to render a modal for displaying available shortcuts, improving user accessibility.
- Enhanced `Header` component with buttons to open the keyboard shortcuts modal, streamlining user interaction.
2025-09-29 17:29:11 +02:00

140 lines
4.9 KiB
TypeScript

'use client';
import { useState } from 'react';
import { useSearchParams } from 'next/navigation';
import { KanbanBoardContainer } from '@/components/kanban/BoardContainer';
import { Header } from '@/components/ui/Header';
import { TasksProvider, useTasksContext } from '@/contexts/TasksContext';
import { useUserPreferences } from '@/contexts/UserPreferencesContext';
import { Task, Tag } from '@/lib/types';
import { CreateTaskData } from '@/clients/tasks-client';
import { CreateTaskForm } from '@/components/forms/CreateTaskForm';
import { MobileControls } from '@/components/kanban/MobileControls';
import { DesktopControls } from '@/components/kanban/DesktopControls';
import { useIsMobile } from '@/hooks/useIsMobile';
import { useGlobalKeyboardShortcuts } from '@/hooks/useGlobalKeyboardShortcuts';
interface KanbanPageClientProps {
initialTasks: Task[];
initialTags: (Tag & { usage: number })[];
}
function KanbanPageContent() {
const { syncing, createTask, activeFiltersCount, kanbanFilters, setKanbanFilters } = useTasksContext();
const { preferences, updateViewPreferences } = useUserPreferences();
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
const isMobile = useIsMobile(768); // Tailwind md breakpoint
const searchParams = useSearchParams();
const taskIdFromUrl = searchParams.get('taskId');
// Extraire les préférences du context
const showFilters = preferences.viewPreferences.showFilters;
const showObjectives = preferences.viewPreferences.showObjectives;
const compactView = preferences.viewPreferences.compactView;
const swimlanesByTags = preferences.viewPreferences.swimlanesByTags;
// Handlers pour les toggles (sauvegarde automatique via le context)
const handleToggleFilters = () => {
updateViewPreferences({ showFilters: !showFilters });
};
const handleToggleObjectives = () => {
updateViewPreferences({ showObjectives: !showObjectives });
};
const handleToggleCompactView = () => {
updateViewPreferences({ compactView: !compactView });
};
const handleToggleSwimlanes = () => {
updateViewPreferences({ swimlanesByTags: !swimlanesByTags });
};
// Handler pour la création de tâche depuis la barre de contrôles
const handleCreateTask = async (data: CreateTaskData) => {
await createTask(data);
setIsCreateModalOpen(false);
};
// Raccourcis clavier globaux pour la page Kanban
useGlobalKeyboardShortcuts({
onCreateTask: () => setIsCreateModalOpen(true),
onToggleFilters: handleToggleFilters,
onToggleCompactView: handleToggleCompactView,
onToggleSwimlanes: handleToggleSwimlanes,
onOpenSearch: () => {
// Focus sur le champ de recherche dans les contrôles desktop
const searchInput = document.querySelector('input[placeholder*="Rechercher"]') as HTMLInputElement;
searchInput?.focus();
}
});
return (
<div className="min-h-screen bg-[var(--background)]">
<Header
title="Kanban Board"
subtitle="Gestionnaire de tâches"
syncing={syncing}
/>
{/* Barre de contrôles responsive */}
{isMobile ? (
<MobileControls
showFilters={showFilters}
showObjectives={showObjectives}
compactView={compactView}
activeFiltersCount={activeFiltersCount}
kanbanFilters={kanbanFilters}
onToggleFilters={handleToggleFilters}
onToggleObjectives={handleToggleObjectives}
onToggleCompactView={handleToggleCompactView}
onFiltersChange={setKanbanFilters}
onCreateTask={() => setIsCreateModalOpen(true)}
/>
) : (
<DesktopControls
showFilters={showFilters}
showObjectives={showObjectives}
compactView={compactView}
swimlanesByTags={swimlanesByTags}
activeFiltersCount={activeFiltersCount}
kanbanFilters={kanbanFilters}
onToggleFilters={handleToggleFilters}
onToggleObjectives={handleToggleObjectives}
onToggleCompactView={handleToggleCompactView}
onToggleSwimlanes={handleToggleSwimlanes}
onFiltersChange={setKanbanFilters}
onCreateTask={() => setIsCreateModalOpen(true)}
/>
)}
<main className="h-[calc(100vh-160px)]">
<KanbanBoardContainer
showFilters={showFilters}
showObjectives={showObjectives}
initialTaskIdToEdit={taskIdFromUrl}
/>
</main>
{/* Modal de création de tâche */}
<CreateTaskForm
isOpen={isCreateModalOpen}
onClose={() => setIsCreateModalOpen(false)}
onSubmit={handleCreateTask}
loading={false}
/>
</div>
);
}
export function KanbanPageClient({ initialTasks, initialTags }: KanbanPageClientProps) {
return (
<TasksProvider
initialTasks={initialTasks}
initialTags={initialTags}
>
<KanbanPageContent />
</TasksProvider>
);
}