feat: add updatedAt field to AchievementCard and related services
- Introduced `updatedAt` property in `AchievementData`, `KeyAccomplishment`, and `Task` interfaces for improved task tracking. - Updated `AchievementCard` UI to display the last updated date alongside completion date, enhancing user visibility. - Adjusted `UIShowcaseClient` and `TasksService` to include `updatedAt` values, ensuring consistency across task management components.
This commit is contained in:
@@ -64,6 +64,7 @@ export function UIShowcaseClient() {
|
|||||||
description: 'Migration vers les composants UI génériques',
|
description: 'Migration vers les composants UI génériques',
|
||||||
impact: 'high',
|
impact: 'high',
|
||||||
completedAt: new Date(),
|
completedAt: new Date(),
|
||||||
|
updatedAt: new Date(),
|
||||||
tags: ['refactoring', 'ui'],
|
tags: ['refactoring', 'ui'],
|
||||||
todosCount: 8
|
todosCount: 8
|
||||||
},
|
},
|
||||||
@@ -73,6 +74,7 @@ export function UIShowcaseClient() {
|
|||||||
description: 'Ajout de 10 nouveaux thèmes avec CSS variables',
|
description: 'Ajout de 10 nouveaux thèmes avec CSS variables',
|
||||||
impact: 'medium',
|
impact: 'medium',
|
||||||
completedAt: new Date(Date.now() - 86400000),
|
completedAt: new Date(Date.now() - 86400000),
|
||||||
|
updatedAt: new Date(Date.now() - 86400000),
|
||||||
tags: ['themes', 'css'],
|
tags: ['themes', 'css'],
|
||||||
todosCount: 3
|
todosCount: 3
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export interface AchievementData {
|
|||||||
description?: string;
|
description?: string;
|
||||||
impact: 'low' | 'medium' | 'high';
|
impact: 'low' | 'medium' | 'high';
|
||||||
completedAt: Date;
|
completedAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
tags?: string[];
|
tags?: string[];
|
||||||
todosCount?: number;
|
todosCount?: number;
|
||||||
}
|
}
|
||||||
@@ -46,9 +47,12 @@ export function AchievementCard({
|
|||||||
</span>
|
</span>
|
||||||
<PriorityBadge priority={achievement.impact} />
|
<PriorityBadge priority={achievement.impact} />
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xs text-[var(--muted-foreground)]">
|
<div className="text-xs text-[var(--muted-foreground)] text-right">
|
||||||
{format(achievement.completedAt, 'dd/MM', { locale: fr })}
|
<div>Terminé: {format(achievement.completedAt, 'dd/MM', { locale: fr })}</div>
|
||||||
</span>
|
{achievement.updatedAt && achievement.updatedAt.getTime() !== achievement.completedAt.getTime() && (
|
||||||
|
<div>Mis à jour: {format(achievement.updatedAt, 'dd/MM', { locale: fr })}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Titre */}
|
{/* Titre */}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export interface KeyAccomplishment {
|
|||||||
tags: string[];
|
tags: string[];
|
||||||
impact: 'high' | 'medium' | 'low';
|
impact: 'high' | 'medium' | 'low';
|
||||||
completedAt: Date;
|
completedAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
relatedItems: string[]; // IDs des tâches/checkboxes liées
|
relatedItems: string[]; // IDs des tâches/checkboxes liées
|
||||||
todosCount: number; // Nombre de todos associés
|
todosCount: number; // Nombre de todos associés
|
||||||
}
|
}
|
||||||
@@ -261,6 +262,7 @@ export class ManagerSummaryService {
|
|||||||
tags: task.taskTags?.map(tt => tt.tag.name) || [],
|
tags: task.taskTags?.map(tt => tt.tag.name) || [],
|
||||||
impact,
|
impact,
|
||||||
completedAt: task.completedAt || task.updatedAt,
|
completedAt: task.completedAt || task.updatedAt,
|
||||||
|
updatedAt: task.updatedAt,
|
||||||
relatedItems: [task.id],
|
relatedItems: [task.id],
|
||||||
todosCount: allRelatedTodos // Nombre total de todos associés à cette tâche
|
todosCount: allRelatedTodos // Nombre total de todos associés à cette tâche
|
||||||
});
|
});
|
||||||
@@ -283,6 +285,7 @@ export class ManagerSummaryService {
|
|||||||
tags: [], // Todos standalone n'ont pas de tags par défaut
|
tags: [], // Todos standalone n'ont pas de tags par défaut
|
||||||
impact,
|
impact,
|
||||||
completedAt: todo.date,
|
completedAt: todo.date,
|
||||||
|
updatedAt: todo.date, // Pour les todos, updatedAt = completedAt
|
||||||
relatedItems: [todo.id],
|
relatedItems: [todo.id],
|
||||||
todosCount: 1 // Un todo = 1 todo
|
todosCount: 1 // Un todo = 1 todo
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -67,15 +67,18 @@ export class TasksService {
|
|||||||
tags?: string[];
|
tags?: string[];
|
||||||
dueDate?: Date;
|
dueDate?: Date;
|
||||||
}): Promise<Task> {
|
}): Promise<Task> {
|
||||||
|
const status = taskData.status || 'todo';
|
||||||
const task = await prisma.task.create({
|
const task = await prisma.task.create({
|
||||||
data: {
|
data: {
|
||||||
title: taskData.title,
|
title: taskData.title,
|
||||||
description: taskData.description,
|
description: taskData.description,
|
||||||
status: taskData.status || 'todo',
|
status: status,
|
||||||
priority: taskData.priority || 'medium',
|
priority: taskData.priority || 'medium',
|
||||||
dueDate: taskData.dueDate,
|
dueDate: taskData.dueDate,
|
||||||
source: 'manual', // Source manuelle
|
source: 'manual', // Source manuelle
|
||||||
sourceId: `manual-${Date.now()}` // ID unique
|
sourceId: `manual-${Date.now()}`, // ID unique
|
||||||
|
// Si créée directement en done/archived, définir completedAt
|
||||||
|
completedAt: (status === 'done' || status === 'archived') ? getToday() : null
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
taskTags: {
|
taskTags: {
|
||||||
@@ -135,12 +138,16 @@ export class TasksService {
|
|||||||
updatedAt: getToday()
|
updatedAt: getToday()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Logique pour completedAt : date de résolution définitive
|
||||||
if (updates.status === 'done' && !task.completedAt) {
|
if (updates.status === 'done') {
|
||||||
|
// Première fois qu'on marque comme done -> définir completedAt
|
||||||
|
updateData.completedAt = getToday();
|
||||||
|
} else if (updates.status === 'archived' && !task.completedAt) {
|
||||||
|
// Première fois qu'on archive -> définir completedAt (archiver = résoudre)
|
||||||
updateData.completedAt = getToday();
|
updateData.completedAt = getToday();
|
||||||
} else if (updates.status && updates.status !== 'done' && task.completedAt) {
|
|
||||||
updateData.completedAt = null;
|
|
||||||
}
|
}
|
||||||
|
// Si elle était déjà done/archived et qu'on change le statut,
|
||||||
|
// on garde la completedAt existante (ne jamais l'effacer)
|
||||||
|
|
||||||
await prisma.task.update({
|
await prisma.task.update({
|
||||||
where: { id: taskId },
|
where: { id: taskId },
|
||||||
|
|||||||
Reference in New Issue
Block a user