From 25ffad696fc8fec118c770f1a7f0ccedde4c9cc2 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sun, 17 Aug 2025 08:27:27 +0000 Subject: [PATCH 1/4] Improve the visual appearance and behavior of announcement messages Update AnnouncementCard component styling to match Task card background and remove message persistence from the database. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/CNzb9L3 --- client/src/components/AnnouncementCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/AnnouncementCard.tsx b/client/src/components/AnnouncementCard.tsx index 38bbd38..8509984 100644 --- a/client/src/components/AnnouncementCard.tsx +++ b/client/src/components/AnnouncementCard.tsx @@ -388,7 +388,7 @@ export default function AnnouncementCard() { const TypeIcon = getTypeIcon(announcement.type); return ( -
+
From 5f270c0aa81cd268ed851aafc20480679188d4b8 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sun, 17 Aug 2025 08:31:06 +0000 Subject: [PATCH 2/4] Improve announcement card display and production database usage Update announcement card UI to match task card styling and integrate PostgreSQL for production announcements, using the `DASHBOARD_MESSAGES` table. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/BFQBiA5 --- client/src/components/AnnouncementCard.tsx | 6 +- server/routes.ts | 143 ++++++++++++++++++--- 2 files changed, 125 insertions(+), 24 deletions(-) diff --git a/client/src/components/AnnouncementCard.tsx b/client/src/components/AnnouncementCard.tsx index 8509984..09dd4ad 100644 --- a/client/src/components/AnnouncementCard.tsx +++ b/client/src/components/AnnouncementCard.tsx @@ -267,10 +267,7 @@ export default function AnnouncementCard() { return ( -
- - Informations -
+ Informations
{user?.role === 'admin' && ( { @@ -371,6 +368,7 @@ export default function AnnouncementCard() { )} +
diff --git a/server/routes.ts b/server/routes.ts index 0fac6cb..91ffdb9 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -39,15 +39,22 @@ import { insertSavTicketSchema, insertSavTicketHistorySchema, insertWeatherDataSchema, - insertWeatherSettingsSchema + insertWeatherSettingsSchema, + users, groups, userGroups, suppliers, orders, deliveries, publicities, publicityParticipations, + customerOrders, nocodbConfigs, dlcProducts, tasks, invoiceVerifications, dashboardMessages } from "@shared/schema"; import { hasPermission } from "@shared/permissions"; import { z } from "zod"; +import { eq, desc } from "drizzle-orm"; import { invoiceVerificationService } from "./invoiceVerification"; import { backupService } from "./backupService"; import { weatherService } from "./weatherService.js"; export async function registerRoutes(app: Express): Promise { + // Detect environment + const environment = process.env.NODE_ENV || 'development'; + console.log('🌍 Environment detected:', environment); + // Health check endpoint for Docker app.get('/api/health', (req, res) => { res.status(200).json({ @@ -2997,33 +3004,102 @@ RÉSUMÉ DU SCAN }); // Route de géolocalisation météo - // Announcement routes + // Announcement routes - PostgreSQL en production, mémoire en développement app.get('/api/announcements', isAuthenticated, async (req: any, res) => { try { const userId = req.user.claims ? req.user.claims.sub : req.user.id; + console.log('📢 [SERVER] Fetching announcements for user:', userId, 'environment:', environment); + const user = await storage.getUserWithGroups(userId); if (!user) { return res.status(404).json({ message: "User not found" }); } - // Get user's group IDs for filtering - let groupIds: number[] = []; - if (user.role === 'admin') { - // Admin can see all announcements, but can filter by selected store - const storeId = req.query.storeId; - if (storeId) { - groupIds = [parseInt(storeId)]; + console.log('📢 [SERVER] User found:', { username: user.username, role: user.role }); + + if (environment === 'production') { + // PRODUCTION: Utiliser PostgreSQL avec DASHBOARD_MESSAGES + console.log('🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table'); + + try { + let query = db.select({ + id: dashboardMessages.id, + title: dashboardMessages.title, + content: dashboardMessages.content, + type: dashboardMessages.type, + storeId: dashboardMessages.storeId, + createdBy: dashboardMessages.createdBy, + createdAt: dashboardMessages.createdAt, + }).from(dashboardMessages); + + // Filtrage par magasin pour admin + if (user.role === 'admin' && req.query.storeId) { + query = query.where(eq(dashboardMessages.storeId, parseInt(req.query.storeId as string))); + } + + const messages = await query.orderBy(desc(dashboardMessages.createdAt)).limit(5); + + // Ajouter les relations manuellement + const announcements = await Promise.all( + messages.map(async (message) => { + // Récupérer l'auteur + let author = { id: parseInt(message.createdBy) || 0, firstName: 'Utilisateur', lastName: 'Inconnu' }; + try { + const [userResult] = await db.select().from(users).where(eq(users.id, message.createdBy)); + if (userResult) { + author = { + id: parseInt(message.createdBy), + firstName: userResult.firstName || 'Utilisateur', + lastName: userResult.lastName || 'Inconnu' + }; + } + } catch (e) { + console.warn('Could not fetch author for message:', message.id); + } + + // Récupérer le groupe si storeId est défini + let group = null; + if (message.storeId) { + try { + const [groupResult] = await db.select().from(groups).where(eq(groups.id, message.storeId)); + if (groupResult) { + group = { id: groupResult.id, name: groupResult.name }; + } + } catch (e) { + console.warn('Could not fetch group for message:', message.id); + } + } + + return { + ...message, + author, + group + }; + }) + ); + + console.log('🎯 [PRODUCTION] Found announcements:', announcements.length); + res.json(announcements); + + } catch (dbError) { + console.error('🎯 [PRODUCTION] Database error:', dbError); + // Fallback au stockage mémoire en cas d'erreur DB + console.log('🧠 [FALLBACK] Using memory storage due to DB error'); + const announcements = await storage.getAnnouncements(); + res.json(announcements); } } else { - // Other roles see only their assigned groups + global announcements - const userGroups = (user as any).userGroups; - groupIds = userGroups ? userGroups.map((ug: any) => ug.groupId) : []; + // DÉVELOPPEMENT: Utiliser stockage mémoire + console.log('🧠 [DEV] Using memory storage for announcements'); + const groupIds = user.role === 'admin' && req.query.storeId + ? [parseInt(req.query.storeId as string)] + : undefined; + + const announcements = await storage.getAnnouncements(groupIds); + res.json(announcements); } - - const announcements = await storage.getAnnouncements(groupIds.length > 0 ? groupIds : undefined); - res.json(announcements); } catch (error) { - console.error("Error fetching announcements:", error); + console.error("📢 [SERVER] Error fetching announcements:", error); res.status(500).json({ message: "Failed to fetch announcements" }); } }); @@ -3067,10 +3143,37 @@ RÉSUMÉ DU SCAN console.log('🎯 [SERVER] Announcement data validated:', announcementData); - const announcement = await storage.createAnnouncement(announcementData); - console.log('🎯 [SERVER] Announcement created successfully:', announcement); - - res.status(201).json(announcement); + if (environment === 'production') { + // PRODUCTION: Créer dans PostgreSQL DASHBOARD_MESSAGES + console.log('🎯 [PRODUCTION] Creating in PostgreSQL DASHBOARD_MESSAGES table'); + try { + const [newMessage] = await db.insert(dashboardMessages).values({ + title: announcementData.title, + content: announcementData.content, + type: announcementData.type, + storeId: announcementData.storeId, + createdBy: user.id.toString(), + }).returning(); + + const announcement = { + ...newMessage, + author: { id: user.id, firstName: user.firstName, lastName: user.lastName }, + group: null + }; + + console.log('🎯 [PRODUCTION] Announcement created successfully in DB:', announcement); + res.status(201).json(announcement); + } catch (dbError) { + console.error('🎯 [PRODUCTION] DB error, fallback to memory:', dbError); + const announcement = await storage.createAnnouncement(announcementData); + res.status(201).json(announcement); + } + } else { + // DÉVELOPPEMENT: Créer en mémoire + const announcement = await storage.createAnnouncement(announcementData); + console.log('🧠 [DEV] Announcement created in memory:', announcement); + res.status(201).json(announcement); + } } catch (error) { console.error('🎯 [SERVER] Error creating announcement:', error); if (error instanceof z.ZodError) { From 3c2639d9b907b4bc1a583fc8e77acc181f633135 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sun, 17 Aug 2025 08:40:00 +0000 Subject: [PATCH 3/4] Improve announcement display by adjusting layout and content visibility Refactor AnnouncementCard component to adjust flex layout, remove unused TypeIcon import, and modify div structure for better presentation. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/dMHQVxZ --- attached_assets/image_1755419859659.png | Bin 0 -> 46874 bytes client/src/components/AnnouncementCard.tsx | 52 ++++++++++----------- 2 files changed, 24 insertions(+), 28 deletions(-) create mode 100644 attached_assets/image_1755419859659.png diff --git a/attached_assets/image_1755419859659.png b/attached_assets/image_1755419859659.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8550e5c0cf2c09be3fbb292d22da36424ecb80 GIT binary patch literal 46874 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 {announcements.map((announcement) => { const priorityConfig = getPriorityConfig(announcement.type); - const TypeIcon = getTypeIcon(announcement.type); return (
-
- -
-
-

- {announcement.title} -

- - {priorityConfig.label} - -
- - {announcement.content && ( -

- {announcement.content} -

- )} - -
- - {safeFormat(safeDate(announcement.createdAt), 'dd/MM à HH:mm')} - - - {announcement.author.firstName} {announcement.author.lastName} - {announcement.group && ` • ${announcement.group.name}`} - -
+
+
+

+ {announcement.title} +

+ + {priorityConfig.label} + +
+ + {announcement.content && ( +

+ {announcement.content} +

+ )} + +
+ + {safeFormat(safeDate(announcement.createdAt), 'dd/MM à HH:mm')} + + + {announcement.author.firstName} {announcement.author.lastName} + {announcement.group && ` • ${announcement.group.name}`} +
{user?.role === 'admin' && ( From 3b180b84a4ec9780cf67ec430ec54f34327f03d2 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sun, 17 Aug 2025 08:49:58 +0000 Subject: [PATCH 4/4] Add icons to announcement cards to visually represent announcement types Integrate type icons into the AnnouncementCard component by importing getTypeIcon and rendering the icon next to the announcement title, improving visual clarity. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/7I4lS2Q --- client/src/components/AnnouncementCard.tsx | 52 ++++++++++++---------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/client/src/components/AnnouncementCard.tsx b/client/src/components/AnnouncementCard.tsx index 1585ace..d56e520 100644 --- a/client/src/components/AnnouncementCard.tsx +++ b/client/src/components/AnnouncementCard.tsx @@ -383,33 +383,37 @@ export default function AnnouncementCard() {
{announcements.map((announcement) => { const priorityConfig = getPriorityConfig(announcement.type); + const TypeIcon = getTypeIcon(announcement.type); return (
-
-
-

- {announcement.title} -

- - {priorityConfig.label} - -
- - {announcement.content && ( -

- {announcement.content} -

- )} - -
- - {safeFormat(safeDate(announcement.createdAt), 'dd/MM à HH:mm')} - - - {announcement.author.firstName} {announcement.author.lastName} - {announcement.group && ` • ${announcement.group.name}`} - +
+ +
+
+

+ {announcement.title} +

+ + {priorityConfig.label} + +
+ + {announcement.content && ( +

+ {announcement.content} +

+ )} + +
+ + {safeFormat(safeDate(announcement.createdAt), 'dd/MM à HH:mm')} + + + {announcement.author.firstName} {announcement.author.lastName} + {announcement.group && ` • ${announcement.group.name}`} + +
{user?.role === 'admin' && (