Enhance task management with start dates and improved visibility

Introduce task start dates, allowing for future task scheduling and better visibility for managers and employees. Admins can now see all tasks, while other roles only see tasks that have started or have no start date. Includes UI updates to visually distinguish future tasks and a new form for creating tasks with start and due dates.

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/kX6A8MG
This commit is contained in:
michaelschal committed 2025-08-19 07:23:52 +00:00
1 parent 87cc2a0f88
commit aa1906a9bb
7 files changed
+701 -512

No files matched your search

+1 -1
View File
@@ -1362,7 +1362,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
timestamp: new Date().toISOString()
});
const tasks = await storage.getTasks(groupIds);
const tasks = await storage.getTasks(groupIds, user.role);
console.log('📋 Tasks returned:', {
count: tasks.length,
userId: user.id,
+28 -5
View File
@@ -172,8 +172,8 @@ export interface IStorage {
restoreDlcProductStock(id: number): Promise<DlcProductFrontend>;
getDlcStats(groupIds?: number[]): Promise<{ active: number; expiringSoon: number; expired: number; }>;
// Task operations
getTasks(groupIds?: number[]): Promise<any[]>;
// Task operations
getTasks(groupIds?: number[], userRole?: string): Promise<any[]>;
getTask(id: number): Promise<any | undefined>;
createTask(task: InsertTask): Promise<Task>;
updateTask(id: number, task: Partial<InsertTask>): Promise<Task>;
@@ -1584,7 +1584,10 @@ export class DatabaseStorage 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 query = db
.select({
task: tasks,
@@ -1593,14 +1596,34 @@ export class DatabaseStorage implements IStorage {
.from(tasks)
.leftJoin(groups, eq(tasks.groupId, groups.id));
// Appliquer le filtrage par magasin si spécifié
let whereConditions = [];
if (groupIds && groupIds.length > 0) {
query = query.where(inArray(tasks.groupId, groupIds));
whereConditions.push(inArray(tasks.groupId, groupIds));
}
// 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
whereConditions.push(
or(
isNull(tasks.startDate), // Tâches sans date de départ (toujours visibles)
lte(tasks.startDate, today) // Tâches dont la date de départ est arrivée
)
);
}
// Admin et directeur voient toutes les tâches (pas de filtre additionnel)
if (whereConditions.length > 0) {
query = query.where(and(...whereConditions));
}
const results = await query.orderBy(desc(tasks.createdAt));
return results.map((row: any) => ({
...row.task,
group: row.group
group: row.group,
// Ajouter le statut "future" pour les tâches futures (admin/directeur)
isFutureTask: row.task.startDate && new Date(row.task.startDate) > today
}));
}