- Signature is too small. Please provide a more complete signature.
-
- )}
-
+ setLocalSignature(value)}
+ typedSignatureEnabled={typedSignatureEnabled}
+ uploadSignatureEnabled={uploadSignatureEnabled}
+ drawSignatureEnabled={drawSignatureEnabled}
+ />
@@ -317,7 +303,7 @@ export const DocumentSigningSignatureField = ({
onDialogSignClick()}
>
Sign
diff --git a/apps/remix/app/components/general/document/document-edit-form.tsx b/apps/remix/app/components/general/document/document-edit-form.tsx
index b1f38bb41..e2b03f053 100644
--- a/apps/remix/app/components/general/document/document-edit-form.tsx
+++ b/apps/remix/app/components/general/document/document-edit-form.tsx
@@ -5,6 +5,7 @@ import { useLingui } from '@lingui/react';
import { DocumentDistributionMethod, DocumentStatus } from '@prisma/client';
import { useNavigate, useSearchParams } from 'react-router';
+import { DocumentSignatureType } from '@documenso/lib/constants/document';
import { isValidLanguageCode } from '@documenso/lib/constants/i18n';
import {
DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
@@ -71,7 +72,7 @@ export const DocumentEditForm = ({
const { recipients, fields } = document;
- const { mutateAsync: updateDocumentSettings } = trpc.document.setSettingsForDocument.useMutation({
+ const { mutateAsync: updateDocument } = trpc.document.updateDocument.useMutation({
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
onSuccess: (newData) => {
utils.document.getDocumentWithDetailsById.setData(
@@ -174,9 +175,9 @@ export const DocumentEditForm = ({
const onAddSettingsFormSubmit = async (data: TAddSettingsFormSchema) => {
try {
- const { timezone, dateFormat, redirectUrl, language } = data.meta;
+ const { timezone, dateFormat, redirectUrl, language, signatureTypes } = data.meta;
- await updateDocumentSettings({
+ await updateDocument({
documentId: document.id,
data: {
title: data.title,
@@ -190,6 +191,9 @@ export const DocumentEditForm = ({
dateFormat,
redirectUrl,
language: isValidLanguageCode(language) ? language : undefined,
+ typedSignatureEnabled: signatureTypes.includes(DocumentSignatureType.TYPE),
+ uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD),
+ drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW),
},
});
@@ -213,7 +217,7 @@ export const DocumentEditForm = ({
signingOrder: data.signingOrder,
}),
- updateDocumentSettings({
+ updateDocument({
documentId: document.id,
meta: {
allowDictateNextSigner: data.allowDictateNextSigner,
@@ -249,14 +253,6 @@ export const DocumentEditForm = ({
fields: data.fields,
});
- await updateDocumentSettings({
- documentId: document.id,
-
- meta: {
- typedSignatureEnabled: data.typedSignatureEnabled,
- },
- });
-
// Clear all field data from localStorage
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
@@ -386,7 +382,6 @@ export const DocumentEditForm = ({
fields={fields}
onSubmit={onAddFieldsFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
- typedSignatureEnabled={document.documentMeta?.typedSignatureEnabled}
teamId={team?.id}
/>
diff --git a/apps/remix/app/components/general/template/template-edit-form.tsx b/apps/remix/app/components/general/template/template-edit-form.tsx
index 46d293969..e7dcc86d8 100644
--- a/apps/remix/app/components/general/template/template-edit-form.tsx
+++ b/apps/remix/app/components/general/template/template-edit-form.tsx
@@ -4,6 +4,7 @@ import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react';
import { useNavigate } from 'react-router';
+import { DocumentSignatureType } from '@documenso/lib/constants/document';
import { isValidLanguageCode } from '@documenso/lib/constants/i18n';
import {
DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
@@ -124,6 +125,8 @@ export const TemplateEditForm = ({
});
const onAddSettingsFormSubmit = async (data: TAddTemplateSettingsFormSchema) => {
+ const { signatureTypes } = data.meta;
+
try {
await updateTemplateSettings({
templateId: template.id,
@@ -136,6 +139,9 @@ export const TemplateEditForm = ({
},
meta: {
...data.meta,
+ typedSignatureEnabled: signatureTypes.includes(DocumentSignatureType.TYPE),
+ uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD),
+ drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW),
language: isValidLanguageCode(data.meta.language) ? data.meta.language : undefined,
},
});
@@ -188,13 +194,6 @@ export const TemplateEditForm = ({
fields: data.fields,
});
- await updateTemplateSettings({
- templateId: template.id,
- meta: {
- typedSignatureEnabled: data.typedSignatureEnabled,
- },
- });
-
// Clear all field data from localStorage
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
@@ -286,7 +285,6 @@ export const TemplateEditForm = ({
fields={fields}
onSubmit={onAddFieldsFormSubmit}
teamId={team?.id}
- typedSignatureEnabled={template.templateMeta?.typedSignatureEnabled}
/>
diff --git a/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx b/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
index a5a12229e..a93a01560 100644
--- a/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
+++ b/apps/remix/app/routes/_recipient+/d.$token+/_index.tsx
@@ -79,7 +79,14 @@ export default function DirectTemplatePage() {
const { template, directTemplateRecipient } = data;
return (
-
+ ();
return (
-
+ field.type === FieldType.SIGNATURE)) {
+ await signSignaturePad(page);
+ }
for (const field of fields) {
await page.locator(`#field-${field.id}`).getByRole('button').click();
@@ -349,7 +351,9 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient an
});
}
- await signSignaturePad(page);
+ if (fields.some((field) => field.type === FieldType.SIGNATURE)) {
+ await signSignaturePad(page);
+ }
for (const field of fields) {
await page.locator(`#field-${field.id}`).getByRole('button').click();
diff --git a/packages/app-tests/e2e/document-auth/next-recipient-dictation.spec.ts b/packages/app-tests/e2e/document-auth/next-recipient-dictation.spec.ts
index 85d72aac6..345359542 100644
--- a/packages/app-tests/e2e/document-auth/next-recipient-dictation.spec.ts
+++ b/packages/app-tests/e2e/document-auth/next-recipient-dictation.spec.ts
@@ -11,7 +11,7 @@ import { prisma } from '@documenso/prisma';
import { seedPendingDocumentWithFullFields } from '@documenso/prisma/seed/documents';
import { seedUser } from '@documenso/prisma/seed/users';
-import { signSignaturePad } from '../fixtures/signature';
+import { signDirectSignaturePad, signSignaturePad } from '../fixtures/signature';
test('[NEXT_RECIPIENT_DICTATION]: should allow updating next recipient when dictation is enabled', async ({
page,
@@ -322,7 +322,7 @@ test('[NEXT_RECIPIENT_DICTATION]: should allow assistant to dictate next signer'
await page.locator(`#field-${field.id}`).getByRole('button').click();
if (field.type === FieldType.SIGNATURE) {
- await signSignaturePad(page);
+ await signDirectSignaturePad(page);
await page.getByRole('button', { name: 'Sign', exact: true }).click();
}
diff --git a/packages/app-tests/e2e/features/include-document-certificate.spec.ts b/packages/app-tests/e2e/features/include-document-certificate.spec.ts
index 4e4386206..de9ce08ea 100644
--- a/packages/app-tests/e2e/features/include-document-certificate.spec.ts
+++ b/packages/app-tests/e2e/features/include-document-certificate.spec.ts
@@ -222,7 +222,10 @@ test.describe('Signing Certificate Tests', () => {
// Toggle signing certificate setting
await page.getByLabel('Include the Signing Certificate in the Document').click();
- await page.getByRole('button', { name: /Save/ }).first().click();
+ await page
+ .getByRole('button', { name: /Update/ })
+ .first()
+ .click();
await page.waitForTimeout(1000);
@@ -236,7 +239,10 @@ test.describe('Signing Certificate Tests', () => {
// Toggle the setting back to true
await page.getByLabel('Include the Signing Certificate in the Document').click();
- await page.getByRole('button', { name: /Save/ }).first().click();
+ await page
+ .getByRole('button', { name: /Update/ })
+ .first()
+ .click();
await page.waitForTimeout(1000);
diff --git a/packages/app-tests/e2e/fixtures/signature.ts b/packages/app-tests/e2e/fixtures/signature.ts
index 9ba9f8044..5bca69fdd 100644
--- a/packages/app-tests/e2e/fixtures/signature.ts
+++ b/packages/app-tests/e2e/fixtures/signature.ts
@@ -1,40 +1,28 @@
import type { Page } from '@playwright/test';
+/**
+ * Will open the signature pad dialog and sign it.
+ */
export const signSignaturePad = async (page: Page) => {
await page.waitForTimeout(200);
- const canvas = page.getByTestId('signature-pad');
+ await page.getByTestId('signature-pad-dialog-button').click();
- const box = await canvas.boundingBox();
+ // Click type tab
+ await page.getByRole('tab', { name: 'Type' }).click();
+ await page.getByTestId('signature-pad-type-input').fill('Signature');
- if (!box) {
- throw new Error('Signature pad not found');
- }
-
- // Calculate center point
- const centerX = box.x + box.width / 2;
- const centerY = box.y + box.height / 2;
-
- // Calculate square size (making it slightly smaller than the canvas)
- const squareSize = Math.min(box.width, box.height) * 0.4; // 40% of the smallest dimension
-
- // Move to center
- await page.mouse.move(centerX, centerY);
- await page.mouse.down();
-
- // Draw square clockwise from center
- // Move right
- await page.mouse.move(centerX + squareSize, centerY, { steps: 10 });
- // Move down
- await page.mouse.move(centerX + squareSize, centerY + squareSize, { steps: 10 });
- // Move left
- await page.mouse.move(centerX - squareSize, centerY + squareSize, { steps: 10 });
- // Move up
- await page.mouse.move(centerX - squareSize, centerY - squareSize, { steps: 10 });
- // Move right
- await page.mouse.move(centerX + squareSize, centerY - squareSize, { steps: 10 });
- // Move down to close the square
- await page.mouse.move(centerX + squareSize, centerY, { steps: 10 });
-
- await page.mouse.up();
+ // Click Next button
+ await page.getByRole('button', { name: 'Next' }).click();
+};
+
+/**
+ * For when the signature pad is already open.
+ */
+export const signDirectSignaturePad = async (page: Page) => {
+ await page.waitForTimeout(200);
+
+ // Click type tab
+ await page.getByRole('tab', { name: 'Type' }).click();
+ await page.getByTestId('signature-pad-type-input').fill('Signature');
};
diff --git a/packages/app-tests/e2e/teams/team-global-settings.spec.ts b/packages/app-tests/e2e/teams/team-global-settings.spec.ts
index 29e8428ab..34b3f412e 100644
--- a/packages/app-tests/e2e/teams/team-global-settings.spec.ts
+++ b/packages/app-tests/e2e/teams/team-global-settings.spec.ts
@@ -23,7 +23,7 @@ test('[TEAMS]: update the default document visibility in the team global setting
// !: Brittle selector
await page.getByRole('combobox').first().click();
await page.getByRole('option', { name: 'Admin' }).click();
- await page.getByRole('button', { name: 'Save' }).first().click();
+ await page.getByRole('button', { name: 'Update' }).first().click();
const toast = page.locator('li[role="status"][data-state="open"]').first();
await expect(toast).toBeVisible();
@@ -47,7 +47,7 @@ test('[TEAMS]: update the sender details in the team global settings', async ({
await expect(checkbox).toBeChecked();
- await page.getByRole('button', { name: 'Save' }).first().click();
+ await page.getByRole('button', { name: 'Update' }).first().click();
const toast = page.locator('li[role="status"][data-state="open"]').first();
await expect(toast).toBeVisible();
diff --git a/packages/app-tests/e2e/teams/team-signature-settings.spec.ts b/packages/app-tests/e2e/teams/team-signature-settings.spec.ts
new file mode 100644
index 000000000..0e6605176
--- /dev/null
+++ b/packages/app-tests/e2e/teams/team-signature-settings.spec.ts
@@ -0,0 +1,182 @@
+import { expect, test } from '@playwright/test';
+
+import { prisma } from '@documenso/prisma';
+import {
+ seedTeamDocumentWithMeta,
+ seedTeamDocuments,
+ seedTeamTemplateWithMeta,
+} from '@documenso/prisma/seed/documents';
+
+import { apiSignin } from '../fixtures/authentication';
+
+test.describe.configure({ mode: 'parallel' });
+
+test('[TEAMS]: check that default team signature settings are all enabled', async ({ page }) => {
+ const { team } = await seedTeamDocuments();
+
+ await apiSignin({
+ page,
+ email: team.owner.email,
+ password: 'password',
+ redirectPath: `/t/${team.url}/settings/preferences`,
+ });
+
+ // Verify that the default created team settings has all signatures enabled
+ await expect(page.getByRole('combobox').filter({ hasText: 'Type' })).toBeVisible();
+ await expect(page.getByRole('combobox').filter({ hasText: 'Upload' })).toBeVisible();
+ await expect(page.getByRole('combobox').filter({ hasText: 'Draw' })).toBeVisible();
+
+ const document = await seedTeamDocumentWithMeta(team);
+
+ // Create a document and check the settings
+ await page.goto(`/t/${team.url}/documents/${document.id}/edit`);
+
+ // Verify that the settings match
+ await page.getByRole('button', { name: 'Advanced Options' }).click();
+ await expect(page.getByRole('combobox').filter({ hasText: 'Type' })).toBeVisible();
+ await expect(page.getByRole('combobox').filter({ hasText: 'Upload' })).toBeVisible();
+ await expect(page.getByRole('combobox').filter({ hasText: 'Draw' })).toBeVisible();
+
+ // Go to document and check that the signatured tabs are correct.
+ await page.goto(`/sign/${document.recipients[0].token}`);
+ await page.getByTestId('signature-pad-dialog-button').click();
+
+ // Check the tab values
+ await expect(page.getByRole('tab', { name: 'Type' })).toBeVisible();
+ await expect(page.getByRole('tab', { name: 'Upload' })).toBeVisible();
+ await expect(page.getByRole('tab', { name: 'Draw' })).toBeVisible();
+});
+
+test('[TEAMS]: check signature modes can be disabled', async ({ page }) => {
+ const { team } = await seedTeamDocuments();
+
+ await apiSignin({
+ page,
+ email: team.owner.email,
+ password: 'password',
+ redirectPath: `/t/${team.url}/settings/preferences`,
+ });
+
+ const allTabs = ['Type', 'Upload', 'Draw'];
+ const tabTest = [['Type', 'Upload', 'Draw'], ['Type', 'Upload'], ['Type']];
+
+ for (const tabs of tabTest) {
+ await page.goto(`/t/${team.url}/settings/preferences`);
+
+ // Update combobox to have the correct tabs
+ await page.getByTestId('signature-types-combobox').click();
+
+ await expect(page.getByRole('option', { name: 'Type' })).toBeVisible();
+ await expect(page.getByRole('option', { name: 'Upload' })).toBeVisible();
+ await expect(page.getByRole('option', { name: 'Draw' })).toBeVisible();
+
+ // Clear all selected items.
+ for (const tab of allTabs) {
+ const item = page.getByRole('option', { name: tab });
+
+ const isSelected = (await item.innerHTML()).includes('opacity-100');
+
+ if (isSelected) {
+ await item.click();
+ }
+ }
+
+ // Selected wanted items.
+ for (const tab of tabs) {
+ const item = page.getByRole('option', { name: tab });
+ await item.click();
+ }
+
+ await page.getByRole('button', { name: 'Update' }).first().click();
+
+ const document = await seedTeamDocumentWithMeta(team);
+
+ // Go to document and check that the signatured tabs are correct.
+ await page.goto(`/sign/${document.recipients[0].token}`);
+ await page.getByTestId('signature-pad-dialog-button').click();
+
+ // Check the tab values
+ for (const tab of allTabs) {
+ if (tabs.includes(tab)) {
+ await expect(page.getByRole('tab', { name: tab })).toBeVisible();
+ } else {
+ await expect(page.getByRole('tab', { name: tab })).not.toBeVisible();
+ }
+ }
+ }
+});
+
+test('[TEAMS]: check signature modes work for templates', async ({ page }) => {
+ const { team } = await seedTeamDocuments();
+
+ await apiSignin({
+ page,
+ email: team.owner.email,
+ password: 'password',
+ redirectPath: `/t/${team.url}/settings/preferences`,
+ });
+
+ const allTabs = ['Type', 'Upload', 'Draw'];
+ const tabTest = [['Type', 'Upload', 'Draw'], ['Type', 'Upload'], ['Type']];
+
+ for (const tabs of tabTest) {
+ await page.goto(`/t/${team.url}/settings/preferences`);
+
+ // Update combobox to have the correct tabs
+ await page.getByTestId('signature-types-combobox').click();
+
+ await expect(page.getByRole('option', { name: 'Type' })).toBeVisible();
+ await expect(page.getByRole('option', { name: 'Upload' })).toBeVisible();
+ await expect(page.getByRole('option', { name: 'Draw' })).toBeVisible();
+
+ // Clear all selected items.
+ for (const tab of allTabs) {
+ const item = page.getByRole('option', { name: tab });
+
+ const isSelected = (await item.innerHTML()).includes('opacity-100');
+
+ if (isSelected) {
+ await item.click();
+ }
+ }
+
+ // Selected wanted items.
+ for (const tab of tabs) {
+ const item = page.getByRole('option', { name: tab });
+ await item.click();
+ }
+
+ await page.getByRole('button', { name: 'Update' }).first().click();
+
+ const template = await seedTeamTemplateWithMeta(team);
+
+ await page.goto(`/t/${team.url}/templates/${template.id}`);
+ await page.getByRole('button', { name: 'Use' }).click();
+
+ // Check the send document checkbox to true
+ await page.getByLabel('Send document').click();
+ await page.getByRole('button', { name: 'Create and send' }).click();
+ await page.waitForTimeout(1000);
+
+ const document = await prisma.document.findFirst({
+ where: {
+ templateId: template.id,
+ },
+ include: {
+ documentMeta: true,
+ },
+ });
+
+ // Test kinda flaky, debug here.
+ // console.log({
+ // tabs,
+ // typedSignatureEnabled: document?.documentMeta?.typedSignatureEnabled,
+ // uploadSignatureEnabled: document?.documentMeta?.uploadSignatureEnabled,
+ // drawSignatureEnabled: document?.documentMeta?.drawSignatureEnabled,
+ // });
+
+ expect(document?.documentMeta?.typedSignatureEnabled).toEqual(tabs.includes('Type'));
+ expect(document?.documentMeta?.uploadSignatureEnabled).toEqual(tabs.includes('Upload'));
+ expect(document?.documentMeta?.drawSignatureEnabled).toEqual(tabs.includes('Draw'));
+ }
+});
diff --git a/packages/app-tests/e2e/templates/direct-templates.spec.ts b/packages/app-tests/e2e/templates/direct-templates.spec.ts
index 47dd05a7f..2a44acd6a 100644
--- a/packages/app-tests/e2e/templates/direct-templates.spec.ts
+++ b/packages/app-tests/e2e/templates/direct-templates.spec.ts
@@ -298,6 +298,7 @@ test('[DIRECT_TEMPLATES]: use direct template link with 2 recipients', async ({
await page.goto(formatDirectTemplatePath(template.directLink?.token || ''));
await expect(page.getByRole('heading', { name: 'General' })).toBeVisible();
+ await page.waitForTimeout(1000);
await page.getByPlaceholder('recipient@documenso.com').fill(seedTestEmail());
await page.getByRole('button', { name: 'Continue' }).click();
diff --git a/packages/app-tests/e2e/user/update-name.spec.ts b/packages/app-tests/e2e/user/update-name.spec.ts
index fae570e31..29f6ff827 100644
--- a/packages/app-tests/e2e/user/update-name.spec.ts
+++ b/packages/app-tests/e2e/user/update-name.spec.ts
@@ -4,6 +4,7 @@ import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-emai
import { seedUser } from '@documenso/prisma/seed/users';
import { apiSignin } from '../fixtures/authentication';
+import { signSignaturePad } from '../fixtures/signature';
test('[USER] update full name', async ({ page }) => {
const user = await seedUser();
@@ -12,7 +13,7 @@ test('[USER] update full name', async ({ page }) => {
await page.getByLabel('Full Name').fill('John Doe');
- await page.getByPlaceholder('Type your signature').fill('John Doe');
+ await signSignaturePad(page);
await page.getByRole('button', { name: 'Update profile' }).click();
diff --git a/packages/lib/constants/document.ts b/packages/lib/constants/document.ts
index faec13cde..670c68ed7 100644
--- a/packages/lib/constants/document.ts
+++ b/packages/lib/constants/document.ts
@@ -34,3 +34,29 @@ export const DOCUMENT_DISTRIBUTION_METHODS: Record;
+
+export enum DocumentSignatureType {
+ DRAW = 'draw',
+ TYPE = 'type',
+ UPLOAD = 'upload',
+}
+
+type DocumentSignatureTypeData = {
+ label: MessageDescriptor;
+ value: DocumentSignatureType;
+};
+
+export const DOCUMENT_SIGNATURE_TYPES = {
+ [DocumentSignatureType.DRAW]: {
+ label: msg`Draw`,
+ value: DocumentSignatureType.DRAW,
+ },
+ [DocumentSignatureType.TYPE]: {
+ label: msg`Type`,
+ value: DocumentSignatureType.TYPE,
+ },
+ [DocumentSignatureType.UPLOAD]: {
+ label: msg`Upload`,
+ value: DocumentSignatureType.UPLOAD,
+ },
+} satisfies Record;
diff --git a/packages/lib/constants/signatures.ts b/packages/lib/constants/signatures.ts
new file mode 100644
index 000000000..0e0090e4f
--- /dev/null
+++ b/packages/lib/constants/signatures.ts
@@ -0,0 +1,4 @@
+export const SIGNATURE_CANVAS_DPI = 2;
+export const SIGNATURE_MIN_COVERAGE_THRESHOLD = 0.01;
+
+export const isBase64Image = (value: string) => value.startsWith('data:image/png;base64,');
diff --git a/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts b/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts
index f198be660..03c32b552 100644
--- a/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts
+++ b/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts
@@ -23,6 +23,8 @@ const SEND_TEAM_DELETED_EMAIL_JOB_DEFINITION_SCHEMA = z.object({
brandingHidePoweredBy: z.boolean(),
teamId: z.number(),
typedSignatureEnabled: z.boolean(),
+ uploadSignatureEnabled: z.boolean(),
+ drawSignatureEnabled: z.boolean(),
})
.nullish(),
}),
diff --git a/packages/lib/server-only/document-meta/upsert-document-meta.ts b/packages/lib/server-only/document-meta/upsert-document-meta.ts
index 53c2eea21..1d80bf8d6 100644
--- a/packages/lib/server-only/document-meta/upsert-document-meta.ts
+++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts
@@ -27,6 +27,8 @@ export type CreateDocumentMetaOptions = {
allowDictateNextSigner?: boolean;
distributionMethod?: DocumentDistributionMethod;
typedSignatureEnabled?: boolean;
+ uploadSignatureEnabled?: boolean;
+ drawSignatureEnabled?: boolean;
language?: SupportedLanguageCodes;
requestMetadata: ApiRequestMetadata;
};
@@ -46,6 +48,8 @@ export const upsertDocumentMeta = async ({
emailSettings,
distributionMethod,
typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
language,
requestMetadata,
}: CreateDocumentMetaOptions) => {
@@ -99,6 +103,8 @@ export const upsertDocumentMeta = async ({
emailSettings,
distributionMethod,
typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
language,
},
update: {
@@ -113,6 +119,8 @@ export const upsertDocumentMeta = async ({
emailSettings,
distributionMethod,
typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
language,
},
});
diff --git a/packages/lib/server-only/document/create-document-v2.ts b/packages/lib/server-only/document/create-document-v2.ts
index a28270350..9e6aed167 100644
--- a/packages/lib/server-only/document/create-document-v2.ts
+++ b/packages/lib/server-only/document/create-document-v2.ts
@@ -158,6 +158,10 @@ export const createDocumentV2 = async ({
language: meta?.language || team?.teamGlobalSettings?.documentLanguage,
typedSignatureEnabled:
meta?.typedSignatureEnabled ?? team?.teamGlobalSettings?.typedSignatureEnabled,
+ uploadSignatureEnabled:
+ meta?.uploadSignatureEnabled ?? team?.teamGlobalSettings?.uploadSignatureEnabled,
+ drawSignatureEnabled:
+ meta?.drawSignatureEnabled ?? team?.teamGlobalSettings?.drawSignatureEnabled,
},
},
},
diff --git a/packages/lib/server-only/document/create-document.ts b/packages/lib/server-only/document/create-document.ts
index 12253606f..992e3c685 100644
--- a/packages/lib/server-only/document/create-document.ts
+++ b/packages/lib/server-only/document/create-document.ts
@@ -128,8 +128,10 @@ export const createDocument = async ({
documentMeta: {
create: {
language: team?.teamGlobalSettings?.documentLanguage,
- typedSignatureEnabled: team?.teamGlobalSettings?.typedSignatureEnabled,
timezone: timezone,
+ typedSignatureEnabled: team?.teamGlobalSettings?.typedSignatureEnabled ?? true,
+ uploadSignatureEnabled: team?.teamGlobalSettings?.uploadSignatureEnabled ?? true,
+ drawSignatureEnabled: team?.teamGlobalSettings?.drawSignatureEnabled ?? true,
},
},
},
diff --git a/packages/lib/server-only/field/sign-field-with-token.ts b/packages/lib/server-only/field/sign-field-with-token.ts
index 22933ba75..3d796b23f 100644
--- a/packages/lib/server-only/field/sign-field-with-token.ts
+++ b/packages/lib/server-only/field/sign-field-with-token.ts
@@ -201,7 +201,7 @@ export const signFieldWithToken = async ({
throw new Error('Signature field must have a signature');
}
- if (isSignatureField && !documentMeta?.typedSignatureEnabled && typedSignature) {
+ if (isSignatureField && documentMeta?.typedSignatureEnabled === false && typedSignature) {
throw new Error('Typed signatures are not allowed. Please draw your signature');
}
diff --git a/packages/lib/server-only/team/update-team-document-settings.ts b/packages/lib/server-only/team/update-team-document-settings.ts
deleted file mode 100644
index de2f51413..000000000
--- a/packages/lib/server-only/team/update-team-document-settings.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import type { DocumentVisibility } from '@prisma/client';
-import { TeamMemberRole } from '@prisma/client';
-import type { z } from 'zod';
-
-import { prisma } from '@documenso/prisma';
-import { TeamGlobalSettingsSchema } from '@documenso/prisma/generated/zod/modelSchema/TeamGlobalSettingsSchema';
-
-import type { SupportedLanguageCodes } from '../../constants/i18n';
-
-export type UpdateTeamDocumentSettingsOptions = {
- userId: number;
- teamId: number;
-
- settings: {
- documentVisibility: DocumentVisibility;
- documentLanguage: SupportedLanguageCodes;
- includeSenderDetails: boolean;
- typedSignatureEnabled: boolean;
- includeSigningCertificate: boolean;
- };
-};
-
-export const ZUpdateTeamDocumentSettingsResponseSchema = TeamGlobalSettingsSchema;
-
-export type TUpdateTeamDocumentSettingsResponse = z.infer<
- typeof ZUpdateTeamDocumentSettingsResponseSchema
->;
-
-export const updateTeamDocumentSettings = async ({
- userId,
- teamId,
- settings,
-}: UpdateTeamDocumentSettingsOptions): Promise => {
- const {
- documentVisibility,
- documentLanguage,
- includeSenderDetails,
- includeSigningCertificate,
- typedSignatureEnabled,
- } = settings;
-
- const member = await prisma.teamMember.findFirst({
- where: {
- userId,
- teamId,
- },
- });
-
- if (!member || member.role !== TeamMemberRole.ADMIN) {
- throw new Error('You do not have permission to update this team.');
- }
-
- return await prisma.teamGlobalSettings.upsert({
- where: {
- teamId,
- },
- create: {
- teamId,
- documentVisibility,
- documentLanguage,
- includeSenderDetails,
- typedSignatureEnabled,
- includeSigningCertificate,
- },
- update: {
- documentVisibility,
- documentLanguage,
- includeSenderDetails,
- typedSignatureEnabled,
- includeSigningCertificate,
- },
- });
-};
diff --git a/packages/lib/server-only/template/create-document-from-direct-template.ts b/packages/lib/server-only/template/create-document-from-direct-template.ts
index 965bc6583..0b8784417 100644
--- a/packages/lib/server-only/template/create-document-from-direct-template.ts
+++ b/packages/lib/server-only/template/create-document-from-direct-template.ts
@@ -324,6 +324,9 @@ export const createDocumentFromDirectTemplate = async ({
language: metaLanguage,
signingOrder: metaSigningOrder,
distributionMethod: template.templateMeta?.distributionMethod,
+ typedSignatureEnabled: template.templateMeta?.typedSignatureEnabled,
+ uploadSignatureEnabled: template.templateMeta?.uploadSignatureEnabled,
+ drawSignatureEnabled: template.templateMeta?.drawSignatureEnabled,
},
},
},
diff --git a/packages/lib/server-only/template/create-document-from-template-legacy.ts b/packages/lib/server-only/template/create-document-from-template-legacy.ts
index eeaaac062..7c3b843e7 100644
--- a/packages/lib/server-only/template/create-document-from-template-legacy.ts
+++ b/packages/lib/server-only/template/create-document-from-template-legacy.ts
@@ -96,6 +96,9 @@ export const createDocumentFromTemplateLegacy = async ({
signingOrder: template.templateMeta?.signingOrder ?? undefined,
language:
template.templateMeta?.language || template.team?.teamGlobalSettings?.documentLanguage,
+ typedSignatureEnabled: template.templateMeta?.typedSignatureEnabled,
+ uploadSignatureEnabled: template.templateMeta?.uploadSignatureEnabled,
+ drawSignatureEnabled: template.templateMeta?.drawSignatureEnabled,
},
},
},
diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts
index e5667cf94..07300d184 100644
--- a/packages/lib/server-only/template/create-document-from-template.ts
+++ b/packages/lib/server-only/template/create-document-from-template.ts
@@ -82,9 +82,11 @@ export type CreateDocumentFromTemplateOptions = {
signingOrder?: DocumentSigningOrder;
language?: SupportedLanguageCodes;
distributionMethod?: DocumentDistributionMethod;
- typedSignatureEnabled?: boolean;
allowDictateNextSigner?: boolean;
emailSettings?: TDocumentEmailSettings;
+ typedSignatureEnabled?: boolean;
+ uploadSignatureEnabled?: boolean;
+ drawSignatureEnabled?: boolean;
};
requestMetadata: ApiRequestMetadata;
};
@@ -405,6 +407,10 @@ export const createDocumentFromTemplate = async ({
template.team?.teamGlobalSettings?.documentLanguage,
typedSignatureEnabled:
override?.typedSignatureEnabled ?? template.templateMeta?.typedSignatureEnabled,
+ uploadSignatureEnabled:
+ override?.uploadSignatureEnabled ?? template.templateMeta?.uploadSignatureEnabled,
+ drawSignatureEnabled:
+ override?.drawSignatureEnabled ?? template.templateMeta?.drawSignatureEnabled,
allowDictateNextSigner:
override?.allowDictateNextSigner ??
template.templateMeta?.allowDictateNextSigner ??
diff --git a/packages/lib/server-only/template/create-template.ts b/packages/lib/server-only/template/create-template.ts
index 16991401e..8e884cce4 100644
--- a/packages/lib/server-only/template/create-template.ts
+++ b/packages/lib/server-only/template/create-template.ts
@@ -4,6 +4,8 @@ import { prisma } from '@documenso/prisma';
import { TemplateSchema } from '@documenso/prisma/generated/zod/modelSchema//TemplateSchema';
import type { TCreateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema';
+import { AppError, AppErrorCode } from '../../errors/app-error';
+
export type CreateTemplateOptions = TCreateTemplateMutationSchema & {
userId: number;
teamId?: number;
@@ -19,8 +21,10 @@ export const createTemplate = async ({
teamId,
templateDocumentDataId,
}: CreateTemplateOptions) => {
+ let team = null;
+
if (teamId) {
- await prisma.team.findFirstOrThrow({
+ team = await prisma.team.findFirst({
where: {
id: teamId,
members: {
@@ -29,7 +33,14 @@ export const createTemplate = async ({
},
},
},
+ include: {
+ teamGlobalSettings: true,
+ },
});
+
+ if (!team) {
+ throw new AppError(AppErrorCode.NOT_FOUND);
+ }
}
return await prisma.template.create({
@@ -38,6 +49,14 @@ export const createTemplate = async ({
userId,
templateDocumentDataId,
teamId,
+ templateMeta: {
+ create: {
+ language: team?.teamGlobalSettings?.documentLanguage,
+ typedSignatureEnabled: team?.teamGlobalSettings?.typedSignatureEnabled ?? true,
+ uploadSignatureEnabled: team?.teamGlobalSettings?.uploadSignatureEnabled ?? true,
+ drawSignatureEnabled: team?.teamGlobalSettings?.drawSignatureEnabled ?? true,
+ },
+ },
},
});
};
diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po
index 8f0961af1..ff2b70a0a 100644
--- a/packages/lib/translations/de/web.po
+++ b/packages/lib/translations/de/web.po
@@ -419,6 +419,10 @@ msgstr "<0>{teamName}0> hat angefragt, Ihre E-Mail-Adresse für ihr Team bei D
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Klicken Sie hier, um hochzuladen0> oder ziehen Sie die Datei per Drag & Drop"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>E-Mail0> - Der Empfänger erhält das Dokument zur Unterschrift, Genehmigung usw."
@@ -465,6 +469,14 @@ msgstr "<0>Passkey erforderlich0> - Der Empfänger muss ein Konto haben und de
msgid "<0>Sender:0> All"
msgstr "<0>Absender:0> Alle"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>Sie sind dabei, die Genehmigung von <1>\"{documentTitle}\"1> abzuschließen.0><2/> Sind Sie sicher?"
@@ -898,6 +910,16 @@ msgstr "Alle Zeiten"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Erlauben Sie den Dokumentempfängern, direkt an diese E-Mail-Adresse zu antworten"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr ""
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Erlaubt die Authentifizierung mit biometrischen Daten, Passwort-Managern, Hardware-Schlüsseln usw."
@@ -1237,6 +1259,13 @@ msgstr ""
msgid "Assisting"
msgstr ""
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Versuche, das Dokument erneut zu versiegeln, nützlich nach einer Codeänderung, um ein fehlerhaftes Dokument zu beheben."
@@ -1309,11 +1338,11 @@ msgstr "Bitte bestätige vor dem Start deine E-Mail-Adresse, indem du auf den Bu
msgid "Billing"
msgstr "Abrechnung"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Schwarz"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Blau"
@@ -1384,6 +1413,10 @@ msgstr "Indem Sie den elektronischen Unterzeichnungsdienst von Documenso verwend
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "Indem Sie fortfahren, Ihre elektronische Unterschrift zu leisten, erkennen Sie an und stimmen zu, dass sie verwendet wird, um das gegebene Dokument zu unterzeichnen, und die gleiche rechtliche Gültigkeit wie eine handschriftliche Unterschrift hat. Durch den Abschluss des elektronischen Unterzeichnungsprozesses bestätigen Sie Ihr Verständnis und Ihre Akzeptanz dieser Bedingungen."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Sie zu, Transaktionen durchzuführen und Offenlegungen elektronisch zu erhalten. Sie erkennen an, dass Ihre elektronische Unterschrift auf Dokumenten bindend ist und dass Sie die Bedingungen akzeptieren, die in den Dokumenten dargelegt sind, die Sie unterzeichnen."
@@ -1436,6 +1469,8 @@ msgstr ""
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1522,7 +1557,7 @@ msgstr "Datei löschen"
msgid "Clear filters"
msgstr "Filter löschen"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Unterschrift löschen"
@@ -1697,6 +1732,7 @@ msgstr "Inhalt"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Fortsetzen"
@@ -1737,14 +1773,18 @@ msgstr "Steuert die Standard-sichtbarkeit eines hochgeladenen Dokuments."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Steuert das Format der Nachricht, die gesendet wird, wenn ein Empfänger eingeladen wird, ein Dokument zu unterschreiben. Wenn eine benutzerdefinierte Nachricht beim Konfigurieren des Dokuments bereitgestellt wurde, wird diese stattdessen verwendet."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Legt fest, ob die Empfänger die Dokumente mit einer getippten Unterschrift unterschreiben können. Aktivieren oder deaktivieren Sie die getippte Unterschrift global."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr ""
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Legt fest, ob das Signaturzertifikat in das Dokument aufgenommen wird, wenn es heruntergeladen wird. Das Signaturzertifikat kann weiterhin separat von der Protokollseite heruntergeladen werden."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1975,6 +2015,10 @@ msgstr "Standardsprache des Dokuments"
msgid "Default Document Visibility"
msgstr "Standard Sichtbarkeit des Dokuments"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr ""
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "löschen"
@@ -2201,6 +2245,11 @@ msgstr "Dokument \"{0}\" - Abgelehnt von {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Dokument \"{0}\" - Ablehnung Bestätigt"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2349,6 +2398,10 @@ msgstr "Dokumentpräferenzen aktualisiert"
msgid "Document re-sent"
msgstr "Dokument erneut gesendet"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2486,6 +2539,10 @@ msgstr "Entwurfte Dokumente"
msgid "Drag & drop your PDF here."
msgstr "Ziehen Sie Ihr PDF hierher."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2543,6 +2600,7 @@ msgstr "Offenlegung der elektronischen Unterschrift"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2553,6 +2611,7 @@ msgstr "Offenlegung der elektronischen Unterschrift"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2646,15 +2705,6 @@ msgstr "Direktlink-Signierung aktivieren"
msgid "Enable signing order"
msgstr "Aktiviere die Signaturreihenfolge"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Getippte Unterschrift aktivieren"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Aktivieren Sie getippte Unterschriften"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2929,7 +2979,7 @@ msgstr "Zum Eigentümer gehen"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Gehen Sie zu Ihren <0>öffentlichen Profileinstellungen0>, um Dokumente hinzuzufügen."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Grün"
@@ -3483,10 +3533,12 @@ msgstr "Meine Vorlagen"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3537,6 +3589,7 @@ msgstr "Neue Vorlage"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Nächster"
@@ -3954,6 +4007,7 @@ msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies w
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Bitte geben Sie einen gültigen Namen ein."
@@ -3989,10 +4043,6 @@ msgstr "Bitte beachten Sie, dass Sie den Zugriff auf alle Dokumente, die mit die
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Bitte beachten Sie, dass Sie den Zugriff auf alle mit diesem Team verbundenen Dokumente verlieren werden und alle Mitglieder entfernt und benachrichtigt werden."
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Bitte geben Sie einen Grund an"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Bitte geben Sie ein Token von der Authentifizierungs-App oder einen Backup-Code an. Wenn Sie keinen Backup-Code haben, kontaktieren Sie bitte den Support."
@@ -4063,6 +4113,10 @@ msgstr "Privat"
msgid "Private templates can only be modified and viewed by you."
msgstr "Private Vorlagen können nur von Ihnen bearbeitet und angezeigt werden."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4140,6 +4194,10 @@ msgstr "Bereit"
msgid "Reason"
msgstr "Grund"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr ""
@@ -4222,7 +4280,7 @@ msgstr "Wiederherstellungscode kopiert"
msgid "Recovery codes"
msgstr "Wiederherstellungscodes"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Rot"
@@ -4243,8 +4301,11 @@ msgstr "Registrierung erfolgreich"
msgid "Reject Document"
msgstr "Dokument Ablehnen"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Abgelehnt"
@@ -4429,8 +4490,6 @@ msgstr "Zeilen pro Seite"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4740,7 +4799,6 @@ msgstr "Registrieren mit OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4757,12 +4815,17 @@ msgstr "Unterschrift"
msgid "Signature ID"
msgstr "Signatur-ID"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "Die Unterschrift ist zu klein. Bitte geben Sie eine vollständigere Unterschrift an."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr ""
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr ""
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4987,6 +5050,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Betreff <0>(Optional)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr ""
@@ -5501,6 +5565,10 @@ msgstr "Der Token, den Sie zur Zurücksetzung Ihres Passworts verwendet haben, i
msgid "The two-factor authentication code provided is incorrect"
msgstr ""
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5582,6 +5650,10 @@ msgstr "Dieses Dokument wurde vom Eigentümer storniert und steht anderen nicht
msgid "This document has been cancelled by the owner."
msgstr "Dieses Dokument wurde vom Eigentümer storniert."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "Dieses Dokument wurde von allen Empfängern unterschrieben"
@@ -5730,6 +5802,10 @@ msgstr "Zeitzone"
msgid "Title"
msgstr "Titel"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "Um diese Einladung anzunehmen, müssen Sie ein Konto erstellen."
@@ -5897,6 +5973,7 @@ msgstr "Zwei-Faktor-Wiederauthentifizierung"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Typ"
@@ -6004,6 +6081,7 @@ msgstr "Unvollendet"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Unbekannt"
@@ -6014,11 +6092,14 @@ msgstr "Unbezahlt"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Aktualisieren"
@@ -6039,6 +6120,8 @@ msgid "Update profile"
msgstr "Profil aktualisieren"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Empfänger aktualisieren"
@@ -6077,10 +6160,6 @@ msgstr "Webhook aktualisieren"
msgid "Updating password..."
msgstr "Passwort wird aktualisiert..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Profil wird aktualisiert..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Aktualisierung Ihrer Informationen"
@@ -6089,6 +6168,10 @@ msgstr "Aktualisierung Ihrer Informationen"
msgid "Upgrade"
msgstr "Upgrade"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Laden Sie eine CSV-Datei hoch, um mehrere Dokumente aus dieser Vorlage zu erstellen. Jede Zeile repräsentiert ein Dokument mit den Empfängerdaten."
@@ -6113,7 +6196,7 @@ msgstr "CSV hochladen"
msgid "Upload custom document"
msgstr "Benutzerdefiniertes Dokument hochladen"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Signatur hochladen"
@@ -6287,6 +6370,7 @@ msgstr "Dokument anzeigen"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6653,6 +6737,11 @@ msgstr "Willkommen bei Documenso!"
msgid "Were you trying to edit this document instead?"
msgstr "Hast du stattdessen versucht, dieses Dokument zu bearbeiten?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Wenn Sie auf Fortfahren klicken, werden Sie aufgefordert, den ersten verfügbaren Authenticator auf Ihrem System hinzuzufügen."
diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po
index 97a33b80a..692b265d3 100644
--- a/packages/lib/translations/en/web.po
+++ b/packages/lib/translations/en/web.po
@@ -414,6 +414,10 @@ msgstr "<0>{teamName}0> has requested to use your email address for their team
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Click to upload0> or drag and drop"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
@@ -460,6 +464,14 @@ msgstr "<0>Require passkey0> - The recipient must have an account and passkey
msgid "<0>Sender:0> All"
msgstr "<0>Sender:0> All"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr "<0>Typed0> - A signature that is typed using a keyboard."
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr "<0>Uploaded0> - A signature that is uploaded from a file."
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
@@ -893,6 +905,16 @@ msgstr "All Time"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Allow document recipients to reply directly to this email address"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr "Allow signers to dictate next signer"
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr "Allowed Signature Types"
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Allows authenticating using biometrics, password managers, hardware keys, etc."
@@ -1232,6 +1254,13 @@ msgstr "Assisted"
msgid "Assisting"
msgstr "Assisting"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr "At least one signature type must be enabled"
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
@@ -1304,11 +1333,11 @@ msgstr "Before you get started, please confirm your email address by clicking th
msgid "Billing"
msgstr "Billing"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Black"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Blue"
@@ -1379,6 +1408,10 @@ msgstr "By proceeding to use the electronic signature service provided by Docume
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
@@ -1431,6 +1464,8 @@ msgstr "Can prepare"
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1517,7 +1552,7 @@ msgstr "Clear file"
msgid "Clear filters"
msgstr "Clear filters"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Clear Signature"
@@ -1692,6 +1727,7 @@ msgstr "Content"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Continue"
@@ -1732,14 +1768,18 @@ msgstr "Controls the default visibility of an uploaded document."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr "Controls which signatures are allowed to be used when signing a document."
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1970,6 +2010,10 @@ msgstr "Default Document Language"
msgid "Default Document Visibility"
msgstr "Default Document Visibility"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr "Default Signature Settings"
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "delete"
@@ -2196,6 +2240,11 @@ msgstr "Document \"{0}\" - Rejected by {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Document \"{0}\" - Rejection Confirmed"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr "Document \"{0}\" Cancelled"
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2344,6 +2393,10 @@ msgstr "Document preferences updated"
msgid "Document re-sent"
msgstr "Document re-sent"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr "Document rejected"
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2481,6 +2534,10 @@ msgstr "Drafted Documents"
msgid "Drag & drop your PDF here."
msgstr "Drag & drop your PDF here."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr "Draw"
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2538,6 +2595,7 @@ msgstr "Electronic Signature Disclosure"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2548,6 +2606,7 @@ msgstr "Electronic Signature Disclosure"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2641,15 +2700,6 @@ msgstr "Enable Direct Link Signing"
msgid "Enable signing order"
msgstr "Enable signing order"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Enable Typed Signature"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Enable Typed Signatures"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2924,7 +2974,7 @@ msgstr "Go to owner"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Go to your <0>public profile settings0> to add documents."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Green"
@@ -3478,10 +3528,12 @@ msgstr "My templates"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3532,6 +3584,7 @@ msgstr "New Template"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Next"
@@ -3949,6 +4002,7 @@ msgstr "Please enter a meaningful name for your token. This will help you identi
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Please enter a valid name."
@@ -3984,10 +4038,6 @@ msgstr "Please note that this action is irreversible. Once confirmed, your webho
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Please provide a reason"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
@@ -4058,6 +4108,10 @@ msgstr "Private"
msgid "Private templates can only be modified and viewed by you."
msgstr "Private templates can only be modified and viewed by you."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr "Proceed"
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4135,6 +4189,10 @@ msgstr "Ready"
msgid "Reason"
msgstr "Reason"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr "Reason for cancellation: {cancellationReason}"
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr "Reason for rejection: "
@@ -4217,7 +4275,7 @@ msgstr "Recovery code copied"
msgid "Recovery codes"
msgstr "Recovery codes"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Red"
@@ -4238,8 +4296,11 @@ msgstr "Registration Successful"
msgid "Reject Document"
msgstr "Reject Document"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Rejected"
@@ -4424,8 +4485,6 @@ msgstr "Rows per page"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4735,7 +4794,6 @@ msgstr "Sign Up with OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4752,12 +4810,17 @@ msgstr "Signature"
msgid "Signature ID"
msgstr "Signature ID"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "Signature is too small. Please provide a more complete signature."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr "Signature is too small"
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr "Signature Pad cannot be empty."
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr "Signature types"
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4982,6 +5045,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Subject <0>(Optional)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr "Submitting..."
@@ -5498,6 +5562,10 @@ msgstr "The token you have used to reset your password is either expired or it n
msgid "The two-factor authentication code provided is incorrect"
msgstr "The two-factor authentication code provided is incorrect"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr "The types of signatures that recipients are allowed to use when signing the document."
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5579,6 +5647,10 @@ msgstr "This document has been cancelled by the owner and is no longer available
msgid "This document has been cancelled by the owner."
msgstr "This document has been cancelled by the owner."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr "This document has been rejected by a recipient"
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "This document has been signed by all recipients"
@@ -5727,6 +5799,10 @@ msgstr "Time Zone"
msgid "Title"
msgstr "Title"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr "Title cannot be empty"
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "To accept this invitation you must create an account."
@@ -5894,6 +5970,7 @@ msgstr "Two-Factor Re-Authentication"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Type"
@@ -6001,6 +6078,7 @@ msgstr "Uncompleted"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Unknown"
@@ -6011,11 +6089,14 @@ msgstr "Unpaid"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Update"
@@ -6036,6 +6117,8 @@ msgid "Update profile"
msgstr "Update profile"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Update Recipient"
@@ -6074,10 +6157,6 @@ msgstr "Update webhook"
msgid "Updating password..."
msgstr "Updating password..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Updating profile..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Updating Your Information"
@@ -6086,6 +6165,10 @@ msgstr "Updating Your Information"
msgid "Upgrade"
msgstr "Upgrade"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr "Upload"
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
@@ -6110,7 +6193,7 @@ msgstr "Upload CSV"
msgid "Upload custom document"
msgstr "Upload custom document"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Upload Signature"
@@ -6284,6 +6367,7 @@ msgstr "View document"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6650,6 +6734,11 @@ msgstr "Welcome to Documenso!"
msgid "Were you trying to edit this document instead?"
msgstr "Were you trying to edit this document instead?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "When you click continue, you will be prompted to add the first available authenticator on your system."
diff --git a/packages/lib/translations/es/web.po b/packages/lib/translations/es/web.po
index 91c795f37..e54cfd54e 100644
--- a/packages/lib/translations/es/web.po
+++ b/packages/lib/translations/es/web.po
@@ -419,6 +419,10 @@ msgstr "<0>{teamName}0> ha solicitado usar tu dirección de correo electrónic
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Haga clic para subir0> o arrastre y suelte"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Correo electrónico0> - Al destinatario se le enviará el documento para firmar, aprobar, etc."
@@ -465,6 +469,14 @@ msgstr "<0>Requerir clave de acceso0> - El destinatario debe tener una cuenta
msgid "<0>Sender:0> All"
msgstr "<0>Remitente:0> Todos"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>Está a punto de completar la aprobación de <1>\"{documentTitle}\"1>.0><2/> ¿Está seguro?"
@@ -898,6 +910,16 @@ msgstr "Todo el Tiempo"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Permitir que los destinatarios del documento respondan directamente a esta dirección de correo electrónico"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr ""
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Permite autenticarse usando biometría, administradores de contraseñas, claves de hardware, etc."
@@ -1237,6 +1259,13 @@ msgstr ""
msgid "Assisting"
msgstr ""
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Intenta sellar el documento de nuevo, útil después de que se haya producido un cambio de código para resolver un documento erróneo."
@@ -1309,11 +1338,11 @@ msgstr "Antes de comenzar, por favor confirma tu dirección de correo electróni
msgid "Billing"
msgstr "Facturación"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Negro"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Azul"
@@ -1384,6 +1413,10 @@ msgstr "Al continuar utilizando el servicio de firma electrónica proporcionado
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "Al continuar con su firma electrónica, usted reconoce y consiente que se utilizará para firmar el documento dado y tiene la misma validez legal que una firma manuscrita. Al completar el proceso de firma electrónica, usted afirma su comprensión y aceptación de estas condiciones."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "Al utilizar la función de firma electrónica, usted está consintiendo realizar transacciones y recibir divulgaciones electrónicamente. Reconoce que su firma electrónica en los documentos es vinculante y que acepta los términos esbozados en los documentos que está firmando."
@@ -1436,6 +1469,8 @@ msgstr ""
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1522,7 +1557,7 @@ msgstr "Limpiar archivo"
msgid "Clear filters"
msgstr "Limpiar filtros"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Limpiar firma"
@@ -1697,6 +1732,7 @@ msgstr "Contenido"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Continuar"
@@ -1737,14 +1773,18 @@ msgstr "Controla la visibilidad predeterminada de un documento cargado."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Controla el formato del mensaje que se enviará al invitar a un destinatario a firmar un documento. Si se ha proporcionado un mensaje personalizado al configurar el documento, se usará en su lugar."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Controla si los destinatarios pueden firmar los documentos utilizando una firma mecanografiada. Habilitar o deshabilitar la firma mecanografiada globalmente."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr ""
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Controla si el certificado de firma se incluirá en el documento cuando se descargue. El certificado de firma aún puede descargarse por separado desde la página de registros."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1975,6 +2015,10 @@ msgstr "Idioma predeterminado del documento"
msgid "Default Document Visibility"
msgstr "Visibilidad predeterminada del documento"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr ""
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "eliminar"
@@ -2201,6 +2245,11 @@ msgstr "Documento \"{0}\" - Rechazado por {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Documento \"{0}\" - Rechazo confirmado"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2349,6 +2398,10 @@ msgstr "Preferencias del documento actualizadas"
msgid "Document re-sent"
msgstr "Documento reenviado"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2486,6 +2539,10 @@ msgstr "Documentos redactados"
msgid "Drag & drop your PDF here."
msgstr "Arrastre y suelte su PDF aquí."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2543,6 +2600,7 @@ msgstr "Divulgación de Firma Electrónica"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2553,6 +2611,7 @@ msgstr "Divulgación de Firma Electrónica"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2646,15 +2705,6 @@ msgstr "Habilitar firma de enlace directo"
msgid "Enable signing order"
msgstr "Habilitar orden de firma"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Habilitar firma mecanografiada"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Habilitar firmas escritas"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2929,7 +2979,7 @@ msgstr "Ir al propietario"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Ve a tu <0>configuración de perfil público0> para agregar documentos."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Verde"
@@ -3483,10 +3533,12 @@ msgstr "Mis plantillas"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3537,6 +3589,7 @@ msgstr "Nueva plantilla"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Siguiente"
@@ -3954,6 +4007,7 @@ msgstr "Por favor, ingresa un nombre significativo para tu token. Esto te ayudar
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Por favor, introduce un nombre válido."
@@ -3989,10 +4043,6 @@ msgstr "Por favor, ten en cuenta que esta acción es irreversible. Una vez confi
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Por favor, ten en cuenta que perderás acceso a todos los documentos asociados con este equipo y todos los miembros serán eliminados y notificados"
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Please provide a reason"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Por favor, proporciona un token del autenticador o un código de respaldo. Si no tienes un código de respaldo disponible, contacta al soporte."
@@ -4063,6 +4113,10 @@ msgstr "Privado"
msgid "Private templates can only be modified and viewed by you."
msgstr "Las plantillas privadas solo pueden ser modificadas y vistas por ti."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4140,6 +4194,10 @@ msgstr "Listo"
msgid "Reason"
msgstr "Razón"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr ""
@@ -4222,7 +4280,7 @@ msgstr "Código de recuperación copiado"
msgid "Recovery codes"
msgstr "Códigos de recuperación"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Rojo"
@@ -4243,8 +4301,11 @@ msgstr "Registro exitoso"
msgid "Reject Document"
msgstr "Rechazar Documento"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Rejected"
@@ -4429,8 +4490,6 @@ msgstr "Filas por página"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4740,7 +4799,6 @@ msgstr "Regístrate con OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4757,12 +4815,17 @@ msgstr "Firma"
msgid "Signature ID"
msgstr "ID de Firma"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "La firma es demasiado pequeña. Proporcione una firma más completa."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr ""
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr ""
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4987,6 +5050,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Asunto <0>(Opcional)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr ""
@@ -5501,6 +5565,10 @@ msgstr "El token que has utilizado para restablecer tu contraseña ha expirado o
msgid "The two-factor authentication code provided is incorrect"
msgstr ""
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5582,6 +5650,10 @@ msgstr "Este documento ha sido cancelado por el propietario y ya no está dispon
msgid "This document has been cancelled by the owner."
msgstr "Este documento ha sido cancelado por el propietario."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "Este documento ha sido firmado por todos los destinatarios"
@@ -5730,6 +5802,10 @@ msgstr "Zona horaria"
msgid "Title"
msgstr "Título"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "Para aceptar esta invitación debes crear una cuenta."
@@ -5897,6 +5973,7 @@ msgstr "Re-autenticación de Doble Factor"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Tipo"
@@ -6004,6 +6081,7 @@ msgstr "Incompleto"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Desconocido"
@@ -6014,11 +6092,14 @@ msgstr "No pagado"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Actualizar"
@@ -6039,6 +6120,8 @@ msgid "Update profile"
msgstr "Actualizar perfil"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Actualizar destinatario"
@@ -6077,10 +6160,6 @@ msgstr "Actualizar webhook"
msgid "Updating password..."
msgstr "Actualizando contraseña..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Actualizando perfil..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Actualizando Su Información"
@@ -6089,6 +6168,10 @@ msgstr "Actualizando Su Información"
msgid "Upgrade"
msgstr "Actualizar"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Sube un archivo CSV para crear múltiples documentos a partir de esta plantilla. Cada fila representa un documento con los detalles del destinatario."
@@ -6113,7 +6196,7 @@ msgstr "Subir CSV"
msgid "Upload custom document"
msgstr "Subir documento personalizado"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Subir firma"
@@ -6287,6 +6370,7 @@ msgstr "Ver documento"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6653,6 +6737,11 @@ msgstr "¡Bienvenido a Documenso!"
msgid "Were you trying to edit this document instead?"
msgstr "¿Estabas intentando editar este documento en su lugar?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Cuando haces clic en continuar, se te pedirá que añadas el primer autenticador disponible en tu sistema."
diff --git a/packages/lib/translations/fr/web.po b/packages/lib/translations/fr/web.po
index f2d810409..3dc0de14e 100644
--- a/packages/lib/translations/fr/web.po
+++ b/packages/lib/translations/fr/web.po
@@ -419,6 +419,10 @@ msgstr "<0>{teamName}0> a demandé à utiliser votre adresse e-mail pour leur
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Cliquez pour importer0> ou faites glisser et déposez"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - Le destinataire recevra le document par e-mail pour signer, approuver, etc."
@@ -465,6 +469,14 @@ msgstr "<0>Clé d'accès requise0> - Le destinataire doit avoir un compte et u
msgid "<0>Sender:0> All"
msgstr "<0>Expéditeur :0> Tous"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>Vous êtes sur le point de terminer l'approbation de <1>\"{documentTitle}\"1>.0><2/> Êtes-vous sûr ?"
@@ -898,6 +910,16 @@ msgstr "Depuis toujours"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Autoriser les destinataires du document à répondre directement à cette adresse e-mail"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr ""
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Permet d'authentifier en utilisant des biométries, des gestionnaires de mots de passe, des clés matérielles, etc."
@@ -1237,6 +1259,13 @@ msgstr ""
msgid "Assisting"
msgstr ""
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Essaye de sceller le document à nouveau, utile après qu'un changement de code ait eu lieu pour résoudre un document erroné."
@@ -1309,11 +1338,11 @@ msgstr "Avant de commencer, veuillez confirmer votre adresse e-mail en cliquant
msgid "Billing"
msgstr "Facturation"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Noir"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Bleu"
@@ -1384,6 +1413,10 @@ msgstr "En procédant à l'utilisation du service de signature électronique fou
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "En procédant avec votre signature électronique, vous reconnaissez et consentez à ce qu'elle soit utilisée pour signer le document donné et a la même validité légale qu'une signature manuscrite. En complétant le processus de signature électronique, vous affirmez votre compréhension et votre acceptation de ces conditions."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "En utilisant la fonctionnalité de signature électronique, vous consentez à effectuer des transactions et à recevoir des divulgations électroniquement. Vous reconnaissez que votre signature électronique sur les documents est contraignante et que vous acceptez les termes énoncés dans les documents que vous signez."
@@ -1436,6 +1469,8 @@ msgstr ""
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1522,7 +1557,7 @@ msgstr "Effacer le fichier"
msgid "Clear filters"
msgstr "Effacer les filtres"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Effacer la signature"
@@ -1697,6 +1732,7 @@ msgstr "Contenu"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Continuer"
@@ -1737,14 +1773,18 @@ msgstr "Contrôle la visibilité par défaut d'un document importé."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Contrôle le formatage du message qui sera envoyé lors de l'invitation d'un destinataire à signer un document. Si un message personnalisé a été fourni lors de la configuration du document, il sera utilisé à la place."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Contrôle si les destinataires peuvent signer les documents à l'aide d'une signature dactylographiée. Active ou désactive globalement la signature dactylographiée."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr ""
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Contrôle si le certificat de signature sera inclus dans le document lorsqu'il sera téléchargé. Le certificat de signature peut toujours être téléchargé séparément à partir de la page d'historique'."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1975,6 +2015,10 @@ msgstr "Langue par défaut du document"
msgid "Default Document Visibility"
msgstr "Visibilité par défaut du document"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr ""
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "supprimer"
@@ -2201,6 +2245,11 @@ msgstr "Document \"{0}\" - Rejeté par {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Document \"{0}\" - Rejet Confirmé"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2349,6 +2398,10 @@ msgstr "Préférences de document mises à jour"
msgid "Document re-sent"
msgstr "Document renvoyé"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2486,6 +2539,10 @@ msgstr "Documents brouillon"
msgid "Drag & drop your PDF here."
msgstr "Faites glisser et déposez votre PDF ici."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2543,6 +2600,7 @@ msgstr "Divulgation de signature électronique"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2553,6 +2611,7 @@ msgstr "Divulgation de signature électronique"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2646,15 +2705,6 @@ msgstr "Activer la signature de lien direct"
msgid "Enable signing order"
msgstr "Activer l'ordre de signature"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Activer la signature dactylographiée"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Activer les signatures tapées"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2929,7 +2979,7 @@ msgstr "Aller au propriétaire"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Allez à vos <0>paramètres de profil public0> pour ajouter des documents."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Vert"
@@ -3483,10 +3533,12 @@ msgstr "Mes modèles"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3537,6 +3589,7 @@ msgstr "Nouveau modèle"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Suivant"
@@ -3954,6 +4007,7 @@ msgstr "Veuillez entrer un nom significatif pour votre token. Cela vous aidera
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Veuiillez entrer un nom valide."
@@ -3989,10 +4043,6 @@ msgstr "Veuillez noter que cette action est irréversible. Une fois confirmée,
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Veuillez noter que vous perdrez l'accès à tous les documents associés à cette équipe et que tous les membres seront supprimés et notifiés"
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Veuillez fournir une raison"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Veuillez fournir un token de l'authentificateur, ou un code de secours. Si vous n'avez pas de code de secours disponible, veuillez contacter le support."
@@ -4063,6 +4113,10 @@ msgstr "Privé"
msgid "Private templates can only be modified and viewed by you."
msgstr "Les modèles privés ne peuvent être modifiés et consultés que par vous."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4140,6 +4194,10 @@ msgstr "Prêt"
msgid "Reason"
msgstr "Raison"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr ""
@@ -4222,7 +4280,7 @@ msgstr "Code de récupération copié"
msgid "Recovery codes"
msgstr "Codes de récupération"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Rouge"
@@ -4243,8 +4301,11 @@ msgstr "Inscription réussie"
msgid "Reject Document"
msgstr "Rejeter le Document"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Rejeté"
@@ -4429,8 +4490,6 @@ msgstr "Lignes par page"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4740,7 +4799,6 @@ msgstr "S'inscrire avec OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4757,12 +4815,17 @@ msgstr "Signature"
msgid "Signature ID"
msgstr "ID de signature"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "La signature est trop petite. Veuillez fournir une signature plus grande."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr ""
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr ""
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4987,6 +5050,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Objet <0>(Optionnel)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr ""
@@ -5501,6 +5565,10 @@ msgstr "Le token que vous avez utilisé pour réinitialiser votre mot de passe a
msgid "The two-factor authentication code provided is incorrect"
msgstr ""
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5582,6 +5650,10 @@ msgstr "Ce document a été annulé par le propriétaire et n'est plus disponibl
msgid "This document has been cancelled by the owner."
msgstr "Ce document a été annulé par le propriétaire."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "Ce document a été signé par tous les destinataires"
@@ -5730,6 +5802,10 @@ msgstr "Fuseau horaire"
msgid "Title"
msgstr "Titre"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "Pour accepter cette invitation, vous devez créer un compte."
@@ -5897,6 +5973,7 @@ msgstr "Ré-authentification à deux facteurs"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Type"
@@ -6004,6 +6081,7 @@ msgstr "Non complet"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Inconnu"
@@ -6014,11 +6092,14 @@ msgstr "Non payé"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Mettre à jour"
@@ -6039,6 +6120,8 @@ msgid "Update profile"
msgstr "Mettre à jour le profil"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Mettre à jour le destinataire"
@@ -6077,10 +6160,6 @@ msgstr "Mettre à jour le webhook"
msgid "Updating password..."
msgstr "Mise à jour du mot de passe..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Mise à jour du profil..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Mise à jour de vos informations"
@@ -6089,6 +6168,10 @@ msgstr "Mise à jour de vos informations"
msgid "Upgrade"
msgstr "Améliorer"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Importer un fichier CSV pour créer plusieurs documents à partir de ce modèle. Chaque ligne représente un document avec les coordonnées de son destinataire."
@@ -6113,7 +6196,7 @@ msgstr "Importer le CSV"
msgid "Upload custom document"
msgstr "Importer un document personnalisé"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Importer une signature"
@@ -6287,6 +6370,7 @@ msgstr "Voir le document"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6653,6 +6737,11 @@ msgstr "Bienvenue sur Documenso !"
msgid "Were you trying to edit this document instead?"
msgstr "Essayiez-vous d'éditer ce document à la place ?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Lorsque vous cliquez sur continuer, vous serez invité à ajouter le premier authentificateur disponible sur votre système."
diff --git a/packages/lib/translations/it/web.po b/packages/lib/translations/it/web.po
index ec1f01975..2f48020a8 100644
--- a/packages/lib/translations/it/web.po
+++ b/packages/lib/translations/it/web.po
@@ -419,6 +419,10 @@ msgstr "<0>{teamName}0> ha richiesto di utilizzare il tuo indirizzo email per
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Fai clic per caricare0> o trascina e rilascia"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>Email0> - Al destinatario verrà inviato il documento tramite email per firmare, approvare, ecc."
@@ -465,6 +469,14 @@ msgstr "<0>Richiede passkey0> - Il destinatario deve avere un account e una pa
msgid "<0>Sender:0> All"
msgstr "<0>Mittente:0> Tutti"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>Stai per completare l'approvazione di <1>\"{documentTitle}\"1>.0><2/> Sei sicuro?"
@@ -898,6 +910,16 @@ msgstr "Tutto il tempo"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Consenti ai destinatari del documento di rispondere direttamente a questo indirizzo email"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr ""
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Consente di autenticare utilizzando biometria, gestori di password, chiavi hardware, ecc."
@@ -1237,6 +1259,13 @@ msgstr ""
msgid "Assisting"
msgstr ""
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Tenta nuovamente di sigillare il documento, utile dopo una modifica al codice per risolvere un documento errato."
@@ -1309,11 +1338,11 @@ msgstr "Prima di iniziare, conferma il tuo indirizzo email facendo clic sul puls
msgid "Billing"
msgstr "Fatturazione"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Nero"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Blu"
@@ -1384,6 +1413,10 @@ msgstr "Procedendo con l'utilizzo del servizio di firma elettronica fornito da D
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "Procedendo con la tua firma elettronica, riconosci e acconsenti che sarà utilizzata per firmare il documento dato e ha la stessa validità legale di una firma autografa. Completando il processo di firma elettronica, affermi la tua comprensione e accettazione di queste condizioni."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "Utilizzando la funzione di firma elettronica, acconsenti a effettuare transazioni e ricevere divulgazioni elettronicamente. Riconosci che la tua firma elettronica sui documenti è vincolante e accetti i termini delineati nei documenti che stai firmando."
@@ -1436,6 +1469,8 @@ msgstr ""
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1522,7 +1557,7 @@ msgstr "Rimuovi file"
msgid "Clear filters"
msgstr "Cancella filtri"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Cancella firma"
@@ -1697,6 +1732,7 @@ msgstr "Contenuto"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Continua"
@@ -1737,14 +1773,18 @@ msgstr "Controlla la visibilità predefinita di un documento caricato."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Controlla la formattazione del messaggio che verrà inviato quando si invita un destinatario a firmare un documento. Se è stato fornito un messaggio personalizzato durante la configurazione del documento, verrà utilizzato invece."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Controlla se i destinatari possono firmare i documenti utilizzando una firma digitata. Abilita o disabilita la firma digitata a livello globale."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr ""
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Controlla se il certificato di firma sarà incluso nel documento quando viene scaricato. Il certificato di firma può comunque essere scaricato separatamente dalla pagina dei log."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1975,6 +2015,10 @@ msgstr "Lingua predefinita del documento"
msgid "Default Document Visibility"
msgstr "Visibilità predefinita del documento"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr ""
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "elimina"
@@ -2201,6 +2245,11 @@ msgstr "Documento \"{0}\" - Rifiutato da {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Documento \"{0}\" - Rifiuto Confermato"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2349,6 +2398,10 @@ msgstr "Preferenze del documento aggiornate"
msgid "Document re-sent"
msgstr "Documento rinviato"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2486,6 +2539,10 @@ msgstr "Documenti redatti"
msgid "Drag & drop your PDF here."
msgstr "Trascina e rilascia il tuo PDF qui."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2543,6 +2600,7 @@ msgstr "Divulgazione della firma elettronica"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2553,6 +2611,7 @@ msgstr "Divulgazione della firma elettronica"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2646,15 +2705,6 @@ msgstr "Abilita la firma di link diretto"
msgid "Enable signing order"
msgstr "Abilita ordine di firma"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Abilita firma digitata"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Abilita firme digitate"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2929,7 +2979,7 @@ msgstr "Vai al proprietario"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Vai alle tue <0>impostazioni del profilo pubblico0> per aggiungere documenti."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Verde"
@@ -3483,10 +3533,12 @@ msgstr "I miei modelli"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3537,6 +3589,7 @@ msgstr "Nuovo modello"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Successivo"
@@ -3954,6 +4007,7 @@ msgstr "Si prega di inserire un nome significativo per il proprio token. Questo
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Per favore inserisci un nome valido."
@@ -3989,10 +4043,6 @@ msgstr "Si prega di notare che questa azione è irreversibile. Una volta conferm
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Si prega di notare che perderai l'accesso a tutti i documenti associati a questo team e tutti i membri saranno rimossi e notificati"
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Per favore, fornire una ragione"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Si prega di fornire un token dal tuo autenticatore, o un codice di backup. Se non hai un codice di backup disponibile, contatta il supporto."
@@ -4063,6 +4113,10 @@ msgstr "Privato"
msgid "Private templates can only be modified and viewed by you."
msgstr "I modelli privati possono essere modificati e visualizzati solo da te."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4140,6 +4194,10 @@ msgstr "Pronto"
msgid "Reason"
msgstr "Motivo"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr ""
@@ -4222,7 +4280,7 @@ msgstr "Codice di recupero copiato"
msgid "Recovery codes"
msgstr "Codici di recupero"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Rosso"
@@ -4243,8 +4301,11 @@ msgstr "Registrazione avvenuta con successo"
msgid "Reject Document"
msgstr "Rifiuta Documento"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Rifiutato"
@@ -4429,8 +4490,6 @@ msgstr "Righe per pagina"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4740,7 +4799,6 @@ msgstr "Iscriviti con OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4757,12 +4815,17 @@ msgstr "Firma"
msgid "Signature ID"
msgstr "ID Firma"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "La firma è troppo piccola. Si prega di fornire una firma più completa."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr ""
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr ""
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4987,6 +5050,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Oggetto <0>(Opzionale)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr ""
@@ -5501,6 +5565,10 @@ msgstr "Il token che hai usato per reimpostare la tua password è scaduto o non
msgid "The two-factor authentication code provided is incorrect"
msgstr ""
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5582,6 +5650,10 @@ msgstr "Questo documento è stato annullato dal proprietario e non è più dispo
msgid "This document has been cancelled by the owner."
msgstr "Questo documento è stato annullato dal proprietario."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "Questo documento è stato firmato da tutti i destinatari"
@@ -5730,6 +5802,10 @@ msgstr "Fuso orario"
msgid "Title"
msgstr "Titolo"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "Per accettare questo invito devi creare un account."
@@ -5897,6 +5973,7 @@ msgstr "Ri-autenticazione a due fattori"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Tipo"
@@ -6004,6 +6081,7 @@ msgstr "Incompleto"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Sconosciuto"
@@ -6014,11 +6092,14 @@ msgstr "Non pagato"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Aggiorna"
@@ -6039,6 +6120,8 @@ msgid "Update profile"
msgstr "Aggiorna profilo"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Aggiorna destinatario"
@@ -6077,10 +6160,6 @@ msgstr "Aggiorna webhook"
msgid "Updating password..."
msgstr "Aggiornamento della password..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Aggiornamento del profilo..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Aggiornamento delle tue informazioni"
@@ -6089,6 +6168,10 @@ msgstr "Aggiornamento delle tue informazioni"
msgid "Upgrade"
msgstr "Aggiorna"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Carica un file CSV per creare più documenti da questo modello. Ogni riga rappresenta un documento con i dettagli del destinatario."
@@ -6113,7 +6196,7 @@ msgstr "Carica CSV"
msgid "Upload custom document"
msgstr "Carica documento personalizzato"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Carica Firma"
@@ -6287,6 +6370,7 @@ msgstr "Visualizza documento"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6653,6 +6737,11 @@ msgstr "Benvenuto su Documenso!"
msgid "Were you trying to edit this document instead?"
msgstr "Stavi provando a modificare questo documento invece?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Quando fai clic su continua, ti verrà chiesto di aggiungere il primo autenticatore disponibile sul tuo sistema."
diff --git a/packages/lib/translations/pl/web.po b/packages/lib/translations/pl/web.po
index b79d85c43..74659f5ab 100644
--- a/packages/lib/translations/pl/web.po
+++ b/packages/lib/translations/pl/web.po
@@ -419,6 +419,10 @@ msgstr "<0>{teamName}0> poprosił o używanie twojego adresu e-mail dla swojeg
msgid "<0>Click to upload0> or drag and drop"
msgstr "<0>Kliknij, aby przesłać0> lub przeciągnij i upuść"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Drawn0> - A signature that is drawn using a mouse or stylus."
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
msgid "<0>Email0> - The recipient will be emailed the document to sign, approve, etc."
msgstr "<0>E-mail0> - Odbiorca otrzyma e-mail z dokumentem do podpisania, zatwierdzenia itp."
@@ -465,6 +469,14 @@ msgstr "<0>Wymagana passkey0> - Odbiorca musi mieć konto i skonfigurowaną pa
msgid "<0>Sender:0> All"
msgstr "<0>Rządzący:0> Wszyscy"
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Typed0> - A signature that is typed using a keyboard."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "<0>Uploaded0> - A signature that is uploaded from a file."
+msgstr ""
+
#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
msgid "<0>You are about to complete approving <1>\"{documentTitle}\"1>.0><2/> Are you sure?"
msgstr "<0>Jesteś na drodze do zatwierdzenia <1>\"{documentTitle}\"1>.0><2/> Czy jesteś pewien?"
@@ -898,6 +910,16 @@ msgstr "Cały czas"
msgid "Allow document recipients to reply directly to this email address"
msgstr "Zezwól odbiorcom dokumentów na bezpośrednią odpowiedź na ten adres e-mail"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "Allow signers to dictate next signer"
+msgstr ""
+
+#: packages/ui/primitives/template-flow/add-template-settings.tsx
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Allowed Signature Types"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
msgstr "Pozwala na uwierzytelnianie za pomocą biometrii, menedżerów haseł, kluczy sprzętowych itp."
@@ -1237,6 +1259,13 @@ msgstr ""
msgid "Assisting"
msgstr ""
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: packages/ui/primitives/template-flow/add-template-settings.types.tsx
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+#: packages/lib/types/document-meta.ts
+msgid "At least one signature type must be enabled"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx
msgid "Attempts sealing the document again, useful for after a code change has occurred to resolve an erroneous document."
msgstr "Ponowne próby zapieczętowania dokumentu, przydatne po zmianie kodu w celu rozwiązania błędnego dokumentu."
@@ -1309,11 +1338,11 @@ msgstr "Zanim zaczniesz, proszę potwierdź swój adres e-mail, klikając przyci
msgid "Billing"
msgstr "Fakturowanie"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Black"
msgstr "Czarny"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Blue"
msgstr "Niebieski"
@@ -1384,6 +1413,10 @@ msgstr "Kontynuując korzystanie z usługi podpisu elektronicznego oferowanej pr
msgid "By proceeding with your electronic signature, you acknowledge and consent that it will be used to sign the given document and holds the same legal validity as a handwritten signature. By completing the electronic signing process, you affirm your understanding and acceptance of these conditions."
msgstr "Kontynuując z Twoim podpisem elektronicznym, przyjmujesz i zgadzasz się, że będzie on użyty do podpisania danego dokumentu i ma tę samą ważność prawną jak odręczny podpis. Dokonując procesu podpisu elektronicznego, potwierdzasz swoje zrozumienie i akceptację tych warunków."
+#: apps/remix/app/components/forms/signup.tsx
+msgid "By proceeding, you agree to our <0>Terms of Service0> and <1>Privacy Policy1>."
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "By using the electronic signature feature, you are consenting to conduct transactions and receive disclosures electronically. You acknowledge that your electronic signature on documents is binding and that you accept the terms outlined in the documents you are signing."
msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na przeprowadzanie transakcji i otrzymywanie ujawnień elektronicznie. Przyjmujesz do wiadomości, że Twój podpis elektroniczny na dokumentach jest wiążący i akceptujesz warunki przedstawione w dokumentach, które podpisujesz."
@@ -1436,6 +1469,8 @@ msgstr ""
#: apps/remix/app/components/dialogs/document-move-dialog.tsx
#: apps/remix/app/components/dialogs/document-duplicate-dialog.tsx
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Cancel"
@@ -1522,7 +1557,7 @@ msgstr "Wyczyść plik"
msgid "Clear filters"
msgstr "Wyczyść filtry"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
msgid "Clear Signature"
msgstr "Wyczyść podpis"
@@ -1697,6 +1732,7 @@ msgstr "Treść"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/document-flow/document-flow-root.tsx
msgid "Continue"
msgstr "Kontynuuj"
@@ -1737,14 +1773,18 @@ msgstr "Kontroluje domyślną widoczność przesłanego dokumentu."
msgid "Controls the formatting of the message that will be sent when inviting a recipient to sign a document. If a custom message has been provided while configuring the document, it will be used instead."
msgstr "Kontroluje formatowanie wiadomości, która zostanie wysłana podczas zapraszania odbiorcy do podpisania dokumentu. Jeśli w konfiguracji dokumentu podano niestandardową wiadomość, zostanie użyta zamiast tego."
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Controls whether the recipients can sign the documents using a typed signature. Enable or disable the typed signature globally."
-msgstr "Kontroluje, czy odbiorcy mogą podpisywać dokumenty za pomocą pisanych podpisów. Włącz lub wyłącz podpis pisany globalnie."
+#: packages/ui/primitives/document-flow/add-settings.tsx
+msgid "Controls the language for the document, including the language to be used for email notifications, and the final certificate that is generated and attached to the document."
+msgstr ""
#: apps/remix/app/components/forms/team-document-preferences-form.tsx
msgid "Controls whether the signing certificate will be included in the document when it is downloaded. The signing certificate can still be downloaded from the logs page separately."
msgstr "Kontroluje, czy certyfikat podpisu zostanie dołączony do dokumentu podczas jego pobierania. Certyfikat podpisu można również pobrać osobno ze strony logów."
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Controls which signatures are allowed to be used when signing a document."
+msgstr ""
+
#: apps/remix/app/components/general/document/document-recipient-link-copy-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Copied"
@@ -1975,6 +2015,10 @@ msgstr "Domyślny język dokumentu"
msgid "Default Document Visibility"
msgstr "Domyślna widoczność dokumentu"
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+msgid "Default Signature Settings"
+msgstr ""
+
#: apps/remix/app/components/dialogs/document-delete-dialog.tsx
msgid "delete"
msgstr "usuń"
@@ -2201,6 +2245,11 @@ msgstr "Dokument \"{0}\" - Odrzucony przez {1}"
msgid "Document \"{0}\" - Rejection Confirmed"
msgstr "Dokument \"{0}\" - Odrzucenie potwierdzone"
+#. placeholder {0}: document.title
+#: packages/lib/jobs/definitions/emails/send-document-cancelled-emails.handler.ts
+msgid "Document \"{0}\" Cancelled"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-settings.tsx
#: packages/ui/primitives/document-flow/add-settings.tsx
#: packages/ui/components/document/document-global-auth-access-select.tsx
@@ -2349,6 +2398,10 @@ msgstr "Preferencje dokumentu zaktualizowane"
msgid "Document re-sent"
msgstr "Dokument ponownie wysłany"
+#: apps/remix/app/components/general/document/document-status.tsx
+msgid "Document rejected"
+msgstr ""
+
#: apps/remix/app/routes/_recipient+/sign.$token+/rejected.tsx
#: apps/remix/app/components/embed/embed-document-rejected.tsx
#: packages/email/template-components/template-document-rejected.tsx
@@ -2486,6 +2539,10 @@ msgstr "Szkice dokumentów"
msgid "Drag & drop your PDF here."
msgstr "Przeciągnij i upuść swój PDF tutaj."
+#: packages/lib/constants/document.ts
+msgid "Draw"
+msgstr ""
+
#: packages/ui/primitives/template-flow/add-template-fields.tsx
#: packages/ui/primitives/document-flow/add-fields.tsx
msgid "Dropdown"
@@ -2543,6 +2600,7 @@ msgstr "Ujawnienie podpisu elektronicznego"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-email-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx
#: apps/remix/app/components/forms/signin.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -2553,6 +2611,7 @@ msgstr "Ujawnienie podpisu elektronicznego"
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -2646,15 +2705,6 @@ msgstr "Włącz podpisywanie linku bezpośredniego"
msgid "Enable signing order"
msgstr "Włącz kolejność podpisów"
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-msgid "Enable Typed Signature"
-msgstr "Włącz podpis pisany"
-
-#: packages/ui/primitives/template-flow/add-template-fields.tsx
-#: packages/ui/primitives/document-flow/add-fields.tsx
-msgid "Enable Typed Signatures"
-msgstr "Włącz podpisy typu pisanego"
-
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks._index.tsx
@@ -2929,7 +2979,7 @@ msgstr "Przejdź do właściciela"
msgid "Go to your <0>public profile settings0> to add documents."
msgstr "Przejdź do swojego <0>ustawienia profilu publicznego0>, aby dodać dokumenty."
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Green"
msgstr "Zielony"
@@ -3483,10 +3533,12 @@ msgstr "Moje szablony"
#: apps/remix/app/components/tables/admin-dashboard-users-table.tsx
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/general/document-signing/document-signing-name-field.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/template-use-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-add-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
#: packages/ui/primitives/template-flow/add-template-fields.tsx
@@ -3537,6 +3589,7 @@ msgstr "Nowy szablon"
#: apps/remix/app/components/forms/signup.tsx
#: apps/remix/app/components/embed/embed-document-signing-page.tsx
#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-dialog.tsx
msgid "Next"
msgstr "Dalej"
@@ -3954,6 +4007,7 @@ msgstr "Wpisz nazwę tokena. Pomoże to później w jego identyfikacji."
#: apps/remix/app/components/general/claim-account.tsx
#: apps/remix/app/components/forms/signup.tsx
+#: apps/remix/app/components/forms/profile.tsx
msgid "Please enter a valid name."
msgstr "Proszę wpisać poprawną nazwę."
@@ -3989,10 +4043,6 @@ msgstr "Proszę pamiętać, że ta czynność jest nieodwracalna. Po potwierdzen
msgid "Please note that you will lose access to all documents associated with this team & all the members will be removed and notified"
msgstr "Proszę pamiętać, że stracisz dostęp do wszystkich dokumentów powiązanych z tym zespołem i wszyscy członkowie zostaną usunięci oraz powiadomieni"
-#: apps/remix/app/components/general/document-signing/document-signing-reject-dialog.tsx
-msgid "Please provide a reason"
-msgstr "Proszę podać powód"
-
#: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx
msgid "Please provide a token from the authenticator, or a backup code. If you do not have a backup code available, please contact support."
msgstr "Proszę podać token z aplikacji uwierzytelniającej lub kod zapasowy. Jeśli nie masz dostępnego kodu zapasowego, skontaktuj się z pomocą techniczną."
@@ -4063,6 +4113,10 @@ msgstr "Prywatne"
msgid "Private templates can only be modified and viewed by you."
msgstr "Prywatne szablony mogą być modyfikowane i przeglądane tylko przez Ciebie."
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
+msgid "Proceed"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/settings+/profile.tsx
#: apps/remix/app/components/general/settings-nav-mobile.tsx
#: apps/remix/app/components/general/settings-nav-desktop.tsx
@@ -4140,6 +4194,10 @@ msgstr "Gotowy"
msgid "Reason"
msgstr "Powód"
+#: packages/email/template-components/template-document-cancel.tsx
+msgid "Reason for cancellation: {cancellationReason}"
+msgstr ""
+
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
msgid "Reason for rejection: "
msgstr ""
@@ -4222,7 +4280,7 @@ msgstr "Kod odzyskiwania skopiowany"
msgid "Recovery codes"
msgstr "Kody odzyskiwania"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx
msgid "Red"
msgstr "Czerwony"
@@ -4243,8 +4301,11 @@ msgstr "Rejestracja zakończona sukcesem"
msgid "Reject Document"
msgstr "Odrzuć dokument"
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/general/stack-avatars-with-tooltip.tsx
+#: apps/remix/app/components/general/document/document-status.tsx
#: apps/remix/app/components/general/document/document-page-view-recipients.tsx
+#: packages/lib/constants/document.ts
msgid "Rejected"
msgstr "Odrzucony"
@@ -4429,8 +4490,6 @@ msgstr "Wiersze na stronę"
#: apps/remix/app/components/general/document-signing/document-signing-text-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-number-field.tsx
-#: apps/remix/app/components/forms/team-document-preferences-form.tsx
-#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx
msgid "Save"
@@ -4740,7 +4799,6 @@ msgstr "Zarejestruj się za pomocą OIDC"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
#: apps/remix/app/components/forms/profile.tsx
@@ -4757,12 +4815,17 @@ msgstr "Podpis"
msgid "Signature ID"
msgstr "Identyfikator podpisu"
-#: apps/remix/app/components/general/document-signing/document-signing-signature-field.tsx
-#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
-#: apps/remix/app/components/embed/embed-document-signing-page.tsx
-#: apps/remix/app/components/embed/embed-direct-template-client-page.tsx
-msgid "Signature is too small. Please provide a more complete signature."
-msgstr "Podpis jest zbyt mały. Proszę podać bardziej kompletny podpis."
+#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
+msgid "Signature is too small"
+msgstr ""
+
+#: apps/remix/app/components/forms/profile.tsx
+msgid "Signature Pad cannot be empty."
+msgstr ""
+
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "Signature types"
+msgstr ""
#: apps/remix/app/routes/_authenticated+/admin+/stats.tsx
msgid "Signatures Collected"
@@ -4987,6 +5050,7 @@ msgid "Subject <0>(Optional)0>"
msgstr "Temat <0>(Opcjonalnie)0>"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Submitting..."
msgstr ""
@@ -5501,6 +5565,10 @@ msgstr "Token, którego użyłeś do zresetowania hasła, jest albo wygasły, al
msgid "The two-factor authentication code provided is incorrect"
msgstr ""
+#: packages/ui/components/document/document-signature-settings-tooltip.tsx
+msgid "The types of signatures that recipients are allowed to use when signing the document."
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id.tsx
#: apps/remix/app/routes/_authenticated+/settings+/webhooks.$id.tsx
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -5582,6 +5650,10 @@ msgstr "Ten dokument został anulowany przez właściciela i nie jest już dost
msgid "This document has been cancelled by the owner."
msgstr "Ten dokument został anulowany przez właściciela."
+#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
+msgid "This document has been rejected by a recipient"
+msgstr ""
+
#: apps/remix/app/routes/_authenticated+/documents.$id._index.tsx
msgid "This document has been signed by all recipients"
msgstr "Ten dokument został podpisany przez wszystkich odbiorców"
@@ -5730,6 +5802,10 @@ msgstr "Strefa czasowa"
msgid "Title"
msgstr "Tytuł"
+#: packages/ui/primitives/document-flow/add-settings.types.ts
+msgid "Title cannot be empty"
+msgstr ""
+
#: apps/remix/app/routes/_unauthenticated+/team.invite.$token.tsx
msgid "To accept this invitation you must create an account."
msgstr "Aby zaakceptować to zaproszenie, musisz założyć konto."
@@ -5897,6 +5973,7 @@ msgstr "Ponowna autoryzacja za pomocą dwuetapowej weryfikacji"
#: apps/remix/app/components/tables/templates-table.tsx
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: packages/lib/constants/document.ts
msgid "Type"
msgstr "Typ"
@@ -6004,6 +6081,7 @@ msgstr "Niezakończony"
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
+#: apps/remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.billing.tsx
msgid "Unknown"
msgstr "Nieznany"
@@ -6014,11 +6092,14 @@ msgstr "Nieopłacone"
#: apps/remix/app/components/tables/settings-security-passkey-table-actions.tsx
#: apps/remix/app/components/tables/settings-public-profile-templates-table.tsx
+#: apps/remix/app/components/forms/team-document-preferences-form.tsx
+#: apps/remix/app/components/forms/team-branding-preferences-form.tsx
#: apps/remix/app/components/forms/public-profile-form.tsx
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
#: apps/remix/app/components/dialogs/public-profile-template-manage-dialog.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
msgid "Update"
msgstr "Zaktualizuj"
@@ -6039,6 +6120,8 @@ msgid "Update profile"
msgstr "Zaktualizuj profil"
#: apps/remix/app/components/tables/admin-document-recipient-item-table.tsx
+#: apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
+#: apps/remix/app/components/dialogs/assistant-confirmation-dialog.tsx
msgid "Update Recipient"
msgstr "Zaktualizuj odbiorcę"
@@ -6077,10 +6160,6 @@ msgstr "Zaktualizuj webhook"
msgid "Updating password..."
msgstr "Aktualizowanie hasła..."
-#: apps/remix/app/components/forms/profile.tsx
-msgid "Updating profile..."
-msgstr "Aktualizacja profilu..."
-
#: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
msgid "Updating Your Information"
msgstr "Aktualizacja Twoich informacji"
@@ -6089,6 +6168,10 @@ msgstr "Aktualizacja Twoich informacji"
msgid "Upgrade"
msgstr "Ulepsz"
+#: packages/lib/constants/document.ts
+msgid "Upload"
+msgstr ""
+
#: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx
msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details."
msgstr "Prześlij plik CSV, aby utworzyć wiele dokumentów z tego szablonu. Każda linia reprezentuje jeden dokument z jego szczegółami odbiorcy."
@@ -6113,7 +6196,7 @@ msgstr "Prześlij CSV"
msgid "Upload custom document"
msgstr "Prześlij niestandardowy dokument"
-#: packages/ui/primitives/signature-pad/signature-pad.tsx
+#: packages/ui/primitives/signature-pad/signature-pad-upload.tsx
msgid "Upload Signature"
msgstr "Prześlij podpis"
@@ -6287,6 +6370,7 @@ msgstr "Zobacz dokument"
#: apps/remix/app/components/general/document-signing/document-signing-form.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/ui/primitives/document-flow/add-subject.tsx
+#: packages/ui/primitives/document-flow/add-subject.tsx
#: packages/email/template-components/template-document-rejected.tsx
#: packages/email/template-components/template-document-invite.tsx
msgid "View Document"
@@ -6653,6 +6737,11 @@ msgstr "Witamy w Documenso!"
msgid "Were you trying to edit this document instead?"
msgstr "Czy próbowałeś raczej edytować ten dokument?"
+#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx
+#: packages/ui/primitives/document-flow/add-signers.tsx
+msgid "When enabled, signers can choose who should sign next in the sequence instead of following the predefined order."
+msgstr ""
+
#: apps/remix/app/components/dialogs/passkey-create-dialog.tsx
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
msgstr "Kiedy klikniesz kontynuuj, zostaniesz poproszony o dodanie pierwszego dostępnego autoryzatora w swoim systemie."
diff --git a/packages/lib/types/document-meta.ts b/packages/lib/types/document-meta.ts
new file mode 100644
index 000000000..f8b5f7395
--- /dev/null
+++ b/packages/lib/types/document-meta.ts
@@ -0,0 +1,53 @@
+import { msg } from '@lingui/core/macro';
+import { z } from 'zod';
+
+import { DocumentMetaSchema } from '@documenso/prisma/generated/zod/modelSchema/DocumentMetaSchema';
+
+/**
+ * The full document response schema.
+ *
+ * Mainly used for returning a single document from the API.
+ */
+export const ZDocumentMetaSchema = DocumentMetaSchema.pick({
+ signingOrder: true,
+ distributionMethod: true,
+ id: true,
+ subject: true,
+ message: true,
+ timezone: true,
+ password: true,
+ dateFormat: true,
+ documentId: true,
+ redirectUrl: true,
+ typedSignatureEnabled: true,
+ uploadSignatureEnabled: true,
+ drawSignatureEnabled: true,
+ language: true,
+ emailSettings: true,
+});
+
+export type TDocumentMeta = z.infer;
+
+/**
+ * If you update this, you must also update the schema.prisma @default value for
+ * - Template meta
+ * - Document meta
+ */
+export const ZDocumentSignatureSettingsSchema = z
+ .object({
+ typedSignatureEnabled: z.boolean(),
+ uploadSignatureEnabled: z.boolean(),
+ drawnSignatureEnabled: z.boolean(),
+ })
+ .refine(
+ (data) => {
+ return (
+ data.typedSignatureEnabled || data.uploadSignatureEnabled || data.drawnSignatureEnabled
+ );
+ },
+ {
+ message: msg`At least one signature type must be enabled`.id,
+ },
+ );
+
+export type TDocumentSignatureSettings = z.infer;
diff --git a/packages/lib/types/document.ts b/packages/lib/types/document.ts
index b411d3bb7..d0be2c225 100644
--- a/packages/lib/types/document.ts
+++ b/packages/lib/types/document.ts
@@ -51,6 +51,8 @@ export const ZDocumentSchema = DocumentSchema.pick({
documentId: true,
redirectUrl: true,
typedSignatureEnabled: true,
+ uploadSignatureEnabled: true,
+ drawSignatureEnabled: true,
allowDictateNextSigner: true,
language: true,
emailSettings: true,
diff --git a/packages/lib/types/template.ts b/packages/lib/types/template.ts
index ba2b89ee1..591cd345d 100644
--- a/packages/lib/types/template.ts
+++ b/packages/lib/types/template.ts
@@ -45,6 +45,8 @@ export const ZTemplateSchema = TemplateSchema.pick({
dateFormat: true,
signingOrder: true,
typedSignatureEnabled: true,
+ uploadSignatureEnabled: true,
+ drawSignatureEnabled: true,
allowDictateNextSigner: true,
distributionMethod: true,
templateId: true,
diff --git a/packages/lib/types/webhook-payload.ts b/packages/lib/types/webhook-payload.ts
index 3ea81471d..a4a2da8f6 100644
--- a/packages/lib/types/webhook-payload.ts
+++ b/packages/lib/types/webhook-payload.ts
@@ -48,6 +48,8 @@ export const ZWebhookDocumentMetaSchema = z.object({
signingOrder: z.nativeEnum(DocumentSigningOrder),
allowDictateNextSigner: z.boolean(),
typedSignatureEnabled: z.boolean(),
+ uploadSignatureEnabled: z.boolean(),
+ drawSignatureEnabled: z.boolean(),
language: z.string(),
distributionMethod: z.nativeEnum(DocumentDistributionMethod),
emailSettings: z.any().nullable(),
diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts
index de5b70973..c6fb4e319 100644
--- a/packages/lib/utils/teams.ts
+++ b/packages/lib/utils/teams.ts
@@ -1,4 +1,5 @@
import { NEXT_PUBLIC_WEBAPP_URL } from '../constants/app';
+import { DocumentSignatureType } from '../constants/document';
import type { TEAM_MEMBER_ROLE_MAP } from '../constants/teams';
import { TEAM_MEMBER_ROLE_HIERARCHY, TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../constants/teams';
@@ -44,3 +45,31 @@ export const isTeamRoleWithinUserHierarchy = (
) => {
return TEAM_MEMBER_ROLE_HIERARCHY[currentUserRole].some((i) => i === roleToCheck);
};
+
+export const extractTeamSignatureSettings = (
+ settings?: {
+ typedSignatureEnabled: boolean;
+ drawSignatureEnabled: boolean;
+ uploadSignatureEnabled: boolean;
+ } | null,
+) => {
+ if (!settings) {
+ return [DocumentSignatureType.TYPE, DocumentSignatureType.UPLOAD, DocumentSignatureType.DRAW];
+ }
+
+ const signatureTypes: DocumentSignatureType[] = [];
+
+ if (settings.typedSignatureEnabled) {
+ signatureTypes.push(DocumentSignatureType.TYPE);
+ }
+
+ if (settings.drawSignatureEnabled) {
+ signatureTypes.push(DocumentSignatureType.DRAW);
+ }
+
+ if (settings.uploadSignatureEnabled) {
+ signatureTypes.push(DocumentSignatureType.UPLOAD);
+ }
+
+ return signatureTypes;
+};
diff --git a/packages/prisma/migrations/20250313015104_add_signatures_toggle/migration.sql b/packages/prisma/migrations/20250313015104_add_signatures_toggle/migration.sql
new file mode 100644
index 000000000..643a0b24d
--- /dev/null
+++ b/packages/prisma/migrations/20250313015104_add_signatures_toggle/migration.sql
@@ -0,0 +1,11 @@
+-- AlterTable
+ALTER TABLE "DocumentMeta" ADD COLUMN "drawSignatureEnabled" BOOLEAN NOT NULL DEFAULT true,
+ADD COLUMN "uploadSignatureEnabled" BOOLEAN NOT NULL DEFAULT true;
+
+-- AlterTable
+ALTER TABLE "TeamGlobalSettings" ADD COLUMN "drawSignatureEnabled" BOOLEAN NOT NULL DEFAULT true,
+ADD COLUMN "uploadSignatureEnabled" BOOLEAN NOT NULL DEFAULT true;
+
+-- AlterTable
+ALTER TABLE "TemplateMeta" ADD COLUMN "drawSignatureEnabled" BOOLEAN NOT NULL DEFAULT true,
+ADD COLUMN "uploadSignatureEnabled" BOOLEAN NOT NULL DEFAULT true;
diff --git a/packages/prisma/prisma-middleware.ts b/packages/prisma/prisma-middleware.ts
new file mode 100644
index 000000000..8653c1e3f
--- /dev/null
+++ b/packages/prisma/prisma-middleware.ts
@@ -0,0 +1,25 @@
+import type { PrismaClient } from '@prisma/client';
+
+export function addPrismaMiddleware(prisma: PrismaClient) {
+ prisma.$use(async (params, next) => {
+ // Check if we're creating a new team
+ if (params.model === 'Team' && params.action === 'create') {
+ // Execute the team creation
+ const result = await next(params);
+
+ // Create the TeamGlobalSettings
+ await prisma.teamGlobalSettings.create({
+ data: {
+ teamId: result.id,
+ },
+ });
+
+ return result;
+ }
+
+ // For all other operations, just pass through
+ return next(params);
+ });
+
+ return prisma;
+}
diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma
index 4ae16dd03..04b60843f 100644
--- a/packages/prisma/schema.prisma
+++ b/packages/prisma/schema.prisma
@@ -390,21 +390,25 @@ enum DocumentDistributionMethod {
/// @zod.import(["import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';"])
model DocumentMeta {
- id String @id @default(cuid())
+ id String @id @default(cuid())
subject String?
message String?
- timezone String? @default("Etc/UTC") @db.Text
+ 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)
+ 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)
- allowDictateNextSigner Boolean @default(false)
- typedSignatureEnabled Boolean @default(true)
- language String @default("en")
- distributionMethod DocumentDistributionMethod @default(EMAIL)
- emailSettings Json? /// [DocumentEmailSettings] @zod.custom.use(ZDocumentEmailSettingsSchema)
+ signingOrder DocumentSigningOrder @default(PARALLEL)
+ allowDictateNextSigner Boolean @default(false)
+
+ typedSignatureEnabled Boolean @default(true)
+ uploadSignatureEnabled Boolean @default(true)
+ drawSignatureEnabled Boolean @default(true)
+
+ language String @default("en")
+ distributionMethod DocumentDistributionMethod @default(EMAIL)
+ emailSettings Json? /// [DocumentEmailSettings] @zod.custom.use(ZDocumentEmailSettingsSchema)
}
enum ReadStatus {
@@ -545,9 +549,12 @@ model TeamGlobalSettings {
documentVisibility DocumentVisibility @default(EVERYONE)
documentLanguage String @default("en")
includeSenderDetails Boolean @default(true)
- typedSignatureEnabled Boolean @default(true)
includeSigningCertificate Boolean @default(true)
+ typedSignatureEnabled Boolean @default(true)
+ uploadSignatureEnabled Boolean @default(true)
+ drawSignatureEnabled Boolean @default(true)
+
brandingEnabled Boolean @default(false)
brandingLogo String @default("")
brandingUrl String @default("")
@@ -669,9 +676,12 @@ model TemplateMeta {
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
signingOrder DocumentSigningOrder? @default(PARALLEL)
allowDictateNextSigner Boolean @default(false)
- typedSignatureEnabled Boolean @default(true)
distributionMethod DocumentDistributionMethod @default(EMAIL)
+ typedSignatureEnabled Boolean @default(true)
+ uploadSignatureEnabled Boolean @default(true)
+ drawSignatureEnabled Boolean @default(true)
+
templateId Int @unique
template Template @relation(fields: [templateId], references: [id], onDelete: Cascade)
redirectUrl String?
diff --git a/packages/prisma/seed/documents.ts b/packages/prisma/seed/documents.ts
index f7b404211..6fe7958d9 100644
--- a/packages/prisma/seed/documents.ts
+++ b/packages/prisma/seed/documents.ts
@@ -1,9 +1,12 @@
-import type { Document, User } from '@prisma/client';
+import type { Document, Team, User } from '@prisma/client';
import { nanoid } from 'nanoid';
import fs from 'node:fs';
import path from 'node:path';
import { match } from 'ts-pattern';
+import { createDocument } from '@documenso/lib/server-only/document/create-document';
+import { createTemplate } from '@documenso/lib/server-only/template/create-template';
+
import { prisma } from '..';
import {
DocumentDataType,
@@ -87,6 +90,145 @@ export const unseedDocument = async (documentId: number) => {
});
};
+export const seedTeamDocumentWithMeta = async (team: Team) => {
+ const documentData = await prisma.documentData.create({
+ data: {
+ type: DocumentDataType.BYTES_64,
+ data: examplePdf,
+ initialData: examplePdf,
+ },
+ });
+
+ const document = await createDocument({
+ userId: team.ownerUserId,
+ teamId: team.id,
+ title: `[TEST] Document ${nanoid(8)} - Draft`,
+ documentDataId: documentData.id,
+ normalizePdf: true,
+ requestMetadata: {
+ auth: null,
+ requestMetadata: {},
+ source: 'app',
+ },
+ });
+
+ const owner = await prisma.user.findFirstOrThrow({
+ where: {
+ id: team.ownerUserId,
+ },
+ });
+
+ await prisma.document.update({
+ where: {
+ id: document.id,
+ },
+ data: {
+ status: DocumentStatus.PENDING,
+ },
+ });
+
+ await prisma.recipient.create({
+ data: {
+ email: owner.email,
+ name: owner.name ?? '',
+ token: nanoid(),
+ readStatus: ReadStatus.OPENED,
+ sendStatus: SendStatus.SENT,
+ signingStatus: SigningStatus.NOT_SIGNED,
+ signedAt: new Date(),
+ document: {
+ connect: {
+ id: document.id,
+ },
+ },
+ fields: {
+ create: {
+ page: 1,
+ type: FieldType.SIGNATURE,
+ inserted: false,
+ customText: '',
+ positionX: new Prisma.Decimal(1),
+ positionY: new Prisma.Decimal(1),
+ width: new Prisma.Decimal(5),
+ height: new Prisma.Decimal(5),
+ documentId: document.id,
+ },
+ },
+ },
+ });
+
+ return await prisma.document.findFirstOrThrow({
+ where: {
+ id: document.id,
+ },
+ include: {
+ recipients: true,
+ },
+ });
+};
+
+export const seedTeamTemplateWithMeta = async (team: Team) => {
+ const documentData = await prisma.documentData.create({
+ data: {
+ type: DocumentDataType.BYTES_64,
+ data: examplePdf,
+ initialData: examplePdf,
+ },
+ });
+
+ const template = await createTemplate({
+ title: `[TEST] Template ${nanoid(8)} - Draft`,
+ userId: team.ownerUserId,
+ teamId: team.id,
+ templateDocumentDataId: documentData.id,
+ });
+
+ const owner = await prisma.user.findFirstOrThrow({
+ where: {
+ id: team.ownerUserId,
+ },
+ });
+
+ await prisma.recipient.create({
+ data: {
+ email: owner.email,
+ name: owner.name ?? '',
+ token: nanoid(),
+ readStatus: ReadStatus.OPENED,
+ sendStatus: SendStatus.SENT,
+ signingStatus: SigningStatus.NOT_SIGNED,
+ signedAt: new Date(),
+ template: {
+ connect: {
+ id: template.id,
+ },
+ },
+ fields: {
+ create: {
+ page: 1,
+ type: FieldType.SIGNATURE,
+ inserted: false,
+ customText: '',
+ positionX: new Prisma.Decimal(1),
+ positionY: new Prisma.Decimal(1),
+ width: new Prisma.Decimal(5),
+ height: new Prisma.Decimal(5),
+ templateId: template.id,
+ },
+ },
+ },
+ });
+
+ return await prisma.document.findFirstOrThrow({
+ where: {
+ id: template.id,
+ },
+ include: {
+ recipients: true,
+ },
+ });
+};
+
export const seedDraftDocument = async (
sender: User,
recipients: (User | string)[],
diff --git a/packages/tailwind-config/index.cjs b/packages/tailwind-config/index.cjs
index 437ad6497..ca0334fef 100644
--- a/packages/tailwind-config/index.cjs
+++ b/packages/tailwind-config/index.cjs
@@ -1,5 +1,6 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const { fontFamily } = require('tailwindcss/defaultTheme');
+const { default: flattenColorPalette } = require('tailwindcss/lib/util/flattenColorPalette');
/** @type {import('tailwindcss').Config} */
module.exports = {
@@ -14,6 +15,9 @@ module.exports = {
zIndex: {
9999: '9999',
},
+ aspectRatio: {
+ 'signature-pad': '16 / 7',
+ },
colors: {
border: 'hsl(var(--border))',
'field-border': 'hsl(var(--field-border))',
@@ -147,5 +151,17 @@ module.exports = {
require('tailwindcss-animate'),
require('@tailwindcss/typography'),
require('@tailwindcss/container-queries'),
+ addVariablesForColors,
],
};
+
+function addVariablesForColors({ addBase, theme }) {
+ let allColors = flattenColorPalette(theme('colors'));
+ let newVars = Object.fromEntries(
+ Object.entries(allColors).map(([key, val]) => [`--${key}`, val]),
+ );
+
+ addBase({
+ ':root': newVars,
+ });
+}
diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts
index 3c2be450b..d638286d4 100644
--- a/packages/trpc/server/document-router/router.ts
+++ b/packages/trpc/server/document-router/router.ts
@@ -56,9 +56,12 @@ import {
ZSearchDocumentsMutationSchema,
ZSetSigningOrderForDocumentMutationSchema,
ZSuccessResponseSchema,
+} from './schema';
+import { updateDocumentRoute } from './update-document';
+import {
ZUpdateDocumentRequestSchema,
ZUpdateDocumentResponseSchema,
-} from './schema';
+} from './update-document.types';
export const documentRouter = router({
/**
@@ -335,20 +338,12 @@ export const documentRouter = router({
});
}),
+ updateDocument: updateDocumentRoute,
+
/**
- * @public
- *
- * Todo: Refactor to updateDocument.
+ * @deprecated Delete this after updateDocument endpoint is deployed
*/
setSettingsForDocument: authenticatedProcedure
- .meta({
- openapi: {
- method: 'POST',
- path: '/document/update',
- summary: 'Update document',
- tags: ['Document'],
- },
- })
.input(ZUpdateDocumentRequestSchema)
.output(ZUpdateDocumentResponseSchema)
.mutation(async ({ input, ctx }) => {
@@ -368,6 +363,8 @@ export const documentRouter = router({
dateFormat: meta.dateFormat,
language: meta.language,
typedSignatureEnabled: meta.typedSignatureEnabled,
+ uploadSignatureEnabled: meta.uploadSignatureEnabled,
+ drawSignatureEnabled: meta.drawSignatureEnabled,
redirectUrl: meta.redirectUrl,
distributionMethod: meta.distributionMethod,
signingOrder: meta.signingOrder,
diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts
index 5617f0488..2b5e06a3d 100644
--- a/packages/trpc/server/document-router/schema.ts
+++ b/packages/trpc/server/document-router/schema.ts
@@ -109,6 +109,14 @@ export const ZDocumentMetaTypedSignatureEnabledSchema = z
.boolean()
.describe('Whether to allow recipients to sign using a typed signature.');
+export const ZDocumentMetaDrawSignatureEnabledSchema = z
+ .boolean()
+ .describe('Whether to allow recipients to sign using a draw signature.');
+
+export const ZDocumentMetaUploadSignatureEnabledSchema = z
+ .boolean()
+ .describe('Whether to allow recipients to sign using an uploaded signature.');
+
export const ZFindDocumentsRequestSchema = ZFindSearchParamsSchema.extend({
templateId: z
.number()
@@ -233,6 +241,8 @@ export const ZCreateDocumentV2RequestSchema = z.object({
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(),
+ drawSignatureEnabled: ZDocumentMetaDrawSignatureEnabledSchema.optional(),
+ uploadSignatureEnabled: ZDocumentMetaUploadSignatureEnabledSchema.optional(),
emailSettings: ZDocumentEmailSettingsSchema.optional(),
})
.optional(),
@@ -249,36 +259,6 @@ export const ZCreateDocumentV2ResponseSchema = z.object({
),
});
-export const ZUpdateDocumentRequestSchema = z.object({
- documentId: z.number(),
- data: z
- .object({
- title: ZDocumentTitleSchema.optional(),
- externalId: ZDocumentExternalIdSchema.nullish(),
- visibility: ZDocumentVisibilitySchema.optional(),
- globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullish(),
- globalActionAuth: ZDocumentActionAuthTypesSchema.nullish(),
- })
- .optional(),
- meta: z
- .object({
- subject: ZDocumentMetaSubjectSchema.optional(),
- message: ZDocumentMetaMessageSchema.optional(),
- timezone: ZDocumentMetaTimezoneSchema.optional(),
- dateFormat: ZDocumentMetaDateFormatSchema.optional(),
- distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
- signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
- allowDictateNextSigner: z.boolean().optional(),
- redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
- language: ZDocumentMetaLanguageSchema.optional(),
- typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(),
- emailSettings: ZDocumentEmailSettingsSchema.optional(),
- })
- .optional(),
-});
-
-export const ZUpdateDocumentResponseSchema = ZDocumentLiteSchema;
-
export const ZSetFieldsForDocumentMutationSchema = z.object({
documentId: z.number(),
fields: z.array(
diff --git a/packages/trpc/server/document-router/update-document.ts b/packages/trpc/server/document-router/update-document.ts
new file mode 100644
index 000000000..5fdb02a88
--- /dev/null
+++ b/packages/trpc/server/document-router/update-document.ts
@@ -0,0 +1,52 @@
+import { upsertDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta';
+import { updateDocument } from '@documenso/lib/server-only/document/update-document';
+
+import { authenticatedProcedure } from '../trpc';
+import {
+ ZUpdateDocumentRequestSchema,
+ ZUpdateDocumentResponseSchema,
+} from './update-document.types';
+import { updateDocumentMeta } from './update-document.types';
+
+/**
+ * Public route.
+ */
+export const updateDocumentRoute = authenticatedProcedure
+ .meta(updateDocumentMeta)
+ .input(ZUpdateDocumentRequestSchema)
+ .output(ZUpdateDocumentResponseSchema)
+ .mutation(async ({ input, ctx }) => {
+ const { teamId } = ctx;
+ const { documentId, data, meta = {} } = input;
+
+ const userId = ctx.user.id;
+
+ if (Object.values(meta).length > 0) {
+ await upsertDocumentMeta({
+ userId: ctx.user.id,
+ teamId,
+ documentId,
+ subject: meta.subject,
+ message: meta.message,
+ timezone: meta.timezone,
+ dateFormat: meta.dateFormat,
+ language: meta.language,
+ typedSignatureEnabled: meta.typedSignatureEnabled,
+ uploadSignatureEnabled: meta.uploadSignatureEnabled,
+ drawSignatureEnabled: meta.drawSignatureEnabled,
+ redirectUrl: meta.redirectUrl,
+ distributionMethod: meta.distributionMethod,
+ signingOrder: meta.signingOrder,
+ emailSettings: meta.emailSettings,
+ requestMetadata: ctx.metadata,
+ });
+ }
+
+ return await updateDocument({
+ userId,
+ teamId,
+ documentId,
+ data,
+ requestMetadata: ctx.metadata,
+ });
+ });
diff --git a/packages/trpc/server/document-router/update-document.types.ts b/packages/trpc/server/document-router/update-document.types.ts
new file mode 100644
index 000000000..a68391499
--- /dev/null
+++ b/packages/trpc/server/document-router/update-document.types.ts
@@ -0,0 +1,68 @@
+import { DocumentSigningOrder } from '@prisma/client';
+// import type { OpenApiMeta } from 'trpc-to-openapi';
+import { z } from 'zod';
+
+import { ZDocumentLiteSchema } from '@documenso/lib/types/document';
+import {
+ ZDocumentAccessAuthTypesSchema,
+ ZDocumentActionAuthTypesSchema,
+} from '@documenso/lib/types/document-auth';
+import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';
+
+import type { TrpcRouteMeta } from '../trpc';
+import {
+ ZDocumentExternalIdSchema,
+ ZDocumentMetaDateFormatSchema,
+ ZDocumentMetaDistributionMethodSchema,
+ ZDocumentMetaDrawSignatureEnabledSchema,
+ ZDocumentMetaLanguageSchema,
+ ZDocumentMetaMessageSchema,
+ ZDocumentMetaRedirectUrlSchema,
+ ZDocumentMetaSubjectSchema,
+ ZDocumentMetaTimezoneSchema,
+ ZDocumentMetaTypedSignatureEnabledSchema,
+ ZDocumentMetaUploadSignatureEnabledSchema,
+ ZDocumentTitleSchema,
+ ZDocumentVisibilitySchema,
+} from './schema';
+
+export const updateDocumentMeta: TrpcRouteMeta = {
+ openapi: {
+ method: 'POST',
+ path: '/document/update',
+ summary: 'Update document',
+ tags: ['Document'],
+ },
+};
+
+export const ZUpdateDocumentRequestSchema = z.object({
+ documentId: z.number(),
+ data: z
+ .object({
+ title: ZDocumentTitleSchema.optional(),
+ externalId: ZDocumentExternalIdSchema.nullish(),
+ visibility: ZDocumentVisibilitySchema.optional(),
+ globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullish(),
+ globalActionAuth: ZDocumentActionAuthTypesSchema.nullish(),
+ })
+ .optional(),
+ meta: z
+ .object({
+ subject: ZDocumentMetaSubjectSchema.optional(),
+ message: ZDocumentMetaMessageSchema.optional(),
+ timezone: ZDocumentMetaTimezoneSchema.optional(),
+ dateFormat: ZDocumentMetaDateFormatSchema.optional(),
+ distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(),
+ signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
+ allowDictateNextSigner: z.boolean().optional(),
+ redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
+ language: ZDocumentMetaLanguageSchema.optional(),
+ typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(),
+ uploadSignatureEnabled: ZDocumentMetaUploadSignatureEnabledSchema.optional(),
+ drawSignatureEnabled: ZDocumentMetaDrawSignatureEnabledSchema.optional(),
+ emailSettings: ZDocumentEmailSettingsSchema.optional(),
+ })
+ .optional(),
+});
+
+export const ZUpdateDocumentResponseSchema = ZDocumentLiteSchema;
diff --git a/packages/trpc/server/team-router/router.ts b/packages/trpc/server/team-router/router.ts
index 292dc85db..618c363c1 100644
--- a/packages/trpc/server/team-router/router.ts
+++ b/packages/trpc/server/team-router/router.ts
@@ -33,7 +33,6 @@ import { resendTeamEmailVerification } from '@documenso/lib/server-only/team/res
import { resendTeamMemberInvitation } from '@documenso/lib/server-only/team/resend-team-member-invitation';
import { updateTeam } from '@documenso/lib/server-only/team/update-team';
import { updateTeamBrandingSettings } from '@documenso/lib/server-only/team/update-team-branding-settings';
-import { updateTeamDocumentSettings } from '@documenso/lib/server-only/team/update-team-document-settings';
import { updateTeamEmail } from '@documenso/lib/server-only/team/update-team-email';
import { updateTeamMember } from '@documenso/lib/server-only/team/update-team-member';
import { updateTeamPublicProfile } from '@documenso/lib/server-only/team/update-team-public-profile';
@@ -66,12 +65,12 @@ import {
ZResendTeamEmailVerificationMutationSchema,
ZResendTeamMemberInvitationMutationSchema,
ZUpdateTeamBrandingSettingsMutationSchema,
- ZUpdateTeamDocumentSettingsMutationSchema,
ZUpdateTeamEmailMutationSchema,
ZUpdateTeamMemberMutationSchema,
ZUpdateTeamMutationSchema,
ZUpdateTeamPublicProfileMutationSchema,
} from './schema';
+import { updateTeamDocumentSettingsRoute } from './update-team-document-settings';
export const teamRouter = router({
// Internal endpoint for now.
@@ -571,18 +570,7 @@ export const teamRouter = router({
return await getTeamPrices();
}),
- // Internal endpoint. Use updateTeam instead.
- updateTeamDocumentSettings: authenticatedProcedure
- .input(ZUpdateTeamDocumentSettingsMutationSchema)
- .mutation(async ({ ctx, input }) => {
- const { teamId, settings } = input;
-
- return await updateTeamDocumentSettings({
- userId: ctx.user.id,
- teamId,
- settings,
- });
- }),
+ updateTeamDocumentSettings: updateTeamDocumentSettingsRoute,
// Internal endpoint for now.
acceptTeamInvitation: authenticatedProcedure
diff --git a/packages/trpc/server/team-router/schema.ts b/packages/trpc/server/team-router/schema.ts
index bd657b6f2..e7880b448 100644
--- a/packages/trpc/server/team-router/schema.ts
+++ b/packages/trpc/server/team-router/schema.ts
@@ -1,7 +1,6 @@
-import { DocumentVisibility, TeamMemberRole } from '@prisma/client';
+import { TeamMemberRole } from '@prisma/client';
import { z } from 'zod';
-import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
import { PROTECTED_TEAM_URLS } from '@documenso/lib/constants/teams';
import { ZFindSearchParamsSchema } from '@documenso/lib/types/search-params';
@@ -195,20 +194,6 @@ export const ZUpdateTeamBrandingSettingsMutationSchema = z.object({
}),
});
-export const ZUpdateTeamDocumentSettingsMutationSchema = z.object({
- teamId: z.number(),
- settings: z.object({
- documentVisibility: z
- .nativeEnum(DocumentVisibility)
- .optional()
- .default(DocumentVisibility.EVERYONE),
- documentLanguage: z.enum(SUPPORTED_LANGUAGE_CODES).optional().default('en'),
- includeSenderDetails: z.boolean().optional().default(false),
- typedSignatureEnabled: z.boolean().optional().default(true),
- includeSigningCertificate: z.boolean().optional().default(true),
- }),
-});
-
export type TCreateTeamMutationSchema = z.infer;
export type TCreateTeamEmailVerificationMutationSchema = z.infer<
typeof ZCreateTeamEmailVerificationMutationSchema
@@ -247,6 +232,3 @@ export type TResendTeamMemberInvitationMutationSchema = z.infer<
export type TUpdateTeamBrandingSettingsMutationSchema = z.infer<
typeof ZUpdateTeamBrandingSettingsMutationSchema
>;
-export type TUpdateTeamDocumentSettingsMutationSchema = z.infer<
- typeof ZUpdateTeamDocumentSettingsMutationSchema
->;
diff --git a/packages/trpc/server/team-router/update-team-document-settings.ts b/packages/trpc/server/team-router/update-team-document-settings.ts
new file mode 100644
index 000000000..ce3525b59
--- /dev/null
+++ b/packages/trpc/server/team-router/update-team-document-settings.ts
@@ -0,0 +1,71 @@
+import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams';
+import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
+import { prisma } from '@documenso/prisma';
+
+import { authenticatedProcedure } from '../trpc';
+import {
+ ZUpdateTeamDocumentSettingsRequestSchema,
+ ZUpdateTeamDocumentSettingsResponseSchema,
+} from './update-team-document-settings.types';
+
+/**
+ * Private route.
+ */
+export const updateTeamDocumentSettingsRoute = authenticatedProcedure
+ .input(ZUpdateTeamDocumentSettingsRequestSchema)
+ .output(ZUpdateTeamDocumentSettingsResponseSchema)
+ .mutation(async ({ ctx, input }) => {
+ const { user } = ctx;
+ const { teamId, settings } = input;
+
+ const {
+ documentVisibility,
+ documentLanguage,
+ includeSenderDetails,
+ includeSigningCertificate,
+ typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
+ } = settings;
+
+ const member = await prisma.teamMember.findFirst({
+ where: {
+ userId: user.id,
+ teamId,
+ role: {
+ in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP.MANAGE_TEAM,
+ },
+ },
+ });
+
+ if (!member) {
+ throw new AppError(AppErrorCode.UNAUTHORIZED, {
+ message: 'You do not have permission to update this team.',
+ });
+ }
+
+ return await prisma.teamGlobalSettings.upsert({
+ where: {
+ teamId,
+ },
+ create: {
+ teamId,
+ documentVisibility,
+ documentLanguage,
+ includeSenderDetails,
+ includeSigningCertificate,
+ typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
+ },
+ update: {
+ documentVisibility,
+ documentLanguage,
+ includeSenderDetails,
+ includeSigningCertificate,
+ typedSignatureEnabled,
+ uploadSignatureEnabled,
+ drawSignatureEnabled,
+ },
+ });
+ });
diff --git a/packages/trpc/server/team-router/update-team-document-settings.types.ts b/packages/trpc/server/team-router/update-team-document-settings.types.ts
new file mode 100644
index 000000000..14263ce56
--- /dev/null
+++ b/packages/trpc/server/team-router/update-team-document-settings.types.ts
@@ -0,0 +1,23 @@
+import { z } from 'zod';
+
+import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
+import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
+import TeamGlobalSettingsSchema from '@documenso/prisma/generated/zod/modelSchema/TeamGlobalSettingsSchema';
+
+export const ZUpdateTeamDocumentSettingsRequestSchema = z.object({
+ teamId: z.number(),
+ settings: z.object({
+ documentVisibility: z
+ .nativeEnum(DocumentVisibility)
+ .optional()
+ .default(DocumentVisibility.EVERYONE),
+ documentLanguage: z.enum(SUPPORTED_LANGUAGE_CODES).optional().default('en'),
+ includeSenderDetails: z.boolean().optional().default(false),
+ includeSigningCertificate: z.boolean().optional().default(true),
+ typedSignatureEnabled: z.boolean().optional().default(true),
+ uploadSignatureEnabled: z.boolean().optional().default(true),
+ drawSignatureEnabled: z.boolean().optional().default(true),
+ }),
+});
+
+export const ZUpdateTeamDocumentSettingsResponseSchema = TeamGlobalSettingsSchema;
diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts
index 6edfbeed3..f2f4691ca 100644
--- a/packages/trpc/server/template-router/schema.ts
+++ b/packages/trpc/server/template-router/schema.ts
@@ -19,12 +19,14 @@ import { TemplateDirectLinkSchema } from '@documenso/prisma/generated/zod/modelS
import {
ZDocumentMetaDateFormatSchema,
ZDocumentMetaDistributionMethodSchema,
+ ZDocumentMetaDrawSignatureEnabledSchema,
ZDocumentMetaLanguageSchema,
ZDocumentMetaMessageSchema,
ZDocumentMetaRedirectUrlSchema,
ZDocumentMetaSubjectSchema,
ZDocumentMetaTimezoneSchema,
ZDocumentMetaTypedSignatureEnabledSchema,
+ ZDocumentMetaUploadSignatureEnabledSchema,
} from '../document-router/schema';
import { ZSignFieldWithTokenMutationSchema } from '../field-router/schema';
@@ -164,6 +166,8 @@ export const ZUpdateTemplateRequestSchema = z.object({
redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(),
language: ZDocumentMetaLanguageSchema.optional(),
typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(),
+ uploadSignatureEnabled: ZDocumentMetaUploadSignatureEnabledSchema.optional(),
+ drawSignatureEnabled: ZDocumentMetaDrawSignatureEnabledSchema.optional(),
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
allowDictateNextSigner: z.boolean().optional(),
})
diff --git a/packages/trpc/server/trpc.ts b/packages/trpc/server/trpc.ts
index 234051e77..28e7e2127 100644
--- a/packages/trpc/server/trpc.ts
+++ b/packages/trpc/server/trpc.ts
@@ -9,8 +9,8 @@ import { isAdmin } from '@documenso/lib/utils/is-admin';
import type { TrpcContext } from './context';
-// Can't import type from trpc-to-openapi because it breaks nextjs build, not sure why.
-type OpenApiMeta = {
+// Can't import type from trpc-to-openapi because it breaks build, not sure why.
+export type TrpcRouteMeta = {
openapi?: {
enabled?: boolean;
method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
@@ -30,7 +30,7 @@ type OpenApiMeta = {
} & Record;
const t = initTRPC
- .meta()
+ .meta()
.context()
.create({
transformer: SuperJSON,
diff --git a/packages/ui/components/document/document-signature-settings-tooltip.tsx b/packages/ui/components/document/document-signature-settings-tooltip.tsx
new file mode 100644
index 000000000..6f09927ee
--- /dev/null
+++ b/packages/ui/components/document/document-signature-settings-tooltip.tsx
@@ -0,0 +1,58 @@
+import { Trans } from '@lingui/react/macro';
+import { InfoIcon } from 'lucide-react';
+
+import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip';
+
+export const DocumentSignatureSettingsTooltip = () => {
+ return (
+
+
+
+
+
+
+
+
+ Signature types
+
+
+
+
+
+ The types of signatures that recipients are allowed to use when signing the document.
+
+
+
+
+
+
+
+ Drawn
+
+ {' - '}
+ A signature that is drawn using a mouse or stylus.
+
+
+
+
+
+ Typed
+
+ {' - '}
+ A signature that is typed using a keyboard.
+
+
+
+
+
+ Uploaded
+
+ {' - '}
+ A signature that is uploaded from a file.
+
+