fix: Rafraîchir les documents côté client après upload manuel du contrat signé

- Ajout d'une prop refreshTrigger à DocumentsCard pour forcer le rechargement
- Ajout d'un listener d'événement custom 'refreshContractDocuments' dans la page client
- Émission de l'événement après l'upload réussi dans ManualSignedContractUpload
- Fix: Le contrat signé apparaît maintenant sur la page client après upload manuel depuis staff
This commit is contained in:
odentas 2025-12-19 17:29:50 +01:00
parent f43a0be89c
commit 49f0204a74
4 changed files with 31 additions and 9 deletions

View file

@ -1,5 +0,0 @@
# This directory is a Syncthing folder marker.
# Do not delete.
folderID: nqhsm-upsyy
created: 2025-09-22T11:34:12+02:00

View file

@ -585,6 +585,9 @@ export default function ContratPage() {
const payslipsQuery = usePayslips(id);
const [signedPayslipUrls, setSignedPayslipUrls] = useState<Record<string, string>>({});
// State pour forcer le rechargement des documents après un upload manuel (côté staff)
const [documentsRefreshTrigger, setDocumentsRefreshTrigger] = useState<number>(0);
// State pour la modale de signature DocuSeal
const [embedSrc, setEmbedSrc] = useState<string>("");
const [modalTitle, setModalTitle] = useState<string>("");
@ -604,6 +607,20 @@ export default function ContratPage() {
// Query client pour la mise à jour du cache
const queryClient = useQueryClient();
// Effet pour écouter les événements de rafraîchissement des documents
useEffect(() => {
const handleRefreshDocuments = () => {
console.log('🔄 Rafraîchissement des documents demandé');
setDocumentsRefreshTrigger(prev => prev + 1);
};
window.addEventListener('refreshContractDocuments', handleRefreshDocuments);
return () => {
window.removeEventListener('refreshContractDocuments', handleRefreshDocuments);
};
}, []);
// Effet pour bloquer le défilement quand le modal DocuSeal est ouvert
useEffect(() => {
// Vérifier si le dialog est ouvert en surveillant embedSrc
@ -1284,6 +1301,7 @@ return (
contrat_signe_employeur: data.contrat_signe_employeur,
contrat_signe_salarie: data.contrat_signe_salarie
}}
refreshTrigger={documentsRefreshTrigger}
/>
<Section title="Demande" icon={FileText}>

View file

@ -15,6 +15,7 @@ interface DocumentsCardProps {
contrat_signe_salarie?: string;
};
showPayslips?: boolean; // Par défaut true, si false ne charge pas les fiches de paie
refreshTrigger?: number; // Pour forcer le rechargement des données
}
interface SignedPdfData {
@ -52,7 +53,7 @@ interface AvenantData {
created_at: string;
}
export default function DocumentsCard({ contractId, contractNumber, contractData, showPayslips = true }: DocumentsCardProps) {
export default function DocumentsCard({ contractId, contractNumber, contractData, showPayslips = true, refreshTrigger = 0 }: DocumentsCardProps) {
const [signedPdfData, setSignedPdfData] = useState<SignedPdfData | null>(null);
const [loadingSignedPdf, setLoadingSignedPdf] = useState(true);
const [payslips, setPayslips] = useState<PayslipData[]>([]);
@ -146,6 +147,7 @@ export default function DocumentsCard({ contractId, contractNumber, contractData
// Récupération du contrat signé
useEffect(() => {
const fetchSignedPdf = async () => {
setLoadingSignedPdf(true);
try {
const response = await fetch(`/api/contrats/${contractId}/signed-pdf`, {
credentials: 'include',
@ -170,11 +172,12 @@ export default function DocumentsCard({ contractId, contractNumber, contractData
};
fetchSignedPdf();
}, [contractId]);
}, [contractId, refreshTrigger]);
// Récupération des avenants signés
useEffect(() => {
const fetchAvenants = async () => {
setLoadingAvenants(true);
try {
const response = await fetch(`/api/contrats/${contractId}/avenants`, {
credentials: 'include',
@ -197,7 +200,7 @@ export default function DocumentsCard({ contractId, contractNumber, contractData
};
fetchAvenants();
}, [contractId]);
}, [contractId, refreshTrigger]);
// Effet pour bloquer le défilement et gérer la touche Échap quand le modal est ouvert
useEffect(() => {
@ -230,6 +233,7 @@ export default function DocumentsCard({ contractId, contractNumber, contractData
}
const fetchPayslips = async () => {
setLoadingPayslips(true);
try {
const response = await fetch(`/api/contrats/${contractId}/payslip-urls`, {
credentials: 'include',
@ -252,7 +256,7 @@ export default function DocumentsCard({ contractId, contractNumber, contractData
};
fetchPayslips();
}, [contractId, showPayslips]);
}, [contractId, showPayslips, refreshTrigger]);
// Formatage des dates
const formatDate = (dateStr: string) => {

View file

@ -77,6 +77,11 @@ export function ManualSignedContractUpload({
setUploadSuccess(true);
toast.success("Contrat signé uploadé avec succès");
// Émettre un événement personnalisé pour rafraîchir les documents côté client
if (typeof window !== 'undefined') {
window.dispatchEvent(new CustomEvent('refreshContractDocuments'));
}
// Attendre 1 seconde puis fermer et notifier le succès
setTimeout(() => {
onOpenChange(false);