From f58c2ca448ffa2c4b134da69f17b0492f382166b Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Thu, 14 Aug 2025 12:10:16 +0000 Subject: [PATCH] Fix buttons for adding comments and deleting service tickets Implement mutations for adding comments and deleting service tickets, and add event handlers for these actions in the SavTickets page. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 31f9bd88-0285-4787-81b3-31ceeea5a08b Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/31f9bd88-0285-4787-81b3-31ceeea5a08b/yN3F32y --- ...-45AC-A9CA-1EA3033AD4E3}_1755173214117.png | Bin 0 -> 25274 bytes client/src/pages/SavTickets.tsx | 158 +++++++++++++++++- 2 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 attached_assets/{66B42A7D-EB4F-45AC-A9CA-1EA3033AD4E3}_1755173214117.png diff --git a/attached_assets/{66B42A7D-EB4F-45AC-A9CA-1EA3033AD4E3}_1755173214117.png b/attached_assets/{66B42A7D-EB4F-45AC-A9CA-1EA3033AD4E3}_1755173214117.png new file mode 100644 index 0000000000000000000000000000000000000000..93838a37227958b0c1a7b5fe49e41e8cb93e89e6 GIT binary patch literal 25274 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 b)gga^mOQO)SitMgzhQ1-b-nhgcf$Vw4DjSa literal 0 HcmV?d00001 diff --git a/client/src/pages/SavTickets.tsx b/client/src/pages/SavTickets.tsx index 6de9732..3acd203 100644 --- a/client/src/pages/SavTickets.tsx +++ b/client/src/pages/SavTickets.tsx @@ -59,7 +59,10 @@ export default function SavTickets() { const [showCreateModal, setShowCreateModal] = useState(false); const [showDetailModal, setShowDetailModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); + const [showCommentModal, setShowCommentModal] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedTicket, setSelectedTicket] = useState(null); + const [newComment, setNewComment] = useState(""); const [formData, setFormData] = useState({ supplierId: "", groupId: "", @@ -156,6 +159,56 @@ export default function SavTickets() { }, }); + // Add comment mutation + const addCommentMutation = useMutation({ + mutationFn: async (data: { ticketId: number; comment: string }) => { + const response = await apiRequest(`/api/sav-tickets/${data.ticketId}/comments`, "POST", { + comment: data.comment + }); + return response; + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['/api/sav/tickets'] }); + setShowCommentModal(false); + setNewComment(""); + toast({ + title: "Commentaire ajouté", + description: "Le commentaire a été ajouté avec succès.", + }); + }, + onError: (error: any) => { + toast({ + title: "Erreur", + description: error?.message || "Impossible d'ajouter le commentaire.", + variant: "destructive", + }); + }, + }); + + // Delete ticket mutation + const deleteTicketMutation = useMutation({ + mutationFn: async (ticketId: number) => { + const response = await apiRequest(`/api/sav-tickets/${ticketId}`, "DELETE"); + return response; + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['/api/sav/tickets'] }); + queryClient.invalidateQueries({ queryKey: ['/api/sav/stats'] }); + setShowDeleteModal(false); + toast({ + title: "Ticket supprimé", + description: "Le ticket a été supprimé avec succès.", + }); + }, + onError: (error: any) => { + toast({ + title: "Erreur", + description: error?.message || "Impossible de supprimer le ticket.", + variant: "destructive", + }); + }, + }); + // Check permissions AFTER all hooks are called const canView = ['admin', 'directeur', 'manager', 'employee'].includes(user?.role || ''); const canModify = ['admin', 'directeur', 'manager'].includes(user?.role || ''); @@ -237,6 +290,19 @@ export default function SavTickets() { setShowEditModal(true); }; + // Handle commenting on ticket + const handleCommentTicket = (ticket: SavTicketWithRelations) => { + setSelectedTicket(ticket); + setNewComment(""); + setShowCommentModal(true); + }; + + // Handle deleting ticket + const handleDeleteTicket = (ticket: SavTicketWithRelations) => { + setSelectedTicket(ticket); + setShowDeleteModal(true); + }; + // Handle permission check without early return if (!canView) { return ( @@ -717,13 +783,13 @@ export default function SavTickets() { - )} {canDelete && ( - )} @@ -971,6 +1037,94 @@ export default function SavTickets() { )} + + {/* Comment Modal */} + {selectedTicket && ( + + + + Ajouter un commentaire + + Ajouter un commentaire au ticket {selectedTicket.ticketNumber} + + +
+
+ +