Improve task feedback and show scheduled tasks to directors

Replace alerts with toast notifications for task operations and grant directors visibility into scheduled tasks, previously only visible to admins.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: cc2d271b-82f0-4d6a-9302-a0b067ffb429
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/cc2d271b-82f0-4d6a-9302-a0b067ffb429/IUKNI3f
This commit is contained in:
michaelschal committed 2025-08-19 11:35:36 +00:00
1 parent 90480201ee
commit f407cdceb7
2 files changed
+38 -7

No files matched your search

+20 -4
View File
@@ -40,6 +40,7 @@ type TaskWithRelations = Task & {
// Composant TaskForm inline - Version production ultra-simple
function TaskFormInline({ task, onClose }: any) {
const { toast } = useToast();
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
@@ -53,12 +54,20 @@ function TaskFormInline({ task, onClose }: any) {
const dueDate = formData.get('dueDate') as string;
if (!title?.trim()) {
alert("Le titre est requis");
toast({
title: "Erreur",
description: "Le titre est requis",
variant: "destructive",
});
return;
}
if (!assignedTo?.trim()) {
alert("L'assignation est requise");
toast({
title: "Erreur",
description: "L'assignation est requise",
variant: "destructive",
});
return;
}
@@ -101,12 +110,19 @@ function TaskFormInline({ task, onClose }: any) {
throw new Error(`Erreur ${response.status}: ${errorText}`);
}
alert(task ? "Tâche modifiée avec succès" : "Tâche créée avec succès");
toast({
title: "Succès",
description: task ? "Tâche modifiée avec succès" : "Tâche créée avec succès",
});
window.location.reload();
} catch (error) {
console.error('Erreur:', error);
alert("Erreur lors de l'opération");
toast({
title: "Erreur",
description: "Erreur lors de l'opération",
variant: "destructive",
});
submitBtn.disabled = false;
submitBtn.textContent = task ? "Modifier" : "Créer";
}
+18 -3
View File
@@ -1612,7 +1612,7 @@ export class DatabaseStorage implements IStorage {
)
);
}
// Admin et directeur voient toutes les tâches (pas de filtre additionnel)
// Admin et directeur voient toutes les tâches, y compris les tâches programmées
if (whereConditions.length > 0) {
query = query.where(and(...whereConditions));
@@ -2950,17 +2950,32 @@ export class MemStorage implements IStorage {
};
}
async getTasks(groupIds?: number[]): Promise<TaskWithRelations[]> {
async getTasks(groupIds?: number[], userRole?: string): Promise<TaskWithRelations[]> {
const today = new Date();
today.setHours(0, 0, 0, 0);
let tasks = Array.from(this.tasks.values());
if (groupIds && groupIds.length > 0) {
tasks = tasks.filter(task => groupIds.includes(task.groupId));
}
// Filtrage par rôle pour la date de départ
if (userRole === 'manager' || userRole === 'employee') {
// Managers et employés : seulement les tâches dont la date de départ est atteinte ou passée
tasks = tasks.filter(task => {
if (!task.startDate) return true; // Tâches sans date de départ (toujours visibles)
const startDate = new Date(task.startDate);
return startDate <= today; // Tâches dont la date de départ est arrivée
});
}
// Admin et directeur voient toutes les tâches, y compris les tâches programmées
return tasks.map(task => ({
...task,
group: this.groups.get(task.groupId)!,
creator: this.users.get(task.createdBy)!
creator: this.users.get(task.createdBy)!,
isFutureTask: task.startDate ? new Date(task.startDate) > today : false
}));
}