Vai al contenuto principale

Integrare il Visualizzatore di Documenti

Il Visualizzatore di Documenti è un componente web che permette agli utenti di modificare modelli e preparare documenti per la firma — direttamente all'interno della tua applicazione. Questa guida mostra come collegarlo all'API GraphQL per costruire un flusso completo di firma.

Panoramica

Una tipica integrazione segue questi passaggi:

  1. Autenticarsi — ottenere un token per il visualizzatore
  2. Caricare un modello — tramite l’API GraphQL
  3. Visualizzare il visualizzatore — passare l’ID del modello e il token
  4. Catturare gli eventi — il visualizzatore emette gli eventi update e validate mentre l’utente lavora
  5. Inviare il documento — chiamare la mutation send con i dati dei destinatari e dei ruoli dal visualizzatore

Autenticazione

Il visualizzatore necessita di un token valido passato al suo attributo token. Il tuo backend può fornire un JWT SRP oppure un token a breve durata generato tramite generateComponentToken. Consulta Autorizzazione Widget prima di integrare il visualizzatore nella tua applicazione.

Modalità Composizione — Inviare un Documento Predefinito

La modalità composizione è per flussi in cui il tuo sistema conosce già i destinatari. L’utente si limita a posizionare i campi firma e a inviare.

1. Visualizzare il visualizzatore

<ls-document-viewer
id="viewer"
templateid="dHBsYjQ5YTg5NWQtYWRhMy0xMWYwLWIxZGMtMDY5NzZlZmU0MzIx"
token="YOUR_ACCESS_TOKEN"
mode="compose"
recipients='[
{"email": "jane@example.com", "firstname": "Jane", "lastname": "Smith", "signerIndex": 1},
{"email": "john@example.com", "firstname": "John", "lastname": "Doe", "signerIndex": 2}
]'
filtertoolbox="signature|initials|date|text"
>
<span slot="right-button">
<button id="send-btn" disabled>Send</button>
</span>
</ls-document-viewer>

2. Monitorare la validazione e gli ID dei ruoli

Quando l’utente aggiunge campi, il visualizzatore emette eventi. Ti servono due informazioni da questi eventi:

  • validate — indica se il modello ha tutti i campi obbligatori (al minimo, una firma per ogni destinatario)
  • update — fornisce lo stato corrente del modello, inclusi roleId per ogni partecipante quando serve la mappatura dei ruoli del modello
const viewer = document.getElementById('viewer');
const sendBtn = document.getElementById('send-btn');

let isValid = false;
const recipientRoles = {};

viewer.addEventListener('validate', (e) => {
isValid = e.detail.valid;
sendBtn.disabled = !isValid;
});

viewer.addEventListener('update', (e) => {
const roles = e.detail.template.roles;
roles.forEach((role) => {
recipientRoles[role.signerIndex] = role.id;
});
});

Il roleId dall’evento update collega ogni destinatario ai suoi campi nel modello. Includilo quando il flusso di invio richiede tale mappatura.

3. Inviare il documento

Quando l’utente clicca invia, chiama la mutation send con i dati dei destinatari e gli ID dei ruoli raccolti dal visualizzatore:

sendBtn.addEventListener('click', async () => {
const token = '<token-from-authentication-guide>';

const recipients = [
{
firstName: 'Jane',
lastName: 'Smith',
email: 'jane@example.com',
role: 'Signer',
roleId: recipientRoles[1],
signerIndex: 1,
order: 1,
},
{
firstName: 'John',
lastName: 'Doe',
email: 'john@example.com',
role: 'Signer',
roleId: recipientRoles[2],
signerIndex: 2,
order: 2,
},
];

const response = await fetch('https://graphql.uk.legalesign.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({
query: `mutation SendDocument {
send(input: {
groupId: "YOUR_GROUP_ID"
templateId: "dHBsYjQ5YTg5NWQtYWRhMy0xMWYwLWIxZGMtMDY5NzZlZmU0MzIx"
title: "Contract - Jane Smith & John Doe"
recipients: ${JSON.stringify(recipients).replace(/"(\w+)":/g, '$1:')}
sequentialSigning: true
})
}`,
}),
});

const result = await response.json();
const taskId = result.data.send;

// Poll for completion
console.log('Task started:', taskId);
});

La mutation send restituisce un ID di task. Interroga la query task e monitora task.report.status finché non raggiunge COMPLETED o FAILED per confermare il completamento della creazione del documento.

Modalità Editor — Creazione del Modello

La modalità editor offre agli utenti un’esperienza completa di modifica del modello — aggiunta di ruoli, posizionamento di campi, configurazione opzioni. Usala quando vuoi che gli utenti costruiscano modelli riutilizzabili.

<ls-document-viewer
id="editor"
templateid="dHBsYjQ5YTg5NWQtYWRhMy0xMWYwLWIxZGMtMDY5NzZlZmU0MzIx"
token="YOUR_ACCESS_TOKEN"
mode="editor"
></ls-document-viewer>

In modalità editor, l’evento update viene emesso ogni volta che il modello cambia. Puoi usarlo per monitorare lo stato del modello o mostrare un indicatore di salvataggio:

const editor = document.getElementById('editor');

editor.addEventListener('update', (e) => {
console.log('Template updated:', e.detail);
});

editor.addEventListener('validate', (e) => {
console.log('Template valid:', e.detail.valid);
});

Le modifiche al modello vengono salvate automaticamente dal visualizzatore — non serve chiamare nessuna mutation GraphQL per persistere le modifiche.

Integrazione React

Il wrapper React fornisce la stessa funzionalità con gestione eventi in stile React:

import { useState } from 'react';
import { LsDocumentViewer } from 'legalesign-document-viewer-react';

const DocumentCompose = ({ templateId, recipients, token }) => {
const [isValid, setIsValid] = useState(false);
const [roleMap, setRoleMap] = useState({});

const handleValidate = (e) => {
setIsValid(e.detail.valid);
};

const handleUpdate = (e) => {
const roles = e.detail.template.roles;
const map = {};
roles.forEach((role) => {
map[role.signerIndex] = role.id;
});
setRoleMap(map);
};

const handleSend = async () => {
const mappedRecipients = recipients.map((r, i) => ({
...r,
roleId: roleMap[r.signerIndex],
order: i + 1,
}));

const response = await fetch('https://graphql.uk.legalesign.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({
query: `mutation SendDocument {
send(input: {
groupId: "YOUR_GROUP_ID"
templateId: "${templateId}"
title: "Document"
recipients: ${JSON.stringify(mappedRecipients).replace(/"(\w+)":/g, '$1:')}
})
}`,
}),
});

const result = await response.json();
console.log('Task ID:', result.data.send);
};

if (!token) return null;

return (
<LsDocumentViewer
templateid={templateId}
token={token}
mode="compose"
recipients={JSON.stringify(recipients)}
onValidate={handleValidate}
onUpdate={handleUpdate}
>
<div slot="right-button">
<button onClick={handleSend} disabled={!isValid}>
Send
</button>
</div>
</LsDocumentViewer>
);
};

Testimoni

Per aggiungere un testimone per un firmatario, imposta roleType: "WITNESS" e usa un signerIndex pari all’indice del firmatario padre + 100. Per esempio, un testimone per il firmatario 2 avrà signerIndex: 102:

<ls-document-viewer
mode="compose"
recipients='[
{"email": "signer@example.com", "firstname": "Alice", "lastname": "Jones", "signerIndex": 1},
{"email": "signer2@example.com", "firstname": "Bob", "lastname": "Brown", "signerIndex": 2},
{"email": "witness@example.com", "firstname": "Carol", "lastname": "White", "signerIndex": 102, "roleType": "WITNESS"}
]'
...
></ls-document-viewer>

Concetti Chiave

Concetto del visualizzatoreTipo GraphQLDescrizione
attributo templateidTemplateIl modello in modifica o composizione
attributo recipientsRecipientInputDestinatari passati alla modalità composizione
roleId dall’evento updateRoleCollega un destinatario ai propri campi nel modello
evento validateSe il modello ha tutti i campi obbligatori
mutation sendsendInvia il documento dopo la composizione
attributo tokenToken da autenticazione
mode="compose"Modalità semplificata per posizionare campi e inviare
mode="editor"Modalità completa di modifica del modello
experience nell’input di invioExperienceControlla brand, email e pagina di firma — vedi Spiegazione delle Esperienze