Zum Hauptinhalt springen

Integrieren Sie den Dokumenten-Viewer

Der Document Viewer ist eine Web-Komponente, mit der Benutzer Vorlagen bearbeiten und Dokumente zur Unterzeichnung vorbereiten können — direkt in Ihrer Anwendung. Diese Anleitung zeigt, wie Sie ihn mit der GraphQL API verbinden, um einen kompletten Unterschriften-Workflow zu erstellen.

Überblick​

Eine typische Integration folgt diesen Schritten:

  1. Authentifizieren — ein Token für den Viewer erhalten
  2. Eine Vorlage hochladen — über die GraphQL API
  3. Den Viewer rendern — die Vorlage-ID und das Token übergeben
  4. Ereignisse erfassen — der Viewer sendet update- und validate-Events, während der Benutzer arbeitet
  5. Das Dokument senden — die send-Mutation mit den Empfänger- und Rollendaten aus dem Viewer aufrufen

Authentifizierung​

Der Viewer benötigt ein gültiges Token, das an sein token-Attribut übergeben wird. Ihr Backend kann entweder ein SRP JWT oder ein kurzfristiges Komponenten-Token von generateComponentToken bereitstellen. Siehe Widget Authorization, bevor Sie den Viewer in Ihre Anwendung einbinden.

Compose-Modus — Senden eines vorgefertigten Dokuments​

Der Compose-Modus ist für Workflows gedacht, bei denen Ihr System die Empfänger bereits kennt. Der Benutzer platziert nur noch die Signaturfelder und sendet.

1. Den Viewer rendern​

<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. Validierung und Rollen-IDs verfolgen​

Während der Benutzer Felder hinzufügt, sendet der Viewer Events. Sie benötigen zwei Dinge aus diesen Events:

  • validate — gibt an, ob die Vorlage alle erforderlichen Felder enthält (mindestens eine Unterschrift pro Empfänger)
  • update — liefert den aktuellen Vorlagenzustand, einschließlich roleId für jeden Teilnehmer, wenn Sie eine Zuordnung von Template-Rollen benötigen
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;
});
});

Die roleId aus dem update-Event ordnet jeden Empfänger seinen Feldern auf der Vorlage zu. Fügen Sie sie ein, wenn Ihr Sendeablauf diese Zuordnung benötigt.

3. Das Dokument senden​

Wenn der Benutzer auf Senden klickt, rufen Sie die send Mutation mit den Empfängerdaten und den aus dem Viewer erfassten Rollen-IDs auf:

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);
});

Die send-Mutation liefert eine Aufgaben-ID zurück. Fragen Sie die task Abfrage ab und überwachen Sie task.report.status, bis dieser COMPLETED oder FAILED erreicht, um die Fertigstellung der Dokumentenerstellung zu bestätigen.

Editor-Modus — Vorlage erstellen​

Der Editor-Modus bietet Benutzern das vollständige Vorlagen-Bearbeitungserlebnis — Rollen hinzufügen, Felder platzieren und Optionen konfigurieren. Verwenden Sie dies, wenn Benutzer wiederverwendbare Vorlagen erstellen sollen.

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

Im Editor-Modus wird das update-Event ausgelöst, wann immer sich die Vorlage ändert. Sie können es verwenden, um den Vorlagenzustand zu verfolgen oder eine Speicheranzeige anzuzeigen:

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);
});

Vorlagenänderungen werden automatisch vom Viewer gespeichert — Sie müssen keine GraphQL-Mutation aufrufen, um die Änderungen zu speichern.

React-Integration​

Der React-Wrapper bietet dieselbe Funktionalität mit React-artiger Ereignisbehandlung:

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>
);
};

Zeugen​

Um einen Zeugen für einen Unterzeichner hinzuzufügen, setzen Sie roleType: "WITNESS" und verwenden Sie einen signerIndex, der dem Index des übergeordneten Unterzeichners + 100 entspricht. Zum Beispiel hat ein Zeuge für Unterzeichner 2 den 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>

Schlüsselkonzepte​

Viewer-KonzeptGraphQL-TypBeschreibung
templateid-AttributTemplateDie bearbeitete oder zusammengesetzte Vorlage
recipients-AttributRecipientInputEmpfänger, die an den Compose-Modus übergeben werden
roleId aus update-EventRoleVerknüpft einen Empfänger mit seinen Feldern auf der Vorlage
validate-Event—Ob die Vorlage alle erforderlichen Felder enthält
send-MutationsendSendet das Dokument nach der Komposition
token-Attribut—Token aus der Authentifizierung
mode="compose"—Vereinfachter Modus zum Platzieren von Feldern und Senden
mode="editor"—Vollständiger Vorlagenbearbeitungsmodus
experience im Send-InputExperienceSteuert Branding, E-Mails und Unterzeichnungsseite — siehe Experiences explained