feat: overhaul TODO.md and enhance Kanban components

- Updated TODO.md to reflect the new project structure and phases, marking several tasks as completed.
- Enhanced Kanban components with a tech-inspired design, including new styles for columns and task cards.
- Removed the obsolete reminders service and task processor, streamlining the codebase for better maintainability.
- Introduced a modern API for task management, including CRUD operations and improved error handling.
- Updated global styles for a cohesive dark theme and added custom scrollbar styles.
This commit is contained in:
Julien Froidefond
2025-09-14 08:15:22 +02:00
parent d645fffd87
commit 124e8baee8
18 changed files with 857 additions and 1154 deletions

87
scripts/reset-database.ts Normal file
View File

@@ -0,0 +1,87 @@
import { prisma } from '../services/database';
/**
* Script pour reset la base de données et supprimer les anciennes données
*/
async function resetDatabase() {
console.log('🗑️ Reset de la base de données...');
console.log('===================================');
try {
// Compter les tâches avant suppression
const beforeCount = await prisma.task.count();
const manualCount = await prisma.task.count({ where: { source: 'manual' } });
const remindersCount = await prisma.task.count({ where: { source: 'reminders' } });
console.log(`📊 État actuel:`);
console.log(` Total: ${beforeCount} tâches`);
console.log(` Manuelles: ${manualCount} tâches`);
console.log(` Rappels: ${remindersCount} tâches`);
console.log('');
// Supprimer toutes les tâches de synchronisation
const deletedTasks = await prisma.task.deleteMany({
where: {
source: 'reminders'
}
});
console.log(`✅ Supprimé ${deletedTasks.count} tâches de synchronisation`);
// Supprimer les logs de sync
const deletedLogs = await prisma.syncLog.deleteMany();
console.log(`✅ Supprimé ${deletedLogs.count} logs de synchronisation`);
// Supprimer les tags orphelins (optionnel)
const deletedTags = await prisma.tag.deleteMany();
console.log(`✅ Supprimé ${deletedTags.count} tags`);
// Compter après nettoyage
const afterCount = await prisma.task.count();
console.log('');
console.log('🎉 Base de données nettoyée !');
console.log(`📊 Résultat: ${afterCount} tâches restantes`);
// Afficher les tâches restantes
if (afterCount > 0) {
console.log('');
console.log('📋 Tâches restantes:');
const remainingTasks = await prisma.task.findMany({
orderBy: { createdAt: 'desc' }
});
remainingTasks.forEach((task, index) => {
const statusEmoji = {
'todo': '⏳',
'in_progress': '🔄',
'done': '✅',
'cancelled': '❌'
}[task.status] || '❓';
const tags = JSON.parse(task.tagsJson || '[]');
const tagsStr = tags.length > 0 ? ` [${tags.join(', ')}]` : '';
console.log(` ${index + 1}. ${statusEmoji} ${task.title}${tagsStr}`);
});
}
} catch (error) {
console.error('❌ Erreur lors du reset:', error);
throw error;
}
}
// Exécuter le script
if (require.main === module) {
resetDatabase().then(() => {
console.log('');
console.log('✨ Reset terminé avec succès !');
process.exit(0);
}).catch((error) => {
console.error('💥 Erreur fatale:', error);
process.exit(1);
});
}
export { resetDatabase };

100
scripts/seed-data.ts Normal file
View File

@@ -0,0 +1,100 @@
import { tasksService } from '../services/tasks';
import { TaskStatus, TaskPriority } from '../lib/types';
/**
* Script pour ajouter des données de test avec tags et variété
*/
async function seedTestData() {
console.log('🌱 Ajout de données de test...');
console.log('================================');
const testTasks = [
{
title: '🎨 Redesign du dashboard',
description: 'Créer une interface moderne et intuitive pour le tableau de bord principal',
status: 'in_progress' as TaskStatus,
priority: 'high' as TaskPriority,
tags: ['design', 'ui', 'frontend'],
dueDate: new Date('2025-01-20')
},
{
title: '🔧 Optimiser les performances API',
description: 'Améliorer les temps de réponse des endpoints et ajouter la pagination',
status: 'todo' as TaskStatus,
priority: 'medium' as TaskPriority,
tags: ['backend', 'performance', 'api'],
dueDate: new Date('2025-01-25')
},
{
title: '✅ Tests unitaires composants',
description: 'Ajouter des tests Jest/RTL pour les composants principaux',
status: 'done' as TaskStatus,
priority: 'medium' as TaskPriority,
tags: ['testing', 'jest', 'quality'],
dueDate: new Date('2025-01-10')
}
];
let createdCount = 0;
let errorCount = 0;
for (const taskData of testTasks) {
try {
const task = await tasksService.createTask(taskData);
const statusEmoji = {
'todo': '⏳',
'in_progress': '🔄',
'done': '✅',
'cancelled': '❌'
}[task.status];
const priorityEmoji = {
'low': '🔵',
'medium': '🟡',
'high': '🔴'
}[task.priority];
console.log(` ${statusEmoji} ${priorityEmoji} ${task.title}`);
console.log(` Tags: ${task.tags?.join(', ') || 'aucun'}`);
if (task.dueDate) {
console.log(` Échéance: ${task.dueDate.toLocaleDateString('fr-FR')}`);
}
console.log('');
createdCount++;
} catch (error) {
console.error(` ❌ Erreur pour "${taskData.title}":`, error instanceof Error ? error.message : error);
errorCount++;
}
}
console.log('📊 Résumé:');
console.log(` ✅ Tâches créées: ${createdCount}`);
console.log(` ❌ Erreurs: ${errorCount}`);
// Afficher les stats finales
const stats = await tasksService.getTaskStats();
console.log('');
console.log('📈 Statistiques finales:');
console.log(` Total: ${stats.total} tâches`);
console.log(` À faire: ${stats.todo}`);
console.log(` En cours: ${stats.inProgress}`);
console.log(` Terminées: ${stats.completed}`);
console.log(` Annulées: ${stats.cancelled}`);
console.log(` Taux de completion: ${stats.completionRate}%`);
}
// Exécuter le script
if (require.main === module) {
seedTestData().then(() => {
console.log('');
console.log('✨ Données de test ajoutées avec succès !');
process.exit(0);
}).catch((error) => {
console.error('💥 Erreur fatale:', error);
process.exit(1);
});
}
export { seedTestData };