From 8aa1099eb5c81a4eb3e211f567bd73676d5b4eb0 Mon Sep 17 00:00:00 2001 From: Pascal Date: Tue, 26 Nov 2024 14:15:12 +0100 Subject: [PATCH] button_signature --- public/style/signature.css | 19 ++++ src/pages/signature/signature.ts | 168 +++++++++++++++++++++++++++---- 2 files changed, 169 insertions(+), 18 deletions(-) diff --git a/public/style/signature.css b/public/style/signature.css index ab907cf..6e3d5ce 100755 --- a/public/style/signature.css +++ b/public/style/signature.css @@ -1499,4 +1499,23 @@ input[type="file"] { z-index: 1000; display: none; animation: slideDown 0.3s ease-out; +} + +.sign-button { + background-color: #4CAF50; + color: white; + padding: 8px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + margin-top: 10px; +} + +.sign-button:hover { + background-color: #45a049; +} + +.sign-button:disabled { + background-color: #cccccc; + cursor: not-allowed; } \ No newline at end of file diff --git a/src/pages/signature/signature.ts b/src/pages/signature/signature.ts index 1f25eb7..7fc6e14 100755 --- a/src/pages/signature/signature.ts +++ b/src/pages/signature/signature.ts @@ -13,6 +13,7 @@ declare global { submitDocumentRequest: typeof submitDocumentRequest; submitNewDocument: typeof submitNewDocument; submitCommonDocument: typeof submitCommonDocument; + signDocument: typeof signDocument; } } @@ -28,7 +29,15 @@ import { } from '../../models/signature.models'; import { messageStore } from '../../utils/messageMock'; import { showAlert } from '../account/account'; -let currentUser = membersMock[0]; + +interface Member { + id: string | number; + name: string; + email?: string; + avatar?: string; +} + +let currentUser: Member = membersMock[0]; interface Group { id: number; @@ -546,19 +555,19 @@ function showProcessDetails(group: Group, groupId: number) {

Documents Communs

- ${displayGroup.commonDocuments.map((document: { - signatures?: DocumentSignature[]; - name: string; - visibility: string; - createdAt?: string | null; - deadline?: string | null; - id: number; - }) => { + ${displayGroup.commonDocuments.map((document: any) => { const totalSignatures = document.signatures?.length || 0; const signedCount = document.signatures?.filter((sig: DocumentSignature) => sig.signed).length || 0; const percentage = totalSignatures > 0 ? (signedCount / totalSignatures) * 100 : 0; const isVierge = !document.createdAt || !document.deadline || !document.signatures?.length; + // Ajouter le bouton de signature pour tous les documents non vierges en mode dev + const signButton = !isVierge ? ` + + ` : ''; + return `
@@ -600,6 +609,7 @@ function showProcessDetails(group: Group, groupId: number) { documentName: '${document.name}' })">New request `} + ${signButton}
`; @@ -614,14 +624,16 @@ function showProcessDetails(group: Group, groupId: number) {
${(role.documents || []).length > 0 ? (role.documents || []).map(document => { - const totalSignatures = document.signatures.length; - const signedCount = document.signatures.filter((sig: DocumentSignature) => sig.signed).length; - const percentage = totalSignatures > 0 ? (signedCount / totalSignatures) * 100 : 0; - - // Détection d'un document vierge const isVierge = !document.createdAt || - !document.deadline || - document.signatures.length === 0; + !document.deadline || + document.signatures.length === 0; + + // Ajouter le bouton de signature pour tous les documents non vierges en mode dev + const signButton = !isVierge ? ` + + ` : ''; return `
@@ -652,11 +664,12 @@ function showProcessDetails(group: Group, groupId: number) { `).join('')}
-
+
-

${signedCount} out of ${totalSignatures} signed (${percentage.toFixed(0)}%)

+

${document.signatures.filter((sig: DocumentSignature) => sig.signed).length} out of ${document.signatures.length} signed (${(document.signatures.filter((sig: DocumentSignature) => sig.signed).length / document.signatures.length * 100).toFixed(0)}%)

` : ''} + ${signButton}
`; }).join('') @@ -1437,3 +1450,122 @@ export function initSignature() { }); } } + +// Ajouter cette interface pour la signature +interface SignatureResponse { + success: boolean; + message: string; + documentId: number; + memberId: string | number; + signedAt: string; +} + +// Ajouter cette fonction pour signer un document +function signDocument(documentId: number, processId: number, isCommonDocument: boolean = false) { + try { + const groups = JSON.parse(localStorage.getItem('groups') || JSON.stringify(groupsMock)); + const group = groups.find((g: Group) => g.id === processId); + + if (!group) { + throw new Error('Processus non trouvé'); + } + + let document; + let documentList; + + if (isCommonDocument) { + documentList = group.commonDocuments; + document = group.commonDocuments.find((d: any) => d.id === documentId); + } else { + // Chercher dans les documents des rôles + for (const role of group.roles) { + if (role.documents) { + document = role.documents.find((d: any) => d.id === documentId); + if (document) { + documentList = role.documents; + break; + } + } + } + } + + if (!document) { + throw new Error('Document non trouvé'); + } + + // Trouver la signature correspondant à l'utilisateur courant + const userSignature = document.signatures.find((sig: DocumentSignature) => + sig.member.name === currentUser.name + ); + + if (!userSignature) { + throw new Error('Signature non trouvée pour cet utilisateur'); + } + + if (userSignature.signed) { + throw new Error('Document déjà signé par cet utilisateur'); + } + + // Mettre à jour la signature + userSignature.signed = true; + userSignature.signedAt = new Date().toISOString(); + + // Sauvegarder les modifications + localStorage.setItem('groups', JSON.stringify(groups)); + + // Rafraîchir l'affichage + if (isCommonDocument) { + showProcessDetails(group, processId); + } else { + const role = group.roles.find((r: any) => r.documents?.includes(document)); + if (role) { + showRoleDocuments(role, group); + } + } + + showAlert('Document signé avec succès!'); + return { + success: true, + message: 'Document signé avec succès', + documentId, + memberId: currentUser.id, + signedAt: userSignature.signedAt + }; + + } catch (error) { + console.error('Erreur lors de la signature:', error); + showAlert(error instanceof Error ? error.message : 'Erreur lors de la signature'); + return { + success: false, + message: error instanceof Error ? error.message : 'Erreur lors de la signature', + documentId, + memberId: currentUser.id, + signedAt: '' + }; + } +} + +// Modifier la fonction qui génère les cartes de documents pour ajouter le bouton de signature +function generateDocumentCard(document: any, isCommonDocument: boolean = false) { + // ... code existant de la carte ... + + // Ajouter le bouton de signature si l'utilisateur n'a pas encore signé + const userSignature = document.signatures?.find((sig: DocumentSignature) => + sig.member?.name === currentUser?.name + ); + + const signatureButton = !userSignature?.signed ? ` + + ` : ''; + return ` +
+ // ... reste du code de la carte ... + ${signatureButton} +
+ `; +} + +// Ajouter la fonction au scope global +window.signDocument = signDocument;