feat: add pinned tag functionality and UI enhancements

- Introduced `isPinned` property to the `Tag` model for marking main objectives.
- Updated `TagForm` to include a checkbox for setting tags as pinned, enhancing user interaction.
- Enhanced `KanbanBoardContainer` to display pinned tasks in a dedicated `ObjectivesBoard`, improving task visibility.
- Modified `KanbanFilters` to support filtering by pinned tags, streamlining task management.
- Adjusted `TasksContext` to separate pinned tasks from regular tasks for better organization.
This commit is contained in:
Julien Froidefond
2025-09-14 22:23:55 +02:00
parent c4f68bb00c
commit a589c0cc2f
10 changed files with 309 additions and 27 deletions

View File

@@ -29,6 +29,7 @@ interface TasksContextType {
kanbanFilters: KanbanFilters;
setKanbanFilters: (filters: KanbanFilters) => void;
filteredTasks: Task[];
pinnedTasks: Task[]; // Tâches avec tags épinglés (objectifs)
// Tags
tags: Tag[];
tagsLoading: boolean;
@@ -54,9 +55,28 @@ export function TasksProvider({ children, initialTasks, initialStats }: TasksPro
// État des filtres Kanban
const [kanbanFilters, setKanbanFilters] = useState<KanbanFilters>({});
// Filtrage des tâches
// Séparer les tâches épinglées (objectifs) des autres
const { pinnedTasks, regularTasks } = useMemo(() => {
const pinnedTagNames = tags.filter(tag => tag.isPinned).map(tag => tag.name);
const pinned: Task[] = [];
const regular: Task[] = [];
tasksState.tasks.forEach(task => {
const hasPinnedTag = task.tags?.some(tagName => pinnedTagNames.includes(tagName));
if (hasPinnedTag) {
pinned.push(task);
} else {
regular.push(task);
}
});
return { pinnedTasks: pinned, regularTasks: regular };
}, [tasksState.tasks, tags]);
// Filtrage des tâches régulières (pas les épinglées)
const filteredTasks = useMemo(() => {
let filtered = tasksState.tasks;
let filtered = regularTasks;
// Filtre par recherche
if (kanbanFilters.search) {
@@ -85,7 +105,7 @@ export function TasksProvider({ children, initialTasks, initialStats }: TasksPro
}
return filtered;
}, [tasksState.tasks, kanbanFilters]);
}, [regularTasks, kanbanFilters]);
const contextValue: TasksContextType = {
...tasksState,
@@ -94,7 +114,8 @@ export function TasksProvider({ children, initialTasks, initialStats }: TasksPro
tagsError,
kanbanFilters,
setKanbanFilters,
filteredTasks
filteredTasks,
pinnedTasks
};
return (