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:
parent
f43a0be89c
commit
49f0204a74
4 changed files with 31 additions and 9 deletions
|
|
@ -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
|
||||
|
|
@ -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}>
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue