feat: add typed signature (#1357)

Add the ability to insert typed signatures.

Once the signature field is placed on the document, a checkbox appears
in the document editor where the document owner can allow signers to add
typed signatures. Typed signatures are disabled by default.

![CleanShot 2024-09-30 at 14 57
54](https://github.com/user-attachments/assets/c388abb5-bcb1-49d0-aad8-9148c3020420)
This commit is contained in:
Catalin Pit
2024-10-18 04:25:19 +01:00
committed by GitHub
parent e0c948c2ac
commit 1a9dcadba5
25 changed files with 716 additions and 462 deletions

View File

@ -18,6 +18,7 @@ export type CreateDocumentMetaOptions = {
dateFormat?: string;
redirectUrl?: string;
signingOrder?: DocumentSigningOrder;
typedSignatureEnabled?: boolean;
userId: number;
requestMetadata: RequestMetadata;
};
@ -32,6 +33,7 @@ export const upsertDocumentMeta = async ({
userId,
redirectUrl,
signingOrder,
typedSignatureEnabled,
requestMetadata,
}: CreateDocumentMetaOptions) => {
const user = await prisma.user.findFirstOrThrow({
@ -82,6 +84,7 @@ export const upsertDocumentMeta = async ({
documentId,
redirectUrl,
signingOrder,
typedSignatureEnabled,
},
update: {
subject,
@ -91,6 +94,7 @@ export const upsertDocumentMeta = async ({
timezone,
redirectUrl,
signingOrder,
typedSignatureEnabled,
},
});

View File

@ -115,7 +115,7 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Erweiterte Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/document-flow/add-fields.tsx:570
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
msgid "Advanced settings"
msgstr "Erweiterte Einstellungen"
@ -140,11 +140,11 @@ msgstr "Genehmiger"
msgid "Approving"
msgstr "Genehmigung"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Schwarz"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Blau"
@ -178,7 +178,7 @@ msgstr "CC'd"
msgid "Character Limit"
msgstr "Zeichenbeschränkung"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Checkbox"
@ -191,7 +191,7 @@ msgstr "Checkbox-Werte"
msgid "Clear filters"
msgstr "Filter löschen"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Unterschrift löschen"
@ -207,7 +207,7 @@ msgstr "Schließen"
msgid "Configure Direct Recipient"
msgstr "Direkten Empfänger konfigurieren"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/document-flow/add-fields.tsx:571
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
msgid "Configure the {0} field"
msgstr "Konfigurieren Sie das Feld {0}"
@ -224,7 +224,7 @@ msgstr "In die Zwischenablage kopiert"
msgid "Custom Text"
msgstr "Benutzerdefinierter Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/document-flow/add-fields.tsx:922
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
msgid "Date"
msgstr "Datum"
@ -256,7 +256,7 @@ msgstr "Herunterladen"
msgid "Drag & drop your PDF here."
msgstr "Ziehen Sie Ihr PDF hierher."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
msgid "Dropdown"
msgstr "Dropdown"
@ -265,7 +265,7 @@ msgstr "Dropdown"
msgid "Dropdown options"
msgstr "Dropdown-Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:870
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
@ -278,7 +278,7 @@ msgstr "E-Mail"
msgid "Email Options"
msgstr "E-Mail-Optionen"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Empty field"
msgstr "Leeres Feld"
@ -291,6 +291,10 @@ msgstr "Direktlink-Signierung aktivieren"
msgid "Enable signing order"
msgstr "Aktiviere die Signaturreihenfolge"
#: packages/ui/primitives/document-flow/add-fields.tsx:790
msgid "Enable Typed Signatures"
msgstr ""
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Passwort eingeben"
@ -350,7 +354,7 @@ msgstr "Globale Empfängerauthentifizierung"
msgid "Go Back"
msgstr "Zurück"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Grün"
@ -406,7 +410,7 @@ msgstr "Nachricht <0>(Optional)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:896
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
@ -428,12 +432,12 @@ msgstr "Muss unterzeichnen"
msgid "Needs to view"
msgstr "Muss sehen"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/document-flow/add-fields.tsx:680
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
msgid "No recipient matching this description was found."
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/document-flow/add-fields.tsx:696
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
msgid "No recipients with this role"
msgstr "Keine Empfänger mit dieser Rolle"
@ -458,7 +462,7 @@ msgstr "Kein Unterschriftsfeld gefunden"
msgid "No value found."
msgstr "Kein Wert gefunden."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/document-flow/add-fields.tsx:974
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
msgid "Number"
msgstr "Nummer"
@ -493,7 +497,7 @@ msgstr "Wählen Sie eine Zahl"
msgid "Placeholder"
msgstr "Platzhalter"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
msgid "Radio"
msgstr "Radio"
@ -520,7 +524,7 @@ msgstr "Erhält Kopie"
msgid "Recipient action authentication"
msgstr "Empfängeraktion Authentifizierung"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Rot"
@ -529,7 +533,7 @@ msgstr "Rot"
msgid "Redirect URL"
msgstr "Weiterleitungs-URL"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
msgid "Remove"
msgstr "Entfernen"
@ -600,7 +604,7 @@ msgstr "Erweiterte Einstellungen anzeigen"
msgid "Sign"
msgstr "Unterschreiben"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:818
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
@ -648,7 +652,7 @@ msgstr "Einreichen"
msgid "Template title"
msgstr "Vorlagentitel"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/document-flow/add-fields.tsx:948
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
msgid "Text"
msgstr "Text"
@ -709,7 +713,7 @@ msgstr "Der Name des Unterzeichners"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:752
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
@ -721,7 +725,7 @@ msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das P
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Dieser Empfänger kann nicht mehr bearbeitet werden, da er ein Feld unterschrieben oder das Dokument abgeschlossen hat."
@ -746,7 +750,7 @@ msgstr "Zeitzone"
msgid "Title"
msgstr "Titel"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest."

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -220,7 +220,7 @@ msgstr "Aktive Abonnements"
msgid "Add"
msgstr "Hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add all relevant fields for each recipient."
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
@ -241,7 +241,7 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun
msgid "Add email"
msgstr "E-Mail hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
msgid "Add Fields"
msgstr "Felder hinzufügen"
@ -263,11 +263,11 @@ msgstr "Passkey hinzufügen"
msgid "Add Placeholders"
msgstr "Platzhalter hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
msgid "Add Signers"
msgstr "Unterzeichner hinzufügen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
msgid "Add Subject"
msgstr "Betreff hinzufügen"
@ -283,7 +283,7 @@ msgstr "Team-E-Mail hinzufügen"
#~ msgid "Add Text"
#~ msgstr "Add Text"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add the people who will sign the document."
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
@ -291,7 +291,7 @@ msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
msgid "Add the recipients to create the document with"
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add the subject and message you wish to send to signers."
msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten."
@ -370,13 +370,13 @@ msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurd
msgid "An error occurred"
msgstr "Ein Fehler ist aufgetreten"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
msgid "An error occurred while adding signers."
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
msgid "An error occurred while adding the fields."
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
@ -426,7 +426,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Vorlage verschoben wurde."
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
msgid "An error occurred while removing the signature."
msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
@ -434,7 +434,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
msgid "An error occurred while removing the text."
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
msgid "An error occurred while sending the document."
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
@ -449,7 +449,7 @@ msgstr "Beim Senden Ihrer Bestätigungs-E-Mail ist ein Fehler aufgetreten"
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
msgid "An error occurred while signing the document."
msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
@ -458,7 +458,7 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
msgid "An error occurred while trying to create a checkout session."
msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
msgid "An error occurred while updating the document settings."
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
@ -665,11 +665,11 @@ msgstr "Durch die Aktivierung von 2FA müssen Sie jedes Mal, wenn Sie sich anmel
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
@ -752,7 +752,7 @@ msgid "Click to copy signing link for sending to recipient"
msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger zu senden"
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
msgid "Click to insert field"
@ -802,7 +802,7 @@ msgstr "Abgeschlossene Dokumente"
msgid "Completed Documents"
msgstr "Abgeschlossene Dokumente"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
msgid "Configure general settings for the document."
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
@ -1274,7 +1274,7 @@ msgstr "Dokument erneut gesendet"
msgid "Document resealed"
msgstr "Dokument wieder versiegelt"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
msgid "Document sent"
msgstr "Dokument gesendet"
@ -1369,6 +1369,10 @@ msgstr "Entwurfdokumente"
msgid "Drafted Documents"
msgstr "Entwurfte Dokumente"
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:245
#~ msgid "Draw"
#~ msgstr ""
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
msgstr "Aufgrund einer unbezahlten Rechnung wurde Ihrem Team der Zugriff eingeschränkt. Bitte begleichen Sie die Zahlung, um den vollumfänglichen Zugang zu Ihrem Team wiederherzustellen."
@ -1491,10 +1495,10 @@ msgstr "Geben Sie hier Ihren Text ein"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
@ -1519,8 +1523,8 @@ msgstr "Geben Sie hier Ihren Text ein"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
@ -1597,7 +1601,7 @@ msgstr "Haben Sie Ihr Passwort vergessen?"
msgid "Full Name"
msgstr "Vollständiger Name"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
@ -2294,7 +2298,7 @@ msgstr "Bitte kontaktieren Sie den Support, wenn Sie diese Aktion rückgängig m
msgid "Please enter a meaningful name for your token. This will help you identify it later."
msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies wird Ihnen helfen, es später zu identifizieren."
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
msgid "Please mark as viewed to complete"
msgstr "Bitte als angesehen markieren, um abzuschließen"
@ -2730,13 +2734,13 @@ msgstr "Vorlagen in Ihrem Team-Öffentliches Profil anzeigen, damit Ihre Zielgru
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
#: apps/web/src/components/ui/user-profile-timur.tsx:81
msgid "Sign"
msgstr "Unterzeichnen"
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
msgid "Sign as {0} <0>({1})</0>"
msgstr "Unterzeichnen als {0} <0>({1})</0>"
@ -2802,8 +2806,8 @@ msgstr "Registrieren mit OIDC"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
#: apps/web/src/components/forms/profile.tsx:132
@ -3552,6 +3556,10 @@ msgstr "Type 'delete' to confirm"
msgid "Type a command or search..."
msgstr "Type a command or search..."
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:275
#~ msgid "Typed Signature"
#~ msgstr ""
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
msgid "Uh oh! Looks like you're missing a token"
msgstr "Uh oh! Looks like you're missing a token"
@ -4382,7 +4390,7 @@ msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt."
msgid "Your document has been re-sent successfully."
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
msgid "Your document has been sent successfully."
msgstr "Ihr Dokument wurde erfolgreich gesendet."

View File

@ -110,7 +110,7 @@ msgstr "Admin"
msgid "Advanced Options"
msgstr "Advanced Options"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/document-flow/add-fields.tsx:570
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
msgid "Advanced settings"
msgstr "Advanced settings"
@ -135,11 +135,11 @@ msgstr "Approver"
msgid "Approving"
msgstr "Approving"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Black"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Blue"
@ -173,7 +173,7 @@ msgstr "CC'd"
msgid "Character Limit"
msgstr "Character Limit"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Checkbox"
@ -186,7 +186,7 @@ msgstr "Checkbox values"
msgid "Clear filters"
msgstr "Clear filters"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Clear Signature"
@ -202,7 +202,7 @@ msgstr "Close"
msgid "Configure Direct Recipient"
msgstr "Configure Direct Recipient"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/document-flow/add-fields.tsx:571
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
msgid "Configure the {0} field"
msgstr "Configure the {0} field"
@ -219,7 +219,7 @@ msgstr "Copied to clipboard"
msgid "Custom Text"
msgstr "Custom Text"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/document-flow/add-fields.tsx:922
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
msgid "Date"
msgstr "Date"
@ -251,7 +251,7 @@ msgstr "Download"
msgid "Drag & drop your PDF here."
msgstr "Drag & drop your PDF here."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
msgid "Dropdown"
msgstr "Dropdown"
@ -260,7 +260,7 @@ msgstr "Dropdown"
msgid "Dropdown options"
msgstr "Dropdown options"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:870
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
@ -273,7 +273,7 @@ msgstr "Email"
msgid "Email Options"
msgstr "Email Options"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Empty field"
msgstr "Empty field"
@ -286,6 +286,10 @@ msgstr "Enable Direct Link Signing"
msgid "Enable signing order"
msgstr "Enable signing order"
#: packages/ui/primitives/document-flow/add-fields.tsx:790
msgid "Enable Typed Signatures"
msgstr "Enable Typed Signatures"
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Enter password"
@ -345,7 +349,7 @@ msgstr "Global recipient action authentication"
msgid "Go Back"
msgstr "Go Back"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Green"
@ -401,7 +405,7 @@ msgstr "Message <0>(Optional)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:896
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
@ -423,12 +427,12 @@ msgstr "Needs to sign"
msgid "Needs to view"
msgstr "Needs to view"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/document-flow/add-fields.tsx:680
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
msgid "No recipient matching this description was found."
msgstr "No recipient matching this description was found."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/document-flow/add-fields.tsx:696
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
msgid "No recipients with this role"
msgstr "No recipients with this role"
@ -453,7 +457,7 @@ msgstr "No signature field found"
msgid "No value found."
msgstr "No value found."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/document-flow/add-fields.tsx:974
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
msgid "Number"
msgstr "Number"
@ -488,7 +492,7 @@ msgstr "Pick a number"
msgid "Placeholder"
msgstr "Placeholder"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
msgid "Radio"
msgstr "Radio"
@ -515,7 +519,7 @@ msgstr "Receives copy"
msgid "Recipient action authentication"
msgstr "Recipient action authentication"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Red"
@ -524,7 +528,7 @@ msgstr "Red"
msgid "Redirect URL"
msgstr "Redirect URL"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
msgid "Remove"
msgstr "Remove"
@ -595,7 +599,7 @@ msgstr "Show advanced settings"
msgid "Sign"
msgstr "Sign"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:818
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
@ -643,7 +647,7 @@ msgstr "Submit"
msgid "Template title"
msgstr "Template title"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/document-flow/add-fields.tsx:948
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
msgid "Text"
msgstr "Text"
@ -704,7 +708,7 @@ msgstr "The signer's name"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:752
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
@ -716,7 +720,7 @@ msgstr "This document is password protected. Please enter the password to view t
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "This recipient can no longer be modified as they have signed a field, or completed the document."
@ -741,7 +745,7 @@ msgstr "Time Zone"
msgid "Title"
msgstr "Title"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "To proceed further, please set at least one value for the {0} field."

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -215,7 +215,7 @@ msgstr "Active Subscriptions"
msgid "Add"
msgstr "Add"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add all relevant fields for each recipient."
msgstr "Add all relevant fields for each recipient."
@ -236,7 +236,7 @@ msgstr "Add an authenticator to serve as a secondary authentication method when
msgid "Add email"
msgstr "Add email"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
msgid "Add Fields"
msgstr "Add Fields"
@ -258,11 +258,11 @@ msgstr "Add passkey"
msgid "Add Placeholders"
msgstr "Add Placeholders"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
msgid "Add Signers"
msgstr "Add Signers"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
msgid "Add Subject"
msgstr "Add Subject"
@ -278,7 +278,7 @@ msgstr "Add team email"
#~ msgid "Add Text"
#~ msgstr "Add Text"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add the people who will sign the document."
msgstr "Add the people who will sign the document."
@ -286,7 +286,7 @@ msgstr "Add the people who will sign the document."
msgid "Add the recipients to create the document with"
msgstr "Add the recipients to create the document with"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add the subject and message you wish to send to signers."
msgstr "Add the subject and message you wish to send to signers."
@ -365,13 +365,13 @@ msgstr "An email requesting the transfer of this team has been sent."
msgid "An error occurred"
msgstr "An error occurred"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
msgid "An error occurred while adding signers."
msgstr "An error occurred while adding signers."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
msgid "An error occurred while adding the fields."
msgstr "An error occurred while adding the fields."
@ -421,7 +421,7 @@ msgstr "An error occurred while moving the template."
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
msgid "An error occurred while removing the signature."
msgstr "An error occurred while removing the signature."
@ -429,7 +429,7 @@ msgstr "An error occurred while removing the signature."
msgid "An error occurred while removing the text."
msgstr "An error occurred while removing the text."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
msgid "An error occurred while sending the document."
msgstr "An error occurred while sending the document."
@ -444,7 +444,7 @@ msgstr "An error occurred while sending your confirmation email"
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
msgid "An error occurred while signing the document."
msgstr "An error occurred while signing the document."
@ -453,7 +453,7 @@ msgstr "An error occurred while signing the document."
msgid "An error occurred while trying to create a checkout session."
msgstr "An error occurred while trying to create a checkout session."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
msgid "An error occurred while updating the document settings."
msgstr "An error occurred while updating the document settings."
@ -660,11 +660,11 @@ msgstr "By enabling 2FA, you will be required to enter a code from your authenti
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
@ -747,7 +747,7 @@ msgid "Click to copy signing link for sending to recipient"
msgstr "Click to copy signing link for sending to recipient"
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
msgid "Click to insert field"
@ -797,7 +797,7 @@ msgstr "Completed documents"
msgid "Completed Documents"
msgstr "Completed Documents"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
msgid "Configure general settings for the document."
msgstr "Configure general settings for the document."
@ -1269,7 +1269,7 @@ msgstr "Document re-sent"
msgid "Document resealed"
msgstr "Document resealed"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
msgid "Document sent"
msgstr "Document sent"
@ -1364,6 +1364,10 @@ msgstr "Draft documents"
msgid "Drafted Documents"
msgstr "Drafted Documents"
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:245
#~ msgid "Draw"
#~ msgstr "Draw"
#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121
msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
msgstr "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team."
@ -1486,10 +1490,10 @@ msgstr "Enter your text here"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
@ -1514,8 +1518,8 @@ msgstr "Enter your text here"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
@ -1592,7 +1596,7 @@ msgstr "Forgot your password?"
msgid "Full Name"
msgstr "Full Name"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
@ -2289,7 +2293,7 @@ msgstr "Please contact support if you would like to revert this action."
msgid "Please enter a meaningful name for your token. This will help you identify it later."
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
msgid "Please mark as viewed to complete"
msgstr "Please mark as viewed to complete"
@ -2725,13 +2729,13 @@ msgstr "Show templates in your team public profile for your audience to sign and
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
#: apps/web/src/components/ui/user-profile-timur.tsx:81
msgid "Sign"
msgstr "Sign"
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
msgid "Sign as {0} <0>({1})</0>"
msgstr "Sign as {0} <0>({1})</0>"
@ -2797,8 +2801,8 @@ msgstr "Sign Up with OIDC"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
#: apps/web/src/components/forms/profile.tsx:132
@ -3547,6 +3551,10 @@ msgstr "Type 'delete' to confirm"
msgid "Type a command or search..."
msgstr "Type a command or search..."
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:275
#~ msgid "Typed Signature"
#~ msgstr "Typed Signature"
#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26
msgid "Uh oh! Looks like you're missing a token"
msgstr "Uh oh! Looks like you're missing a token"
@ -4377,7 +4385,7 @@ msgstr "Your document has been created from the template successfully."
msgid "Your document has been re-sent successfully."
msgstr "Your document has been re-sent successfully."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
msgid "Your document has been sent successfully."
msgstr "Your document has been sent successfully."

View File

@ -115,7 +115,7 @@ msgstr "Administrateur"
msgid "Advanced Options"
msgstr "Options avancées"
#: packages/ui/primitives/document-flow/add-fields.tsx:565
#: packages/ui/primitives/document-flow/add-fields.tsx:570
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
msgid "Advanced settings"
msgstr "Paramètres avancés"
@ -140,11 +140,11 @@ msgstr "Approuveur"
msgid "Approving"
msgstr "En attente d'approbation"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
#: packages/ui/primitives/signature-pad/signature-pad.tsx:377
msgid "Black"
msgstr "Noir"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
#: packages/ui/primitives/signature-pad/signature-pad.tsx:391
msgid "Blue"
msgstr "Bleu"
@ -178,7 +178,7 @@ msgstr "CC'd"
msgid "Character Limit"
msgstr "Limite de caractères"
#: packages/ui/primitives/document-flow/add-fields.tsx:993
#: packages/ui/primitives/document-flow/add-fields.tsx:1026
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
msgid "Checkbox"
msgstr "Case à cocher"
@ -191,7 +191,7 @@ msgstr "Valeurs de case à cocher"
msgid "Clear filters"
msgstr "Effacer les filtres"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:310
#: packages/ui/primitives/signature-pad/signature-pad.tsx:411
msgid "Clear Signature"
msgstr "Effacer la signature"
@ -207,7 +207,7 @@ msgstr "Fermer"
msgid "Configure Direct Recipient"
msgstr "Configurer le destinataire direct"
#: packages/ui/primitives/document-flow/add-fields.tsx:566
#: packages/ui/primitives/document-flow/add-fields.tsx:571
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
msgid "Configure the {0} field"
msgstr "Configurer le champ {0}"
@ -224,7 +224,7 @@ msgstr "Copié dans le presse-papiers"
msgid "Custom Text"
msgstr "Texte personnalisé"
#: packages/ui/primitives/document-flow/add-fields.tsx:889
#: packages/ui/primitives/document-flow/add-fields.tsx:922
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
msgid "Date"
msgstr "Date"
@ -256,7 +256,7 @@ msgstr "Télécharger"
msgid "Drag & drop your PDF here."
msgstr "Faites glisser et déposez votre PDF ici."
#: packages/ui/primitives/document-flow/add-fields.tsx:1019
#: packages/ui/primitives/document-flow/add-fields.tsx:1052
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
msgid "Dropdown"
msgstr "Liste déroulante"
@ -265,7 +265,7 @@ msgstr "Liste déroulante"
msgid "Dropdown options"
msgstr "Options de liste déroulante"
#: packages/ui/primitives/document-flow/add-fields.tsx:837
#: packages/ui/primitives/document-flow/add-fields.tsx:870
#: packages/ui/primitives/document-flow/add-signature.tsx:272
#: packages/ui/primitives/document-flow/add-signers.tsx:500
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
@ -278,7 +278,7 @@ msgstr "Email"
msgid "Email Options"
msgstr "Options d'email"
#: packages/ui/primitives/document-flow/add-fields.tsx:1082
#: packages/ui/primitives/document-flow/add-fields.tsx:1117
msgid "Empty field"
msgstr "Champ vide"
@ -291,6 +291,10 @@ msgstr "Activer la signature de lien direct"
msgid "Enable signing order"
msgstr "Activer l'ordre de signature"
#: packages/ui/primitives/document-flow/add-fields.tsx:790
msgid "Enable Typed Signatures"
msgstr ""
#: packages/ui/primitives/document-password-dialog.tsx:84
msgid "Enter password"
msgstr "Entrez le mot de passe"
@ -350,7 +354,7 @@ msgstr "Authentification d'action de destinataire globale"
msgid "Go Back"
msgstr "Retourner"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
#: packages/ui/primitives/signature-pad/signature-pad.tsx:398
msgid "Green"
msgstr "Vert"
@ -406,7 +410,7 @@ msgstr "Message <0>(Optionnel)</0>"
msgid "Min"
msgstr "Min"
#: packages/ui/primitives/document-flow/add-fields.tsx:863
#: packages/ui/primitives/document-flow/add-fields.tsx:896
#: packages/ui/primitives/document-flow/add-signature.tsx:298
#: packages/ui/primitives/document-flow/add-signers.tsx:535
#: packages/ui/primitives/document-flow/add-signers.tsx:541
@ -428,12 +432,12 @@ msgstr "Nécessite une signature"
msgid "Needs to view"
msgstr "Nécessite une visualisation"
#: packages/ui/primitives/document-flow/add-fields.tsx:674
#: packages/ui/primitives/document-flow/add-fields.tsx:680
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
msgid "No recipient matching this description was found."
msgstr "Aucun destinataire correspondant à cette description n'a été trouvé."
#: packages/ui/primitives/document-flow/add-fields.tsx:690
#: packages/ui/primitives/document-flow/add-fields.tsx:696
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
msgid "No recipients with this role"
msgstr "Aucun destinataire avec ce rôle"
@ -458,7 +462,7 @@ msgstr "Aucun champ de signature trouvé"
msgid "No value found."
msgstr "Aucune valeur trouvée."
#: packages/ui/primitives/document-flow/add-fields.tsx:941
#: packages/ui/primitives/document-flow/add-fields.tsx:974
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
msgid "Number"
msgstr "Numéro"
@ -493,7 +497,7 @@ msgstr "Choisissez un numéro"
msgid "Placeholder"
msgstr "Espace réservé"
#: packages/ui/primitives/document-flow/add-fields.tsx:967
#: packages/ui/primitives/document-flow/add-fields.tsx:1000
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
msgid "Radio"
msgstr "Radio"
@ -520,7 +524,7 @@ msgstr "Recevoir une copie"
msgid "Recipient action authentication"
msgstr "Authentification d'action de destinataire"
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
#: packages/ui/primitives/signature-pad/signature-pad.tsx:384
msgid "Red"
msgstr "Rouge"
@ -529,7 +533,7 @@ msgstr "Rouge"
msgid "Redirect URL"
msgstr "URL de redirection"
#: packages/ui/primitives/document-flow/add-fields.tsx:1069
#: packages/ui/primitives/document-flow/add-fields.tsx:1104
msgid "Remove"
msgstr "Retirer"
@ -600,7 +604,7 @@ msgstr "Afficher les paramètres avancés"
msgid "Sign"
msgstr "Signer"
#: packages/ui/primitives/document-flow/add-fields.tsx:785
#: packages/ui/primitives/document-flow/add-fields.tsx:818
#: packages/ui/primitives/document-flow/add-signature.tsx:323
#: packages/ui/primitives/document-flow/field-icon.tsx:52
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
@ -648,7 +652,7 @@ msgstr "Soumettre"
msgid "Template title"
msgstr "Titre du modèle"
#: packages/ui/primitives/document-flow/add-fields.tsx:915
#: packages/ui/primitives/document-flow/add-fields.tsx:948
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
msgid "Text"
msgstr "Texte"
@ -709,7 +713,7 @@ msgstr "Le nom du signataire"
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'authentification pour chaque destinataire à l'étape suivante."
#: packages/ui/primitives/document-flow/add-fields.tsx:746
#: packages/ui/primitives/document-flow/add-fields.tsx:752
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
msgstr "Ce document a déjà été envoyé à ce destinataire. Vous ne pouvez plus modifier ce destinataire."
@ -721,7 +725,7 @@ msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de pa
msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués."
#: packages/ui/primitives/document-flow/add-fields.tsx:1050
#: packages/ui/primitives/document-flow/add-fields.tsx:1084
msgid "This recipient can no longer be modified as they have signed a field, or completed the document."
msgstr "Ce destinataire ne peut plus être modifié car il a signé un champ ou complété le document."
@ -746,7 +750,7 @@ msgstr "Fuseau horaire"
msgid "Title"
msgstr "Titre"
#: packages/ui/primitives/document-flow/add-fields.tsx:1033
#: packages/ui/primitives/document-flow/add-fields.tsx:1067
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
msgid "To proceed further, please set at least one value for the {0} field."
msgstr "Pour continuer, veuillez définir au moins une valeur pour le champ {0}."

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -220,7 +220,7 @@ msgstr "Abonnements actifs"
msgid "Add"
msgstr "Ajouter"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:175
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
msgid "Add all relevant fields for each recipient."
msgstr "Ajouter tous les champs pertinents pour chaque destinataire."
@ -241,7 +241,7 @@ msgstr "Ajouter un authentificateur pour servir de méthode d'authentification s
msgid "Add email"
msgstr "Ajouter un e-mail"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:174
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
msgid "Add Fields"
msgstr "Ajouter des champs"
@ -263,11 +263,11 @@ msgstr "Ajouter une clé de passe"
msgid "Add Placeholders"
msgstr "Ajouter des espaces réservés"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:169
msgid "Add Signers"
msgstr "Ajouter des signataires"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:179
msgid "Add Subject"
msgstr "Ajouter un sujet"
@ -283,7 +283,7 @@ msgstr "Ajouter un e-mail d'équipe"
#~ msgid "Add Text"
#~ msgstr "Add Text"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:170
msgid "Add the people who will sign the document."
msgstr "Ajouter les personnes qui signeront le document."
@ -291,7 +291,7 @@ msgstr "Ajouter les personnes qui signeront le document."
msgid "Add the recipients to create the document with"
msgstr "Ajouter les destinataires pour créer le document avec"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:180
msgid "Add the subject and message you wish to send to signers."
msgstr "Ajouter le sujet et le message que vous souhaitez envoyer aux signataires."
@ -370,13 +370,13 @@ msgstr "Un e-mail demandant le transfert de cette équipe a été envoyé."
msgid "An error occurred"
msgstr "Une erreur est survenue"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:266
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
msgid "An error occurred while adding signers."
msgstr "Une erreur est survenue lors de l'ajout de signataires."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:301
msgid "An error occurred while adding the fields."
msgstr "Une erreur est survenue lors de l'ajout des champs."
@ -426,7 +426,7 @@ msgstr "Une erreur est survenue lors du déplacement du modèle."
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
msgid "An error occurred while removing the signature."
msgstr "Une erreur est survenue lors de la suppression de la signature."
@ -434,7 +434,7 @@ msgstr "Une erreur est survenue lors de la suppression de la signature."
msgid "An error occurred while removing the text."
msgstr "Une erreur est survenue lors de la suppression du texte."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:332
msgid "An error occurred while sending the document."
msgstr "Une erreur est survenue lors de l'envoi du document."
@ -449,7 +449,7 @@ msgstr "Une erreur est survenue lors de l'envoi de votre e-mail de confirmation"
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:149
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:147
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168
msgid "An error occurred while signing the document."
msgstr "Une erreur est survenue lors de la signature du document."
@ -458,7 +458,7 @@ msgstr "Une erreur est survenue lors de la signature du document."
msgid "An error occurred while trying to create a checkout session."
msgstr "Une erreur est survenue lors de la création d'une session de paiement."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:232
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
msgid "An error occurred while updating the document settings."
msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document."
@ -665,11 +665,11 @@ msgstr "En activant l'authentification à deux facteurs (2FA), vous devrez entre
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:248
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176
@ -752,7 +752,7 @@ msgid "Click to copy signing link for sending to recipient"
msgstr "Cliquez pour copier le lien de signature à envoyer au destinataire"
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:115
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
msgid "Click to insert field"
@ -802,7 +802,7 @@ msgstr "Documents complétés"
msgid "Completed Documents"
msgstr "Documents Complétés"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:165
msgid "Configure general settings for the document."
msgstr "Configurer les paramètres généraux pour le document."
@ -1274,7 +1274,7 @@ msgstr "Document renvoyé"
msgid "Document resealed"
msgstr "Document resealé"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:321
msgid "Document sent"
msgstr "Document envoyé"
@ -1491,10 +1491,10 @@ msgstr "Entrez votre texte ici"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:231
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:265
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:300
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:331
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
@ -1519,8 +1519,8 @@ msgstr "Entrez votre texte ici"
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:174
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:146
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:172
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195
#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54
@ -1597,7 +1597,7 @@ msgstr "Mot de passe oublié ?"
msgid "Full Name"
msgstr "Nom complet"
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:164
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
@ -2294,7 +2294,7 @@ msgstr "Veuillez contacter le support si vous souhaitez annuler cette action."
msgid "Please enter a meaningful name for your token. This will help you identify it later."
msgstr "Veuillez entrer un nom significatif pour votre jeton. Cela vous aidera à l'identifier plus tard."
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:135
msgid "Please mark as viewed to complete"
msgstr "Veuillez marquer comme vu pour terminer"
@ -2730,13 +2730,13 @@ msgstr "Afficher des modèles dans le profil public de votre équipe pour que vo
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:256
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
#: apps/web/src/components/ui/user-profile-timur.tsx:81
msgid "Sign"
msgstr "Signer"
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:219
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:217
msgid "Sign as {0} <0>({1})</0>"
msgstr "Signer comme {0} <0>({1})</0>"
@ -2802,8 +2802,8 @@ msgstr "S'inscrire avec OIDC"
#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:338
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:225
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
#: apps/web/src/components/forms/profile.tsx:132
@ -4382,7 +4382,7 @@ msgstr "Votre document a été créé à partir du modèle avec succès."
msgid "Your document has been re-sent successfully."
msgstr "Votre document a été renvoyé avec succès."
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:322
msgid "Your document has been sent successfully."
msgstr "Votre document a été envoyé avec succès."

View File

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "DocumentMeta" ADD COLUMN "enabledTypedSignature" BOOLEAN NOT NULL DEFAULT false;

View File

@ -0,0 +1,9 @@
/*
Warnings:
- You are about to drop the column `enabledTypedSignature` on the `DocumentMeta` table. All the data in the column will be lost.
*/
-- AlterTable
ALTER TABLE "DocumentMeta" DROP COLUMN "enabledTypedSignature",
ADD COLUMN "typedSignatureEnabled" BOOLEAN NOT NULL DEFAULT false;

View File

@ -359,16 +359,17 @@ model DocumentData {
}
model DocumentMeta {
id String @id @default(cuid())
subject String?
message String?
timezone String? @default("Etc/UTC") @db.Text
password String?
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
documentId Int @unique
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
redirectUrl String?
signingOrder DocumentSigningOrder @default(PARALLEL)
id String @id @default(cuid())
subject String?
message String?
timezone String? @default("Etc/UTC") @db.Text
password String?
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
documentId Int @unique
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
redirectUrl String?
signingOrder DocumentSigningOrder @default(PARALLEL)
typedSignatureEnabled Boolean @default(false)
}
enum ReadStatus {

View File

@ -42,6 +42,7 @@ import {
ZSetSettingsForDocumentMutationSchema,
ZSetSigningOrderForDocumentMutationSchema,
ZSetTitleForDocumentMutationSchema,
ZUpdateTypedSignatureSettingsMutationSchema,
} from './schema';
export const documentRouter = router({
@ -332,6 +333,46 @@ export const documentRouter = router({
}
}),
updateTypedSignatureSettings: authenticatedProcedure
.input(ZUpdateTypedSignatureSettingsMutationSchema)
.mutation(async ({ input, ctx }) => {
try {
const { documentId, teamId, typedSignatureEnabled } = input;
const document = await getDocumentById({
id: documentId,
teamId,
userId: ctx.user.id,
}).catch(() => null);
if (!document) {
throw new TRPCError({
code: 'NOT_FOUND',
message: 'Document not found',
});
}
return await upsertDocumentMeta({
documentId,
typedSignatureEnabled,
userId: ctx.user.id,
requestMetadata: extractNextApiRequestMetadata(ctx.req),
});
} catch (err) {
console.error(err);
if (err instanceof TRPCError) {
throw err;
}
throw new TRPCError({
code: 'BAD_REQUEST',
message:
'We were unable to update the settings for this document. Please try again later.',
});
}
}),
sendDocument: authenticatedProcedure
.input(ZSendDocumentMutationSchema)
.mutation(async ({ input, ctx }) => {

View File

@ -158,6 +158,16 @@ export type TSetSigningOrderForDocumentMutationSchema = z.infer<
typeof ZSetSigningOrderForDocumentMutationSchema
>;
export const ZUpdateTypedSignatureSettingsMutationSchema = z.object({
documentId: z.number(),
teamId: z.number().optional(),
typedSignatureEnabled: z.boolean(),
});
export type TUpdateTypedSignatureSettingsMutationSchema = z.infer<
typeof ZUpdateTypedSignatureSettingsMutationSchema
>;
export const ZResendDocumentMutationSchema = z.object({
documentId: z.number(),
recipients: z.array(z.number()).min(1),

View File

@ -47,7 +47,9 @@ import { cn } from '../../lib/utils';
import { Alert, AlertDescription } from '../alert';
import { Button } from '../button';
import { Card, CardContent } from '../card';
import { Checkbox } from '../checkbox';
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from '../command';
import { Form, FormControl, FormField, FormItem, FormLabel } from '../form/form';
import { Popover, PopoverContent, PopoverTrigger } from '../popover';
import { useStep } from '../stepper';
import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
@ -96,6 +98,7 @@ export type AddFieldsFormProps = {
onSubmit: (_data: TAddFieldsFormSchema) => void;
canGoBack?: boolean;
isDocumentPdfLoaded: boolean;
typedSignatureEnabled?: boolean;
teamId?: number;
};
@ -107,6 +110,7 @@ export const AddFieldsFormPartial = ({
onSubmit,
canGoBack = false,
isDocumentPdfLoaded,
typedSignatureEnabled,
teamId,
}: AddFieldsFormProps) => {
const { toast } = useToast();
@ -120,13 +124,7 @@ export const AddFieldsFormPartial = ({
const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);
const [currentField, setCurrentField] = useState<FieldFormType>();
const {
control,
handleSubmit,
formState: { isSubmitting },
setValue,
getValues,
} = useForm<TAddFieldsFormSchema>({
const form = useForm<TAddFieldsFormSchema>({
defaultValues: {
fields: fields.map((field) => ({
nativeId: field.id,
@ -141,6 +139,7 @@ export const AddFieldsFormPartial = ({
recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '',
fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined,
})),
typedSignatureEnabled: typedSignatureEnabled ?? false,
},
});
@ -148,10 +147,10 @@ export const AddFieldsFormPartial = ({
useHotkeys(['ctrl+v', 'meta+v'], (evt) => onFieldPaste(evt));
useHotkeys(['ctrl+d', 'meta+d'], (evt) => onFieldCopy(evt, { duplicate: true }));
const onFormSubmit = handleSubmit(onSubmit);
const onFormSubmit = form.handleSubmit(onSubmit);
const handleSavedFieldSettings = (fieldState: FieldMeta) => {
const initialValues = getValues();
const initialValues = form.getValues();
const updatedFields = initialValues.fields.map((field) => {
if (field.formId === currentField?.formId) {
@ -166,7 +165,7 @@ export const AddFieldsFormPartial = ({
return field;
});
setValue('fields', updatedFields);
form.setValue('fields', updatedFields);
};
const {
@ -175,7 +174,7 @@ export const AddFieldsFormPartial = ({
update,
fields: localFields,
} = useFieldArray({
control,
control: form.control,
name: 'fields',
});
@ -530,6 +529,12 @@ export const AddFieldsFormPartial = ({
);
}, [recipientsByRole]);
const isTypedSignatureEnabled = form.watch('typedSignatureEnabled');
const handleTypedSignatureChange = (value: boolean) => {
form.setValue('typedSignatureEnabled', value, { shouldDirty: true });
};
const handleAdvancedSettings = () => {
setShowAdvancedSettings((prev) => !prev);
};
@ -577,6 +582,7 @@ export const AddFieldsFormPartial = ({
title={documentFlow.title}
description={documentFlow.description}
/>
<DocumentFlowFormContainerContent>
<div className="flex flex-col">
{selectedField && (
@ -760,269 +766,297 @@ export const AddFieldsFormPartial = ({
</Popover>
)}
<div className="-mx-2 flex-1 overflow-y-auto px-2">
<fieldset disabled={isFieldsDisabled} className="my-2 grid grid-cols-3 gap-4">
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.SIGNATURE)}
onMouseDown={() => setSelectedField(FieldType.SIGNATURE)}
data-selected={selectedField === FieldType.SIGNATURE ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-lg font-normal',
fontCaveat.className,
)}
>
<Trans>Signature</Trans>
</p>
</CardContent>
</Card>
</button>
<Form {...form}>
<FormField
control={form.control}
name="typedSignatureEnabled"
render={({ field: { value, ...field } }) => (
<FormItem className="mb-6 flex flex-row items-center space-x-2 space-y-0">
<FormControl>
<Checkbox
{...field}
id="typedSignatureEnabled"
checkClassName="text-white"
checked={value}
onCheckedChange={(checked) => field.onChange(checked)}
disabled={form.formState.isSubmitting}
/>
</FormControl>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.INITIALS)}
onMouseDown={() => setSelectedField(FieldType.INITIALS)}
data-selected={selectedField === FieldType.INITIALS ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Contact className="h-4 w-4" />
Initials
</p>
</CardContent>
</Card>
</button>
<FormLabel
htmlFor="typedSignatureEnabled"
className="text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
>
<Trans>Enable Typed Signatures</Trans>
</FormLabel>
</FormItem>
)}
/>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.EMAIL)}
onMouseDown={() => setSelectedField(FieldType.EMAIL)}
data-selected={selectedField === FieldType.EMAIL ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<div className="-mx-2 flex-1 overflow-y-auto px-2">
<fieldset disabled={isFieldsDisabled} className="my-2 grid grid-cols-3 gap-4">
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.SIGNATURE)}
onMouseDown={() => setSelectedField(FieldType.SIGNATURE)}
data-selected={selectedField === FieldType.SIGNATURE ? true : undefined}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Mail className="h-4 w-4" />
<Trans>Email</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-lg font-normal',
fontCaveat.className,
)}
>
<Trans>Signature</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.NAME)}
onMouseDown={() => setSelectedField(FieldType.NAME)}
data-selected={selectedField === FieldType.NAME ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.INITIALS)}
onMouseDown={() => setSelectedField(FieldType.INITIALS)}
data-selected={selectedField === FieldType.INITIALS ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<User className="h-4 w-4" />
<Trans>Name</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Contact className="h-4 w-4" />
Initials
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.DATE)}
onMouseDown={() => setSelectedField(FieldType.DATE)}
data-selected={selectedField === FieldType.DATE ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.EMAIL)}
onMouseDown={() => setSelectedField(FieldType.EMAIL)}
data-selected={selectedField === FieldType.EMAIL ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<CalendarDays className="h-4 w-4" />
<Trans>Date</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="flex flex-col items-center justify-center px-6 py-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Mail className="h-4 w-4" />
<Trans>Email</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.TEXT)}
onMouseDown={() => setSelectedField(FieldType.TEXT)}
data-selected={selectedField === FieldType.TEXT ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.NAME)}
onMouseDown={() => setSelectedField(FieldType.NAME)}
data-selected={selectedField === FieldType.NAME ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Type className="h-4 w-4" />
<Trans>Text</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<User className="h-4 w-4" />
<Trans>Name</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.NUMBER)}
onMouseDown={() => setSelectedField(FieldType.NUMBER)}
data-selected={selectedField === FieldType.NUMBER ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.DATE)}
onMouseDown={() => setSelectedField(FieldType.DATE)}
data-selected={selectedField === FieldType.DATE ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Hash className="h-4 w-4" />
<Trans>Number</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<CalendarDays className="h-4 w-4" />
<Trans>Date</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.RADIO)}
onMouseDown={() => setSelectedField(FieldType.RADIO)}
data-selected={selectedField === FieldType.RADIO ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.TEXT)}
onMouseDown={() => setSelectedField(FieldType.TEXT)}
data-selected={selectedField === FieldType.TEXT ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Disc className="h-4 w-4" />
<Trans>Radio</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Type className="h-4 w-4" />
<Trans>Text</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.CHECKBOX)}
onMouseDown={() => setSelectedField(FieldType.CHECKBOX)}
data-selected={selectedField === FieldType.CHECKBOX ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.NUMBER)}
onMouseDown={() => setSelectedField(FieldType.NUMBER)}
data-selected={selectedField === FieldType.NUMBER ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<CheckSquare className="h-4 w-4" />
<Trans>Checkbox</Trans>
</p>
</CardContent>
</Card>
</button>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Hash className="h-4 w-4" />
<Trans>Number</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.DROPDOWN)}
onMouseDown={() => setSelectedField(FieldType.DROPDOWN)}
data-selected={selectedField === FieldType.DROPDOWN ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.RADIO)}
onMouseDown={() => setSelectedField(FieldType.RADIO)}
data-selected={selectedField === FieldType.RADIO ? true : undefined}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<ChevronDown className="h-4 w-4" />
<Trans>Dropdown</Trans>
</p>
</CardContent>
</Card>
</button>
</fieldset>
</div>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<Disc className="h-4 w-4" />
<Trans>Radio</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.CHECKBOX)}
onMouseDown={() => setSelectedField(FieldType.CHECKBOX)}
data-selected={selectedField === FieldType.CHECKBOX ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<CheckSquare className="h-4 w-4" />
<Trans>Checkbox</Trans>
</p>
</CardContent>
</Card>
</button>
<button
type="button"
className="group h-full w-full"
onClick={() => setSelectedField(FieldType.DROPDOWN)}
onMouseDown={() => setSelectedField(FieldType.DROPDOWN)}
data-selected={selectedField === FieldType.DROPDOWN ? true : undefined}
>
<Card
className={cn(
'flex h-full w-full cursor-pointer items-center justify-center group-disabled:opacity-50',
// selectedSignerStyles.borderClass,
)}
>
<CardContent className="p-4">
<p
className={cn(
'text-muted-foreground group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal',
)}
>
<ChevronDown className="h-4 w-4" />
<Trans>Dropdown</Trans>
</p>
</CardContent>
</Card>
</button>
</fieldset>
</div>
</Form>
</div>
</DocumentFlowFormContainerContent>
@ -1059,8 +1093,9 @@ export const AddFieldsFormPartial = ({
<DocumentFlowFormContainerStep step={currentStep} maxStep={totalSteps} />
<DocumentFlowFormContainerActions
loading={isSubmitting}
disabled={isSubmitting}
loading={form.formState.isSubmitting}
disabled={form.formState.isSubmitting}
disableNextStep={hasErrors}
onGoBackClick={() => {
previousStep();
remove();

View File

@ -18,6 +18,7 @@ export const ZAddFieldsFormSchema = z.object({
fieldMeta: ZFieldMetaSchema,
}),
),
typedSignatureEnabled: z.boolean(),
});
export type TAddFieldsFormSchema = z.infer<typeof ZAddFieldsFormSchema>;

View File

@ -3,12 +3,15 @@
import type { HTMLAttributes, MouseEvent, PointerEvent, TouchEvent } from 'react';
import { useEffect, useMemo, useRef, useState } from 'react';
import { Caveat } from 'next/font/google';
import { Trans } from '@lingui/macro';
import { Undo2 } from 'lucide-react';
import type { StrokeOptions } from 'perfect-freehand';
import { getStroke } from 'perfect-freehand';
import { unsafe_useEffectOnce } from '@documenso/lib/client-only/hooks/use-effect-once';
import { Input } from '@documenso/ui/primitives/input';
import {
Select,
SelectContent,
@ -21,12 +24,20 @@ import { cn } from '../../lib/utils';
import { getSvgPathFromStroke } from './helper';
import { Point } from './point';
const fontCaveat = Caveat({
weight: ['500'],
subsets: ['latin'],
display: 'swap',
variable: '--font-caveat',
});
const DPI = 2;
export type SignaturePadProps = Omit<HTMLAttributes<HTMLCanvasElement>, 'onChange'> & {
onChange?: (_signatureDataUrl: string | null) => void;
containerClassName?: string;
disabled?: boolean;
allowTypedSignature?: boolean;
};
export const SignaturePad = ({
@ -35,6 +46,7 @@ export const SignaturePad = ({
defaultValue,
onChange,
disabled = false,
allowTypedSignature,
...props
}: SignaturePadProps) => {
const $el = useRef<HTMLCanvasElement>(null);
@ -44,6 +56,7 @@ export const SignaturePad = ({
const [lines, setLines] = useState<Point[][]>([]);
const [currentLine, setCurrentLine] = useState<Point[]>([]);
const [selectedColor, setSelectedColor] = useState('black');
const [typedSignature, setTypedSignature] = useState('');
const perfectFreehandOptions = useMemo(() => {
const size = $el.current ? Math.min($el.current.height, $el.current.width) * 0.03 : 10;
@ -181,34 +194,107 @@ export const SignaturePad = ({
onChange?.(null);
setTypedSignature('');
setLines([]);
setCurrentLine([]);
};
const renderTypedSignature = () => {
if ($el.current && typedSignature) {
const ctx = $el.current.getContext('2d');
if (ctx) {
const canvasWidth = $el.current.width;
const canvasHeight = $el.current.height;
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillStyle = selectedColor;
// Calculate the desired width (25ch)
const desiredWidth = canvasWidth * 0.85; // 85% of canvas width
// Start with a base font size
let fontSize = 18;
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
// Measure 10 characters and calculate scale factor
const characterWidth = ctx.measureText('m'.repeat(10)).width;
const scaleFactor = desiredWidth / characterWidth;
// Apply scale factor to font size
fontSize = fontSize * scaleFactor;
// Adjust font size if it exceeds canvas width
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
const textWidth = ctx.measureText(typedSignature).width;
if (textWidth > desiredWidth) {
fontSize = fontSize * (desiredWidth / textWidth);
}
// Set final font and render text
ctx.font = `${fontSize}px ${fontCaveat.style.fontFamily}`;
ctx.fillText(typedSignature, canvasWidth / 2, canvasHeight / 2);
}
}
};
const handleTypedSignatureChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const newValue = event.target.value;
setTypedSignature(newValue);
if (newValue.trim() !== '') {
onChange?.($el.current?.toDataURL() || null);
} else {
onChange?.(null);
}
};
useEffect(() => {
if (typedSignature.trim() !== '') {
renderTypedSignature();
onChange?.($el.current?.toDataURL() || null);
} else {
onClearClick();
}
}, [typedSignature, selectedColor]);
const onUndoClick = () => {
if (lines.length === 0) {
if (lines.length === 0 && typedSignature.length === 0) {
return;
}
const newLines = lines.slice(0, -1);
setLines(newLines);
if (typedSignature.length > 0) {
const newTypedSignature = typedSignature.slice(0, -1);
setTypedSignature(newTypedSignature);
// You might want to call onChange here as well
// onChange?.(newTypedSignature);
} else {
const newLines = lines.slice(0, -1);
setLines(newLines);
// Clear the canvas
if ($el.current) {
const ctx = $el.current.getContext('2d');
const { width, height } = $el.current;
ctx?.clearRect(0, 0, width, height);
// Clear and redraw the canvas
if ($el.current) {
const ctx = $el.current.getContext('2d');
const { width, height } = $el.current;
ctx?.clearRect(0, 0, width, height);
if (typeof defaultValue === 'string' && $imageData.current) {
ctx?.putImageData($imageData.current, 0, 0);
if (typeof defaultValue === 'string' && $imageData.current) {
ctx?.putImageData($imageData.current, 0, 0);
}
newLines.forEach((line) => {
const pathData = new Path2D(
getSvgPathFromStroke(getStroke(line, perfectFreehandOptions)),
);
ctx?.fill(pathData);
});
onChange?.($el.current.toDataURL());
}
newLines.forEach((line) => {
const pathData = new Path2D(getSvgPathFromStroke(getStroke(line, perfectFreehandOptions)));
ctx?.fill(pathData);
});
onChange?.($el.current.toDataURL());
}
};
@ -263,6 +349,21 @@ export const SignaturePad = ({
{...props}
/>
{allowTypedSignature && (
<div
className={cn('ml-4 pb-1', {
'ml-10': lines.length > 0 || typedSignature.length > 0,
})}
>
<Input
placeholder="Type your signature"
className="w-1/2 border-none p-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0"
value={typedSignature}
onChange={handleTypedSignatureChange}
/>
</div>
)}
<div className="text-foreground absolute right-2 top-2 filter">
<Select defaultValue={selectedColor} onValueChange={(value) => setSelectedColor(value)}>
<SelectTrigger className="h-auto w-auto border-none p-0.5">
@ -311,13 +412,13 @@ export const SignaturePad = ({
</button>
</div>
{lines.length > 0 && (
{(lines.length > 0 || typedSignature.length > 0) && (
<div className="absolute bottom-4 left-4 flex gap-2">
<button
type="button"
title="undo"
className="focus-visible:ring-ring ring-offset-background text-muted-foreground/60 hover:text-muted-foreground rounded-full p-0 text-[0.688rem] focus-visible:outline-none focus-visible:ring-2"
onClick={() => onUndoClick()}
onClick={onUndoClick}
>
<Undo2 className="h-4 w-4" />
<span className="sr-only">Undo</span>